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:
Vielleicht gut zu wissen die StringGrid hat 5 Cols und 5 Rows.
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; Danke im voraus. |
Re: Doppelte Eintrage in StringGris loeschen aber wie?
Hallo lucius,
nur ein Ansatz - ungetestet:
Delphi-Quellcode:
Grüße vom marabu
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; |
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; |
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 |
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:
..nun zum thema: die entsprechende zeile ans ende verschieben und dann rowcount dekrementieren.
type
tmovestringgrid=class(tstringgrid) public procedure moverow(fromrow, torow: Integer); end; procedure tmovestringgrid.moverow(fromrow, torow: Integer); begin inherited; end; |
Re: Doppelte Eintrage in StringGris loeschen aber wie?
Puuu das hoert sich ja schwierig an.
Mein code funzt soweit:
Delphi-Quellcode:
Aber ich moechte eigenlich das die erste row nicht mit kopiert wird(unveraendert bleibt), alles was ich jetzt kriege ist 2 lere SG`s.
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; Etwa so SG.Row := 1, dan faengt er erst ab der zweiten Reihe zu zaehlen und das ist mein Ziel. |
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. |
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. |
Re: Doppelte Eintrage in StringGris loeschen aber wie?
... da stand aber eben ein anderer code..:stupid:
Zitat:
..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; |
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. |
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