Memorizza una stringa insieme a una stringa nel ListBox di Delphi

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?

Vi sono situazioni in cui si desidera visualizzare a elenco di stringhe all'utente, ad esempio nel controllo della casella di riepilogo, ma ha anche un modo per 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).

instagram viewer

ListBox. Oggetti - 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 ciascuno dei 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. Elementi. Inserisci metodo per aggiungere stringhe all'elenco, per associare un oggetto a ciascuna stringa, sarà necessario utilizzare un altro approccio.

Il ListBox. Elementi. 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 degli articoli. AddObject.

Due stringhe per una stringa

Dal momento che entrambi gli articoli. AddObject e 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 eventi OnCreate del modulo) insieme al riferimento a ciascun pulsante.

var idx: intero; inizioper idx: = 0 per -1 + ComponentCount fareinizioSe 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]) Fare clic; 

Voglio assegnare i miei oggetti personalizzati all'elemento String

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

genere TStudent = classeprivato fName: string; anno: numero intero; pubblicoproprietà Nome: stringa letta fName; proprietà Anno: intero leggere FYear; costruttore Creare(const nome: corda; const anno: intero); fine;... costruttore TStudent. Creare(const nome: corda; const anno: intero); inizio fName: = nome; anno: = anno; fine; inizio// aggiungi due stringhe / oggetti -> studenti all'elenco ListBox1.AddItem ('John', TStudent. Crea ('John', 1970)); ListBox1.AddItem ('Jack', TStudent. Crea ('Jack', 1982)); // prendi il primo studente - John studente: = ListBox1.Items. Objects [0] come TStudent; // mostra l'anno di John ShowMessage (IntToStr (studente. Anno)); 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, altrimenti 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 di stringhe Nell'esempio sopra, "studenti" (classe TStudent) sono collegati a una stringa in una casella di riepilogo, quando l'applicazione sta per essere chiusa (ad esempio l'evento OnDestroy del modulo principale), è necessario liberare la memoria occupato:

 FreeObjects (ListBox1.Items); 

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

instagram story viewer