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 Virtual Tree View und Mauscursor (https://www.delphipraxis.net/148311-virtual-tree-view-und-mauscursor.html)

Codewalker 27. Feb 2010 12:44


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

DeddyH 27. Feb 2010 12:49

Re: Virtual Tree View und Mauscursor
 
Wäre das nicht mit einem HotTrack einfacher zu machen?

Codewalker 27. Feb 2010 12:51

Re: Virtual Tree View und Mauscursor
 
HotTrack kenne ich nur vom Namen. Wie genau meinst du das?

DeddyH 27. Feb 2010 12:55

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:
procedure TMainForm.FormCreate(Sender: TObject);
begin
  VST.TreeOptions.PaintOptions := VST.TreeOptions.PaintOptions + [toHotTrack];
  VST.Colors.HotColor := clNavy;
  VST.HotCursor := crHandPoint;
end;
Entspricht das in etwa dem, was Du erreichen wolltest?

Codewalker 27. Feb 2010 12:58

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.

DeddyH 27. Feb 2010 13:08

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.

Codewalker 27. Feb 2010 13:13

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.

DeddyH 27. Feb 2010 13:30

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: Video [/edit]

Rakshasa 27. Feb 2010 14:03

Re: Virtual Tree View und Mauscursor
 
Die aktuelle Spalte kann man ja folgendermaßen auslesen:

vst_treeview.Header.Columns.ColumnFromPosition();

Hawkeye219 27. Feb 2010 15:34

Re: Virtual Tree View und Mauscursor
 
Hallo,

ich habe hier mal unverschämterweise den Tipp von Rakshasa in meinen Code eingebaut:

Delphi-Quellcode:
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;
Gruß Hawkeye

Codewalker 27. Feb 2010 18:42

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.

Hawkeye219 27. Feb 2010 19:37

Re: Virtual Tree View und Mauscursor
 
Thomas, ich habe den Code aus meinem vorigen Beitrag ein wenig umgebaut und erweitert:

Delphi-Quellcode:
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;
Gruß Hawkeye

Codewalker 28. Feb 2010 20:46

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 13:44 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