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 VirtualStringTree Relativer HitPoint (https://www.delphipraxis.net/210781-virtualstringtree-relativer-hitpoint.html)

Hobbycoder 8. Jun 2022 10:52

VirtualStringTree Relativer HitPoint
 
Hi,

ich möchte im OnNodeClick einem VirtualStringTree den HitPoint excakt in einer Zelle bestimmem.
Nehmen wir eine Cell mit den Maßen 20 x 20. Beim Klich benötige ich den Point z.B. (5,8) den der User innerhalb der Column des Nodes angeklickt hat.
Ich erhalte aber in der HitInfo nur den absoluten HitPoint, also z.B. (156,256).
Wie kann ich den auf die Zelle umrechnen lassen, so dass ich immer die relative Position erhalte.

TiGü 8. Jun 2022 11:46

AW: VirtualStringTree Relativer HitPoint
 
Delphi-Quellcode:
procedure TDeineform.DeineVirtualTreeViewNodeClick(Sender: TBaseVirtualTree; const HitInfo: THitInfo);
var
    Column: TVirtualTreeColumn;
    ColumnX, ColumnY: Integer;
begin
    Column := Sender.Header.Columns[HitInfo.HitColumn];
    ColumnX := HitInfo.HitPoint.X - Column.Left;
    ColumnY := (HitInfo.HitPoint.Y + Sender.OffsetY) - (HitInfo.HitNode.Index * HitInfo.HitNode.TotalHeight);

    Caption := 'HitColumn: ' + Integer(HitInfo.HitColumn).ToString + ' - X:' + ColumnX.ToString + ' - Y:' + ColumnY.ToString;
end;
Geht vielleicht noch eleganter, zumindest sehen die Ergebnisse einigermaßen stimmig aus.
Abweichungen wegen mit oder ohne Rand einer Zelle bitte berücksichtigen, falls vorhanden.

Hobbycoder 8. Jun 2022 11:58

AW: VirtualStringTree Relativer HitPoint
 
Danke,

ich hatte zwischendurch eine andere Lösung gefunden:
Delphi-Quellcode:
procedure TForm1.vstTermineNodeClick(Sender: TBaseVirtualTree;
  const HitInfo: THitInfo);
var
  A: TAuftrag;
  T: TTeamWeekView;
  R: TRect;
begin
  case rgAnsicht.ItemIndex of
    0: ;
    1: begin
         TeamWeekViewList.UnSelectAll;
         T:=TTeamWeekView(vstTermine.GetNodeData(HitInfo.HitNode)^);
         R:=vstTermine.GetDisplayRect(HitInfo.HitNode, HitInfo.HitColumn, False);
         a:=nil;
         case HitInfo.HitColumn of
           1: A:=T.Montag.FindAuftragAt(Point(HitInfo.HitPoint.X, HitInfo.HitPoint.Y-R.Top), nil);
           2: A:=T.Dienstag.FindAuftragAt(Point(HitInfo.HitPoint.X, HitInfo.HitPoint.Y-R.Top), nil);
           3: A:=T.Mittwoch.FindAuftragAt(Point(HitInfo.HitPoint.X, HitInfo.HitPoint.Y-R.Top), nil);
           4: A:=T.Donnerstag.FindAuftragAt(Point(HitInfo.HitPoint.X, HitInfo.HitPoint.Y-R.Top), nil);
           5: A:=T.Freitag.FindAuftragAt(Point(HitInfo.HitPoint.X, HitInfo.HitPoint.Y-R.Top), nil);
           6: A:=T.Samstag.FindAuftragAt(Point(HitInfo.HitPoint.X, HitInfo.HitPoint.Y-R.Top), nil);
         end;
         if A<>nil then
         begin
           A.Selected:=True;
           vstTermine.Invalidate;
         end;
       end;
    2: ;
  end;
end;
Scheint auch soweit zu funktionieren.

Ich habe noch nicht getestet, was passiert, wenn ich gescrollt habe, weil in der Anwendung alle Nodes immer im Sichtbaren bereich liegen.
Möglichweise ist da deine Lösung besser. Mal ausprobieren...


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:26 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-2025 by Thomas Breitkreuz