Newsgroup: it.comp.lang.delphi
Titolo: Click Btn

Forse mi sto perdendo in una stronzata, ma oggi ho caldo...
Ho un edit e un button, focus su edit, clicco il bottone che fa quello che 
deve fare.
Se però gestisco l'onexit dell'edit, magari dando un messaggio all'utente, 
il click del button non scatta, credo cioè che sente il mouse down ma a 
causa dell'onexit poi non sente il mouseup. Come posso fare perchè il click 
del bottone avvenga ugualmente, senza rinunciare al'onexit?
Gianni 


ma tu gestisci o no il mousedown? :-|
A.

> ma tu gestisci o no il mousedown? :-|
No. Gestisco solo il click del button e l'exit dell'edit: quando clicco sul 
button, gli eventi che scattano sono, in ordine: exit dell'edit, mousedown e 
mouse up del button. cliccando sul bottone, la prima cosa che capita è che 
viene scatenato l'exit dell'edit, quindi il bottone fa in tempo a ricevere 
solo il mousedown. Se nell'onexit dell'edit non gestisco GUI (p.e. nessun 
messaggio all'utente), il bottone poi sente anche il mouseup quindi completa 
il click, se invece mi intrometto con qualcosa che interrompe la sequenza, 
il mouse up viene perso, => non viene eseguito il click.
Un effetto collaterale è il seguente: spostando il mouse di nuovo sopra il 
bottone, il bottone graficamente viene schiacciato, come quando si fa click, 
cioè come se lo stessi premendo, ma non succede nulla. E' come se fosse 
rimasto bloccato su una posizione intermedia dalla quale non sa sbloccarsi.
Gianni

 il mouse up viene perso, => non viene eseguito il click.
Esattamente cosa fai per "interrompere la sequenza"? Puoi postare un 
pezzo di codice ?
ciao
Giacomo


Assolutamente semplice: metti in una form un edit ed un bottone e scrivi 
questi due eventi:
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage( 'sono il bottone 1' );
end;
procedure TForm1.Edit1Exit(Sender: TObject);
begin
ShowMessage( 'sono l''edit1 ' );
end;
Commenta lo showmessage in editexit1 Focus su Edit1, clicca il bottone: il 
botttone ti da un messaggio. clicca il bottone di chiusura della form 
(quello in alto a dx sulla barra del titolo): la form si chiude.
Ora abilita il msg nell'exiit dell'edit: focus su edit, click su bottone: 
l'edit ti da il messaggio, il bottone no, se col mouse vai sopra il bottone 
il bottone si schiaccia senza che tu stia schiacciando, ma non genera cmq il 
click. Inoltre, prova adesso a cliccare il bottone di chiusura della form 
(quello in alto a dx sulla barra del titolo): ti serviranno due click perchè 
il primo viene mangiato da qualcuno.....
Ciao Gianni 

 ha scritto nel messaggio 
news:eb7kp0$i8d$1...@nnrp.ngi.it...

Hai pensato ad inserire entrambi separati all'interno di un TPanel? Useresti 
OnExit del TPanel, credo senza inconvenienti alcuno
Giorgio 


Allora: mettendoli su due panel diversi, la cosa non cambia.
Mettendoli entrambi dentro un unico panel, quando clicco il bottone non 
scatta l'exit dell'edit (ovviamente).
Il problema è che io voglio che scatti l'exit, perchè li ci ho messo un 
controllo sul contenuto dell'exit, contenuto che va controllato prima che il 
bottone esegua la sua procedura.
In pratica, io posso avere n edit, ognuno con un proprio controllo 
specifico, ed m bottoni che si aspettano di trovare dei contenuti 
"appropriati". Tutto questo potrei farlo facendo si che ogni bottone, prima 
di eseguire la propria procedura, chiami un metodo generale di conferma di 
tutti gli edit. La cosa però avrebbe degli inconvenienti (ad es, se il campo 
è numerico all'uscita mi scattano delle procedure di calcolo, che quindi 
devono trovare un numero ben formattato nel campo che abbandono). Inoltre, 
poichè quello che controllo sono in genere delle formattazioni, vorrei 
centralizzare questi controlli direttamente nell'edit, cioè derivare da 
TEdit ed aggiungere poche ma utili cosine...
Non so se sto incasinadno tutto per nulla ;-)
Gianni 

 scatta l'exit dell'edit (ovviamente).
