Quel est le but de la propriété ' Tag ' des composants Delphi VCL?

Y a-t-il un but spécifique pour la propriété 'Tag' des composants Delphi VCL? J'ai googlé quelques exemples en l'utilisant comme, par exemple, une propriété 'color' ou en utilisant la valeur comme adresse de pointeur, mais est-ce une "bonne pratique" de l'utiliser, ou est-ce considéré comme une "mauvaise pratique" car il lie la logique du programme à L'interface utilisateur?

21
demandé sur HMcG 2009-11-07 00:56:41

8 réponses

La propriété " tag "est là comme un" conteneur de fret " pour tout ce que vous pourriez vouloir en faire.

Quelque chose pour lequel il est souvent utilisé est dans les gestionnaires d'événements lorsque vous avez beaucoup de composants similaires partageant un gestionnaire d'événements. Le gestionnaire d'événements peut trouver son appelant, puis interroger sa valeur de balise pour obtenir plus d'informations sur ce sur quoi il est censé agir.

Modifier:

Exemple: une application calculatrice peut marquer les boutons numériques avec leurs numéros respectifs... stupide et exemple incomplet, mais vous avez l'idée. Le gestionnaire d'événements pourrait alors tirer le numéro à ajouter dans l'affichage et l'accumulateur dès la sortie de la balise au lieu d'avoir à déterminer quel bouton est destiné à faire quoi.

36
répondu Carl Smotricz 2009-11-06 22:01:00

C'est un endroit pour ajouter une information à n'importe quel composant, même si vous n'avez pas la source pour ce composant. Il doit être utilisé avec précaution, car vous ne pouvez l'utiliser qu'à une seule fin par composant. Pour cette raison, les bibliothèques ne devraient jamais l'utiliser.

11
répondu Henk Holterman 2017-04-10 13:44:52

J'ai quelques problèmes fondamentaux avec la propriété Tag. Eh bien pas exactement cette propriété elle-même car elle fonctionne comme prévu.

En général, je considère l'utilisation de toutes les variables universelles / générales / polyvalentes comme une "mauvaise pratique". Ils peuvent être utiles pendant le débogage mais sont très nocifs dans l'environnement de production / mission critique. Ils réduisent la lisibilité et la compréhensibilité du code car personne ne sait ce que fait un attribut ou une propriété nommé "Tag". Bien sûr vous savez pourquoi vous utilisez ceci variable. Mais tôt ou tard, vous oublierez (je sais que vous le ferez) et compter sur cette valeur rend quelque chose de plus compliqué. C'est pourquoi nous devrions nommer correctement chaque variable et propriété pour nous aider à comprendre ce que fait le code.

L'utilisation de la propriété Tag est juste une solution de contournement / raccourci pour éviter d'implémenter un code compréhensible et bien écrit. C'est la pratique et c'est addictif. La prochaine fois que vous devez stocker une nouvelle valeur entière liée à un composant vous utiliserez la propriété Tag sans considérant tout autre moyen de stocker les valeurs souhaitées. Et stocker un pointeur dans la propriété Tag est une idée horrible: vous devez lancer cette valeur chaque fois que vous déboguez des pointeurs.

Dites-moi: combien de fois vous êtes-vous retrouvé dans une situation où vous vouliez stocker une nouvelle valeur dans la propriété Tag mais vous avez réalisé que cette propriété est déjà utilisée dans un but différent (si seulement il y avait une propriété 'Tag2' dans chaque composant...).

5
répondu hubalu 2013-08-12 10:16:23

Comme d'autres l'ont dit, c'est un endroit pour mettre n'importe quoi. Généralement, cela est pratique lors de l'association de deux objets via une référence d'objet ou un pointeur. La balise est parfaitement dimensionnée pour contenir un pointeur, donc si vous devez, disons, garder un objet lié à un élément dans une listbox, cela devient assez simple.

4
répondu 3Dave 2009-11-06 22:02:34

En outre, il peut être utilisé à des fins de regroupement, disons que vous souhaitez accéder à tous les composants avec une valeur de balise spécifique, quel que soit le type du composant.

3
répondu luvieere 2009-11-06 22:03:32

C'est génial! Un billet de faveur. Je l'utilise tout le temps pour stocker une information supplémentaire associée à l'objet.

Souvent, je stocke un pointeur vers une structure associée, ou parfois un entier qui peut être un indice dans un autre tableau.

Vous pouvez l'utiliser comme compteur pour les temps d'accès à l'objet, ou autre.

Le seul inconvénient est que si votre programme utilise beaucoup de mémoire et que vous avez des millions d'objets, ces 4 octets pour chaque balise s'additionnent, en particulier si vous ne l'utilisez pas. Dans ce cas, pour votre plus prolifique type d'objet, vous pouvez créer votre propre version sans la balise.

3
répondu lkessler 2009-11-07 00:10:08

Vous avez 2 boutons sur votre formulaire, sur l'un vous définissez le Tag = 1, et L'autre Tag = 2. Maintenant, vous assignez le même événement OnClick aux deux boutons et tordez le code comme ceci:

procedure TForm28.Button1Click(Sender: TObject);
begin
  case (Sender as TButton).Tag of
   1: Caption := 'you pressed button 1';
   2: Caption := 'you pressed button 2';
  end;
end;

Ou plus compact:

procedure TForm28.Button1Click(Sender: TObject);
begin
  Caption := 'you pressed button ' + IntToStr((Sender as TButton).Tag);
end;

Fondamentalement,Tag vous permettra d'identifier ce contrôle a déclenché l'événement. Pensez si vous avez un formulaire avec des boutons créés dynamiquement... une liste avec les utilisateurs de la base de données, et sur chaque fiche vous mettre un bouton "Supprimer Utilisateur". Dans cette situation, vous ne pouvez pas créer un pour chaque bouton, vous allez créer un événement, qui sera attribué à tous les boutons... et vous pouvez mettre dans la balise l'ID utilisateur par exemple. De cette façon, lorsque vous implémentez l'événement pour gérer tous les boutons, vous saurez quel utilisateur Supprimer.

3
répondu ioan ghip 2016-03-15 16:11:02

J'utilise des tags tout le temps. voici quelques exemples;

Un exemple simple: vous avez un bloc-notes (comme un pagecontroll sans onglets) vous pouvez donc définir des boutons en tant qu'onglets et écrire

NoteBook.ActivePage := TButton(Sender).Tag;

Un échantillon plus compliqué; un entier peut contenir 16 bolleans au niveau du BIT; Je peux ensuite vérifier les expéditeurs jusqu'à 16 conditions pour décider comment continuer la pricedure

If (BitCheck (Bit2,TButton(sender).tag=True) And BitCheck(bit12,TButton(Sender).Tag=False) Then
Begin
end;

If (BitCheck (Bit9,TButton(sender).tag=True) Or BitCheck(bit14,TButton(Sender).Tag=True) Then
Begin
end;

Vous avez L'idée

2
répondu Eli Fried 2012-01-26 16:50:52