¿Existe algún propósito específico para la propiedad 'Etiqueta' de los componentes Delphi VCL? He buscado en Google algunos ejemplos usándolo como, por ejemplo, una propiedad 'color' o usando el valor como una dirección de puntero, pero ¿es 'una buena práctica' usarlo, o se considera 'mala práctica' ya que ata? la lógica del programa a la interfaz de usuario?¿Cuál es el propósito de la propiedad 'Etiqueta' de los componentes Delphi VCL?
Respuesta
La propiedad "etiqueta" está allí como un "contenedor de carga" para lo que sea que quieras hacer con ella.
Algo que se usa a menudo es en controladores de eventos cuando hay muchos componentes similares que comparten un controlador de eventos. El controlador de eventos puede encontrar a su interlocutor y luego consultar su valor de etiqueta para obtener más información acerca de en qué se supone que está actuando.
EDIT:
Ejemplo: Una aplicación de calculadora podría etiquetar los botones numéricos con sus respectivos números ... ejemplo tonto e incompleta, pero usted consigue la idea. El controlador de eventos podría entonces sacar el número para agregarlo a la pantalla y al acumulador directamente de la etiqueta en lugar de tener que averiguar qué botón debe hacer qué.
+1 para el ejemplo. –
Es un lugar para agregar información a cualquier componente, incluso si no tiene la fuente para ese componente. Debe usarse con cuidado, ya que puede usarlo solo para un propósito por componente. Por esa razón, las bibliotecas nunca deberían usarlo.
solo se usa una vez? como en usted solo puede cambiar la información de la etiqueta una vez? Entonces, si tuviera que hacer algo como TCard.tag: = 3; No puedo más tarde hacer TCard.tag: = 5; ? –
Solo puede usarlo para un propósito a la vez. Supongamos que coloca un THelper en el mismo formulario que comienza a asignar textos de ayuda a cada etiqueta que pueda encontrar. –
Como han dicho otros, es un lugar para poner cualquier cosa. Por lo general, esto es útil cuando se asocian dos objetos a través de una referencia de objeto o un puntero. La etiqueta tiene el tamaño perfecto para contener un puntero, por lo que si necesita, por ejemplo, mantener un objeto vinculado a un elemento en un cuadro de lista, se vuelve bastante sencillo.
y, con suerte, un puntero todavía cabe en una etiqueta cuando llega Delphi de 64 bits ... – frogb
@frogb: ¡Y así es! –
También se puede utilizar para fines de agrupamiento, digamos que desea acceder a todos los componentes con un valor de etiqueta específico, independientemente del tipo de componente.
¡Es genial! Un regalo de promoción. Lo uso todo el tiempo para almacenar una pieza adicional de información asociada con el objeto.
A menudo guardo un puntero a una estructura de datos asociada, o a veces un entero que puede ser un índice en alguna otra matriz.
Puede usarlo como un contador para las veces que se accede al objeto, o lo que sea.
El único inconveniente es que si su programa usa mucha memoria y tiene millones de objetos, esos 4 bytes para cada etiqueta se suman, especialmente si no los está usando. En ese caso, para su tipo de objeto más prolífico, es posible que desee crear su propia versión sin la etiqueta.
No es probable que sea un problema grave, ya que es poco probable que sus "millones de objetos" tengan la propiedad Etiqueta. Solo las clases de VCL lo tienen, y no suele tener todas esas instancias a la vez. –
Oh, tienes razón. La mayoría de los elementos de árbol y lista en Delphi estándar no tienen etiquetas. Estaba mezclando eso con el paquete ElTree de LMDInnovative que uso, que tiene una etiqueta en cada elemento del árbol. Mis árboles pueden tener millones de elementos y, como resultado, tengo millones de etiquetas. Pero el verdadero punto es que me encanta tener esa capacidad – lkessler
Los elementos de árbol y lista tienen una propiedad de "datos", que es equivalente a la "etiqueta". –
usted tiene 2 botones en el formulario, en el que definió la etiqueta = 1, y el otro Tag = 2. Ahora se asigne la misma OnClick evento para los dos botones y se retuercen el código como el siguiente:
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;
o más compacta:
procedure TForm28.Button1Click(Sender: TObject);
begin
Caption := 'you pressed button ' + IntToStr((Sender as TButton).Tag);
end;
Básicamente, la etiqueta le permitirá identificar qué control generó el evento. Piensa si tienes un formulario con botones creados dinámicamente ... una lista con usuarios de la base de datos, y en cada registro colocas un botón "Eliminar usuario". En esta situación, no puede crear un evento para cada botón, creará un evento que se asignará a todos los botones ... y puede poner en la etiqueta el ID de usuario, por ejemplo.De esta forma, cuando implemente el evento para manejar todos los botones, sabrá qué usuario eliminar.
Hay un error de compilación en el código: '(Sender as TButton)' debe ser '(Sender as TButton) .Tag'. – ZzZombo
@ZzZombo tienes razón, gracias –
I Usar etiquetas todo el tiempo. aquí hay algunos ejemplos;
una muestra simple: usted tiene un cuaderno (Como un pagecontroll sin pestañas) por lo que puede definir botones en forma de fichas y escribir
NoteBook.ActivePage := TButton(Sender).Tag;
Una muestra más complicado; un número entero puede contener 16 bolleans bit a bit; A continuación, puedo comprobar los remitentes hasta 16 condiciones para decidir cómo continuar 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;
se entiende la idea
Tengo algunos problemas fundamentales con la propiedad Tag. Bueno, no exactamente esta propiedad en sí misma porque funciona según lo previsto.
En general, considero el uso de cualquier variable universal/general/multipropósito como una "mala práctica". Pueden ser útiles durante la depuración pero son muy dañinos en entornos de producción/misión crítica. Reducen la legibilidad del código y la comprensibilidad porque nadie sabe qué hace un atributo o propiedad con el nombre 'Etiqueta'. Por supuesto que sabes por qué estás usando esta variable. Pero tarde o temprano lo olvidarás (sé que lo harás) y confiar en este valor hace que todo sea más complicado. Es por eso que deberíamos nombrar adecuadamente cada variable y propiedad para ayudarnos a entender qué hace el código.
El uso de la propiedad Tag es solo una solución/atajo para evitar la implementación de código comprensible y bien escrito. Esta es la PRÁCTICA y es adictiva. La próxima vez que necesite almacenar un nuevo valor entero vinculado a un componente, usará la propiedad Tag sin considerar ninguna otra forma de almacenar los valores deseados. Y almacenar un puntero en la propiedad Tag es una idea horrible: tiene que convertir este valor cada vez que depure punteros.
Dime: ¿Cuántas veces te encontraste en una situación en la que querías almacenar un nuevo valor en la propiedad Tag pero te diste cuenta de que esta propiedad ya se usa para un propósito diferente (si solo hubiera un 'Tag2' 'propiedad en cada componente ...).
Etiqueta ya utilizada? No hay problema. use HelpContext Sí, veo su punto sin embargo. –
- 1. ¿Cuál es el nombre propiedad de los componentes oscilantes?
- 2. ¿Cuál es el propósito de la propiedad "privada" en package.json?
- 3. Serialización de componentes Delphi
- 4. ¿Cuál es el verdadero propósito de la etiqueta contentDescription de Android?
- 5. ¿Cuál es el propósito de 'Class.forName ("MY_JDBC_DRIVER")'?
- 6. ¿Cuál es el propósito de los conjuntos de datos?
- 7. ¿Cuál es el propósito de los punteros de objetos comprimidos?
- 8. ¿Cuál es el propósito/significado de la propiedad de la versión en un Boleto FormsAuthentication?
- 9. Desplazamiento sincronizado Componentes Delphi
- 10. ¿Cuál es el propósito de config.assets.precompile?
- 11. ¿Cuál es el propósito de String.IsInterned?
- 12. ¿Cuál es el propósito de Anorm's Pk?
- 13. ¿Cuál es el propósito de los archivos pdb?
- 14. ¿Cuál es el propósito de los archivos .edmx?
- 15. ¿Cuál es el propósito de precompiledApp.config?
- 16. ¿Cuál es el propósito de la propiedad webkitRelativePath en el objeto File?
- 17. ¿Cuál es el propósito de __cxa_pure_virtual?
- 18. ¿Cuál es el propósito de Active Records?
- 19. ¿Cuál es el propósito de los tipos anónimos?
- 20. ¿Cuál es el propósito de los Atributos en C#?
- 21. ¿Cuál es el propósito de 'var'?
- 22. ¿Cuál es el propósito de `qt_noop`
- 23. ¿Cuál es el propósito de layout.xml?
- 24. ¿Cuál es el propósito de requestWindowFeature()?
- 25. ¿Cuál es el propósito de Mage_Core_Block_Template_Facade
- 26. ¿Cuál es el propósito de IntentSender?
- 27. ¿Cuál es el propósito de utilizar NSOrderedSame?
- 28. ¿Cuál es el propósito de git-mv?
- 29. ¿Cuál es el propósito de Membership.ValidateUser()
- 30. ¿Cuál es el propósito de Ext.require
Esto no se aplica a -just- Delphi, pero sigue siendo una pregunta perfectamente buena con respuestas igualmente buenas. Solo un aviso previo – Kawa