Si che scatta, come scattera' anche quello del panel quando te ne vai da 
questo.
Il TPanel funge da contenitore per i due controlli e non va ad interferire 
sul loro normale funzionamento,
associandoli dal punto di vista grafico, come volevi. Se scegli bene le 
misure, i colori, ecc puoi fare in modo che il tpanel
quasi non si noti.
Cmq se l'OnClick non si verifica puoi sostituirlo senza alcun inconveniente 
col'OnMouseUp.
Ciao Giorgio 

 Ciao Giorgio
Scusa, ho sbagliato a scrivere (la fretta..)
Volevo scrivere "mettendo tutto in un panel, con il click sul bottone non 
scatta l'exit del panel", quindi se ho spostato qui il codice prima scritto 
nell'exit dell'edit, non ottengo quello che desidero.
Se sostituisco l'onclick con l'onmouseup, non ottengo quanto voluto perchč č 
proprio il mouseup che non viene piů sentito (vedi primo post). Piuttosto, 
la cosa funzionerebbe gestendo il mousedown (che scatta cmq e sempre dopo 
l'exit dell'edit).... forse č l'unica strada.
Ciao Gianni 

> inconveniente col'OnMouseUp.
Non hai letto bene la mia risposta: quando clicchi il button si attiva 
l'OnExit dell'Edit con la differenza che non dovresti avere piu'
alcuna interferenza tra i due componenti.
Giorgio 


Ho provato ma ce l'ho ancora. Con il mouseup ho addirittura un ulteriore 
effetto ancora più strano: clicco sul bottone e scatta l'onexit dell'edit => 
mi viene dato un messaggio, il bottone rimane "straviato" come spiegato 
prima. Se ora clicco un qualsiasi altro bottone, compreso quello che chiude 
la form, mi viene dato il messaggio che ho messo sul mouseup del primo 
bottone.. Mah! 


La combinazione che ti ho suggerito l'ho usata piu' volte senza alcun 
problema. Naturalmente il Button NON VA inserito all'interno dell'EDIT ma 
entrambi SEPARATI all'interno del TPanel, usando i componenti nativi Delphi.
Se e' cosi' hai qualcos'altro che non va al di fuori dei due componenti. Non 
e' che hai modificato il codice originale di uno di essi sulle VCL?
Giorgio 

bottone.. Mah!
Ciao, Gianni,
ho letto l'interessantissimo posto che hai provocato: non sarebbe la 
prima volta che accade "l'insondabile"... ma fammi un po' capire: tu, 
all'inizio, hai postato le righe di codice del "OnClick" e 
dell'"OnExit"; secondo quanto hai scritto, non è possibile che succeda 
il pandemonio da te descritto; assolutamente!!; quindi:
- o le righe di codice non sono quelle (nascondi qualcosa)
- o fra i metodi dei componenti hai collegato (magari inavvertitamente) 
qualche azione che diviene ridondante ew fa andare in loop il sistema;
- o da qualche altra parte del programma, in qualche altra Unit 
collegata, hai inserito qualche variabile pubblica che hai richiamato in 
questa Unit o hai utilizzato variabili riservate di Delphi;
Controlla in Object Inspector tutti i collegamenti ai vari campi e 
metodi dei due componenti; altrimenti, cancella completamente la Unit e 
riscrivila con attenzione: tutto dovrebbe funzionare: è alquanto 
elementare e per così poco non può impallarsi!!!
Buon lavoro
NioBi
--- posted by geoForum on 
http://www.delphiedintorni.it

