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 :
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 :
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;
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 :
avec 12 en Caption, soit 2x6, ok,
et là, si je clique dans le mémo,
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 :
Qu'est-ce que vous pensez de tout ça ? Bug ou pas bug ?
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;
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;
Partager