Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: xinyiman - Dicembre 04, 2013, 06:35:14 pm

Titolo: Domande PickList
Inserito da: xinyiman - Dicembre 04, 2013, 06:35:14 pm
Come posso assegnare ad una picklist di una dbgrid un evento per capire quando viene cambiato il valore selezionato? E quindi gestire l'evento da me? E come posso fare per far si che l'utente può usare solo i valori della picklist e non inseribili da tastiera?

Codice: [Seleziona]
               if Self.DBGrid2.Columns[i].FieldName='CATEG_MERC' then
               begin
                    Self.DBGrid2.Columns[i].ButtonStyle:=cbsPickList;
                    Self.DBGrid2.Columns[i].PickList:=appPL;
               end;
Titolo: Re:Domande PickList
Inserito da: nomorelogic - Dicembre 05, 2013, 09:19:54 am
Per fare qualcosa dopo aver selezionato un valore dovresti usare l'evento OnEditingDone.

Per essere sicuro che l'utente abbia selezionato solo uno dei valori possibili non saprei ma puoi sempre verificare il dato inserito nell'evento sopra.


Quando scrivi:
Codice: [Seleziona]
Self.DBGrid2.Columns[i].PickList:=appPL;

Secondo me ottieni un cosiddetto lack of memory.
In pratica i 2 oggetti (PickList e appPL) sono sempre instanziati in memoria ma con l'operazione sopra assegni il puntatore PickList in modo che punti all'oggetto appPL. Di conseguenza PickList non essendo più referenziato da nessuno, nessuno lo distruggerà (quando verrà liberata la griglia, in realtà verrà distrutta la stessa istanza di appPL).

Dovresti fare:
Codice: [Seleziona]
Self.DBGrid2.Columns[i].PickList.AddStrings(appPL);

In questo modo le 2 istanze sono sempre referenziate ed è possibile liberare la memoria.