maison
Top.Mail.Ru Yandeks.Metrika
Forum: "Main";
Archive actuelle: 2002.01.08;
Télécharger: [xml.tar.bz2];

vers le bas

Le composant n'est pas dessiné, et c'est tout ... Trouver des branches similaires


Aleksandr   (2001-12-18 13:03) [0]

Chers collègues!
Il m'a fallu créer un composant. Créé à partir de TGraphicControl. J'ai mis sur le formulaire - tout est en ordre, il est visible, mais il n'est pas dessiné, et c'est tout ... Le code est

type
TWayTree = class (TGraphicControl)
Privée
...
protégé
procédure de peinture;
public
constructeur Create (AOwner: TComponent);
publié
...
propriété Color default clWhite;
property Visible default true;
fin;

registre de procédure;

la mise en oeuvre

procédure TWayTree.Paint;
var
ARect: TRect;
commencer
Hérité;
Canvas.Brush.Color: = Couleur;
ARect.Left: = Left;
ARect.Top:=Top;
ARect.Bottom: = Top + Height;
ARect.Right: = Left + Width;
Canvas.FillRect (ARect)
fin;

constructeur TWayTree.Create;
commencer
Inherited Create (AOwner);
...
fin;

registre de procédure;
commencer
RegisterComponents ("WayTrees", [TWayTree])
fin;

fin.

De plus, lorsque j'essaie encore d'ajouter les propriétés FPen et FBrush (pour un accès séparé au moment de la conception):

TWayTree = class (TGraphicControl)
Privée
FPen: TPen;
FBrush: TBrush;
procedure RePaintRequest (Sender: TObject);
procedure SetBrush (Valeur: TBrush);
procedure SetPen (valeur: TPen);
protégé
procédure de peinture;
public
constructeur Create (AOwner: TComponent);
destructeur Destroy;
publié
propriété Color default clWhite;
propriété visible;
propriété Brush: TBrush read FBrush write SetBrush;
propriété Pen: TPen read FPen write SetPen;
fin;

registre de procédure;

la mise en oeuvre

procédure TWayTree.Paint;
var
ARect: TRect;
commencer
Hérité;
Canvas.Pen: = FPen;
Canvas.Brush: = FBrush;
Canvas.Brush.Color: = Couleur;
ARect.Left: = Left;
ARect.Top:=Top;
ARect.Bottom: = Top + Height;
ARect.Right: = Left + Width;
Canvas.FillRect (ARect);
Canvas.TextOut (ARect.Left, ARect.Top, "AAA");
fin;

destructeur TWayTree.Destroy;
commencer
FPen.Free;
FBrush.Free;
Destroy hérité
fin;

constructeur TWayTree.Create;
commencer
Inherited Create (AOwner);
FPen: = TPen.Create;
FBrush: = TBrush.Create;
FPen.OnChange: = RepaintRequest;
FBrush.OnChange: = RepaintRequest
fin;

procédure TWayTree.SetBrush;
commencer
si Valeur = nul alors
Sortie;
FBrush.Assign (Valeur);
Invalider
fin;

procédure TWayTree.SetPen;
commencer
si Valeur = nul alors
Sortie;
FPen.Assign (Value);
Invalider
fin;

procédure TWayTree.RePaintRequest;
commencer
Invalider
fin;

registre de procédure;
commencer
RegisterComponents ("WayTrees", [TWayTree]);
fin;

fin.
Le composant jure, lorsqu'il est inséré dans un formulaire, qu'il ne peut pas définir le stylet sur zéro. Un stylo et un pinceau apparaissent dans l'inspecteur, mais lorsque je clique sur +, la nifiga ne tombe pas, lorsque je redimensionne les composants, la même erreur ... Qu'est-ce que je fais mal ici?



csf   (2001-12-18 13:09) [1]

Redémarrer Delphi, disent-ils, aide.
Sur stockée vous pouvez toujours lire ...



Aleksandr   (2001-12-18 13:11) [2]

Désolé, je dois aller à la décharge ... J'ai compris que j'avais oublié de remplacer le constructeur par le destructeur pour dessiner ... Je me demande comment vous pouvez connecter une barre de défilement verticale à ce composant ...



csf   (2001-12-18 13:19) [3]

... ce serait bien de vérifier avec Paint FPen & FBrush pour rien ...



Юрий Зотов   (2001-12-18 14:30) [4]

> csf

1. > Redémarrer Delphi, disent-ils, aide.
Précieux conseils.

2. > Vous pouvez toujours lire sur le contenu stocké ...
Vous pouvez. Seulement pour sabzh il n'a rien à faire.

3. > ... ce serait bien de vérifier avec Paint FPen & FBrush pour rien ...
Pourquoi Ils sont créés dans le constructeur du composant. Nil ne peut pas être là.

Total: Vous avez écrit des phrases 3 et tous les 3, excusez-moi, non-sens. Cela valait-il la peine d'écrire? Vaut-il la peine de répondre à des questions dont vous ne connaissez pas très bien le sujet?


> Aleksandr

Vous avez déjà traité vous-même, mais ce n'est pas tout - vous avez un double tirage:

procédure TWayTree.SetBrush;
commencer
si Value = nil alors // Ceci est inutile et même nuisible - cela masque les erreurs de l'utilisateur
Sortie;
FBrush.Assign (Valeur); // Génère FBrush.OnChange et appelle RePaintRequest
Invalidate // Ceci est superflu - il y a un redessin répété.
fin;

