Entwickler-Ecke
Sonstiges (Delphi) - Fehler in procedure zum löschen von Stringgridreihen
Lollinger - Mi 01.08.07 14:32
Titel: Fehler in procedure zum löschen von Stringgridreihen
hallöchen,
ich habe im Internet folgenden Code zum löschen einer bestimmten Reihe gefunden:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure GridDeleteRow(const Grid : TStringGrid; RowNumber : Integer); var i : Integer; begin for i := RowNumber to Grid.RowCount - 2 do Grid.Rows[i].Assign(Grid.Rows[i+ 1]); Grid.Rows[Grid.RowCount-1].Clear; Grid.RowCount := Grid.RowCount - 1; end; |
Diese Prozedur rufe ich in einem Suchalgorithmus (keinen Schrecken bekommen, ist selber ausgedacht) auf:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| procedure TFAdress.EdsearchChange(Sender: TObject); var posi, i: integer; sname, sname2, inh: string; begin sname := Edsearch.text; sname2 := sname; for i := 0 to n do begin inh := inhalt[0,i]; if sname = inh then SG1.Selection := TGridRect(Rect(0,i,1,i)) else begin posi := pos(sname,inh); if posi <> 0 then begin delete(sname,0,posi); if sname = sname2 then SG1.Selection := TGridRect(Rect(0,i,1,i)) end else GridDeleteRow(SG1,i); end; end; end; |
Warum löscht mir Delphi jetzt sobald ich etwas eingebe alle Zeilen - bis auf eine, die wird leer ??
Lannes - Mi 01.08.07 17:01
Hallo,
das Problem liegt nicht in der Zeile.
Die Bedingungen
sname = inh und
sname in inh enthalten werden nie erfüllt, deshalb kommt immer die Zeile zur Ausführung, in der Du das Problem vermutest. --> StringGrid.Row wird gelöscht.
Das die Bedingungen nie zutreffen wird in der Suchroutine begründet sein.
Was ist n, wie ist n initialisiert?
Was ist inhalt[x,y] ?
Ich habe mal Deinen Code kommentiert, nehme an das Dir dann der/die Fehler auffallen.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| procedure TFAdress.EdsearchChange(Sender: TObject); var posi, i: integer; sname, sname2, inh: string; begin sname := Edsearch.text; sname2 := sname; for i := 0 to n do begin inh := inhalt[0,i]; if sname = inh then SG1.Selection := TGridRect(Rect(0,i,1,i)) else begin posi := pos(sname,inh); if posi <> 0 then begin delete(sname,0,posi); if sname = sname2 then SG1.Selection := TGridRect(Rect(0,i,1,i)) end else GridDeleteRow(SG1,i); end; end; end; |
Der Code, reduziert auf Grundlage der Kommentare, führt zum gleichen Ergebnis:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TFAdress.EdsearchChange(Sender: TObject); var i: integer; sname, inh: string; begin sname := Edsearch.text; for i := 0 to n do begin inh := inhalt[0,i]; if pos(sname,inh) = 0 then GridDeleteRow(SG1,i); end; SG1.Selection := TGridRect(Rect(0,n,1,n));end; |
Lollinger - Mi 01.08.07 18:18
n ist konstant festgelegt (n := 500)
inhalt[x,y] sind vom Typ string (gleicher Inhalt wie das Stringgrid mit den Spalten 'Name' und 'e-mail')
zu Zeile 22: 'Position des Suchstrings in inh löschen'. nein, der String soll bis zur Eingabe gelöscht werden...
alles in allem: der Suchlauf funktioniert fehlerfrei... meine Name-/E-Mail-Datenmenge sind auch nur 10... ich möchte jetzt, dass er bei einer Eingabe alle Zeilen rausschmeißt, die den eingegebenen String nicht enthalten... Bsp:
1 Hans Müller hans.müller@email.de
2 Peter Kuhn
Peter@kuhn-haeuser.de
3 Frank Hans
f.hans@home-mail.net
(ausgedachte Namen und EMail)
wenn ich jetzt in das Suchfeld 'Hans' eingebe, soll er Zeile 2 löschen, weil 'Hans' ja da nicht drinsteht. Momentan löscht er mir jedoch alles...
Lollinger - Mi 01.08.07 21:41
so.. hab nach ein paar Schreibtischtests den Suchalgorithmus umgeschrieben...
FRAGE BEANTWORTET!
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| i := 0; x := SG1.Rowcount - 1; noname := 0; while i <= x do begin sname := lowercase(Edsearch.text); lang := length(sname); inh := lowercase(SG1.cells[0,i]); if compareText(inh,sname) = 0 then SG1.Selection := TGridRect(Rect(0,i,1,i)) else begin posi := pos(sname,inh); if posi > 0 then begin if compareText(inh[lang],sname) = 0 then SG1.Selection := TGridRect(Rect(0,i,1,i)); inc(i); end else begin GridDeleteRow(SG1,i); SG1.Selection := TGridRect(Rect(0,0,1,0)); dec(x); end; end; end; |
hoffe mal nix vergessen haben zu kopieren
Lannes - Do 02.08.07 00:21
Hallo,
1.) damit:
Delphi-Quelltext
1:
| if compareText(inh[lang],sname) = 0 then |
prüfst Du ob das letzte Zeichen des Strings aus der Zelle des StringGrids mit dem Suchbegriff identisch ist :roll:
2.) lowercase und compareText ist doppeltgemoppelt
3.) Setz mal in die erste Zelle des Grids genau den Suchbegriff ein :arrow: Endlosschleife :wink:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!