// Hiermit kann man zwei Items (Zeilen bei ViewStyle=vsReport) im
// TListView vertauschen.

// Getestet mit D4 unter XP

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;



Zugriffe seit 6.9.2001 auf Delphi-Ecke