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 :
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;
Ç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 :
Redraw invalidated parts of the control immediately.
et pour Repaint :
Immediate redraw of the control, bypassing the message queue.
À 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.

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 :

Nom : formtest.jpg
Affichages : 718
Taille : 24,9 Ko
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;
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...
Merci de prendre le temps de jeter un œil.