Möglichkeit 1: Du nimmst ein VirtualStringTree.
Möglichkeit 2: Du nimmst diese meine Funktion. Sie liefert true, wenn sie etwas gültiges findet. Kleiner "Nachteil": Es muss RowSelect angeschalten sein, sonst werden keine Subitems gefunden.
Delphi-Quellcode:
//cut here ------------------------------------------------------------------------
function TForm2.GetHitTestInfoEx(X, Y: Integer; const ListView: TListView;
var Item: TListItem; var Column: Integer): Boolean;
var
HT : THitTests;
OffSet : Integer;
idx : Integer;
begin
Result:=false;
Column:=-1;
HT:=ListView.GetHitTestInfoAt(X,Y);
if (not (htAbove in HT)) and (not (htBelow in HT)) and (not (htNoWhere in HT)) then
begin //ok, we are on an item
Result:=true;
Item:=Listview.GetItemAt(X,Y);
OffSet:=0;
for idx:=0 to ListView.Columns.Count-1 do
if (x>=OffSet) and (x<=OffSet+ListView.Columns[idx].Width) then
begin
Column:=idx;
exit;
end
else
Inc(Offset,ListView.Columns[idx].Width);
Result:=false;
end;
end;
//cut here ------------------------------------------------------------------------
procedure TForm2.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
Item : TListItem;
col : Integer;
begin
if GetHitTestInfoEx(x,y,ListView1,Item,col) then
Self.Caption:=Item.Caption+' - Spalte '+IntToStr(col)
else
Self.Caption:='Nischt wird .... nö .... geh weg';
end;