![]() |
ListView - AutoSize der Spalten
Hi Forum,
in einem ListView habe ich mehrere Spalten, die jeweils auf AutoSize gestellt sind. ListView.Align := alClient; (is irgendwie aber auch egal ;-) ) Wenn die Liste nun zur Laufzeit gefüllt wird, dann können irgendwann nach x-Zeilen, diese nicht mehr alle dargestellt werden, also wird ein Vert.Scrollbar angezeigt - das ist schön. :mrgreen: Unschön ist aber, dass nun die letzte Spalte nicht mehr ganz angezeigt wird, da ist ja jetzt die Vert.Scrollbar, also kommt auch noch die Horz.Scrollbar hinzu. Wird jetzt das Fenster in der Größe geändert (z.B. Vollbild, oder Resize), dann wird sofort die Liste angepasst und alles passt wieder schon in die Liste (ohne Horz.Scrollbar, Vert.Scrollbar bleibt natürlich) Wie bewege ich das DingsBumsView dazu, dieses doch von selbst (oder mit Anschubsen) zu machen ohne Resize. Refresh, Realign, Repaint, Invalidate ... hilft nix :gruebel: wat nu ... |
Re: ListView - AutoSize der Spalten
Das hatte ich auch mal.
Ich glaube habe mir damals, ziemlich primitiv, so geholfen:
Delphi-Quellcode:
:stupid:
lv.Width := lv.Width - 1;
lv.Width := lv.Width + 1; |
Re: ListView - AutoSize der Spalten
Nicht zu fassen ... :wall:
es funktioniert ... aber die Spalten im ListView zappeln lustig durch die Gegend, ist ja nicht gerade schön ... (nicht falsch verstehen, Funktion is hier erst mal wichtiger als Ästhetik) :mrgreen: Aber bin weiterhin offen für eine richtige Lösung (wie sag ichs dem ListView, was das Form.Resize sagt), der Workaround ist schon mal gut. cu |
Re: ListView - AutoSize der Spalten
Delphi-Quellcode:
Jo, da sitzt das Geheimnis.
procedure TControl.SetWidth(Value: Integer);
begin SetBounds(FLeft, FTop, Value, FHeight); Include(FScalingFlags, sfWidth); // <- Der Befehl macht es schön ;-) end; Abba dat kann man nicht so einfach aufrufen, oder bin ich da auf dem Schlauch (heavy on woodway) Wer weiss wie man Delphi dazu überredet, diesen Befehl auszuführen (mache ich ja gerne auch selber). So müsste ich die Eigenschaft von TControl abändern (das ist doof) |
AW: ListView - AutoSize der Spalten
Hi,
ist zwar alt, aber ich grab's noch mal aus. Hab nämlich grad das gleiche Problem (warum ist mir das vorher nie aufgefallen). Zwar funktioniert deine Lösung (witdh-1; +1) mit dem gewünschten Ergebnis, aber leider auch mit einem unschönen Zittern des ListView. Bist du noch irgendwann auf eine brauchbarere Lösung gekommen bzw. hast deinen erwähnten Lösungsansatz vollenden können? Gruß Dieter |
AW: ListView - AutoSize der Spalten
Ich hab's so gelöst - aber nur für die Überschrift!
Delphi-Quellcode:
In den +10 stecken die verschiedenen Ränder und Rahmen und.. drin.
lv.Columns.Add;
lv.Columns[i].Caption:=MyText; lv.Columns[i].Width:=lv.Canvas.TextWidth(MyText)+10; (ich war die Frickelei satt) Gruß K-H |
AW: ListView - AutoSize der Spalten
Ja, aber ich will ja nicht jedes mal alle Columns löschen und wieder einreichten.
In meinem Fall habe ich (nur) 4 Columns, die zur Designtime feststehen und bei Bedarf mit unterschiedlichen Informationen gefüllt werden. Die 2. Spalte ist auf autosize, und soll sich mit der Form anpassen. Ist ja auch kein Problem, die wird ja auch größer. mit lv1.Column[3].Width:=ColumnHeaderWidth; setze ich dann nach dem Füllen alle anderen auf die max. Breite, so dass es eigentlich passen sollte. Leider tut es das ja bekanntermaßen nicht, und die letzte Spalte verschwindet hinter dem Scrollbar, bis ich dann ein manuelles Resize der Form durchführe. Ein Resize innerhalb der Procedure bringt nix. Hier mal ein Beispiel:
Delphi-Quellcode:
So in etwa. Müßte eigentlich auch so Funktionieren, aber geht tatsächlich nur wenn ich zur Laufzeit mit der Maus die Form resize.
procedure TForm1.Datenladen;
var li: TListItem; i: integer; begin lv1.Items.BeginUpdate; lv1.items.clear; for i:=0 to Data.Count-1 do begin li:=lv1.items.add; li.caption:=Data[i].Name; li.subitems.add(Data[i].Vorname); li.subitems.add(Data[i].Login); if chk1.checked then li.subitems.add(Data[i].Password) else li.subitems.add('***'); end; lv1.Items.EndUpdate; lv1.columns[1].Autosize:=True; lv1.Column[3].Width:=ColumnHeaderWidth; lv1.Column[2].Width:=ColumnHeaderWidth; lv1.Column[0].Width:=ColumnHeaderWidth; end; procedure TForm1.chk1Click(Sender: TObject); begin Datenladen; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz