Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Listbox Ownerdraw und Größenänderung (https://www.delphipraxis.net/213870-listbox-ownerdraw-und-groessenaenderung.html)

Uwe Raabe 11. Okt 2023 21:19

AW: Listbox Ownerdraw und Größenänderung
 
Zitat:

Zitat von ConstantGardener (Beitrag 1527972)
@uwe: OK, ist ja eigentlich nur die Listbox im Form. Aber vielleicht hilft es...Projekt anbei

Mal prinzipiell: Dieses eigentlich nur kann man ja nicht wissen. Oft sind es auch ganz andere Besonderheiten, die in der Beschreibung gar nicht vorkommen, die man aber in einem Minimalprojekt leicht prüfen kann ohne alles nachzufragen. Ich kann schon nicht mehr zählen, wie oft ich schon ein Verhalten nicht nachstellen konnte, weil die Beschreibung nicht vollständig war. Ich verlinke dann gerne auf die Exact Instructions Challenge.

jaenicke 11. Okt 2023 21:51

AW: Listbox Ownerdraw und Größenänderung
 
Liste der Anhänge anzeigen (Anzahl: 2)
@Uwe:
Das ist wie beschrieben sofort reproduzierbar. Auf den ersten Blick sehe ich auch nicht woran das liegt. Die Zeichen-Ereignisse kommen an, das Rechteck stimmt, wird mit FillRect gefüllt...
Ich habe mal einfach bei jedem Zeichenbefehl eine zufällige Farbe für das FillRect verwendet. Das Ergebnis überrascht... Beispielprojekt im Anhang.

Anhang 56322

Uwe Raabe 12. Okt 2023 09:43

AW: Listbox Ownerdraw und Größenänderung
 
Ich glaube ich habe die Ursache gefunden. In TCustomListBox.CreateParams wird das CS_HREDRAW nur bei Rechts-nach-Links Schreibweise gesetzt. Damit erfolgt bei einer Breitenänderung kein Neuzeichnen des gesamten Fensters, sondern nur des neu hinzugekommenen Bereichs. Zeichenbefehle außerhalb werden von Windows dann einfach ausgeblendet.

Abhilfe schafft eine Interposer-Klasse, deren Deklaration im Scope zwischen Vcl.StdCtrls und der TListBox im Form liegen muss:
Delphi-Quellcode:
type
  TListBox = class(Vcl.StdCtrls.TListBox)
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  end;
...
procedure TListBox.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.WindowClass.style := Params.WindowClass.style or CS_HREDRAW;
end;
Übrigens konnte ich dieses Verhalten mindestens ab Delphi 5 finden (darunter kann ich hier nicht prüfen). Es handelt sich also wahrlich nicht um irgendeine neue Optimierung.

himitsu 12. Okt 2023 10:10

AW: Listbox Ownerdraw und Größenänderung
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1528008)
sondern nur des neu hinzugekommenen Bereichs. Zeichenbefehle außerhalb werden von Windows dann einfach ausgeblendet.

Zitat: Region

ConstantGardener 12. Okt 2023 20:10

AW: Listbox Ownerdraw und Größenänderung
 
Zitat:

Zitat von jaenicke (Beitrag 1527992)
@Uwe:
Das ist wie beschrieben sofort reproduzierbar. Auf den ersten Blick sehe ich auch nicht woran das liegt. Die Zeichen-Ereignisse kommen an, das Rechteck stimmt, wird mit FillRect gefüllt...
Ich habe mal einfach bei jedem Zeichenbefehl eine zufällige Farbe für das FillRect verwendet. Das Ergebnis überrascht... Beispielprojekt im Anhang.

Anhang 56322

:cheers:


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:21 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz