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/)
-   -   Delphi ListView Spaltenbreite an Text automatisch anpassen (https://www.delphipraxis.net/24517-listview-spaltenbreite-text-automatisch-anpassen.html)

Sven Janssen 22. Jun 2004 14:13


ListView Spaltenbreite an Text automatisch anpassen
 
Morgen Leute.

wie bekomme ich es hin, das ich die Spaltenbreite automatisch an die Textbreite des Inhaltes anpassen kann? Angeblich mit property AutoSize: Boolean; aber das will nicht so ganz wie ich es möchte.

Wir kann ich den Doppelklick auf die Spaltentrenner programmatisch aufrufen?
Weil genau das wäre wohl die Idealste Lösung. Erst alles füllen und dann den Klick auf die Spaltentrenner simulieren.

Gruß
Sven

MrKnogge 22. Jun 2004 14:41

Re: ListView Spaltenbreite an Text automatisch anpassen
 
Hallo,

das autosize boolean, hat damit nicht's zu tun, bei autosize wird nur angegeben, wenn die breite deines Listvies verändert wird, wird der Breite des Spalte dessen autosize auf true steht, automatisch die verbeitet, damit du nicht eine (leere) Spalte zu viel hast.

Wie man die einzelnen Spaltenbreiten an den Inhalt anpasst, bzw. so anpasst damit man keine horizontale Scrollbar erhält, sobal die vertikale Scrollbar sichtbar wird, rätsel ich ebenfalls schon ne ganze Weile rum.

Sven Janssen 22. Jun 2004 15:12

Re: ListView Spaltenbreite an Text automatisch anpassen
 
Ich hab mir überlegt das man das Zeichen selber übernimmt und damit per canvas.textwidth die Breite des Textes heraus bekommt und danach die Spaltenbreite auf die größte gefundene Breite setzt.
Aber das ist sehr umständlich.

Sven

Sharky 22. Jun 2004 15:14

Re: ListView Spaltenbreite an Text automatisch anpassen
 
Zitat:

Zitat von Sven Janssen
Ich hab mir überlegt das man das Zeichen selber übernimmt und damit per canvas.textwidth ....

Du brauchst doch nicht selber zu Zeichnen um über den von dir beschriebenen Weg die Textbreite zu ermitteln und die Spaltenbreite entsprechend zu setzen.

Sven Janssen 22. Jun 2004 15:38

Re: ListView Spaltenbreite an Text automatisch anpassen
 
Stimmt.
Ich habs auch nun.

Font des canvas der ListView = Font der ListView.
Dann ne menge Abfragerrei, die Breiten in einem Array merken und dann mit einer for Schleife über den Array laufen und die Breiten setzen.

Ich musste aber ca 20 Pixel zu dem berechneten Wert hinzuaddieren, sonst hat es nicht ganz gepasst.

Sven

Sharky 22. Jun 2004 15:41

Re: ListView Spaltenbreite an Text automatisch anpassen
 
Zitat:

Zitat von Sven Janssen
...Dann ne menge Abfragerrei, die Breiten in einem Array merken und dann mit einer for Schleife über den Array laufen und die Breiten setzen....

Ist es nicht möglich/einfacher beim Eintragen eines Textes in die "Zelle" die notwendige Breite zu berechnen, diese mit der aktuellen Breite zu vergelichen und gegebenenfalls diese anzupassen?

MrKnogge 22. Jun 2004 16:18

Re: ListView Spaltenbreite an Text automatisch anpassen
 
Sven Janssen, könntest du mal deinen source posten, vielleicht lässt sich der ja noch optimieren.

Sven Janssen 22. Jun 2004 16:37

Re: ListView Spaltenbreite an Text automatisch anpassen
 
Delphi-Quellcode:
var spalte,col:integer;
    colw : array [0..10] of integer;
begin
    lv2.canvas.font:=lv2.font;
    for i:=low(colw) to high(colw) do colw[i]:=100;
    lv2.Columns.clear;
    q.first;
    while not q.eof do begin
    .
    . // Hier wird durch eine Tabelle gelaufen für n Elemente
    .
        nitem.subitems.add(q.fieldbyname(telArray[was]).asstring); telefoncol:=0;
        col:=lv2.canvas.textwidth(q.fieldbyname(telArray[was]).asstring);
        inc(spalte);
        if col > colw[spalte] then colw[spalte]:=col;

        nitem.subitems.add(q.fieldbyname(faxArray[was]).asstring); faxcol:=1;
        col:=lv2.canvas.textwidth(q.fieldbyname(faxArray[was]).asstring);
        inc(spalte);
        if col > colw[spalte] then colw[spalte]:=col;

        nitem.subitems.add(q.fieldbyname(emailArray[was]).asstring); emailcol:=2;
        col:=lv2.canvas.textwidth(q.fieldbyname(emailArray[was]).asstring);
        inc(spalte);
        if col > colw[spalte] then colw[spalte]:=col;
        q.next;
    end;
    .
    . // usw usw. _spalte_ deshalb da die Einträge variable sind.
    .

    for i:=0 to lv2.Columns.count -1 do lv2.Columns[i].width:=colw[i]+20;

end;
Wirklich viel zum optimieren sehe ich dort nicht.
Oben ein Löschen, pro Eintrag 3 Zeilen für die Abfrage und unten eine Schleife für das setzen der Breite.

Sven - nun Feierabend macht ... bis morgen

Keldorn 22. Jun 2004 17:55

Re: ListView Spaltenbreite an Text automatisch anpassen
 
Zitat:

Zitat von Sven Janssen
Morgen Leute.

wie bekomme ich es hin, das ich die Spaltenbreite automatisch an die Textbreite des Inhaltes anpassen kann? Angeblich mit property AutoSize: Boolean; aber das will nicht so ganz wie ich es möchte.

Hallo

man braucht eigentlich keinen extra code, probiers doch einfach mal mit
Delphi-Quellcode:
listview1.column[x].width := ColumnTextWidth    oder ColumnHeaderWidth.
Columntextwidth : die spalte ist so groß wie der text und bei der andern wird die spaltegrößn anhand des Headers ermittelt.

Mfg Frank

silentAMD 22. Jun 2004 20:09

Re: ListView Spaltenbreite an Text automatisch anpassen
 
setze doch einfach die column-width auf -1, das ist einfach!!

MrKnogge 22. Jun 2004 23:36

Re: ListView Spaltenbreite an Text automatisch anpassen
 
:shock: das wäre nun das letzte worauf ich gekommen wäre, aber ich glaub ich schau mir mal den Quelltext der TListView an, da müsst ja drinn stehen, was genau beim Doppelklick zwischen 2 Column's passiert.

Sven Janssen 23. Jun 2004 06:55

Re: ListView Spaltenbreite an Text automatisch anpassen
 
Zitat:

Zitat von silentAMD
setze doch einfach die column-width auf -1, das ist einfach!!

Ne oder? Und warum steht das in der @!-X?%& Hilfe nicht :wall:

Aber vielen Dank.
Sven

Sven Janssen 23. Jun 2004 07:15

Re: ListView Spaltenbreite an Text automatisch anpassen
 
tja schön und gut, aber mir gefällt meine Lösung doch besser.
Denn wenn nichts in der Spalte vorhanden ist, oder der breiteste Eintrag kleiner wie die Überschrift ist, dann schaut es hässlich aus.
Und abfragen danach ist nicht, denn width steht nun auf -1 und man bekoommt nicht die momentane Breite zurück.

Sven

MrKnogge 23. Jun 2004 08:07

Re: ListView Spaltenbreite an Text automatisch anpassen
 
dann musst du davor abfragen :wink:

Sven Janssen 23. Jun 2004 08:18

Re: ListView Spaltenbreite an Text automatisch anpassen
 
fragt sich nur auf was?
weil ich so gar nicht weiß wie groß die Spalte danach nun wird.

Sven

Sven Janssen 23. Jun 2004 08:34

Re: ListView Spaltenbreite an Text automatisch anpassen
 
Delphi-Quellcode:
for i:=0 to lv2.Columns.count -1 do lv2.Columns[i].width:=ColumnHeaderWidth;
So damit geht es. Also auf -2 und nicht -1 setzen.

Keldorn hatte es auch schon erwähnt.

Sven

MrKnogge 23. Jun 2004 08:37

Re: ListView Spaltenbreite an Text automatisch anpassen
 
Wo setzt du da einen Wert auf -2 :gruebel:

PS: Wenn du etwas posten möchtest, und von dir der letzte Post im Thread ist, so editiere bitte deinen letzten Beitrag und füge es so hinzu, damit bleibt das ganze Übersichtlicher.

Sven Janssen 23. Jun 2004 10:57

Re: ListView Spaltenbreite an Text automatisch anpassen
 
Zitat:

Zitat von MrKnogge
Wo setzt du da einen Wert auf -2 :gruebel:

PS: Wenn du etwas posten möchtest, und von dir der letzte Post im Thread ist, so editiere bitte deinen letzten Beitrag und füge es so hinzu, damit bleibt das ganze Übersichtlicher.

Delphi-Quellcode:
showmessage(intotstr(ColumnHeaderWidth));
// Ausgabe = -2 ;-)
Sven


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:34 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