Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Doppelte Eintrage in StringGris loeschen aber wie? (https://www.delphipraxis.net/54741-doppelte-eintrage-stringgris-loeschen-aber-wie.html)

lucius 10. Okt 2005 20:51


Doppelte Eintrage in StringGris loeschen aber wie?
 
Erstmal Guten Abend an alle.
Ich habe ein StringGrid das gefuellt wird mit Daten, jetzt moechte ich mittels einen Timer Doppelte Eintraege im SG loeschen, geht sowas?
Mit einer Listbox gehts:

Delphi-Quellcode:
procedure TMainForm.Timer1Timer(Sender: TObject);
var
D1, D2: integer;
begin

while D1 < listbox1.Items.Count do
begin
  for D2 := (listbox1.Items.Count - 1) downto 0 do
  begin
    if (listbox1.Items.Strings[D1] = listbox1.Items.Strings[D2]) and (D1 <> D2) then
      listbox1.Items.Delete(D2);
  end;
  inc(D1);
end;

end;
Vielleicht gut zu wissen die StringGrid hat 5 Cols und 5 Rows.
Danke im voraus.

marabu 10. Okt 2005 21:07

Re: Doppelte Eintrage in StringGris loeschen aber wie?
 
Hallo lucius,

nur ein Ansatz - ungetestet:

Delphi-Quellcode:
procedure DeleteRow(sg: TStringGrid; iRow: integer);
var
  i: integer;
begin
  with sg 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 DeleteDuplicateRows(sg: TStringGrid);
var
  iLow, iHigh: integer;
begin
  for iLow := sg.FixedRows to sg.RowCount - 2 do
    for iHigh := Pred(sg.RowCount) downto Succ(iLow) do
      if sg.Rows[iHigh].Text = sg.Rows[iLow].Text then
        DeleteRow(sg, iHigh);
end;
Grüße vom marabu

lucius 10. Okt 2005 21:15

Re: Doppelte Eintrage in StringGris loeschen aber wie?
 
Aaa der gute marabu, hallo

Ich hatte folgendes gedacht:

Delphi-Quellcode:
procedure TMainForm.Timer1Timer(Sender: TObject);
var
S1, S2: integer;
begin

while S1 < SG1.Rows.Count do
begin
  for S2 := (SG1.Rows.Count - 1) downto 0 do
  begin
    if (SG1.Rows.Count[S1] = SG1.Rows.Count[S2]) and (S1 <> S2) then
      StringGrid1.Rows[S2].Clear();
  end;
  inc(S1);
end;

end;

marabu 10. Okt 2005 21:28

Re: Doppelte Eintrage in StringGris loeschen aber wie?
 
Du hast S1 nicht initialisiert. Und wenn du etwas im OnTimer-Ereignis erledigst, dann ist es oft ratsam den Timer für die Dauer der Verarbeitung zu deaktivieren. Außerdem fällt mir auf, dass da nirgends ein Vergleich auf doppelte Zellwerte statt findet. Ob man mit Rows.Clear() wirklich eine Zeile aus dem Grid entfernen kann, so dass die anderen Zeilen die Lücke schließen? Probiere es einfach mal aus.

Gute Nacht vom marabu

ibp 10. Okt 2005 22:11

Re: Doppelte Eintrage in StringGris loeschen aber wie?
 
man kann sich das ganze löschen von zeilen auch einfacher machen, da das tstringgrid die methoden moverow implementiert hat, aber leider verteckt ist.....(das ganze gibt es auch für movecolumn)

lösung die methode in einer abgeleiteten klasse wieder sichtbar machen!

Delphi-Quellcode:
type
tmovestringgrid=class(tstringgrid)
public
  procedure moverow(fromrow, torow: Integer);
end;

procedure tmovestringgrid.moverow(fromrow, torow: Integer);
begin
  inherited;
end;
..nun zum thema: die entsprechende zeile ans ende verschieben und dann rowcount dekrementieren.

lucius 10. Okt 2005 22:34

Re: Doppelte Eintrage in StringGris loeschen aber wie?
 
Puuu das hoert sich ja schwierig an.
Mein code funzt soweit:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  ndx : Integer;
begin
  StringGrid1.RowCount := StringGrid2.RowCount;

  for ndx := 0 to StringGrid1.RowCount do
  begin
    StringGrid2.Rows[ndx] := StringGrid1.Rows[ndx];
  end;
end;
Aber ich moechte eigenlich das die erste row nicht mit kopiert wird(unveraendert bleibt), alles was ich jetzt kriege ist 2 lere SG`s.
Etwa so SG.Row := 1, dan faengt er erst ab der zweiten Reihe zu zaehlen und das ist mein Ziel.

ibp 10. Okt 2005 22:44

Re: Doppelte Eintrage in StringGris loeschen aber wie?
 
1..du machst ja auch keine inhaltsabfrage!
2..warum überprüfst du nicht gleich beim füllen des grids, ob der eintrag schon vorhanden ist, dann kannst du dir den ganzen anderen mist sparen.

lucius 10. Okt 2005 22:46

Re: Doppelte Eintrage in StringGris loeschen aber wie?
 
Uuu ibp gib mal bitte einen Ansatzcode von was du meinst damit ich mich orientieren kann.
Herzlichen dank.

ibp 10. Okt 2005 22:59

Re: Doppelte Eintrage in StringGris loeschen aber wie?
 
... da stand aber eben ein anderer code..:stupid:

Zitat:

Zitat von lucius
Puuu das hoert sich ja schwierig an.
Mein code funzt soweit:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  ndx : Integer;
begin
  StringGrid1.RowCount := StringGrid2.RowCount;

  for ndx := 0 to StringGrid1.RowCount do
  begin
    StringGrid2.Rows[ndx] := StringGrid1.Rows[ndx];
  end;
end;
Aber ich moechte eigenlich das die erste row nicht mit kopiert wird(unveraendert bleibt), alles was ich jetzt kriege ist 2 lere SG`s.
Etwa so SG.Row := 1, dan faengt er erst ab der zweiten Reihe zu zaehlen und das ist mein Ziel.

dein code müsste bei der ausführung knallen! die schleife darf nur bis rowcount-1 laufen!

..so sollte es gehen!

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  ndx : Integer;
  dst :integer;
  arow: integer;
  anzrows:integer;
  post:boolean;
begin
  anzrows:=StringGrid1.RowCount;
  StringGrid2.RowCount:=anzrows;

  dst:=0;
  for ndx := 0 to anzrows-1 do
  begin
    post:=true;
    for arow:=0 to dst do
      if StringGrid2.Rows[arow]=StringGrid1.Rows[ndx] then
        post:=false;

    if post then
    begin
      StringGrid2.Rows[dst]:=StringGrid1.Rows[ndx];
      inc(dst);
    end;
  end;
end;

lucius 10. Okt 2005 23:13

Re: Doppelte Eintrage in StringGris loeschen aber wie?
 
Klapt wunderbar, nochmals Danke fuer deine Arbeit und Zeit. :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:55 Uhr.
Seite 1 von 2  1 2      

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