Et la même chose dans SetPen. De plus, la variable ARect dans Paint est totalement inutile - utilisez ClientRect ou Canvas.ClipRect.

Enfin, l’essentiel - leurs FBrush et FPen est absolument inutile - seules des ressources supplémentaires sont détruites. Utilisez le canevas intégré:

publié
Propriété Pen: TPen read GetPen write SetPen;
...

fonction ... GetPen: TPen;
commencer
Résultat: = Canvas.Pen
fin;

procedure ... SetPen (const Valeur: TPen);
commencer
Canvas.Pen.Assign (Value)
fin;

Conclusion - même les composants les plus simples doivent être réfléchis avec plus d'attention.



Aleksandr   (2001-12-18 15:50) [5]

2 Yuri Zotov
Merci pour l'info. Cependant, une référence directe aux propriétés du canevas provoquera quelque chose qui ne sera pas le "standard" par défaut: le dessin continuera toujours dans la couleur qui a été utilisée en dernier. Et, par conséquent, on ne peut rien planter sur OnChange - une boucle élémentaire se produira - le réglage de la couleur de la toile provoque OnChange, cela provoque un rafraîchissement et, lors du redessinage, la couleur de Canvas change à nouveau.
Une seule question à l’ordre du jour: comment intégrer le composant TScrollBar? Quelque chose que je ne peux pas faire en double héritage - de TGraphicControl et de TScrollBar ...



DieHard   (2001-12-18 16:01) [6]

Le double héritage ne fonctionnera pas.
Essayez d'hériter de TScrollBox.



MBo   (2001-12-18 16:02) [7]

pas de double héritage.
peut-être hériter de TWinControl?



Polevi   (2001-12-18 16:19) [8]

TCustomControl



Aleksandr   (2001-12-18 16:19) [9]

Hmm ... eh bien, laissons ça pour l'instant ... Voici comment éviter le scintillement constant des composants lors du redimensionnement d'une forme?



panov   (2001-12-18 16:31) [10]

> Aleksandr © (18.12.01 16: 19)
Essayez de définir Enabled: = False avant de redimensionner



Юрий Зотов   (2001-12-18 17:25) [11]

> Aleksandr © (18.12.01 15: 50)

> il continuera toujours à dessiner dans la couleur qui a été utilisée en dernier.

Ce qui est requis


> Et, en conséquence, rien ne peut être planté sur OnChange

Et ne le fais pas. Votre méthode Paint sera appelée automatiquement et rien d’autre n’est requis.

> il y aura une boucle élémentaire - réglage de la couleur de la toile
> provoque OnChange, il provoque le redessinage et le redessinage à nouveau
> Changements de couleur de la toile.

D'abord, vous confirmez vous-même que la modification des propriétés du canevas appelle automatiquement votre méthode Paint. Cela signifie que vous devez accepter le point précédent - vous n'avez pas besoin de gestionnaires OnChange (les gestionnaires OnChange ne font que redessiner en plus - d'où le clignotement supplémentaire).

Deuxièmement, lors de la mise à jour, vous n'avez PAS besoin de modifier les propriétés du canevas. Pourquoi Après tout, si vous liez les propriétés du composant aux propriétés du canevas, ces propriétés du canevas seront DEJA définies lorsque vous appelez la méthode Paint. Dessine avec eux sans rien changer. Et puis il n'y aura pas de boucle.

En général, je vous conseille d'essayer - voyez par vous-même. Je pense que le scintillement sera considérablement réduit.

Ensuite, à propos du scintillement et de la barre de défilement, écoutez les conseils de Polevi. TCustomControl est une fenêtre. Les barres de défilement y sont insérées en définissant simplement les styles WS_HSCROLL / WS_VSCROLL dans CreateParams. Vous pouvez réduire le scintillement en définissant la propriété DoubleBuffered.



Pages: 1 branche entière

Forum: "Main";
Archive actuelle: 2002.01.08;
Télécharger: [xml.tar.bz2];

à l'étage









Mémoire: 0.87 MB
Heure: 0.032 c
3-21921
MVova
2001-12-04 10:41
2002.01.08
Связь многие ко многим ;)


6-22292
3d [Puissance]
2001-10-06 18:16
2002.01.08
Code de réseau pour le jeu.


3-21981
Termik
2001-12-06 08:22
2002.01.08
A propos des champs clés et de l'IDENTITE


14-22328
Débutant
2001-11-02 14:48
2002.01.08
J'en ai déjà marre !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


4-22463
Dmitry Alferev
2001-11-01 23:38
2002.01.08
FindResource ne trouve pas de ressource





afrikaans albanais Arabic arménien azerbaïdjanais basque Biélorusse Bulgare catalan Chinois simplifié) Chinois (traditionnel) croate Tchèque Danois Néerlandais English estonien Filipino Finlandais Français
galicien géorgien Allemand Grecque Créole haïtien hébreu Hindi Hongrois Islandais Indonesian irlandais Italien Japonais Coréen letton lituanien macédonien Malay maltais Norvégien
persan Polonais Portugais roumain Russe serbe Slovaque Slovène Espagnol Swahili Suédois Thai turc ukrainien Urdu vietnamien gallois yiddish bengali bosniaque
Cebuano espéranto gujarati Hause hmong Igbo Javanais Kannada Khmer lao latin maori Marathi mongol népalais punjabi somali tamil telugu yoruba
zoulou
Английский Français Allemand Italien Португальский Русский Espagnol