TListBox y TComboBox de Delphi muestran una lista de elementos, cadenas en una lista "seleccionable". TListBox muestra una lista desplazable, TComboBox muestra una lista desplegable.
Una propiedad común a todos los controles anteriores es el Artículos propiedad. Los elementos definen una lista de cadenas que aparecerán en el control para el usuario. En tiempo de diseño, cuando hace doble clic en la propiedad Elementos, el "Editor de lista de cadenas" le permite especificar elementos de cadena. La propiedad Items es en realidad un descendiente de tipo TStrings.
Hay situaciones en las que desea mostrar una lista de cadenas al usuario, por ejemplo en el control del cuadro de lista, pero también tiene una manera de almacenar una cadena adicional más a lo largo de la que se muestra al usuario.
Además, es posible que desee almacenar / adjuntar más que una cadena "simple" a la cadena, es posible que desee adjuntar un objeto al elemento (cadena).
Dale al objeto TStrings una mirada más en el sistema de ayuda. Ahí está el Objetos propiedad que representa un conjunto de objetos que están asociados con cada una de las cadenas en la propiedad Strings, donde la propiedad Strings hace referencia a las cadenas reales en la lista.
Si desea asignar una segunda cadena (o un objeto) a cada cadena en el cuadro de lista, debe completar la propiedad Elementos en tiempo de ejecución.
Si bien puedes usar el ListBox.Items.Add Para agregar cadenas a la lista, para asociar un objeto con cada cadena, deberá usar otro enfoque.
los ListBox.Items.AddObject El método acepta dos parámetros. El primer parámetro, "Elemento" es el texto del elemento. El segundo parámetro, "AObject" es el objeto asociado con el elemento..
Tenga en cuenta que el cuadro de lista expone el Añadir artículo método que hace lo mismo que Items.AddObject.
Dado que tanto Items.AddObject como AddItem aceptan una variable de tipo TObject para su segundo parámetro, una línea como:
//Error de compilación! ListBox1.Items.AddObject ('zarko', 'gajic');
resultará en un error de compilación: E2010 Tipos incompatibles: 'TObject' y 'string'.
No puede simplemente proporcionar una cadena para el objeto ya que en Delphi para Win32 los valores de cadena no son objetos.
Para asignar una segunda cadena al elemento del cuadro de lista, debe "transformar" una variable de cadena en un objeto; necesita un objeto TString personalizado.
Si el segundo valor que necesita almacenar junto con el elemento de cadena es un valor entero, en realidad no necesita una clase TInteger personalizada.
ListBox1.AddItem ('Zarko Gajic', TObject (1973));
La línea de arriba almacena el número entero "1973" junto con la cadena "Zarko Gajic" agregada.
Más arriba se realiza una conversión de texto directa de un entero a un objeto. El parámetro "AObject" es en realidad el puntero (dirección) de 4 bytes del objeto agregado. Como en Win32 un número entero ocupa 4 bytes, es posible una conversión tan dura.
Para recuperar el número entero asociado con la cadena, debe convertir el "objeto" al valor entero:
// año == 1973 año: = Entero (ListBox1.Items.Objects [ListBox1.Items.IndexOf ('Zarko Gajic')]);
¿Por qué parar aquí? Asignar cadenas y enteros a una cadena en un cuadro de lista es, como acabas de experimentar, un pedazo de pastel.
Dado que los controles de Delphi son en realidad objetos, puede adjuntar un control a cada cadena que se muestra en el cuadro de lista.
El siguiente código se agrega a los subtítulos ListBox1 (cuadro de lista) de todos los controles TButton en un formulario (colóquelo en el controlador de eventos OnCreate del formulario) junto con la referencia a cada botón.
var idx: entero; empezar para idx: = 0 a -1 + ComponentCount hacer empezar Si Componentes [idx] es TButton luego ListBox1.AddObject (TButton (Componentes [idx]). Título, Componentes [idx]); final; final;
Para "hacer clic" programáticamente en el "segundo" botón, puede usar la siguiente instrucción:
TButton (ListBox1.Items.Objects [1]). Haga clic en;
En una situación más genérica, agregaría instancias (objetos) de sus propias clases personalizadas:
tipo TStudent = clase privado fName: cadena; fYear: entero; público propiedad Nombre : cadena de lectura fName; propiedad Año: entero leer fYear; constructor Crear(const nombre : cuerda; const año: entero); final; ... constructor TStudent.Create (const nombre : cuerda; const año: entero); empezar fName: = nombre; fYear: = año; final; -------- empezar // agrega dos cadenas / objetos -> estudiantes a la lista ListBox1.AddItem ('John', TStudent.Create ('John', 1970)); ListBox1.AddItem ('Jack', TStudent.Create ('Jack', 1982)); // agarra al primer alumno - John estudiante: = ListBox1.Items.Objects [0] como TStudent; // muestra el año de John ShowMessage (IntToStr (estudiante.Año)); final;
Esto es lo que la Ayuda tiene que decir sobre los objetos en los descendientes de TStrings: el objeto TStrings no posee los objetos que agrega de esta manera. Los objetos agregados al objeto TStrings aún existen incluso si la instancia de TStrings se destruye. Ellos deben ser destruido explícitamente por la aplicación.
Cuando agrega objetos a las cadenas, objetos que crea, debe asegurarse de liberar la memoria ocupada, o tendrá una pérdida de memoria
Un procedimiento personalizado genérico FreeObjects acepta una variable de tipo TStrings como su único parámetro. FreeObjects liberará cualquier objeto asociado con un elemento en la lista de cadenas. En el ejemplo anterior, los "estudiantes" (clase TStudent) se adjuntan a una cadena en un cuadro de lista, cuando la aplicación está a punto de cerrarse (evento principal OnDestroy del formulario, para ejemplo), necesita liberar la memoria ocupada:
FreeObjects (ListBox1.Items);
Nota: solo se llama a este procedimiento cuando los objetos asignados a elementos de cadena fueron creados por usted.