Newsgroup: it.comp.lang.delphi
Titolo: Gestione Evento onClick

Salve a tutti!
In questo Lunedì di pasquetta volevo chiedere un consiglio sulla 
gestione di eventi, e nello specifico onClick.
Mi spiego:
Ho un componente TListBox che carica i suoi item dinamicamente.
Adesso poichè questi item hanno una serie di informazioni che vorrei 
visualizzare quando clicco sull'item.
Adesso io ho creato una procedura per restituirmi il valore, ma se 
associo la procedura all'evento onClick ... beh .. ottengo come errore 
il fatto che la procedura non è di tipo TNotifyEvent ...
La mia domanda è come si gestice dinamicamente l'evento onClick visto 
che una chiamata tipo TListBox1.onClick := MiaProcedura(indice, testo) 
mi da un errore?
Grazie e Buona Pasquetta!
-- 
Bartolotta Gioachino
devel...@rockitalia.com
ICQ: #9103167

 testo) mi da un errore?
La procedura che intendi assegnare ad un evento deve essere procedure
of object. Le procedure dichiarate in questo modo passano anche un
parametro Self nascosto che le differenzia dalle normali procedure.
Molto semplicemente prova a creare una procedura che appartenga al form
su cui depositi il ListBox, ovviamente con il parametro Sender:
TObject. Di seguito un stralcio di codice:
private
  { Private declarations }
  procedure ClickListBox(Sender: TObject);
e dove vuoi l'assegnazione dell'evento OnClick:
  ListBox1.OnClick := ClickListBox;
Ciao
Antonio

 Antonio


 nome := MenuList.Items.ValueFromIndex[i];
Onestamente non lo so ;-) Però prova con quest'altro codice:
Label1.Caption := MenuList.Items[MenuList.ItemIndex];
Ciao
Antonio

)

 
-- 


 miaLabel := ListBox1.Items.Strings[i];
Le varianti possono essere milioni una volta compreso il meccanismo, in
base alle necessità che ci si trova ad affrontare.
Per essere pignoli, molto pignoli, la scrittura che hai riportato sembra
non essere del tutto corretta, ammesso che a "miaLabel" corrisponda un
oggetto di tipo TLabel.
Meglio una cosa del genere:
===
  ...
  i := ListBox1.ItemIndex;
  if i > -1 then
    MiaLabel.Caption := ListBox1.Items[i];
  ...
===
Ricordati di introdurre - in generale - il controllo che ItemIndex sia
diverso da -1, caso che avviene quando non vi sono elementi selezionati
oppure la lista è vuota. Chiamare ListBox.Items[i] usando un indice
uguale a -1 darebbe luogo ad un'eccezione tra le più classiche: "List
index out of bounds".


 il primo carattere?
Ciao,
  leggi la mia spiegazione ad un problema analogo, ma con l'uso della
ListView al posto della ListBox:
http://makeashorterlink.com/?M28613008
In generale, quando ti accingi ad utilizzare metodi, proprietà e
procedure, posizionati sul nome dell'identificatore e premi F1 per
richiamare la Guida in linea che provvederà a visualizzarti l'argomento
corrispondente (se esiste).
Un corretto uso della guida è essenziale in Delphi, anche se purtroppo
richiede una minima dimestichezza con la lingua inglese, che a livello
puramente tecnico non dovrebbe costituire un serio problema.
Leggendo la Guida, verifica con attenzione che ciò che stai utilizzando
non abbia impieghi e scopi differenti da quello voluto.


 corrisponda un
Secondo me essere pignoli diventa importante per scrivere codice
corretto e facilmente manutenibile. Io avrei scritto *anche* in questo
modo:
Assert(ListBox1.ItemIndex > -1, 'Selezionare almeno un item');
Label1.Caption := ListBox1.Items[ListBox1.ItemIndex];
Due principi che a me piacciono molto: 
1. Uso delle asserzioni in pre-condizione
2. Refactoring per l'eliminazione di variabili
Ciao
Antonio

 
-- 


 funzionamento corretto di Assert?
In breve (ma molto in breve ;-) ) le asserzioni sono dei test che
devono essere veri altrimenti viene sollevata un'eccezione. Esistono
asserzioni pre-condition e post-condition. La prima verifica che una
condizione sia vera prima di un'istruzione mentre l'altra la verifica
dopo l'esecuzione di un'istruzione. In questo modo sei sicuro che
all'ingresso o all'uscita i tuoi parametri siano sempre rispettati,
quindi principalmente è per fini di debug e per scrivere codice che
presenti pochi bug.
Hanno anche l'utilità di rendere il codice maggiormente leggibile
rispetto alle condizioni IF. Inoltre, possono essere eliminate dal
codice eseguibile con una semplice direttiva del compilatore una volta
accertato che il codice funzioni senza problemi.
Probabilmente l'esempio precedente non è molto indicato per
un'asserzione ma era solo per illustrarne il concetto.
Ciao
Antonio

 Label1.Caption := ListBox1.Items[ListBox1.ItemIndex];
Io non avrei mai usato Assert() in questo caso, poichè la condizione
  ListBox.ItemIndex = -1
si può verificare normalmente e non rappresenta un "caso limite".
Io delego l'uso delle asserzioni nei soli casi in cui una condizione
debba o non debba verificarsi e, comunque, che tale condizione
rappresenti un errore.
A parte questo, sono d'accordo che il codice postato potesse essere
oltremodo ottimizzato, ma ho preferito seguire l'ottica dell'Original
Poster per non complicare ulteriormente l'argomento del thread sul quale
volevo fare chiarezza...mentre con l'introduzione dell'argomento
"asserzioni" credo che le acque siano state ben rimescolate, tra l'altro
in una situazione nella quale secondo me non servono. :-)


 l'altro in una situazione nella quale secondo me non servono. :-)
Senz'altro ho rimescolato un pò ;-). Se servono o non servono dipende
sempre dal contesto, secondo me ;-)
Ciao
Antonio

 sempre dal contesto, secondo me ;-)
Sarň testardo, ma io continuo a sostenere che il contesto presentato non
sia adatto alle asserzioni, se non per una lunga serie di presupposti
che - a quel punto - andavano dettagliati per non scaraventare
l'Original Poster nella confusione totale, data la semplicitŕ
complessiva della domanda iniziale. :-)


 semplicità complessiva della domanda iniziale. :-)
Sei testardo, ma hai ragione da vendere :-)) Non ho considerato proprio
il fatto che un item possa o meno essere selezionato. ;-)
Ciao
Antonio