[gelöst]Groupbox flackert

Für Dinge zum Forum, Kritik, Verbesserungsvorschläge, Umfragen und ähnliches.
hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

[gelöst]Groupbox flackert

Beitrag von hubblec4 »

Hallo

Mal eine Frage zu den Groupboxen(GrB).
Wenn ich eine GrB auf die Form ziehe, Projekt kompilere und dann zur laufzeit in die GrB einen Linksklick mache,
dann flackert der "Rahmen" und das Caption von der GrB.

Befinden sich noch weitere Elemente innerhalb der GrB, flackern diese ebenfalls kurz auf.

Das ganze flackern kommt sogar zweimal. MouseDown und beim Mouseup.
(Nur damit keine Missverständnisse entstehen, es werden keinerlei Eventprozeduren verwendet)

Win7-64bit Lazarus 1.4.4 32bit nutze ich

hubble
Zuletzt geändert von hubblec4 am Sa 2. Jan 2016, 21:36, insgesamt 1-mal geändert.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Groupbox flackert

Beitrag von Michl »

Warum nun genau ein Neuzeichnen bei einem Mausklick angeregt wird, habe ich jetzt nicht recherchiert, kann das Verhalten aber bestätigen.

Gegen das Flackern hilft bei mir:

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  GroupBox1.DoubleBuffered := True;
end;   

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: Groupbox flackert

Beitrag von hubblec4 »

Wie immer sau schnelle antwort von dir, und wie immer hats auch geholfen. Recht vielen Dank.

Das mit Doublebufferd hatte ich auch schon gelesen und probiert, ging aber irgendwie nicht.

Aber jetzt ging es eben.
Bis jetzt hatte ich das auch nur für die GrB's gefunden, andere Komponenten scheinen das nicht zu machen.

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: [gelöst]Groupbox flackert

Beitrag von hubblec4 »

Muss jetzt doch noch mal was nachfragen.

Da ich in einem Projekt bereits 50 GroupBoxen(GrB) verwende müsste ich das ja für jede GrB im onCreateEvent einstellen.

Gibt es da noch einen anderen Weg? Wieso muss man das überhaupt so einstellen?
Warum ist dieser DoubleBuffered Wert nicht von Haus aus auf true gesetzt?

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: [gelöst]Groupbox flackert

Beitrag von Michl »

Da kannst das auch einfach mit einer Schleife lösen:

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to ControlCount - 1 do
    if Assigned(Controls[i]) and (Controls[i] is TGroupBox) then
      TGroupBox(Controls[i]).DoubleBuffered := True;
end;

Warum man nicht immer einen Zwischenspeicher nutzt, weiß ich allerdings nicht.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: [gelöst]Groupbox flackert

Beitrag von wp_xyz »

hubblec4 hat geschrieben:Da ich in einem Projekt bereits 50 GroupBoxen(GrB) verwende müsste ich das ja für jede GrB im onCreateEvent einstellen.
Gibt es da noch einen anderen Weg? Wieso muss man das überhaupt so einstellen?
Warum ist dieser DoubleBuffered Wert nicht von Haus aus auf true gesetzt?

Speicher und Performance. Wenn mehrere große Controls auf einem Formular DoubleBuffered verwenden und man das Formular in der Größe verändert, merkt man einen zögerlichen Bildaufbau.

Sind die 50 Groupboxen auf demselben Formular? Wenn ja, solltest du deine Benutzeroberfläche überdenken, sie ist viel zu überladen.

Meiner Meinung nach brauchen Controls nur dann das DoubleBuffered, wenn es in der Größe verändert wird und die Kind-Controls komplizierte Repaint-Aktionen ausführen. Das von dir angesprochene Flackern bei einem Mausklick scheint mir ein Bug zu sein - wieso muss sich ein Control bei einem Mausklick neu zeichnen? Es wäre besser, diesen Bug zu fixen, als die Performance der Anwendung durch massives Doublebuffern zu veschlechtern. Vielleicht ist er auch schon beseitigt? (--> Laz 1.6 oder trunk verwenden). Wenn nicht, kannst du mal ein einfaches Projekt posten, an dem man das Flackern sieht (nur .pas, lfm, .lpr, .lpi in einer einzigen zip-Datei)?

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: [gelöst]Groupbox flackert

Beitrag von Michl »

wp_xyz hat geschrieben:Vielleicht ist er auch schon beseitigt?
Ist nicht entfernt. Wenn man mal nachsieht, wird sogar zwei mal gezeichnet, einmal nach LM_LBUTTONDOWN und einmal nach LM_LBUTTONUP.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: [gelöst]Groupbox flackert

Beitrag von hubblec4 »

GroupBox.7z
(582.82 KiB) 128-mal heruntergeladen
@ Michl
Ja an so eine schleife im onCreateEvent hatte ich auch schon gedacht.

Bin jetzt aber nicht mehr so sicher das ich es verwenden will, wenn es so auf die Performance geht wenn die Form "resized" wird.

Das die GrB zweimal zeichnet hatte ich auch schon gemerkt. Echt komisch.

@wp_xyz

Was die anzahl der GrB's angeht, es sind nicht alle auf der einen Form (gibt 5 Formen), jedoch hat die anzahl meiner GrB nicht unbedingt etwas mit schlechten Design zu tun, es sind nunmal soviele Unterkategorien und Abtrennungen nötig.
Als alternative hatte ich schonmal begonnen Panels zu verwenden (sieht auch schick aus.)


