Implementieren von Objektklicks / Doppelklicks für TListView

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.

ListView.On Item Click & ListView.On Item Double Click

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:

  • htAbove - über dem Kundenbereich.
  • htBelow - unter dem Kundenbereich.
  • htNowhere - in der Steuerung, aber nicht auf einem Gegenstand.
  • htOnItem - auf ein Element, seinen Text oder seine Bitmap.
  • htOnButton - auf einen Knopf.
  • htOnIcon - auf ein Symbol.
  • htOnIndent - auf dem eingerückten Bereich eines Elements.
  • htOnLabel - auf einem Etikett.
  • htOnRight - auf der rechten Seite eines Artikels.
  • htOnStateIcon - auf einem Statussymbol oder einer Bitmap, die einem Element zugeordnet ist.
  • htToLeft - links vom Kundenbereich.
  • htToRight - rechts neben dem Kundenbereich.

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..