Bug Repaint Align/Anchors

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Antworten
Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Bug Repaint Align/Anchors

Beitrag von Michl »

Hallo wertes Forum,

ich bin auf einen merkwürdigen Bug/Feature gestoßen. Eigentlich sollte dieser schon längst aufgefallen sein, konnte aber ihn mit meiner Suchmaschine nicht finden. Sobald in einem Formular die Komponenten das Formular komplett ausfüllen (per Align oder Achors), wird kein Repaint mehr ausgeführt.

z.B.: Ein Button auf ein neues leeres Formular und:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  Repaint;
end;
 
procedure TForm1.FormPaint(Sender: TObject);
begin
  Caption:=IntToStr(Random(100));
end;
starte ich dieses nun wird bei jedem Buttonklick der Eventhander von OnPaint des Formulars aufgerufen. Änder ich jetzt das Align von dem Button zu alClient wird der Eventhandler nicht mehr aufgerufen.

Getestet habe ich unter Win7, Lazarus 1.2.4 mit FPC 2.6.4 und Lazarus 1.3 r45997 FPC 2.7.1 i386-win32-win32/win64.

Kann dieses Verhalten jemand auch unter einem anderen OS bestätigen bzw. mir sagen, ob dieses Verhalten erwünscht ist?!

Danke

Michael
Zuletzt geändert von Michl am Do 31. Jul 2014, 23:06, insgesamt 1-mal geändert.

Code: Alles auswählen

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

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Bug Repaint Align/Anchors

Beitrag von mse »

Möglicherweise wird die paint() Prozedur nicht aufgerufen, wenn die udateregion leer ist. Ein "Fenster" welches vollkommen von "Kind-Fenstern" verdeckt ist, hat keine Möglichkeit um zu zeichnen, daher liefert Windows vermutlich immer eine leere updateregion oder schickt gar keine paint message.

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Bug Repaint Align/Anchors

Beitrag von Antrepolit »

Unter Lazarus 1.2.0 und Win7 64 Bit ist das Verhalten definitiv anders - so, wie es sein soll.
Grüße, Antrepolit

care only if your os is really burning

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Bug Repaint Align/Anchors

Beitrag von Scotty »

Lazarus 1.3 r45707M FPC 2.6.4 x86_64-linux-qt: Unter Qt wird Repaint in jedem Fall ausgeführt; unter Gtk2 nur dann, wenn der Button nicht maximiert ist - in dem Fall kommt das Event nie an.
PS: Übrigens wird das Problem noch deutlicher, wenn der Button auf alNone steht und Übergröße hat. Solange das Formular vom Control abgedeckt wird, kommt nichts an.

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

Re: Bug Repaint Align/Anchors

Beitrag von Michl »

Danke fürs Testen!

mse hat geschrieben:Möglicherweise wird die paint() Prozedur nicht aufgerufen, wenn die udateregion leer ist. Ein "Fenster" welches vollkommen von "Kind-Fenstern" verdeckt ist, hat keine Möglichkeit um zu zeichnen, daher liefert Windows vermutlich immer eine leere updateregion oder schickt gar keine paint message.
Du scheinst den Finger darauf zu haben. Stelle ich alle AnchorSeiten auf das Formular und rücke eine Seite um 1 Pixel ein, wird Repaint aufgerufen (was erstmal gut als Workaround für mich ist, danke dafür!)!

Antrepolit hat geschrieben:Unter Lazarus 1.2.0 und Win7 64 Bit ist das Verhalten definitiv anders - so, wie es sein soll.
Das ist interessant, ich werde mal ein paar Revisionen zurückblättern, mal sehen, wann der Bug eingepflegt wurde.

Code: Alles auswählen

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

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

Re: Bug Repaint Align/Anchors

Beitrag von Michl »

Ich habe jetzt mehrere Versionen bis zurück zu Lazarus Revision 39000 mit FPC 2.6.2 gebaut. Das Verhalten ist bei mir immer so, dass sobald der Button das Formular komplett füllt, ein Repaint nicht aufgerufen wird.

[Edit] :D :D :D ich habe zwei identische Projekte, das eine repaintet, das andere nicht. K.A., wie ich das geschafft habe. Werde mal versuchen einen Unterschied auszumachen. Beide haben kompiliert sogar die gleiche Größe.

[Edit] Doch keine Magie, ich hatte noch "BorderSpacing.Top = 1" in der unit1.lfm stehen...

[Edit] Ich habe es mal als Bug gemeldet: http://bugs.freepascal.org/view.php?id=26547

Code: Alles auswählen

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

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Bug Repaint Align/Anchors

Beitrag von mse »

Wobei man schon damit rechnen sollte, dass paint() nicht aufgerufen wird, wenn es nichts zu Zeichnen gibt. Vielleicht kannst du die Programmstruktur entsprechend anpassen?

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

Re: Bug Repaint Align/Anchors

Beitrag von Michl »

mse hat geschrieben:Wobei man schon damit rechnen sollte, dass paint() nicht aufgerufen wird, wenn es nichts zu Zeichnen gibt. Vielleicht kannst du die Programmstruktur entsprechend anpassen?
Ich bin bisher davon ausgegangen, wenn ich neuzeichnen lasse, dass MainForm.OnPaint gefeuert wird. Dieses wird es ja schließlich auch, wenn ich z.B. die Formulargröße ändere (obwohl das Fenster dort auch komplett durch die "Kinder-Controls" verdeckt wird).

Aber recht hast Du, ich kann tatsächlich meine Programmstruktur ändern. Statt OnPaint auszuwerten habe ich mir ein Event "OnFinished" implementiert, wo ich jetzt mein "View" entsprechend anpasse. Das scheint auf jeden Fall logischer - manchmal sehe ich den Wald vor lauter Bäumen nicht. Danke fürs Denkenanregen!

Code: Alles auswählen

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

Antworten