In the OnDragDrop event of a TListView, the source item and the destination item can be obtained thus:
procedure TFormX.ListView1DragDrop(Sender, Source: TObject; X, Y: Integer); var LSourceItem, LDestItem: TListItem; LSourceIndex, LDestIndex: Integer; begin LSourceItem := ListView1.Selected; LDestItem := ListView1.GetItemAt(X, Y); LSourceIndex := ListView1.Items.IndexOf(LSourceItem); LDestIndex := ListView1.Items.IndexOf(LDestItem); // ... other code ... end;
In 2017, with the release of Delphi 10.2 Tokyo, Embarcadero introduced a specialized implementation of the Observer pattern into the System.Classes unit. While it has been in the wild for 9 years, it remains a "hidden" architecture for many, primarily because it serves as the invisible engine behind LiveBindings. Other than live bindings, you can also use the Observer pattern as a way to update component settings to the Windows registry, an .ini file, or persist it elsewhere.
System.Classes