[gelöst]Groupbox flackert

Für Dinge zum Forum, Kritik, Verbesserungsvorschläge, Umfragen und ähnliches.

[gelöst]Groupbox flackert

Beitragvon hubblec4 » 2. Jan 2016, 11:58 [gelöst]Groupbox flackert

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 2. Jan 2016, 21:36, insgesamt 1-mal geändert.
hubblec4
 
Beiträge: 189
Registriert: 25. Jan 2014, 17:50

Beitragvon Michl » 2. Jan 2016, 12:10 Re: Groupbox flackert

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; 
Michl
 
Beiträge: 2241
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon hubblec4 » 2. Jan 2016, 12:15 Re: Groupbox flackert

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: 189
Registriert: 25. Jan 2014, 17:50

Beitragvon hubblec4 » 13. Jan 2016, 11:14 Re: [gelöst]Groupbox flackert

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?
hubblec4
 
Beiträge: 189
Registriert: 25. Jan 2014, 17:50

Beitragvon Michl » 13. Jan 2016, 11:26 Re: [gelöst]Groupbox flackert

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; 
Michl
 
Beiträge: 2241
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon wp_xyz » 13. Jan 2016, 11:42 Re: [gelöst]Groupbox flackert

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)?
wp_xyz
 
Beiträge: 2459
Registriert: 8. Apr 2011, 08:01

Beitragvon Michl » 13. Jan 2016, 12:39 Re: [gelöst]Groupbox flackert

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; 
Michl
 
Beiträge: 2241
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon hubblec4 » 13. Jan 2016, 13:53 Re: [gelöst]Groupbox flackert

GroupBox.7z
@ 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.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
hubblec4
 
Beiträge: 189
Registriert: 25. Jan 2014, 17:50

Beitragvon wp_xyz » 13. Jan 2016, 14:55 Re: [gelöst]Groupbox flackert

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.
wp_xyz
 
Beiträge: 2459
Registriert: 8. Apr 2011, 08:01

Beitragvon hubblec4 » 13. Jan 2016, 15:36 Re: [gelöst]Groupbox flackert

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.
hubblec4
 
Beiträge: 189
Registriert: 25. Jan 2014, 17:50

Beitragvon Michl » 13. Jan 2016, 16:40 Re: [gelöst]Groupbox flackert

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.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Code: Alles auswählen
type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 
Michl
 
Beiträge: 2241
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon hubblec4 » 13. Jan 2016, 17:04 Re: [gelöst]Groupbox flackert

Super schickes kleines test prog Michl.

Bei mir flackerts auch und ich habe Win7 im CLassic Style laufen.
Vll liegt es ja daran?
hubblec4
 
Beiträge: 189
Registriert: 25. Jan 2014, 17:50

Beitragvon Mathias » 13. Jan 2016, 17:17 Re: [gelöst]Groupbox flackert

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3775
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Michl » 13. Jan 2016, 17:26 Re: [gelöst]Groupbox flackert

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; 
Michl
 
Beiträge: 2241
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon hubblec4 » 13. Jan 2016, 17:38 Re: [gelöst]Groupbox flackert

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
hubblec4
 
Beiträge: 189
Registriert: 25. Jan 2014, 17:50

» Weitere Beiträge siehe nächste Seite »
Nächste

Zurück zu Allgemeines



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried