* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Luglio 16, 2025, 02:46:44 pm

Inserisci il nome utente, la password e la durata della sessione.

141 Visitatori, 0 Utenti

Autore Topic: StringGrid: eventi OnClick e OnDblClick  (Letto 87 volte)

petrusic

  • Hero Member
  • *****
  • Post: 678
  • Karma: +0/-0
StringGrid: eventi OnClick e OnDblClick
« il: 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   :-\
« Ultima modifica: Luglio 15, 2025, 04:09:48 pm da petrusic »
ciao ciao

petrusic

  • Hero Member
  • *****
  • Post: 678
  • Karma: +0/-0
Re:StringGrid: eventi OnClick e OnDblClick
« Risposta #1 il: 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.
ciao ciao

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1613
  • Karma: +50/-0
  • Prima ascoltare, poi decidere
Re:StringGrid: eventi OnClick e OnDblClick
« Risposta #2 il: 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.
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

petrusic

  • Hero Member
  • *****
  • Post: 678
  • Karma: +0/-0
Re:StringGrid: eventi OnClick e OnDblClick
« Risposta #3 il: 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 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
ciao ciao

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1613
  • Karma: +50/-0
  • Prima ascoltare, poi decidere
Re:StringGrid: eventi OnClick e OnDblClick
« Risposta #4 il: 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 ?
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

 

Recenti

How To

Utenti
Stats
  • Post in totale: 19862
  • Topic in totale: 2394
  • Online Today: 205
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 141
Total: 141

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.