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

Comprensione del metodo TStrings.AddObject

Linguaggio di programmazione

Getty Images/ermingut





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

Una proprietà comune a tutti i controlli precedenti è il Elementi proprietà. Gli elementi definiscono un elenco di stringhe che appariranno all'utente nel controllo. In fase di progettazione, quando si fa doppio clic sulla proprietà Items, 'String List Editor' consente di specificare gli elementi stringa. La proprietà Items è in realtà un discendente del tipo TStrings.



Due stringhe per elemento in un ListBox?

Ci sono situazioni in cui si desidera visualizzare a elenco di stringhe all'utente, ad esempio nel controllo casella di riepilogo, ma hanno anche un modo per farlo memorizzare un'altra stringa aggiuntiva lungo quella visualizzata dall'utente .

Inoltre, potresti voler memorizzare/allegare più di una semplice stringa alla stringa, potresti voler allega un oggetto all'elemento (stringa) .



ListBox.Items - TStrings 'conosce' gli oggetti!

Dai un'altra occhiata all'oggetto TStrings nella Guida in linea. C'è il Oggetti proprietà che rappresenta un insieme di oggetti associati a ciascuno dei stringhe nella proprietà Strings - dove la proprietà Strings 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'elemento. 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 corde per una corda

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



|_+_|

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

Non puoi semplicemente fornire 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 stringa in un oggetto: è necessario un oggetto TString personalizzato.

Un intero per una stringa

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



|_+_|

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

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

Per recuperare l'intero associato alla stringa, è necessario eseguire il cast di 'oggetto' sul valore intero:

|_+_|

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 allegare 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 form (inserirlo nel gestore dell'evento OnCreate del form) insieme al riferimento a ciascun pulsante.

|_+_|

Per 'fare clic' a livello di codice sul pulsante 'secondo', è possibile utilizzare l'istruzione successiva:

|_+_|

Voglio assegnare i miei oggetti personalizzati all'elemento stringa

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

|_+_|

Quello che crei devi liberarlo

Ecco cosa dice la Guida sugli oggetti nei discendenti di TStrings: l'oggetto TStrings non possiede gli oggetti che aggiungi in questo modo. Gli oggetti aggiunti all'oggetto TStrings esistono ancora anche se l'istanza di 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 un 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 precedente, gli 'studenti' (classe Tstudent) sono allegati a una stringa in una casella di riepilogo, quando l'applicazione sta per essere chiusa (evento OnDestroy della forma principale, per esempio), è necessario liberare la memoria occupata:

|_+_|

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