Memorizzare una stringa (o un oggetto) con una stringa in un ListBox o ComboBox

TListBox e TComboBox di Delphi visualizzano un elenco di elementi - stringhe in un elenco "selezionabile". TListBox visualizza un elenco a scorrimento, TComboBox visualizza un elenco a discesa.

Una proprietà comune a tutti i controlli sopra è la Elementi proprietà. Gli elementi definiscono un elenco di stringhe che verranno visualizzate nel controllo per l'utente. In fase di progettazione, quando si fa doppio clic sulla proprietà Items, "Editor elenco stringhe" consente di specificare gli elementi stringa. La proprietà Items è in realtà un discendente di tipo TStrings.

Due stringhe per articolo in un ListBox?

Esistono situazioni in cui si desidera visualizzare un elenco di stringhe per l'utente, ad esempio nel controllo casella di riepilogo, ma è anche possibile memorizza un'altra stringa aggiuntiva lungo quella visualizzata per l'utente.

Inoltre, potresti voler archiviare / allegare più di una semplice stringa "normale" alla stringa, che potresti desiderare associare un oggetto all'elemento (stringa).

ListBox.Items - TStrings "Conosce" gli oggetti!

Dai all'oggetto TStrings un'altra occhiata nel sistema di aiuto. C'è il Oggetti proprietà che rappresenta un insieme di oggetti associati a ciascuna delle stringhe nella proprietà Stringhe - dove la proprietà Stringhe fa riferimento alle stringhe effettive nell'elenco.

Se si desidera assegnare una seconda stringa (o un oggetto) a ogni stringa nella casella di riepilogo, è necessario popolare la proprietà Items in fase di esecuzione.

Mentre puoi usare il ListBox.Items.Add metodo per aggiungere stringhe all'elenco, per associare un oggetto a ciascuna stringa, sarà necessario utilizzare un altro approccio.

Il ListBox.Items.AddObject Il metodo accetta due parametri. Il primo parametro, "Articolo" è il testo dell'articolo. Il secondo parametro, "AObject" è l'oggetto associato all'elemento.

Si noti che la casella di riepilogo espone il Aggiungi articolo metodo che fa lo stesso di Items.AddObject.

Due stringhe per una stringa

Poiché sia ​​Items.AddObject che AddItem accettano una variabile di tipo TObject per il loro secondo parametro, una riga come:

 // errore di compilazione! ListBox1.Items.AddObject ('zarko', 'gajic'); 

comporterà un errore di compilazione: E2010 Tipi incompatibili: 'TObject' e 'string'.

Non è possibile fornire semplicemente una stringa per l'oggetto poiché in Delphi per Win32 i valori di stringa non sono oggetti.

Per assegnare una seconda stringa all'elemento della casella di riepilogo, è necessario "trasformare" una variabile di stringa in un oggetto - è necessario un oggetto TString personalizzato.

Un numero intero per una stringa

Se il secondo valore che è necessario memorizzare insieme all'elemento stringa è un valore intero, in realtà non è necessaria una classe TInteger personalizzata.

 ListBox1.AddItem ('Zarko Gajic', TObject (1973)); 

La riga sopra memorizza il numero intero "1973" insieme alla stringa "Zarko Gajic" aggiunta.

Un typecast diretto da un numero intero a un oggetto viene creato sopra. Il parametro "AObject" è in realtà il puntatore (indirizzo) a 4 byte dell'oggetto aggiunto. Poiché in Win32 un numero intero occupa 4 byte, è possibile un cast così rigido.

Per ripristinare il numero intero associato alla stringa, è necessario eseguire il cast "dell'oggetto" al valore intero:

 // anno == 1973 year: = Integer (ListBox1.Items.Objects [ListBox1.Items.IndexOf ('Zarko Gajic')]); 

Un controllo Delphi per una stringa

Perché fermarsi qui? Assegnare stringhe e numeri interi a una stringa in una casella di riepilogo è, come hai appena sperimentato, un gioco da ragazzi.

Poiché i controlli Delphi sono in realtà oggetti, è possibile associare un controllo a ogni stringa visualizzata nella casella di riepilogo.

Il codice seguente aggiunge alle didascalie ListBox1 (casella di riepilogo) di tutti i controlli TButton in un modulo (posizionalo nel gestore di eventi OnCreate del modulo) insieme al riferimento a ciascun pulsante.

 var   idx: intero; inizio   per idx: = 0 per -1 + ComponentCount fare   inizio     Se Componenti [idx] è TButton poi ListBox1.AddObject (TButton (Components [idx]). Didascalia, Components [idx]);   fine; fine; 

Per "fare clic" a livello di codice sul pulsante "secondo", è possibile utilizzare la seguente istruzione:

 TButton (ListBox1.Items.Objects [1]); click. 

Voglio assegnare i miei oggetti personalizzati all'elemento String

In una situazione più generica dovresti aggiungere istanze (oggetti) delle tue classi personalizzate:

 genere   TStudent = classe   privato     fName: string; anno: numero intero;   pubblico     proprietà Nome : stringa letta fName;     proprietà Anno: intero leggere FYear;     costruttore Creare(const nome : corda; const anno: intero);   fine; ... costruttore TStudent.Create (const nome : corda; const anno: intero); inizio   fName: = nome; anno: = anno; fine; -------- inizio   // aggiungi due stringhe / oggetti -> studenti all'elenco   ListBox1.AddItem ('John', TStudent.Create ('John', 1970)); ListBox1.AddItem ('Jack', TStudent.Create ('Jack', 1982));   // prendi il primo studente - John   studente: = ListBox1.Items.Objects [0] come TStudent;   // mostra l'anno di John   ShowMessage (IntToStr (student.Year)); fine; 

Ciò che crei deve essere gratuito

Ecco cosa ha da dire la Guida sugli oggetti nei discendenti di TStrings: l'oggetto TStrings non possiede gli oggetti aggiunti in questo modo. Gli oggetti aggiunti all'oggetto TStrings esistono ancora anche se l'istanza TStrings viene distrutta. Devono essere esplicitamente distrutto dall'applicazione.

Quando aggiungi oggetti alle stringhe - oggetti che crei - devi assicurarti di liberare la memoria occupata, o avrai una perdita di memoria

Una procedura personalizzata generica FreeObjects accetta una variabile di tipo TStrings come unico parametro. FreeObjects libererà tutti gli oggetti associati a un elemento nell'elenco delle stringhe Nell'esempio sopra, "studenti" (classe TStudent) sono collegati a una stringa in una casella di riepilogo, quando l'applicazione sta per essere chiusa (modulo principale OnDestroy event, per esempio), è necessario liberare la memoria occupata:

 FreeObjects (ListBox1.Items); 

Nota: questa procedura viene chiamata solo quando gli oggetti assegnati agli oggetti stringa sono stati creati dall'utente.