@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