Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - ListView schnelle Spaltenoptimierung
moloch - Mo 13.09.04 12:14
Titel: ListView schnelle Spaltenoptimierung
Hallo Forum,
ich baue mir eine Listview auf und gehe danach jede spalte durch um die Breite der Spalte zu optimieren.
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
Christian S.: Delphi-Tags hinzugefügt.
Delete - 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 - 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 - Mo 13.09.04 14:06
hi,
du kannst eine größenveränderungen auch mit form.resize simulieren.
GRuß
Ken
moloch - Mo 13.09.04 14:38
ja ich weiss,
aber das löst doch jetzt nicht das problem.
mfg
moloch
Delete - 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 - 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
Delete - 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:
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; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!