Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi VirtualTreeView - Erkennen ob Text gekürzt wurde (https://www.delphipraxis.net/181363-virtualtreeview-erkennen-ob-text-gekuerzt-wurde.html)

Aviator 8. Aug 2014 19:28


VirtualTreeView - Erkennen ob Text gekürzt wurde
 
Hallo zusammen,
ich bin gerade dabei, einen Hint in meinem VirtualStringTree (VST) anzuzeigen. Alles kein Problem, habe ich schon tausend mal gemacht. Allerdings habe ich immer eine kleine Unschönheit bei der Sache.

Und zwar hätte ich gerne, dass nur dann ein Hint angezeigt wird, wenn der Text vom VST gekürzt wurde und mit "..." erweitert wird. Bei vollständig lesbaren Texten ist es ja nicht gerade sinnvoll, einen Hint anzuzeigen. Mein Problem ist jetzt, dass ich keine Funktion/Property kenne, die mir ausgibt, ob der Text in einer Column bei einer bestimmten Node gekürzt wurde. Ein Blick in die Sourcen des VST brachte mich auch nicht wirklich weiter, außer dass ich mit meinen Suchbegriffen dort nichts fand.

Es gibt ein Event "OnShortenString", allerdings kann ich da nur nochmal selbst eingreifen und sagen, wie groß das Rect ist, in das der Text eingepasst werden soll. Nur bringt mir das im OnGetHint Event des Trees nicht mehr besonders viel.

Meine Frage jetzt: Kennt jemand eine Möglichkeit um zu erkennen, ob ein Text in einer Spalte gekürzt wurde? Oder muss man das was ich vorhabe komplett selbst programmieren und dann mit TextWidth/TextExtend errechnen, ob der Text breiter als die ColumnWidth ist und dann ggf. den Hint anzeigen oder nicht?

Aviator 8. Aug 2014 19:41

AW: VirtualTreeView - Erkennen ob Text gekürzt wurde
 
Kleines Update: Ich habe mal das Event OnMeasureTextWidth mit einbezogen. Hierin setze ich jetzt eine Property auf True, wenn die Breite der Column die übergeben wurde kleiner ist, als der Wert der im Parameter Extend steht. Nur wenn die Variable true ist, wird der Hint angezeigt. Das wäre in meinen Augen eine praktikable Lösung, aber vielleicht kennt ja noch jemand einen besseren Weg.

Edit: Gerade noch weiter getestet. Funktioniert nur, wenn die Breite um einen etwas größeren Wert kleiner ist, als der Extend Wert des Parameters. Wenn es nur ein paar Pixel sind, dann wird anscheinend falsch berechnet bzw. die Breite des Textes ist nicht größer als die der Column, aber durch die Margins wird schon etwas verdeckt.

Aviator 10. Aug 2014 13:34

AW: VirtualTreeView - Erkennen ob Text gekürzt wurde
 
Mal ein freundliches :hi:Push:hi: and dieser Stelle.

Es würde mir schon genügen, wenn mir jemand, der sich damit wirklich auskennt, sagen könnte, ob die Vorgehensweise so oder anders ablaufen sollte.

Hier mal das, wie ich es zur Zeit gelöst habe. Falls es richtig sein sollte, können ja auch andere davon profitieren.

Hier der OnMeasureTextWidth EventHandler:
Delphi-Quellcode:
procedure TfrmMain.vstBugsMeasureTextWidth(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode;
  Column: TColumnIndex; const Text: string; var Extent: Integer);
begin
  ShowNodeHint := (vstBugs.Header.Columns[Column].Width < (Extent + 3.25 * vstBugs.TextMargin));
end;

Und hier der OnGetHint EventHandler:
Delphi-Quellcode:
procedure TfrmMain.vstBugsGetHint(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex;
  var LineBreakStyle: TVTTooltipLineBreakStyle; var HintText: string);
begin
  if ((Column in [1, 2]) and ShowNodeHint) then begin
    HintText := vstBugs.Text[Node, Column];
    ShowNodeHint := False;
  end;
end;
Hier werte ich im Prinzip nur die im OnMeasureTextWidth Event gesetzte Variable aus und zeige dann den Hint an oder aber auch nicht. Wie die 3.25 zustande kommt, kann ich nicht sagen. Normalerweise sollte hier 2 stehen, da der linke und rechte Rand (Property TextMargin) der Zelle zur Breite des Textes addiert wird. Warum das nicht ausreicht weiß ich nicht.

Vielleicht hat darauf ja noch jemand eine plausible Antwort.


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