Vi ringrazio, ma questo punto non capisco e sudo.....
Vi assicuro che:
- sto usando D4 (sono in attesa di passare a qsa di più recente)
- NON ho modificato la VCL (almeno non consapevolmente)
- non linco unit particolari
- non ho sovrascritto componenti ( sarà un mio scopo ma sto solo facendo 
delle prove su componenti delphi)
quindi
- apro una applicazione nuova!
- metto un tedit e un tubutton nella form (tutta roba di delphi)
- scrivo l'evento onexit dell'edit come ho postato: mostra solo un msg1
- scrivo l'evento onclick del bottone come h opostato: mostra solo un msg2
- lancio l'applicazione
- porto il focus sull'edit
- con il mouse clicco il bottone: mi comapre il msg1 dell'exit dell'edit, 
non i compare quello del bottone, il bottone rimane un po' incastrato...
PERO' ho provato con tre macchine diverse e ho sempre lo stesso 
atteggiamento! :-(((((
cosa mi può essere successo? Se volessi verificare se qualche unit della VCL 
è stata erroneamente modificata, come potrei fare?
Ciao Gianni

Allora, ho provato anche con BDS2006 e ho lo stesso risultato!!!
Gianni 

 ha scritto nel messaggio
news:4k2v09F...@individual.net...
:
: Ciao, Gianni,
: ho letto l'interessantissimo posto che hai provocato: non sarebbe la
: prima volta che accade "l'insondabile"... ma fammi un po' capire: tu,
: all'inizio, hai postato le righe di codice del "OnClick" e
: dell'"OnExit"; secondo quanto hai scritto, non è possibile che succeda
: il pandemonio da te descritto; assolutamente!!; quindi:
Mi dispiace, NioBi, ma io ottengo esattamente lo stesso risultato di Gianni
facendo questi passaggi:
1) creo una nuova applicazione
2) metto un TEdit e sull'evento OnExit un Showmessage( ' Edit' )
2) metto un TButton e sull'evento OnClick un Showmessage( ' Button' )
Lanciando l'applicazione, per prima cosa dò il focus all'Edit, poi clicco
sul bottone e mi viene fuori l'effetto-Gianni, cioè prima di tutto il
Showmessage( 'Edit'), poi basta e se passo col mouse sul bottone questo
viene "abbassato" senza alcun intervento "meccanico" da parte mia.
Del showmessage legato al bottone neppure l'ombra
Andrea

Mi viene in mente una precisazione:
se nell'onexit dell'edit scrivo del codice che NON coinvolge l'interfaccia 
grafica (ad es eseguo dei calcoli, chiamo una routine di verifica dati, 
ecc ) l'effetto NON compare. Affinchè compaia, in questo evento devo proprio 
metterci qualcosa che "sembra interrompere la sequenza di messaggi" inviati 
ai componenti, per cui il bottone non sente il mouseup 

 ha scritto nel messaggio 
news:ebhpeb$v1$1...@nnrp.ngi.it...

Il ShowMessage e' modale? questo e' il motivo delle anomalie: cosa succede 
se dopo il click chiudi il primo ShowMessage?
Giorgio

Andando a rumare indietro ai tempi del C e delle prime applicazioni fatte in
ambiente Windows (con immensi switch... per gestire i messaggi) propendo
anch'io per il fatto che sia il codice di showmessage() a "mangiarsi"
qualche messaggio che, poi, crea lo scompiglio grafico scovato dall'amico
Gianni.
La soluzione, però, non la saprei indicare.
: Il ShowMessage e' modale?
Scusa, Giorgio, ma questa domanda mi stupisce un po' ....
Andrea


Si, è modale e lo voglio così. Quello che succede è quanto ho già descritto 
più volte 

Allora, correggiamo il tiro e la domanda, vediamo se arrivo a qualcosa...
Mettete un edit e una stringgrid su una form vuota. Gestiamo l'onexit 
dell'edit facendogli fare un semplice
ShowMessage( 'xxx' );
Lanciamo, focus su edit, cliso sulla griglia: compare il msg, poi quardate 
un po' cosa succede se vi muovete con il mouse sopra la griglia SENZA 
premere alcun tasto: la griglia rimane in uno "stato di MouseDown" (non so 
come meglio esprimermi) e se mi muovo la selezione delle cellle cambia 
continuamente, anche le scroll scorrono, ma io non sto facendo nulla e 
bottoni non ne sto prememdo. Mi serve almeno un click per ripristinare uno 
stato stabile.
La domanda è questa: una volta che ho dato il msg, esiste un modo per lo 
meno per togliere la griglia (o qualunque altro componente) da questo cavolo 
di stato instabile?
Gianni 

"Gianni" ha scritto nel messaggio

E' la corretta sequenza dei messaggi in Windows:
L'evento OnClick viene scatenato (dall'help):
when the user presses and releases the left mouse button with the mouse
pointer over the control.
Se interrompi il flusso delle azioni mostrando una finestra, questa 
intercetta
il "release" del bottone e l'evento non si scatena (com'e' giusto che sia:
deve scatenarsi l'evento OnMouseDown, come avevaprovato asuggerirti
qualche giorno fa Alberto). E' la stessa situazione in cui
tu premi il tasto destro sul bottone, sposti il cursore fuori dall'area del
controllo e rilasci il bottone: l'evento OnClick non si scatena.
Stai sbagliando la progettazione della tua interfaccia: vuoi che
Windows si comporti non come deve ma come vuoi tu. In questo caso,
non ti resta che lavorare postando dei messaggi personalizzati
del tipo WMUSER+valore.
Ciao
-- 
ACSH
[D4]
Chi fa da se', fatica il doppio

