![]() |
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. |
AW: VirtualStringTree Relativer HitPoint
Delphi-Quellcode:
Geht vielleicht noch eleganter, zumindest sehen die Ergebnisse einigermaßen stimmig aus.
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; Abweichungen wegen mit oder ohne Rand einer Zelle bitte berücksichtigen, falls vorhanden. |
AW: VirtualStringTree Relativer HitPoint
Danke,
ich hatte zwischendurch eine andere Lösung gefunden:
Delphi-Quellcode:
Scheint auch soweit zu funktionieren.
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; 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