Bonsoir,
Je ne sais pas si c'est un bug lié à Linux, mais je constate un comportement bizarre ou, à tout le moins, pas en accord avec l'aide.
Je loggue des événements dans un Tmemo et, pour avoir toujours la dernière ligne visible, j'ai monté ma procédure de log ainsi :
Ça fonctionne bien mais je trouvais que App.ProcMess c'était un peu prendre une enclume pour écraser une mouche, d'autant plus que l'aide me dit, pour Update :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 procedure TForm1.log(s: string; ShowTime: boolean); begin if ShowTime then s := TimeToStr(Now) + ' ' + s; mmoLog.Lines.Append(s); mmoLog.SelStart := length(mmoLog.Text); // pour positionner le curseur à la fin du mémo Application.ProcessMessages; end;
et pour Repaint :Redraw invalidated parts of the control immediately.
À la lecture de ces deux lignes on pourrait se dire que ça va le faire, mais si je remplace App.ProcMess par mmoLog.Repaint ou par .Update, hé bien le mémo n'est plus "scrollé" jusqu'en bas et les dernières lignes ne sont plus visibles.Immediate redraw of the control, bypassing the message queue.
Une idée, quelqu'un ?
Contexte : Debian 7 32 bits et mon vieux Lazarus 1.4 / FPC 2.6.2 (mais pour ce que j'en fais ça suffit amplement)
EDIT :
Ah, pour ceux qui voudraient faire des tests, une fiche avec 3 boutons, 3 petits memos (avec scrollbar verticale), un timer (interval à 1000) et en avant :
Et avec ça on constate que Repaint et/ou Update fonctionnent très mal, enfin, pas comme on pourrait s'y attendre, à comparer avec App.ProcMess...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80 private { private declarations } procedure log1(s: string; ShowTime: boolean); procedure log2(s: string; ShowTime: boolean); procedure log3(s: string; ShowTime: boolean); public { public declarations } end; var Form1: TForm1; implementation {$R *.lfm} procedure TForm1.log1(s: string; ShowTime: boolean); begin if ShowTime then s := TimeToStr(Now) + ' ' + s; mmoLog1.Lines.Append(s); mmoLog1.SelStart := length(mmoLog1.Text); mmoLog1.Repaint; // mmoLog1.Update; // Application.ProcessMessages; end; procedure TForm1.log2(s: string; ShowTime: boolean); begin if ShowTime then s := TimeToStr(Now) + ' ' + s; mmoLog2.Lines.Append(s); mmoLog2.SelStart := length(mmoLog2.Text); // mmoLog2.Repaint; mmoLog2.Update; // Application.ProcessMessages; end; procedure TForm1.log3(s: string; ShowTime: boolean); begin if ShowTime then s := TimeToStr(Now) + ' ' + s; mmoLog3.Lines.Append(s); mmoLog3.SelStart := length(mmoLog3.Text); // mmoLog3.Repaint; // mmoLog3.Update; Application.ProcessMessages; end; procedure tempo; var k,t: integer; begin k := 0; // happy compilo for t := 0 to 100000000 do k := k + t; // tempo pour "voir" end; procedure TForm1.Button1Click(Sender: TObject); var i : integer; begin for i := 0 to 20 do begin tempo; log1(IntToStr(i), True); end; end; procedure TForm1.Button2Click(Sender: TObject); var i : integer; begin for i := 0 to 20 do begin tempo; log2(IntToStr(i), True); end; end; procedure TForm1.Button3Click(Sender: TObject); var i : integer; begin for i := 0 to 20 do begin tempo; log3(IntToStr(i), True); end; end; procedure TForm1.Timer1Timer(Sender: TObject); begin Application.ProcessMessages; // pour la prise en compte du bouton d'arrêt dans real prog end;
Merci de prendre le temps de jeter un œil.
Partager