procedure ExChangeEx(lv: TListView; idx1, idx2: Integer);
var
tmp: TListItem;
cb, b: boolean;
ck: array of boolean;
i, c: integer;
begin
c := lv.Items.count - 1;
if (idx1 < 0) or (idx1 > c)
or (idx2 < 0) or (idx2 > c) then
raise exception.create('Zeile nicht vorhanden');
lv.Items.BeginUpdate;
cb := lv.checkboxes;
setlength(ck, c);
try
for i := 0 to c do ck[i] := lv.Items.Item[i].checked;
tmp := TListItem.Create(lv.Items);
tmp.Assign(lv.Items.Item[idx1]);
lv.Items.Item[idx1].Assign(lv.Items.Item[idx2]);
lv.Items.Item[idx2].Assign(tmp);
b := ck[idx1];
ck[idx1] := ck[idx2];
ck[idx2] := b;
tmp.Free;
for i := 0 to c do lv.Items.Item[i].checked := ck[i];
finally
lv.checkboxes := cb;
lv.Items.EndUpdate;
ck := nil;
end;
end;
// Beispielaufruf
procedure TForm1.Button1Click(Sender: TObject);
begin
ExChangeEx(ListView1, 1, 3);
end;
// Wenn Sie ganz sicher sind, dass die Checkboxen nicht genutzt
// werden sollen, dann können Sie die vereinfachte Version nehmen.
procedure ExChange(lv: TListView; idx1, idx2: Integer);
var
tmp: TListItem;
begin
if (idx1 < 0) or (idx1 >= lv.Items.count)
or (idx2 < 0) or (idx2 >= lv.Items.count)
or lv.checkboxes then
raise exception.create('Aktion nicht durchführbar');
lv.Items.BeginUpdate;
try
tmp := TListItem.Create(lv.Items);
tmp.Assign(lv.Items.Item[idx1]);
lv.Items.Item[idx1].Assign(lv.Items.Item[idx2]);
lv.Items.Item[idx2].Assign(tmp);
tmp.Free;
finally
lv.checkboxes := false; // wichtig
lv.Items.EndUpdate;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ExChange(ListView1, 2, 0);
end;