Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: petrusic - Luglio 15, 2025, 03:48:36 pm

Titolo: StringGrid: eventi OnClick e OnDblClick
Inserito da: petrusic - Luglio 15, 2025, 03:48:36 pm
Ho già affrontato l'argomento ed avevo superato l'ostacolo agendo sulle procedure scatenate dai due eventi OnClick e OnDblClick.

Ora non riesco a capire come abbia potuto provocare un malfunzionamento del meccanismo costruito per l'occorrenza del Click, semplice o doppio.
Riporto qui sotto le due procedure:
Codice: [Seleziona]
. . .
var
  Form2: TForm2;

  statoGridDraw: TGridDrawState;

implementation         
. . .
swDblClick: Boolean = False;     
. . .

procedure TForm2.GridMovvClick(Sender: TObject);
begin
  swDblClick:= False;                                                                                                                                                                                             
  Sleep(200);//
  Application.ProcessMessages;                                                                                                                                                                                   
  if not swDblClick then
  begin                                                                                                                                                                                                                       
     BModifMovGridSel.Enabled:= True;
  end;
end;

procedure TForm2.GridMovvDblClick(Sender: TObject);
begin
  swDblClick:= True;
  if (RightStr(GridMovv.Cells[3, iyCell], 12) <> 'T O T A L I ') then
  begin
    RidigRgMovGridSel();
  end;
  CBDescr.SetFocus;
end;

Riporto anche le procedure GridMovvBeforeSelection e GridMovvSelectCell
Codice: [Seleziona]
procedure TForm2.GridMovvBeforeSelection(Sender: TObject; aCol, aRow: Integer);
begin
  iyCell:= aRow;
  ixCell:= aCol;
  if (RightStr(GridMovv.Cells[3, iyCell], 12) <> 'T O T A L I ') then
  begin
    Form2.GridMovv.Invalidate;
  end;
end; 

procedure TForm2.GridMovvSelectCell(Sender: TObject; aCol, aRow: Integer;
var CanSelect: Boolean);
var
  i, j, rgTotali: Integer;

begin
  rgTotali:= iyCell;
  if (RightStr(GridMovv.cells[3, iyCell], 12) =  'T O T A L I ') and (iyCell > 8)  and (GridMovv.cells[8, iyCell] <> 'F')then
  begin
    GridMovv.cells[8, rgTotali]:= 'F';       //  'F':  Riga Totali = Ultima riga della griglia, con Focus automatico ad ogni nuovo movimento inserito
    GridMovv.Col:= 2;
    GridMovv.Row:= rgTotali;
    GridMovvSelectCell(self, 2, (rgTotali), canselect);
    GridMovv.SetFocus;
  end;
end;

Il malfunzionamento che sto rilevando ora è che, allo scatenarsi dell'evento OnClick, l'esecuzione del programma si ferma, come se avessi impostato un breakpoint alla prima riga di begin della procedura, come si può vedere dall'allegato.
Aggiungo infine che l'evento OnBeforeSelection non viene scatenato. Ho inserito sia una riga Writeln sia un breakpoint, ma, quando clicco su una cella qualsiai della GridMovv, la procedura TForm2.GridMovvBeforeSelection non succede niente, proprio come se non venisse eseguita.

Fino a due giorni fa la gestione del doppio click funzionava benissimo   :-\
Titolo: Re:StringGrid: eventi OnClick e OnDblClick
Inserito da: petrusic - Luglio 15, 2025, 04:30:56 pm
Ho ripreso un file Form2.pas, sempre anomalo, però in esso la OnBeforeSelection funziona e cliccando col tasto destro del mouse sull'IDE si è aperta una finestra di Errore contenente il sehuete messaggio:
Citazione
Il file "sysdeps/unix/sysv/linux/poll.c" non è stato trovato.
Volete cercarlo da soli?

A questo punto penso che è meglio non avventurarmi oltre.
Titolo: Re:StringGrid: eventi OnClick e OnDblClick
Inserito da: DragoRosso - Luglio 15, 2025, 07:34:50 pm
In linea generale, usare sleep(xxx) all'interno del thread principale e ProcessMessages è sconsigliato.
Gli effetti che generano non sono così "visibilmente chiari e costanti" sopratutto in seguito ad un cambio di versione, di un aggiornamento del sistema operativo, del carico del PC, etc ...

Gli sleep(xxx) con xxx elevati (sempre all'interno del "main thread") sono poi assolutamente da non fare: in questo caso 200 ms. è più di dieci volte la normale granularità del timing di un sistema operativo (che normalmente è tra i 15 e i 16 ms.).

Ciò che funziona una volta (o anche 100 volte) non è detto che funzioni sempre.

Inoltre, sembra che ritornando "indietro" con le modifiche come hai accennato ottieni degli errori nuovi.

Quindi probabilmente il mix di modifiche ed elaborazioni genera qualche problema che sarà ben difficile da scovare.
Titolo: Re:StringGrid: eventi OnClick e OnDblClick
Inserito da: petrusic - Luglio 15, 2025, 09:44:04 pm
Francamente non mi aspettavo una simile esperienza negativa.
Il codice che ho costruito tempo fa per intercettare il doppio click sulla StngGrid  mi è stato suggerito dalla lettura di questo argomento (https://www.lazaruspascal.it/index.php?topic=613.msg5079;topicseen#msg5079) ed aveva funzionato sempre bene.

Il doppio click è indispensabile per produrre il trasferimento dei dati presenti nella riga selezionata della StringGrid nell'area di di digitazione sottostante, al fine di potere correggere o addirittura annullare la digitazione inserita per errore.
Senza il doppio click non saprei come dare il comando di trasferimento.

Oggi, preso dalla delusione di quanto scaturito, avevo pensato di gettare alle ortiche tutto il lavoro fatto fino ad ora con Lazarus. Questa voilta sono proprio avvilito. Venire fuori da questa anomalia non sarà facile
Titolo: Re:StringGrid: eventi OnClick e OnDblClick
Inserito da: DragoRosso - Luglio 15, 2025, 09:54:12 pm
Ad ogni esigenza c'è sempre una risposta, ed è anche più semplice di quello che si pensa.

Perchè non gestisci il tasto destro e sinistro del mouse (o quello centrale) con due eventi diversi invece del click e double click dello stesso tasto ?