Das TListView-Steuerelement von Delphi zeigt eine Liste von Elementen in Spalten mit Spaltenüberschriften und Unterelementen oder vertikal oder horizontal mit kleinen oder großen Symbolen an.
Wie die meisten Delphi-Steuerelemente macht TListView das verfügbar OnClick und OnDblClick (OnDoubleClick) -Ereignisse.
Wenn Sie wissen möchten, auf welches Element geklickt oder doppelt geklickt wurde, können Sie die OnClick / OnDblClick-Ereignisse leider nicht einfach verarbeiten, um das angeklickte Element zu erhalten.
Das OnClick (OnDblClick) -Ereignis für die TListView wird immer dann ausgelöst, wenn der Benutzer auf das Steuerelement klickt - also immer dann, wenn das "Klicken" auftritt Irgendwo im Client-Bereich des Steuerelements.
Der Benutzer kann in die Listenansicht klicken, ABER alle Elemente "verpassen". Da die Anzeige der Listenansicht abhängig von der ViewStyle - Eigenschaft geändert werden kann, hat der Benutzer möglicherweise auf ein Element, eine Elementbeschriftung, ein Elementsymbol, "nirgendwo", ein Elementstatussymbol usw. Geklickt.
Hinweis: Die ViewStyle-Eigenschaft bestimmt, wie Elemente in der Listenansicht angezeigt werden: Die Elemente können als Gruppe von beweglichen Symbolen oder als Textspalten angezeigt werden.
Um das angeklickte Element (falls vorhanden) zu finden, wenn das OnClick-Ereignis für die Listenansicht ausgelöst wird, müssen Sie bestimmen, welche Elemente der Listenansicht unter dem durch die X- und Y-Parameter angegebenen Punkt liegen Position der Maus zum Zeitpunkt des "Klickens".
Die TListiew's GetHitTestInfoAt Die Funktion gibt Informationen über den angegebenen Punkt im Client-Bereich der Listenansicht zurück.
Um sicherzustellen, dass das Element angeklickt (oder doppelt angeklickt) wurde, müssen Sie GetHitTestInfoAt aufrufen und nur dann reagieren, wenn das Klickereignis für ein tatsächliches Element aufgetreten ist.
Hier ist eine Beispielimplementierung des OnDblClick-Ereignisses von ListView1:
// behandelt ListView1's On Double ClickVerfahren TForm.ListView1DblClick(Absender: TObject);
var
hts: THitTests;
ht: THitTest;
sht: Zeichenfolge;
ListViewCursosPos: TPoint;
selectedItem: TListItem;
Start
// Position des Mauszeigers in Bezug auf ListView
ListViewCursosPos: = ListView1.ScreenToClient (Mouse.CursorPos);
// doppelklicke wo?
hts: = ListView1.GetHitTestInfoAt (ListViewCursosPos.X, ListViewCursosPos.Y);
// "debug" hit test
Beschriftung: = ";
zum ht im hts tun
Start
sht: = GetEnumName (TypeInfo (THitTest), Integer (ht));
Beschriftung: = Format ('% s% s |', [Beschriftung, sht]);
Ende;
// Suchen Sie das doppelt angeklickte Element
wenn hts <= [htOnIcon, htOnItem, htOnLabel, htOnStateIcon] dann
Start
selectedItem: = ListView1.Selected;
// mach etwas mit dem doppelt angeklickten Gegenstand!
Beschriftung: = Format ('DblClcked:% s', [selectedItem.Caption]);
Ende;
Ende;
Lesen Sie in der Ereignisbehandlungsroutine OnDblClick (oder OnClick) die Funktion GetHitTestInfoAt, indem Sie die Position der Maus "innerhalb" des Steuerelements angeben. Um die Position der Maus in Bezug auf die Listenansicht zu ermitteln, wird die ScreenToClient-Funktion verwendet, um einen Punkt (Maus X und Y) in Bildschirmkoordinaten in lokale oder Clientbereichskoordinaten umzuwandeln.
Das GetHitTestInfoAt gibt einen Wert von zurück THitTests Art. Das THitTests ist eine Reihe von THitTest Aufzählungswerte.
Die THitTest-Aufzählungswerte mit ihrer Beschreibung lauten:
Wenn das Ergebnis des Aufrufs von GetHitTestInfoAt eine Teilmenge (Delphi-Mengen!) Von [htOnIcon, htOnItem, htOnLabel, htOnStateIcon] ist, können Sie sicher sein, dass der Benutzer auf das Element (oder auf sein Symbol / Zustandssymbol) geklickt hat..