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 VirtualTreeView Textlänge begrenzen mit '...' (https://www.delphipraxis.net/136705-virtualtreeview-textlaenge-begrenzen-mit.html)

DataCool 6. Jul 2009 14:24


VirtualTreeView Textlänge begrenzen mit '...'
 
Hi Leute,

sollte eigentlich einfach sein aber irgentwie komme ich das Problem nicht ganz aus der Welt.

Ich möchte innerhalb eines VirtualStringTree's die horizontale Scrollbar ausblenden und Text die "zu lang" sind mit '...' anzeigen.
Das Scollbar ausblenden ist ja kein Problem, der Anzeige-Text wird dynamisch im OnGetText-Event gesetzt.
Colmuns gibt es keine.

Ich hatte jetzt schon versucht mit :
Delphi-Quellcode:
  // Textbreite ermitteln
  iTextWidth := vst_xyz.Canvas.TextWidth(pNodeData^.NodeCaption);
  // Text zu breit ? Mit was vergleichen ?
Die Textbreite zu ermitteln, aber mit was soll ich die Breite vergleichen ?

- Width des VirtualTreeview berücksichtigt nicht die Nodeeinrückung

-
Delphi-Quellcode:
   ARect := vst_xyz.Canvas.ClipRect;
   iWidth := ARect.Right - ARect.Left;
liefert leider auch nicht das gewünschte Ergebnis

-
Delphi-Quellcode:
iWidth := vst_xyz.Width - (vst_xyz.Indent * vst_xyz.GetNodeLevel(Node));
leider auch nicht

Habe ich einen Denkfehler oder gibt es gar eine Property im VST dafür die ich übersehen habe ?

Greetz Data

CoLT 6. Jul 2009 15:15

Re: VirtualTreeView Textlänge begrenzen mit '...'
 
Im OnBeforeCellPaint() kannst du auf das ContentRect zugreifen und die Breite des sichtbaren Bereichs errechnen (Da musst du dann noch 2* den TextMargin zu addieren).

Speicher dir das Ergebnis zb in dem Column.Tag oder im dirket im Header.Tag, wenn du ohne Columns arbeitest,

Eine 0 würde ich verwenden, wenn der Platz ausreicht für den Text und alles >0 mit der Funktion VirtualTrees.ShortenString(); kürzen.


CoLT

Hawkeye219 6. Jul 2009 17:57

Re: VirtualTreeView Textlänge begrenzen mit '...'
 
Hi,

am einfachsten ist es wahrscheinlich, eine einzige Spalte ohne Anzeige des Headers einzurichten. In den Optionen für den Header stellst du hoAutoResize auf den Wert True, die Eigenschaft Header.AutoSizeIndex stellst du auf den Wert 0. Dadurch nimmt die Spalte die gesamte Breite des Trees ein, zu lange Texte werden dann vom VST automatisch durch "..." gekennzeichnet.

Gruß Hawkeye

mirage228 6. Jul 2009 18:18

Re: VirtualTreeView Textlänge begrenzen mit '...'
 
Ich werfe mal das Ereignis OnShortenString in den Raum ;-)

DataCool 6. Jul 2009 22:16

Re: VirtualTreeView Textlänge begrenzen mit '...'
 
@Hawkeye,Colt:
Thanks zum 2ten, in meinem Fall nehme ich jetzt die automatische Variante von Hawkeye ;-)

@Mirage:
Auch interessant zu wissen, aber kürzen muss ich den String dort selber.

Greetz Data

mirage228 6. Jul 2009 23:39

Re: VirtualTreeView Textlänge begrenzen mit '...'
 
Zitat:

Zitat von DataCool
@Mirage:
Auch interessant zu wissen, aber kürzen muss ich den String dort selber.

Das stimmt, wobei Du z.B. für Dateinamen "MinimizeName" aus der FileCtrl Unit nehmen kannst:
Delphi-Quellcode:
  if TargetCanvas.TextWidth(S) > TextSpace then
  begin
    Result := MinimizeName(S, TargetCanvas, TextSpace);
    Done := True;
  end;
Viele Grüße

sh17 7. Jul 2009 07:19

Re: VirtualTreeView Textlänge begrenzen mit '...'
 
Oder Du nimmst

Delphi-Quellcode:
S := ShortenString(PaintInfo.Canvas.Handle, S, R.Right - R.Left, 0);
Dann wird alles berechnet

DataCool 7. Jul 2009 07:46

Re: VirtualTreeView Textlänge begrenzen mit '...'
 
Die Frage ist jetzt ausreichend mit mehreren Möglichkeiten beantwortet,
denke das ist jetzt für jeden die richtige Lösung dabei,
nochmal Danke an alle,

Greetz Data


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