Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Dubikate in TStringGrid anzeigen (den Rest rausschmeißen)... (https://www.delphipraxis.net/51524-dubikate-tstringgrid-anzeigen-den-rest-rausschmeissen.html)

Sharky 14. Aug 2005 15:09

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

Zitat von marabu
... Was soll ich sagen, damit produzierte der Code in den ersten Durchläufen korrekte Ergebnisse. ...

Hai marabu,

auch beim ersten Durschlauf war das Ergebniss falsch im Sinne der Anforderung ;-)

alzaimar 14. Aug 2005 15:15

Re: Dubikate in TStringGrid anzeigen (den Rest rausschmeißen
 
@marabu: Auch wenn's völlig unwichtig ist: Ich bleib dabei, man 'kann', muss aber nicht;
Sei j0 der kleinste Index mit sl[j0] = KEY zu irgendeinem KEY und j1 der größte Index. Ziel ist es, j0 zu finden. Ob ich bei j1 anfange (so wie ich mit meiner Änderung) oder bei einem beliebigen j (j0<=j<=j1), so wie Du mit dem IndexOf, ist unerheblich. Allerdings ist meine Version schneller, insofern kann man müssen, muss aber nicht. :wiejetzt:

Ach, was ist das für ein Sonntag, an dem man sich über SOWAS auseinandersetzen kann. Dann geht's uns wohl doch ganz gut :zwinker:

marabu 14. Aug 2005 17:14

Re: Dubikate in TStringGrid anzeigen (den Rest rausschmeißen
 
@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


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:23 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz