2009-11-06 17 views
21

¿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?

+0

Esto no se aplica a -just- Delphi, pero sigue siendo una pregunta perfectamente buena con respuestas igualmente buenas. Solo un aviso previo – Kawa

Respuesta

36

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

+0

+1 para el ejemplo. –

11

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.

+0

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; ? –

+0

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

4

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.

+2

y, con suerte, un puntero todavía cabe en una etiqueta cuando llega Delphi de 64 bits ... – frogb

+1

@frogb: ¡Y así es! –

3

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.

3

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

+2

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

+0

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

+0

Los elementos de árbol y lista tienen una propiedad de "datos", que es equivalente a la "etiqueta". –

3

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.

+0

Hay un error de compilación en el código: '(Sender as TButton)' debe ser '(Sender as TButton) .Tag'. – ZzZombo

+0

@ZzZombo tienes razón, gracias –

2

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

5

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

+2

Etiqueta ya utilizada? No hay problema. use HelpContext Sí, veo su punto sin embargo. –

Cuestiones relacionadas