Delphi-PRAXiS

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 ListView - AutoSize der Spalten (https://www.delphipraxis.net/60337-listview-autosize-der-spalten.html)

Sir Rufo 5. Jan 2006 14:06


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 ...

s14 5. Jan 2006 14:13

Re: ListView - AutoSize der Spalten
 
Das hatte ich auch mal.
Ich glaube habe mir damals, ziemlich primitiv, so geholfen:

Delphi-Quellcode:
lv.Width := lv.Width - 1;
lv.Width := lv.Width + 1;
:stupid:

Sir Rufo 5. Jan 2006 14:21

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

Sir Rufo 6. Jan 2006 15:29

Re: ListView - AutoSize der Spalten
 
Delphi-Quellcode:
procedure TControl.SetWidth(Value: Integer);
begin
  SetBounds(FLeft, FTop, Value, FHeight);
  Include(FScalingFlags, sfWidth); // <- Der Befehl macht es schön ;-)
end;
Jo, da sitzt das Geheimnis.

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)

Captnemo 9. Mai 2014 14:22

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

p80286 9. Mai 2014 14:53

AW: ListView - AutoSize der Spalten
 
Ich hab's so gelöst - aber nur für die Überschrift!
Delphi-Quellcode:
  lv.Columns.Add;
  lv.Columns[i].Caption:=MyText;
  lv.Columns[i].Width:=lv.Canvas.TextWidth(MyText)+10;
In den +10 stecken die verschiedenen Ränder und Rahmen und.. drin.
(ich war die Frickelei satt)

Gruß
K-H

Captnemo 9. Mai 2014 15:04

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:
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;
So in etwa. Müßte eigentlich auch so Funktionieren, aber geht tatsächlich nur wenn ich zur Laufzeit mit der Maus die Form resize.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:57 Uhr.

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