![]() |
Virtual Tree View und Mauscursor
Hallo zusammen.
Ich nutze in meiner Anwendung den Virtual String Tree - das klappt soweit auch sehr gut. In einer Spalte zeige ich einen Hyperlink an, den ich über OnGetText schön blau und unterstrichend darstelle. Wie kriege ich es denn jetzt hin, dass der Text einen eigenen Cursor (die bekannte Hand) bekommt und bei Klick auf den Text die Webseite öffnet (ich suche nur das Ereignis, das Öffnen kriege ich schon hin). Grüße |
Re: Virtual Tree View und Mauscursor
Wäre das nicht mit einem HotTrack einfacher zu machen?
|
Re: Virtual Tree View und Mauscursor
HotTrack kenne ich nur vom Namen. Wie genau meinst du das?
|
Re: Virtual Tree View und Mauscursor
In VST.TreeOptions.PaintOptions kannst Du toHotTrack hinzufügen, mit VST.Colors.HotColor die Farbe des HotTracks festlegen und mit HotCursor den Cursor. Das geht natürlich auch per Code.
Delphi-Quellcode:
Entspricht das in etwa dem, was Du erreichen wolltest?
procedure TMainForm.FormCreate(Sender: TObject);
begin VST.TreeOptions.PaintOptions := VST.TreeOptions.PaintOptions + [toHotTrack]; VST.Colors.HotColor := clNavy; VST.HotCursor := crHandPoint; end; |
Re: Virtual Tree View und Mauscursor
Das ist fast die Lösung. Das Problem ist: Ich möchte HotTrack nur für eine Spalte (eben die mit dem Hyperlink). Alle anderen Spalten sollen normal bleiben.
|
Re: Virtual Tree View und Mauscursor
Versuch einmal, im OnHotChange-Event das Level des aktuellen Nodes zu ermitteln und dementsprechend HotTrack zu setzen oder eben nicht. Ich bin kein VST-Experte, aber das sollte IMO funktionieren.
|
Re: Virtual Tree View und Mauscursor
Danke DeddyH, aber das brachte leider auch nichts. OnHotChange wird bei einem Zeilenwechel ausgelöst, aber jede Zeile ist ja eine Node -> Alle haben Level 0. Ich habe schon überlegt es ins OnMouseMove zu bauen, aber wirklich performant kommt mir das nicht vor, bei jeder Mausbewegung zu ermitteln wo ich denn genau bin.
|
Re: Virtual Tree View und Mauscursor
Da weiß ich im Moment auch nicht weiter, man müsste die zur Node gehörige Column ermitteln. Leider habe ich mich gerade auch in den Weiten meiner Doku-PDF verlaufen und finde aktuell nichts Passendes.
[edit] Da ich nun meine eigene Unknenntnis bzgl. des VST offenbaren musste, will ich wenigstens noch auf den Video vom 2. virtuellen Stammtisch verweisen, falls Du das noch nicht kennst: ![]() |
Re: Virtual Tree View und Mauscursor
Die aktuelle Spalte kann man ja folgendermaßen auslesen:
vst_treeview.Header.Columns.ColumnFromPosition(); |
Re: Virtual Tree View und Mauscursor
Hallo,
ich habe hier mal unverschämterweise den Tipp von Rakshasa in meinen Code eingebaut:
Delphi-Quellcode:
Gruß Hawkeye
procedure TDemoForm.TreeDrawText(Sender: TBaseVirtualTree; TargetCanvas: TCanvas;
Node: PVirtualNode; Column: TColumnIndex; const Text: WideString; const CellRect: TRect; var DefaultDraw: Boolean); const LINKCOLUMN = 2; var P: TPoint; HotColumn: TColumnIndex; begin if ((Node = Tree.HotNode) and (toHotTrack in Tree.TreeOptions.PaintOptions)) then begin P := Tree.ScreenToClient(Mouse.CursorPos); HotColumn := Tree.Header.Columns.ColumnFromPosition(P); if ((Column = LINKCOLUMN) and (HotColumn = LINKCOLUMN)) then TargetCanvas.Font.Style := TargetCanvas.Font.Style + [fsUnderline] else TargetCanvas.Font.Style := TargetCanvas.Font.Style - [fsUnderline]; end; end; |
Re: Virtual Tree View und Mauscursor
Das sieht sehr gut aus, ich komme aber erst morgen wieder zum testen. Wobei dann noch die Frage offen bleibt, in welchem Ereignis man auf den Klick reagiert. Ich will ja den Link nur dann öffnen, wenn auf den Text in der Linkspalte geklickt wurde.
|
Re: Virtual Tree View und Mauscursor
Thomas, ich habe den Code aus meinem vorigen Beitrag ein wenig umgebaut und erweitert:
Delphi-Quellcode:
Gruß Hawkeye
const
LINKCOLUMN = 2; procedure TDemoForm.TreeDrawText(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; const Text: WideString; const CellRect: TRect; var DefaultDraw: Boolean); begin if IsHotNode(Node) then if (Column = LINKCOLUMN) and IsCursorInLinkColumn() then TargetCanvas.Font.Style := TargetCanvas.Font.Style + [fsUnderline] else TargetCanvas.Font.Style := TargetCanvas.Font.Style - [fsUnderline]; end; procedure TDemoForm.TreeMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if IsHotNode(Tree.GetNodeAt(X, Y)) and IsCursorInLinkColumn() then Tree.Cursor := crHandPoint else Tree.Cursor := crDefault; end; procedure TDemoForm.TreeClick (Sender: TObject); begin if IsHotNode(Tree.FocusedNode) and IsCursorInLinkColumn() then ShowMessage (Tree.Text[Tree.FocusedNode, LINKCOLUMN]); end; function TDemoForm.IsHotNode (aNode: PVirtualNode): Boolean; begin Result := (toHotTrack in Tree.TreeOptions.PaintOptions) and Assigned(aNode) and (aNode = Tree.HotNode); end; function TDemoForm.IsCursorInLinkColumn: Boolean; begin Result := (ColumnAtCursorPos() = LINKCOLUMN); end; function TDemoForm.ColumnAtCursorPos: TColumnIndex; var P: TPoint; begin P := Tree.ScreenToClient(Mouse.CursorPos); Result := Tree.Header.Columns.ColumnFromPosition(P); end; |
Re: Virtual Tree View und Mauscursor
Nabend zusammen.
Ich habe den Code von Hawkeye eben implementiert und er funktioniert exakt so wie er sollte. Vielen Dank für Zeit und Mühe :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz