Wo wir dabei sind, warum über
ListView1MouseUp()
und
ListView1.GetItemAt(X, Y)
?
Da gibt es doch bessere Möglichkeiten, z. B. OnClick oder OnDblClick:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
NewColumn: TListColumn;
ListItem: TListItem;
begin
with ListView1 do
begin
ViewStyle := vsReport;
NewColumn := Columns.Add;
NewColumn.Caption := 'Caption';
NewColumn.Width := 150;
for i := 1 to 10 do
begin
ListItem := Items.Add;
ListItem.Caption := 'Caption #' + IntToStr(i);
end;
end;
end;
procedure Test(Item: TListItem; i: Integer);
begin
ShowMessage(Format('i ist: %d; Caption: %s', [i, Item.Caption]));
end;
procedure TForm1.ListView1DblClick(Sender: TObject);
begin
if not (Sender is TListView) then Exit;
with TListView(Sender) do
Test(Selected, 4711);
end;
Und um das zu steigern, warum Werte in einer Parallel-StringList? Warum nicht als Bagage an ListView?
Delphi-Quellcode:
type
TMeineDaten = class
Str: String;
Int: Integer;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
NewColumn: TListColumn;
ListItem: TListItem;
MeineDaten: TMeineDaten;
begin
with ListView1 do
begin
ViewStyle := vsReport;
NewColumn := Columns.Add;
NewColumn.Caption := 'Caption';
NewColumn.Width := 150;
for i := 1 to 10 do
begin
MeineDaten := TMeineDaten.Create;
MeineDaten.Str := '_Abc';
MeineDaten.Int := 123;
ListItem := Items.Add;
ListItem.Caption := 'Caption #' + IntToStr(i);
ListItem.Data := MeineDaten;
end;
end;
end;
procedure Test(Item: TListItem; i: Integer; Daten: TMeineDaten);
begin
ShowMessage(Format('i ist: %d; Caption: %s', [i, Item.Caption]));
ShowMessage(Format('Daten aus Bagage: %s und %d', [Daten.Str, Daten.Int]));
end;
procedure TForm1.ListView1DblClick(Sender: TObject);
begin
if not (Sender is TListView) then Exit;
with TListView(Sender) do
begin
Test(Selected, 4711, TMeineDaten(Selected.Data));
end;
end;
//WICHTIG: bei löschen, der Items muss das Objekt vorher freigegeben werden!!!