Je crée un contrôle personnalisé dérivé de TCustomControl, par exemple:
constructor TMyCustomControl.Create(AOwner: TComponent); begin inherited Create(AOwner); FText := Name; //< empty string ShowMessage(Name); //< empty message box too end;
4 Réponses :
Je crois que la manière appropriée de gérer cela consiste à utiliser le texte hérité texte code> ou
de la propriété code> de la propriété
tcustomcontrol code>, et pour vous assurer que le
CsetCaption Code>
ControlStyle code> est défini. P>
Le nom code> Nom code> n'a pas encore été attribué lorsque le constructeur est en cours d'exécution. Au moment de la conception, l'IDE attribue une valeur à la propriété code> nom code> Une fois le composant déposé sur le concepteur, après la sortie du constructeur de la commande. Au moment de l'exécution, la propriété code> nom code> est définie par le système de diffusion DFM à la place, qui est également invoquée après l'exception du constructeur. P>
de toute façon, le tcontrol.setname () code> Settre de propriétés valide la nouvelle valeur, puis définit la nouvelle valeur dans la propriété code> texte code> de la commande correspondant si le courant < Code> Texte Code> La valeur correspond à l'ancien nom
Nom CODE> Valeur et la propriété
ControlStyle CODE> Inclut le drapeau
CSSetCaption CODE>. . Lorsque la propriété code> texte code> change de propriété pour une raison quelconque, le contrôle vous envoie automatiquement une notification code> cm_textchanged code>. Vous pouvez avoir votre contrôle de contrôle ce message et appeler
invalidate () code> sur lui-même pour déclencher une nouvelle repeinte. À l'intérieur de votre
peinture () code> gestionnaire, dessinez simplement le nom
actuel code> comme, quelle que soit la valeur qu'il s'agisse. S'il est vide, alors soyez-le. N'essayez pas de forcer le nom code> code>, laissez la VCL la gérer pour vous normalement. P>
J'ai intercepté le cm_textchanged et appelé Invalidate, j'ai changé mon code de texte sur le nom de sortie au lieu de FText et que le nom émet correctement maintenant. Seul problème est qu'il ne posite pas correctement ma légende comme elle l'a déjà fait, mais je peux voir si je peux résoudre ce petit problème. Merci pour l'explication de votre réponse, si j'y pense, comment un composant peut-il être attribué un nom du constructeur!
@Blob, arrêt de sujet Note sur le positionnement du texte. Assurez-vous que vous calculez la position du même texte que vous rendu (si vous n'utilisez pas la méthode comme Textrect code>).
@Tlama vous avez raison, j'ai remarqué peu de temps après avoir posté que je calculais toujours le textheight basé sur le nom de FText, pas le nom. Heureux que vous ayez posté de toute façon au cas où je l'aurais manqué;)
Pour appliquer le nom que vous pouvez remplacer Mais je ne pense pas que vous devriez copier le nom sur le texte. Ce sont des propriétés sémantiquement séparées et l'ajout de la liaison inattendue vous ferait mal de jour. P> La méthode plutôt WMPaint devrait vérifier si le texte est vide, puis le nom du texte ne doit pas être modifié. . p> Si quelque chose - vous devez garder les propriétés séparées uniquement pour la simple raison que tcommonent.Loaded code> méthode.
Nom: = 'AAA'; Nom: = 'BBB'; code> ne doit pas faire de texte et nom de synchronisation. Et avec votre approche 1ère déclaration régleriez le texte et la seconde rendrait le nom ancien encore affiché après le changement de nom réel. P> p>
texte code> et
nom code> devrait être hors de synchronisation, tout simplement pas lorsque vous déposez une nouvelle instance sur un formulaire. De toute évidence, OP recherche simplement le comportement
CSetCaption CODE> CSSetCaption par défaut qui prend soin de vous.
@Nngln ils devraient être hors de synchronisation si le développeur envahit intentionnellement la valeur du texte i> mais jusqu'à ce qu'ils soient en synchronisation. Tout comme il va avec des composants VCL en stock, comme Tlabel, Tedit, TPanel, etc.
Un moyen facile de remplacer la méthode setName: J'avais besoin de ma propre variable pour la légende Porepty, car je souhaite utiliser WELLSString plutôt Unicode et écrire un éditeur de propriétés personnalisé. Désolé que j'écris dans un vieux sujet, mais j'espère que cela aidera. P> p>