Einzelnen Beitrag anzeigen

marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#13

Re: Dubikate in TStringGrid anzeigen (den Rest rausschmeißen

  Alt 14. Aug 2005, 18:14
@yankee: sorry, dein thread ist etwas entartet und ich bin wahrscheinlich der Schuldige. Hier der Code, der dein Problem lösen könnte. Er setzt die Idee von keldorn um, ohne den IndexOf()-Fehler. Hoffentlich korrekt:

Delphi-Quellcode:
procedure TDemoForm.DeleteRow(iRow: integer);
var
  i: integer;
begin
  with StringGrid do begin
    if iRow < FixedRows then
      raise Exception.Create('you cannot delete a fixed row');
    for i := Succ(iRow) to RowCount - 1 do
      Rows[i-1].Assign(Rows[i]);
    RowCount := RowCount - 1;
  end;
end;

procedure TDemoForm.KillButtonClick(Sender: TObject);
var
  i, iDup, iCol, iDist: integer;
  allDuplicates: boolean;
begin
  iCol := 1; // column to check
  allDuplicates := false;
  with StringGrid do
  for i := RowCount - 1 downto 0 do begin
    iDup := i;
    while (iDup > 0)
    and (cells[iCol, iDup - 1] = cells[iCol, iDup]) do
      Dec(iDup);
    iDist := i - iDup;
    if (iDist = 0) or (not allDuplicates and (iDist > 1)) then
      DeleteRow(i);
  end;
end;
@keldorn: Bin auch drauf hereingefallen - dabei habe ich sogar älteren Code bei mir gefunden, der die Falle umgeht.

@sharky: Bist ein guter Tester. Selbst die ersten 3000 mit dem gezeigten Random-Code erzeugten Testfälle werden von meiner ersten / fehlerhaften Prozedur korrekt verarbeitet. Da musstest erst du kommen mit deinen wahrscheinlich handgeschmiedeten Testdaten.

@alzaimar: Hast heute als einziger so richtig den Überblick gehabt - kein Wunder, warst ja auch lange genug im Urlaub.

Grüße vom marabu
  Mit Zitat antworten Zitat