Ich habe mal ein sehr simples Testprog gemacht. Man sieht deutlich das alles was Lables sind ebenfalls flackern. Buttons anscheinend nicht.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: [gelöst]Groupbox flackert

Beitrag von wp_xyz »

Danke für das Testprogramm. Aber ich kann kein Flackern feststellen. Habe zwischen Lazarus Trunk und 1.4 die meisten 32-bit Versionen für Win ausprobiert, die ich parat habe, auch bei der Linux-Version (etwas älteres trunk) flackert nichts. Ich muss nur ins Innere der Groupbox klicken? Auch die von dir mitgeschickte exe flackert nicht.

Kann es sein, dass es an der Graphikkarte liegt? Mein Rechner verwendet aber nur die interne Graphik des i5-Prozessors.

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: [gelöst]Groupbox flackert

Beitrag von hubblec4 »

wp_xyz hat geschrieben:Danke für das Testprogramm. Aber ich kann kein Flackern feststellen. Habe zwischen Lazarus Trunk und 1.4 die meisten 32-bit Versionen für Win ausprobiert, die ich parat habe, auch bei der Linux-Version (etwas älteres trunk) flackert nichts. Ich muss nur ins Innere der Groupbox klicken? Auch die von dir mitgeschickte exe flackert nicht.

Kann es sein, dass es an der Graphikkarte liegt? Mein Rechner verwendet aber nur die interne Graphik des i5-Prozessors.



Wow, wie kann das denn sein? Vll hat Michl sich diese Testsache auch mal gesaugt.

Ja, ich klicke einfach auf eine leere stelle innerhalb der GrB und beim MouseDown flackert es einmal und beim MouseUp nocheinmal.
Wenn ich allerdings sehr schnell mehrere links-klicks in die GrB mache flackert auch nichts. also mach mal "langsam" einen lincks-klick.

Ich habe hier schon einen sehr guten Rechner, gute Graka 4-Core Prozessor und 32GB Arbeitsspeicher.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: [gelöst]Groupbox flackert

Beitrag von Michl »

hubblec4 hat geschrieben:Vll hat Michl sich diese Testsache auch mal gesaugt.
Habe ich noch nicht, sehe es hier ja auch so.

Anbei mal mein kleines Testprog, wo man sieht, dass nach einem Klick zwei mal neu gezeichnet wird (zumindest bei mir, Windows 7). Das Ergebnis, von einem Klick zum nächsten, sieht bei mir so aus:

Code: Alles auswählen

LM_LBUTTONDOWN
LM_ERASEBKGND
LM_PAINT
0215/533
BD11/48401
LM_LBUTTONUP
LM_ERASEBKGND
LM_PAINT

Ich hatte auch mal etwas weiter geschaut, ich konnte von der LCL weder per SendMessage/PostMessage, Invalidate, Repaint, noch irgend sonstwie (bis die LCL die Message "WM_LBUTTONDOWN" komplett abgearbeitet hat) eine angeregte Neuzeichnung entdecken. Weder per debuggen, noch per Ausgabe in eine Logdatei (hatte jeweils ein "WriteLn..." in den entsprechenden Methoden versteckt), konnte ich den Auslöser finden.
Dateianhänge
Bsp.zip
(1.92 KiB) 143-mal heruntergeladen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: [gelöst]Groupbox flackert

Beitrag von hubblec4 »

Super schickes kleines test prog Michl.

Bei mir flackerts auch und ich habe Win7 im CLassic Style laufen.
Vll liegt es ja daran?

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: [gelöst]Groupbox flackert

Beitrag von Mathias »

Ich habe das Bsp.zip auch probiert. ich kann klicken, so viel ich will, ich kann nirgends ein Flackern sehen.
Die Terminal-Ausgabe sieht etwa gleich aus wie oben.
Nur LM_ERASEBKGND und LM_PAINT erscheint bei mir nicht.

Verwende Linux Mint.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: [gelöst]Groupbox flackert

Beitrag von Michl »

Mathias hat geschrieben:Ich habe das Bsp.zip auch probiert. ich kann klicken, so viel ich will, ich kann nirgends ein Flackern sehen.
Die Terminal-Ausgabe sieht etwa gleich aus wie oben.
Nur LM_ERASEBKGND und LM_PAINT erscheint bei mir nicht.

Verwende Linux Mint.
Danke fürs testen und die Info!

hubblec4 hat geschrieben:Bei mir flackerts auch und ich habe Win7 im CLassic Style laufen.
Vll liegt es ja daran?
Tatsächlich flackert es bei einem Aero-Theme bei mir nicht (habe es eben mal umgestellt). Ich nutze ebenfalls normalerweise den klassischen Stil. Allerdings wird auch im Aero-Theme zwei mal neu gezeichnet.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: [gelöst]Groupbox flackert

Beitrag von hubblec4 »

Ok dann werde ich es mal auf einem Windows mit nicht klassischen Stil testen. ein Win8 müsste ich auch noch haben.

Wenn es denn daran liegen sollte dann ist es mir fast egal, oder könnte man per CompilerDirective sagen wenn Win7 am start ist dann muss es halt mit dem DoubleBuffered gelöst werden?


EDIT:

OK es liegt an Windows 7 - Klassic Style

Win7 "normal" -> kein Flackern
Win8 -> kein Flackern

Antworten