![]() |
virtuelles TListView und Spaltenbreiten
Hallo zusammen,
Ich habe eine virtuelle ListView mit mehreren Spalten. Wie, um himmelswillen, kann ich die Spaltenbreiten so zur Laufzeit einstellen, das, auf jeden Fall, alles reinpasst, ohne mit "..." abgeschnitten zu werden. ColumnTextWidth und ColumnHeaderWidt nützen mich nix, weil ColumnTextWidt, logischerweise, nicht berechnet werden kann, die ListView weiß ja nicht, wie groß der Eintrag, der evtl. gleich kommt, ist, und ColumnHeaderWidt, bringt mir nix wirklich, weil ich nicht weiß, wieviele Leerzeichen ich in den Header schreiben müßte, damit's paßt. Ich hab das ganze mal so versucht
Code:
Funktioniert auch so in etwa, aber trotzdem werden viele Einträge abgeschn... ;-)
procedure TbListenFormular.liEintraegeData(Sender: TObject;
Item: TListItem); var i, breite: integer; begin // liEintraege ist meine ListView breite := liEintraege.canvas.textWidth(item.Caption); if breite > liEintraege.columns[0].width then liEintraege.columns[0].width := breite; for i := 0 to item.subItems.count -1 do begin breite := liEintraege.canvas.textWidth(item.subItems[i]); if breite > liEintraege.columns[i+1].width then liEintraege.columns[i+1].width := breite; end; end; Kann mir mal jemand auf die Sprünge helfen, bitte? Herzlich grüßt Marco |
AW: virtuelles TListView und Spaltenbreiten
Hast Du einmal versucht, für jede Spalte als Width -1 bzw. -2 anzugeben? Ob das für virtuelle Listviews funktioniert habe ich allerdings auch noch nicht ausprobiert.
|
AW: virtuelles TListView und Spaltenbreiten
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
habe ein kleines Projekt angehängt. Im Prinzip bist Du auf dem Richtigen Weg, Du solltest aber zusätzliche Pixel für die Breite addieren. Gruss Fritz PS : Gruss von Werner Sänger (BOB), ist mein Nachbar |
AW: virtuelles TListView und Spaltenbreiten
Huhu Fritzew und alle anderen,
Erstmal Danke für den Tipp. Ich wäre nie drauf gekommen, einfach einen Wert dazuzuzählen, aber das funktioniert schonmal. Mein Problem ist: du läufst die gesamte Liste ja einmal durch, um die korrekten Spaltenbreiten zu ermitteln. Gibt es denn nicht eine Möglichkeit, dass ganze pro Element zu machen? Hätte den Vorteil, dass man eben nicht, wie bei einer nicht-virtuellen Liste, die ganze Liste einmal durchlaufen muss. Sondern sowas wie - onData: // Fuelle das Item mit den entsprechenden Werten // prüfe, ob alle Spalten breit genug sind, wenn nicht, mach sie breiter. ;-) Ich hab das zwar versucht, dass funzt aber bei mir nicht - wie in Post1 geschrieben. Hat jemand noch 'ne Idee? Herzliche Grüße Marco p.s.: herzliche Grüße zurück an Werner ;-) |
AW: virtuelles TListView und Spaltenbreiten
Zitat:
Das Problem mit Deinem Ansatz ist, dass, das Data Event während dem PaintZyklus aufgerufen wird. Innerhalb der PaintMessage sollte man aber nicht wirklich das Control verändern. Das einzige was mir dazu einfällt wäre eine neue Klasse von Listview abzuleiten und da das Paint zu übeschreiben. Mich würde es aber stören wenn sich ein View während z.B Scrollen ändert. Aber jetz mal als Idee: Also WM_Paint übeschreiben. Dort ein Array mit den Columnbreiten initialisieren jetzt inherited aufrufen Im OnData die Breiten überprüfen und den max für die Columns in das Array schreiben. Zurück im neuen WM_Paint eventuell die Breiten neu setzen wenn notwendig. Gruss Fritz |
AW: virtuelles TListView und Spaltenbreiten
Hallo Fritz,
Ähm, nein, ;-), da hast du recht, das taugt nicht wirklich was, die Paint-Message zu überschreiben. Aber mein Gedanken-Ansatz war sowieso Murks, ich muss ja, beim Befüllen der Items, die Liste sowieso einmal durchlaufen, da kann ich auch gleich da die maximalen Spaltenbreiten berechnen. Herzlich grüßt Marco |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:40 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 by Thomas Breitkreuz