AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

virtuelles TListView und Spaltenbreiten

Ein Thema von Marco Steinebach · begonnen am 7. Feb 2021 · letzter Beitrag vom 15. Feb 2021
Antwort Antwort
Marco Steinebach

Registriert seit: 4. Aug 2006
490 Beiträge
 
Delphi 5 Enterprise
 
#1

virtuelles TListView und Spaltenbreiten

  Alt 7. Feb 2021, 03:02
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
Marco Steinebach
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: virtuelles TListView und Spaltenbreiten

  Alt 7. Feb 2021, 08:27
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: virtuelles TListView und Spaltenbreiten

  Alt 7. Feb 2021, 12:48
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
Angehängte Dateien
Dateityp: zip Listview.zip (1,8 KB, 4x aufgerufen)
Fritz Westermann
  Mit Zitat antworten Zitat
Marco Steinebach

Registriert seit: 4. Aug 2006
490 Beiträge
 
Delphi 5 Enterprise
 
#4

AW: virtuelles TListView und Spaltenbreiten

  Alt 9. Feb 2021, 19:21
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
Marco Steinebach
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: virtuelles TListView und Spaltenbreiten

  Alt 10. Feb 2021, 09:12
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
Fritz Westermann
  Mit Zitat antworten Zitat
Marco Steinebach

Registriert seit: 4. Aug 2006
490 Beiträge
 
Delphi 5 Enterprise
 
#6

AW: virtuelles TListView und Spaltenbreiten

  Alt 15. Feb 2021, 07:07
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
Marco Steinebach
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:43 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