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/)
-   -   virtuelles TListView und Spaltenbreiten (https://www.delphipraxis.net/206892-virtuelles-tlistview-und-spaltenbreiten.html)

Marco Steinebach 7. Feb 2021 02:02

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:
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;
Funktioniert auch so in etwa, aber trotzdem werden viele Einträge abgeschn... ;-)
Kann mir mal jemand auf die Sprünge helfen, bitte?

Herzlich grüßt
Marco

DeddyH 7. Feb 2021 07:27

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.

Fritzew 7. Feb 2021 11:48

AW: virtuelles TListView und Spaltenbreiten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Marco Steinebach (Beitrag 1482419)
Kann mir mal jemand auf die Sprünge helfen, bitte?

Herzlich grüßt
Marco

Hallo Marco,
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

Marco Steinebach 9. Feb 2021 18:21

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 ;-)

Fritzew 10. Feb 2021 08:12

AW: virtuelles TListView und Spaltenbreiten
 
Zitat:

Zitat von Marco Steinebach (Beitrag 1482628)
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:
/)

Hallo Marco
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

Marco Steinebach 15. Feb 2021 06:07

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 02:14 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