Bene, grazie, era quello che temevo. Ora: non è che voglio a tutti i costi 
modificare il comportamento di Ws, però mi fa arrabbiare il fatto che il 
bottone resti "incastrato". Come ho spiegato un un successivo post, dove 
traslo il problema su una stringgrid, mi basterebbe forse riuscire ad 
eliminare quello stato non stabile in cui rimane il componente. Questo mi fa 
arrabbiare perchè non capisco perchè debba rimanere in quello stato, cioè, 
tecnicamente mi va bene che non si è chiusa la sequenza, ma come hai ben 
detto, se faccio il mousedown dentro un bottone e il mouseup fuori, il click 
non si genera, però il bottone non rimane instabile! E' questo che mi urta.. 
Non c'è una soluzione tipo cancellare code di messaggi o altro?
Gianni 

 Mettete un edit e una stringgrid su una form vuota. Gestiamo l'onexit 

Come ti ho risposto nell'altro messaggio, sbagli a voler sistemare
gli effetti non desiderati dovuti ad una cattiva progettazione: devi
semplicemente fare in modo che, con una corretta gestione degli eventi,
questi effetti collaterali non compaiano.
Per il tuo problema, e' sufficiente utilizzare dei messaggi personalizzati,
in questa maniera:
const
// crei il tuo messaggio
WM_Controllo=wm_user+100;
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    StringGrid1: TStringGrid;
    procedure StringGrid1Click(Sender: TObject);
    procedure Edit1Exit(Sender: TObject);
  private
    { Private declarations }
  public
   // crei la procedura che gestisce il messaggio
   procedure ControllaEdit(var Message: TMessage); message WM_Controllo;
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Edit1Exit(Sender: TObject);
begin
 //lanci il tuo messaggio
 PostMessage(Self.Handle, WM_Controllo, 0, 0);
end;
procedure TForm1.StringGrid1Click(Sender: TObject);
begin
 showmessage('grid');
end;
procedure TForm1.ControllaEdit(var Message: TMessage);
begin
 // qui esegui tutti i controlli vorresti fare nell'onexit
 showmessage('edit');
 // qui generi un click sulla griglia
 // questa e' IMO una brutta cosa!
 Form1.StringGrid1Click(nil);
end;
PS: l'ho testato parecchio alla svelta, ma dovrebbe esssere tutto corretto


 il "release" del bottone e l'evento non si scatena (com'e' giusto che sia:
Il motivo e' dovuto al fatto che la ShowMessage come suggerivo a Gianni e' 
modale e di conseguenza blocca il flusso del programma,
non era una domanda stupida, ma il nocciolo del problema ;-)
Ciao Giorgio