Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: petrusic - Aprile 21, 2025, 04:59:46 pm

Titolo: [Risolto] intercettare il click su un controllo qualsiasi della form
Inserito da: petrusic - Aprile 21, 2025, 04:59:46 pm
Ho una difficoltà da superare:
Dovrei infatti intercettare il click , quando esso avviene su un pulsante sella Form corrente, senza permettere l'esecuzione della pocedura "EXIT" del controllo attivo ad un dato momento.

Nella mia Form ho una combobox, dove forzo la parte iniziale del testo da completare con la digitazione.
Supponiamo che la mia ComboBox si chiami "CBDescr".
Normalmente,  nella procedura "CBDescrExit",  mi accerto che la digitazione di completamento del testo sia avvenuta
Codice: [Seleziona]
procedure TForm2.CBDescrExit(Sender: TObject);
 . . .
begin
  if (Length(CBDescr.Text) > 0) then
  begin
    if Form2.RBCauPreMom.Checked then
    begin
      if (RightStr(CBDescr.Text, 5) = 'per: ') or (RightStr(CBDescr.Text, 4) = 'per:') then
      begin
        ShowMessage('Causale per Prestiti momentanei incompleta' + LineEnding + '*** Manca la 2.a parte ***' + LineEnding + LineEnding + 'COMPLETA la causale per proseguire');
        swPremomErro:= True;
   end;
... bla...bla...

Se però non viene immesso nessun carattere e viene eseguito un click del mouse sul pulsante |ESCI| per abbandonare la Form e tornare alla Form precedente, NON riesco ad evitare i controlli eseguiti dentro la suddetta procedura e NON riesco ad abbandonare  immediatamente la Form.
E' possibile intercettare nella procedura CBDescrExit l'avvenuto click sul pulsante |ESCI|?


Titolo: Re:intercettare il click su un controllo qualsiasi della form
Inserito da: DragoRosso - Aprile 21, 2025, 07:37:21 pm
Io faccio così (VALE PER WINDOWS, non sò se sotto Linux si può seguire la stessa logica):

1) Setto un flag (var. booleana) che imposto a True quando entro nella procedura ENTER del controllo;

2) Resetto tale flag solo se vengono soddifatte delle condizioni (normalmente nella procedura ONChange o simile);

3) Se all'uscita della Form trovo il flag attivo (ad esempio nel Click del pulsante ESCI) ignoro l'uscita e rimetto il focus sul controllo.

4) Come opzionale inserisco nell'evento EXIT del controllo la messa a false del flag se occorrono le condizioni (ad esempio mi và bene un testo vuoto nel controllo).

5) Tieni presente che l'evento EXIT viene generato solo se PREMI con il mouse (o con la barra dello spazio) un qualsiasi controllo diverso nella form: NON VIENE GENERATO se esci dalla form chiudendola tramite le "scorciatoie" o tramite un "CTRL" "F4"

Ciao.
Titolo: Re:intercettare il click su un controllo qualsiasi della form
Inserito da: petrusic - Aprile 21, 2025, 10:06:51 pm
Io faccio così (VALE PER WINDOWS, non sò se sotto Linux si può seguire la stessa logica):
1) Setto un flag (var. booleana) che imposto a True quando entro nella procedura ENTER del controllo;
2) Resetto tale flag solo se vengono soddifatte delle condizioni (normalmente nella procedura ONChange o simile);
3) Se all'uscita della Form trovo il flag attivo (ad esempio nel Click del pulsante ESCI) ignoro l'uscita e rimetto il focus sul controllo.
4) Come opzionale inserisco nell'evento EXIT del controllo la messa a false del flag se occorrono le condizioni (ad esempio mi và bene un testo vuoto nel controllo).
5) Tieni presente che l'evento EXIT viene generato solo se PREMI con il mouse (o con la barra dello spazio) un qualsiasi controllo diverso nella form: NON VIENE GENERATO se esci dalla form chiudendola tramite le "scorciatoie" o tramite un "CTRL" "F4"

Cerco di chiarire meglio: Io dovrei intercettare il click del mouse dentro la Form contenente sia il controllo "CBDesr", sia il controllo "BPulEsci". Quando clicco col mouse sul controllo "BPulEsci", il focus  si trova nel controllo "CBDesr", allora viene automaticamente schedulato automaticamente l'Evento OnExit al quale è agganciata la procedura "CBDescrExit. Quindi dovrei intercettare l'avvenuto Click su  "BPulEsci" per abbandonare tale procedura e permettere l'attivazione del Focus sul controllo  "BPulEsci".

Da quello che tu dici, mi pare di capire che non esista un meccanismo che risponda alle mie necessità.
Titolo: Re:intercettare il click su un controllo qualsiasi della form
Inserito da: petrusic - Aprile 21, 2025, 10:53:16 pm
Ho Risolto:
Ho modificato il programma eliminando i controlli relativi al completamanto della digitazione della 2.a parte del testo della ComboBox CBDescr che avevo inserito nella procedura CBDescrExit. Ho spostato tali controllo dentro una procedura comune che richiamo dentro ciascuna procedura "NomeControlloEnter".

Ora funziona tutto esattamente come volevo io.
 :D

comunque., grazie.