Bonjour,

sous Linux parce que sous Windows no problemo.

Soit une fiche sur laquelle se trouvent un TMemo pour logger et un TSpinEdit ("se") pour changer des valeurs en utilisant l'événement OnSpinEditChange.

On pourrait se dire qu'il n'y a rien de plus simple à part un "Hello World", mais c'est sans compter sur la sournoiserie du couple maudit FreePascal / Lazarus dans l'environnement Debian Bullseye 64 bits...

Démonstration avec un integer témoin, positionné à 1 et incrémenté à chaque entrée dans la proc seChange :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
procedure TForm1.seChange(Sender: TObject);
begin
  Log('seChange-in ');
  Temoin := Temoin + 1;
  Caption := IntToStr(temoin)+' '+IntToStr(temoin * se.Value); 
  Log('seChange-out');
end;
Je lance le prog et je clique dans le mémo (qui n'a aucun code, j'ai juste conservé sa première ligne avec son nom) et voilà ce qui apparait :
Nom : clic-dans-memo-avant-toute-action.png
Affichages : 120
Taille : 13,9 Ko

Alors je ferme, je relance, je ne clique pas dans le mémo mais plutôt sur la flèche du spinedit, et j'ai :
Nom : premier-2-12.png
Affichages : 115
Taille : 14,1 Ko
avec 12 en Caption, soit 2x6, ok,

et là, si je clique dans le mémo,
Nom : après-clic-dans-memo-second-3-18.png
Affichages : 115
Taille : 21,4 Ko
paf !, apparition de nouvelles valeurs en provenance directe de la proc du seChange : 18 = 3x6, le témoin a bien été incrémenté.

Pour me sortir de cette embrouille, j'ai trouvé cette combine : un booléen et deux lignes en plus dans la proc :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
procedure TForm1.seChange(Sender: TObject);
begin
  if boolseChange then begin boolseChange := False; Exit; end;
  Log('seChange-in ');
  Temoin := Temoin + 1;
  Caption := IntToStr(temoin)+' '+IntToStr(temoin * se.Value); //FloatToStr(Time);
  Log('seChange-out');
  boolseChange := True;
end;
Qu'est-ce que vous pensez de tout ça ? Bug ou pas bug ?
Parce que mine de rien, ce sont les calculs dans la proc seChange qui prennent cher et m'affichent des trucs pas sympas, du coup...

Vous allez me dire que je n'ai qu'à ne pas cliquer dans le mémo, oui, mais c'est lourd et est-ce que je vais pas masquer un autre problème ?
Parce que quand j'ai commencé à me rendre compte d'un souci par là, j'ai bien vu que les calculs dans la proc étaient faux au premier passage et devenaient corrects au second,


EDIT : juste pour rire, cette petite astuce est inefficace :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
procedure TForm1.mmoLogClick(Sender: TObject);
begin
  exit;
end;