6
votes

Obtenir le nom du composant dans le constructeur?

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;


0 commentaires

4 Réponses :


5
votes

Je crois que la manière appropriée de gérer cela consiste à utiliser le texte hérité texte ou de la propriété de la propriété tcustomcontrol , et pour vous assurer que le CsetCaption ControlStyle est défini.


0 commentaires

6
votes

Le nom Nom 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é nom 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é nom est définie par le système de diffusion DFM à la place, qui est également invoquée après l'exception du constructeur.

de toute façon, le tcontrol.setname () Settre de propriétés valide la nouvelle valeur, puis définit la nouvelle valeur dans la propriété texte de la commande correspondant si le courant < Code> Texte La valeur correspond à l'ancien nom Nom Valeur et la propriété ControlStyle Inclut le drapeau CSSetCaption . . Lorsque la propriété texte change de propriété pour une raison quelconque, le contrôle vous envoie automatiquement une notification cm_textchanged . Vous pouvez avoir votre contrôle de contrôle ce message et appeler invalidate () sur lui-même pour déclencher une nouvelle repeinte. À l'intérieur de votre peinture () gestionnaire, dessinez simplement le nom actuel comme, quelle que soit la valeur qu'il s'agisse. S'il est vide, alors soyez-le. N'essayez pas de forcer le nom , laissez la VCL la gérer pour vous normalement.


3 commentaires

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 ).


@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é;)



0
votes

Pour appliquer le nom que vous pouvez remplacer tcommonent.Loaded méthode.

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.

La méthode plutôt WMPaint devrait vérifier si le texte est vide, puis le nom du texte ne doit pas être modifié. . xxx

Si quelque chose - vous devez garder les propriétés séparées uniquement pour la simple raison que Nom: = 'AAA'; Nom: = 'BBB'; 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.


2 commentaires

texte et nom 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 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 mais jusqu'à ce qu'ils soient en synchronisation. Tout comme il va avec des composants VCL en stock, comme Tlabel, Tedit, TPanel, etc.



0
votes

Un moyen facile de remplacer la méthode setName: xxx

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.


0 commentaires