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?
if Self.DBGrid2.Columns[i].FieldName='CATEG_MERC' then
begin
Self.DBGrid2.Columns[i].ButtonStyle:=cbsPickList;
Self.DBGrid2.Columns[i].PickList:=appPL;
end;
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:
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:
Self.DBGrid2.Columns[i].PickList.AddStrings(appPL);
In questo modo le 2 istanze sono sempre referenziate ed è possibile liberare la memoria.