Newsgroup: it.comp.lang.delphi
Titolo: DBLookupComboBox e prima riga vuota

Ciao a tutti,
ho una serie di componenti come da oggetto che prelevano un dato da DB
MySQL e lo visualizzano nella tendina. Se il DBLookupComboBox non è
selezionato, per default mi visualizza un campo vuoto fino a che
l'utente non seleziona un valore; ma se l'utente sbaglia? Attualmente
non è possibile tornare allo stato iniziale, ovvero non selezionare
alcuna voce da tendina ma lasciarlo vuoto. E' possibile inserire un
testo "--seleziona--" o anche lasciarlo vuoto, ma dare la possibilità
all'utente in caso di errore di selezionare una voce vuota o nulla che
non corrisponda a niente?
Spero di essermi spiegato.
Grazie


In linea di massima cio' che chiedi e' "brutto".
Se ho una tabella di lookup, vuol dire che devo trascodificare un dato
ben preciso.
Se ipotizzo di voler lasciare il dato nullo non averi nessuna
corrispondenza nella tabella di lookup.
Piuttosto prevedi nei valori di lookup un dato [da definire] ed
assegna il suo codice come default al campo.
In questo modo non hai campi nulli e la lookup non deve gestire
eccezioni.
ciao
S

 ma se l'utente sbaglia?
Non è contemplato lo "sbaglio" per la DBLookupCombobox :-)
Non scherzo, però. E' il concetto stesso di "look up" che lo impedisce.
Non è contemplato tanto quanto non lo è per un radiogroup, per esempio.
Una volta che hai selezionato un valore, puoi al limite cambiarlo.
Se ti serve un'altra cosa, userai un altro componente.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 non corrisponda a niente?
Certamente. In generale, non devi agire sul controllo visuale, ma quando 
hai a che fare con dei generici "data control" è meglio fare riferimento 
direttamente al DataSet, cioè al componente che contiene i dati cui fa 
riferimento il controllo in esame.
Nel tuo caso, hai un controllo *TDBLookupComboBox* che modifica il campo 
(indicato dalla proprietà "DataField") assegnando l'ID del record 
selezionato nella tabella correlata. Puoi quindi impostare il campo al 
valore "nullo" (NULL) per annullare automaticamente la selezione di un 
record nella tabella correlata.
Se non ricordo male, è possibile usando la combinazione di tasti 
<CTRL+DEL> quando il controllo possiede il focus. Io comunque suggerirei 
di aggiungere un pulsante al Form, magari collegato ad un'azione (quindi 
molto più facilmente controllabile, anche a livello di stato di 
abilitazione a seconda della modalità attiva sul record), che invochi il 
metodo /Clear/ del campo interessato.
   MyDataSet.FieldByName('EXTERNALID').Clear;
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)

 assegna il suo codice come default al campo.
Per me è una soluzione meno elegante e comoda rispetto all'avere un 
valore nullo, che è un valore particolare per il quale non avrei bisogno 
di definire alcun "caso specifico o particolare" all'interno del DB o 
dell'applicazione Delphi che identifichi il record con ID pari a 0, o a 
1, per esemplificare, indicando che è il record corrispondente al valore 
effettivo non assegnato.


 quindi non faccia riferimento ad alcun record nella tabella correlata.
Non concordo assolutamente.
I valori Null sono ambigui e da evitare il piu' possibile.
Se il campo e' associato ad una lookup accettando il campo Null generi
un'eccezione nel sistema di gestione.
ciao
S

 un'eccezione nel sistema di gestione.
Non avviene alcuna eccezione, tant'è vero che il controllo supporta 
addirittura una combinazione di tasti per impostarlo (vedi proprietà 
"NullValueKey", quindi il presunto "sistema di gestione", oltre a 
prevederlo, lo supporta addirittura ampiamente.


Mmmm avevo già provato ad assegnare il tasto DEL al NullValueKey ma
quando lo provo mi da access violation. Devo settare qualcos'altro
anche? Ora sto inserendo dei CheckBox in modo da gestire l'attivazione/
disattivazione dei DBLookup (ogni volta che viene flaggato, il
DBLookup si dovrebbe azzerare e tornare alla posizione di defult con
valore nullo) ma onestamente non mi piace molto come soluzione, non è
ottimale. Devo recuperare dello spazio dal form per inserire degli
oggetti la cui utilità è solo quella di azzerare il DBLookup e
riportarlo alla posizione di default. Anche la soluzione del
NullValueKey non mi sembra molto user firendly, nel senso che non è
immediata; se la DBLookup per default ha valore nullo e per cambiarlo
devi agire con i tasti freccia andando su e giu, non vedo perchè non
possa tornare al valore nullo sempre con lo stesso procedimento. Forse
sono ancora mentalmente proiettato all'ambito web che risulta molto
più semplice ma a prescindere da questo, credo che fosse stato meglio
aggiungere una proprietà in più al DBLookup in modo da poterlo gestire
pienamente aumentandone le possibilità di utilizzo.

 un'eccezione nel sistema di gestione.
Mica vero.


 riportarlo alla posizione di default. [...]
Basta un pulsante dalle dimensioni ridottissime, magari con un'icona 
rappresentativa.


 inizializzato di conseguenza?
Mah, codice che si basa sulla selezione del campo ce l'ho ma è
riferito all'evento OnClick del DBLookup e da debug quando premo il
tasto Del (configurato come NullValueKey) non entra nemmeno in quella
procedura dandomi subito access violation.

colde ha scritto:


Puo essere questo il motivo?
http://qc.borland.com/wc/qcmain.aspx?d=3256
Ciao
ACSH


 questo articolo e` stato inviato via web dal servizio gratuitohttp://
www.newsland.it/newssegnala
 gli abusi ad 
a...@newsland.it
Credo proprio di si. Il DataField non l'ho settato.

 Credo proprio di si. Il DataField non l'ho settato.
In tal caso, direi che le funzionalità di "lookup" difficilmente 
funzioneranno. :-)
Come puoi utilizzare quel controllo senza andare ad impostare i dati 
fondamentali, dal punto di vista logico, cioè la tabella e il campo in 
cui riportare il valore? :-|
Dovresti leggere *tutta* la documentazione del controllo, non solo una 
parte.



Eh Marco, come potevo passare un finesettimana senza nemmeno ricevere
uno dei tuoi consigli sul mio metodo errato di "studiare"? Almeno una
volta a settimana devo farmelo dire in qualche modo o non ci dormo la
notte! Ormai è una regola. ;)
Scherzi a parte, il campo DataField è veramente nullo eppure la
DBLookup funziona e fa il suo dovere. Tranne ovviamente il solito
discorso del valore nullo. I dati fondamentali per poter recuperare i
campi e la tabella da utilizzare sono inseriti in KeyField come valore
da recuperare dalla selezione (che a seconda delle esigenze è
impostato come ID piuttosto che il valore di altri campi usati come
chiave) e ListField che contiene il campo da visualizzare nella
DBLookup.

 DBLookup funziona e fa il suo dovere. [...]
Mi pare molto strano: il compito principale della "lookup", a parte il 
piegarla a scopi alternativi, è quello di impostare un campo con il 
valore della chiave del campo correlato di un'altra tabella; se tu non 
dici al controllo qual è il campo da scrivere, come può avvenire questa 
assegnazione?
