Autor Beitrag
moloch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 451

Win 2000
D5 Prof
BeitragVerfasst: Mo 13.09.04 12:14 
Hallo Forum,
ich baue mir eine Listview auf und gehe danach jede spalte durch um die Breite der Spalte zu optimieren.

ausblenden Delphi-Quelltext
1:
2:
3:
  for k := 0 to ListView.Columns.Count - 1 do begin
    ListView.Columns[k].Width := -2;
  end;

dieses optimieren ist aber so langsam das man der ganze sache zugucken kann.

ich hab das schon mit listview.columns.beginupdate versucht.
Gibt es denn nicht noch was anderes?

mfg
moloch

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt.
timitio
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 13.09.04 13:10 
Hi,

manuell:
Rechtsklick auf ListView --> Spalteneditor --> Spalte auswählen --> Eigenschaft AutoSize := True;

im Code:
ListView1.items.item[0].Autosize := true;

Ich glaube ich schreibe mal ein Tutorial über List- und TreeViews ... :wink:
moloch Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 451

Win 2000
D5 Prof
BeitragVerfasst: Mo 13.09.04 13:35 
Hey,
also das ist auch nicht viel besser.

bei mir hat das mit Column.AutoSize := True; geklappt aber auch erst dann wenn man die größe des formulars verändert hat.
also ich erstelle ja die ListView wärend der Laufzeit. und wenn ich die Spalten erzeuge mache ich eben Column.AutoSize := True.
das schlägt aber erst an wenn ich die größe des HauptForms verändere. Und dann dauert das auch seine zeit.
mfg
moloch
CenBells
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1547

Win 7
Delphi XE5 Pro
BeitragVerfasst: Mo 13.09.04 14:06 
hi,

du kannst eine größenveränderungen auch mit form.resize simulieren.

GRuß
Ken

_________________
Eine Klasse beschreibt die Struktur und das Verhalten einer Menge gleichartiger Objekte.
moloch Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 451

Win 2000
D5 Prof
BeitragVerfasst: Mo 13.09.04 14:38 
ja ich weiss,
aber das löst doch jetzt nicht das problem.
mfg
moloch
timitio
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 13.09.04 15:56 
Hi,

wenn AutoSize nicht reicht, muss man eben selber etwas tricksen. Es gibt eine Lösung:

1. Das TCanvas Object bietet die Funktion TextWidth(), die die Länge eines Textes in Pixeln ermitteln kann.
2. Mit einer for-Schleife kann man so die Breite aller Einträge der ListView ermitteln und somit auch den längsten Eintrag.
3. Am Ende kann man dann die einzelnen Spalten passend ausrichten.

Das geht sehr schnell und bracht nur 11 Zeilen Quellcode ... dazu muss man aber ein bisschen selber nachdenken...

mfg
timitio
moloch Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 451

Win 2000
D5 Prof
BeitragVerfasst: Mo 13.09.04 16:14 
also diese variante habe ich auch schon in betracht gezogen, da ich das bei einem stringgrid auch so gemacht habe.warum sollte das jetzt schneller sein?
man kann ja der listview -1, oder -2 zuweisen, also width. und dann passiert das alles von selber. naja ich probier es trotzdem mal aus.
mfg
moloch
timitio
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 13.09.04 18:41 
Mein letzter Post war eigentlich absoluter Schrott (--> bringt nämlich nichts). Sorry für den Tonfall. Bis jetzt ist deine Anfangslösung eigentlich die beste:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Button1Click(Sender: TObject);
var
    i: integer;
begin
    listview1.Items.BeginUpdate;
    ListView1.Columns.BeginUpdate;

    for i := 0 to ListView1.Columns.Count-1 do
      ListView1.Column[i].Width := -1;

    ListView1.Columns.EndUpdate;
    listview1.Items.EndUpdate;
end;