Autor |
Beitrag |
Lollinger
Hält's aus hier
Beiträge: 15
WIN XP, WIN 2000
D3 Prof.
|
Verfasst: Mi 01.08.07 14:32
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
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: 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.
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; |
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
Lollinger 
Hält's aus hier
Beiträge: 15
WIN XP, WIN 2000
D3 Prof.
|
Verfasst: 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 
Hält's aus hier
Beiträge: 15
WIN XP, WIN 2000
D3 Prof.
|
Verfasst: 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
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: 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
2.) lowercase und compareText ist doppeltgemoppelt
3.) Setz mal in die erste Zelle des Grids genau den Suchbegriff ein  Endlosschleife 
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
|