Delphi-PRAXiS
Seite 1 von 2  1 2      

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)

ConstantGardener 11. Okt 2023 06:49

Listbox Ownerdraw und Größenänderung
 
Hallo zusammen,

ich habe hier ein kleines Problem mit einer Listbox im Ownerdraw Modus unter Delphi 11.3. VCL 32 oder 64 Bit.
Wenn ich die Listbox in der Größe verändere wird nur der aktuelle Eintrag neu gezeichnet. Das führt dann zu Darstellungsfehlern sobal die Listbox größer wird.
Ist leicht zu reproduzieren: Listbox1 aufs Formular. Align auf alClient, Modus auf ownerdrawfixed, Items mit 4-5 Strings vollschreiben und das im DrawItem.

Delphi-Quellcode:
unit Unit13;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm13 = class(TForm)
    ListBox1: TListBox;
    procedure ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form13: TForm13;

implementation

{$R *.dfm}

procedure TForm13.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
var ACanvas : TCanvas;
begin
 ACanvas:=(Control as TListbox).Canvas;
 ACanvas.Brush.Color:=clTeal;
 ACanvas.Brush.style:=bsSolid;
 ACanvas.FillRect(Rect);

 ACanvas.TextOut (Rect.left+10,Rect.Top+2,ListBox1.Items[Index]);
 ACanvas.TextOut (Rect.right-ACanvas.TextWidth(ListBox1.Items[Index]),Rect.Top+2,ListBox1.Items[Index]);
end;

end.
Kann das jemand nachvollziehen? bzw. mir sagen was ich falsch mache (btw. zeichne seit Jahren Listboxen usw. selbst! Stehe aber scheinbar auf dem Schlauch)?

Amateurprofi 11. Okt 2023 08:28

AW: Listbox Ownerdraw und Größenänderung
 
Nach dem Ändern der Größe:
Delphi-Quellcode:
ListBox1.Repaint;

ConstantGardener 11. Okt 2023 09:33

AW: Listbox Ownerdraw und Größenänderung
 
Danke Amateurprofi für die Antwort, aber das sollte ja automatisch gehen. Klar kann ich im onResize des Forms ne'n Timer neu starten und dann im onTimer ein Repaint machen.
Fühlt sich aber frickelig an! Ist wohl eher ein Bug, wundert mich nur, dass sich bisher keiner dran gestört hat.

himitsu 11. Okt 2023 09:47

AW: Listbox Ownerdraw und Größenänderung
 
Oder .Invalidate anstatt .Repaint bzw. .Refresh.

Repaint malt "eventuell" sofort (kommt bissl auf die Komponenten drauf an)
Invalidate sagt die Anzeige ist "ungültig" ... sie wird dann bei nächster Gelegenheit aktualisiert (Paint)

Delphi-Quellcode:
ListBox1.Repaint;
ListBox1.Repaint;
ListBox1.Repaint;
ListBox1.Repaint;
ListBox1.Repaint;
// malt 1 oder 5 Mal

ListBox1.Invalidate;
ListBox1.Invalidate;
ListBox1.Invalidate;
ListBox1.Invalidate;
ListBox1.Invalidate;
// malt anschließend nur 1 Mal

PS:
Invalidate macht ein InvalidateRect auf das ganze Control.
Beim Resize oder Scroll wird nur ein InvalidateRect auf den "neuen" Bereich ausgelöst und dann auch nur dieser Teil neu gezeichnet.

ConstantGardener 11. Okt 2023 11:28

AW: Listbox Ownerdraw und Größenänderung
 
Ja ist schon alles klar mit dem Repaint usw. Aber es kann doch nicht sein, dass ich das selbst anstoßen muss!?

Wenn sich die Größe der Komponente ändert muss die doch von selbst neu gezeichnet werden und zwar alle sichtbaren Einträge!?
Macht sie mit Standardeinstellungen ja auch. Nur bei OwnerdrawFixed und OwnerdrawVariable tut sie das offenbar nicht.

Uwe Raabe 11. Okt 2023 12:12

AW: Listbox Ownerdraw und Größenänderung
 
Vielleicht würde es helfen ein Beispielprojekt hier bereit zu stellen.

ConstantGardener 11. Okt 2023 12:57

AW: Listbox Ownerdraw und Größenänderung
 
Liste der Anhänge anzeigen (Anzahl: 1)
@uwe: OK, ist ja eigentlich nur die Listbox im Form. Aber vielleicht hilft es...Projekt anbei

himitsu 11. Okt 2023 13:10

AW: Listbox Ownerdraw und Größenänderung
 
DFM vergessen :stupid:

Es ist halt ein Standardverhalten, dass nur der neue Bereich und die aktuelle Selektion neu gezeichnet werden, bei Resize/Scroll,
und dass standardmäßig alles links ausgerichtet ist.

Du willst was Anderes machen, also mußt du auch das Standardverhalten ändern.
z.B. indem man den BiDiMode der Listbox auf bdRightToLeft stellt. (PS, die Hebräer schreiben von rechts nach links)
Als Bonus ist dabei die Scrollbar dann links. :lol:



Ach ja, beim Paint, durch das Resize, liegt eine Region auf dem Canvas, wodurch nur der neue Bereich gezeichnet wird.
Du kannst natürlich versuchen, vor jedem Zeichnen, diese Region zu löschen.
https://docwiki.embarcadero.com/Code...pRect_(Delphi)


Oder
Delphi-Quellcode:
procedure TForm1.FormResize(Sender: TObject);
begin
  ListBox1.Invalidate;
end;

ConstantGardener 11. Okt 2023 14:40

AW: Listbox Ownerdraw und Größenänderung
 
Danke Himitsu, das funktioniert! Hätte aber trotzdem geschworen, dass das früher automatisch ging.

TomyN 11. Okt 2023 21:08

AW: Listbox Ownerdraw und Größenänderung
 
Wahrscheinlich damit man 'bis zu 50% schnelleres Redraw von Listboxen' in die Liste schreiben kann, die Programmierer animieren soll, für die neuste Delphi Version wieder viel Geld auszugeben. :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:04 Uhr.
Seite 1 von 2  1 2      

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