Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Flackern in der MemoBox


Tobi482 - Do 01.05.08 16:47
Titel: Flackern in der MemoBox
Hallo,

ich habe ein Problem mit der MemoBox. In meinem Programm gibt es mehrere (80-100) TStringList'en, die mit Text (Logzeilen) gefüllt sind. Da ich in bestimmte Logs reinschauen möchte, habe ich ein Fenster geschrieben, das mir EINEN gewählten Log ausgibt.

Während ich diesen Log betrachte, passieren viele weitere Events, die geloggt werden. Somit ändert sich der gerade betrachtete Log. Diese Änderungen hätte ich gerne auch in meinem BetrachtungsFenster. Um dies zu realisieren habe ich eine Routine programmiert, die, sobald sich der gewählte Log verändert, das LogViewer-Fenster aktualisiert.

Dies geschieht indem ich die StringList erneut an Memo.Lines übergebe.

Dabei treten folgenden Probleme auf:

1.) Die Memobox scrollt auf Zeile 1 zurück (hinzugefügte Zeilen stehen aber unten)
2.) Die ganze Memobox flackert


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
Procedure UpdateLog;
begin
     //Wenn keine Instanz gewählt ist, dann abbrechen
     if CurrentInstance < 0 then exit;

     //Wenn kein Loggen erwünscht ist abbrechen
     if not main.chkb_logging.Checked then exit;

     //Log übernehmen
     main.memo_log.Lines := Instances[Current].Log;

     //Letzte Zeile scrollen
     SendMessage(main.memo_log.Handle, EM_LINESCROLL, 0, main.memo_log.Lines.Count - 1);
end;


Das scrollen habe ich in den Griff bekommen, jedoch wurde dadruch das flackern nur noch schlimmer.

Wenn jemand eine Idee oder Tipp für mich hat, wäre ich ihm sehr Dankbar

Schon einmal herzlichen Dank im Vorraus.

Mit freundlichen Grüßen
Tobi


passiv - Do 01.05.08 17:13

schon mal doublebuffered:=true probiert? das hat bei mir immer alle probleme mit dem aufbau von bildern etc. behoben. dann darf man aber nicht so ohne weiteres den XP-Skin benutzen, weil dann checkboxes, buttons, etc. eigenartig werden.

mfg Fabs

EDIT1: lösung gerade gefunden: memo auf panel packen und panel.doublebuffered:=true setzen
EDIT2: und weiters gefunden: funktioniert offenbar nicht immer :roll:


Yogu - Do 01.05.08 17:53

Vielleicht helfen die diese beiden Prozeduren weiter:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
Memo1.Lines.BeginUpdate;
try
  Memo1.Lines.Text := Neuertext;
finally
  Memo1.Lines.EndUpdate;
end;

Das hat bei mir schon einige Flackler behoben.


Tobi482 - Fr 02.05.08 13:55

DANKE JUNGS,

ihr seid Klasse :D

eurer Tips haben das Problem behoben :)
Ist nun alles flackerfrei.

Gruß
Tobi