Autor Beitrag
Lollinger
Hält's aus hier
Beiträge: 15

WIN XP, WIN 2000
D3 Prof.
BeitragVerfasst: Mi 01.08.07 14:32 
hallöchen,

ich habe im Internet folgenden Code zum löschen einer bestimmten Reihe gefunden:
ausblenden 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:
ausblenden 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;
// eigener Suchalgorithmus
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); // <-- hier liegt das Problem
            end;
    end;
end;


Warum löscht mir Delphi jetzt sobald ich etwas eingebe alle Zeilen - bis auf eine, die wird leer ??
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: 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.
ausblenden volle Höhe 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;  //Suchbegriff merken  
sname2 := sname;         //Nochmal merken
// eigener Suchalgorithmus  
for i := 0 to n do       //n = global definiert, richtig initialisiert ???
    begin  
    inh := inhalt[0,i];  //Inhalt aus Array ??? ermitteln
    if sname = inh then  //Suchbegriff = inh
       //dann im Grid selectieren, innerhalb einer Schleife ???
       //Selection wird doch beim nächsten Durchlauf wieder aufgehoben  
       SG1.Selection := TGridRect(Rect(0,i,1,i))
       else //Suchbegriff <> inh      
         begin         
         //Suchbegriff in inh enthalten ?
         posi := pos(sname,inh);//wo beginnt der Suchstring  
         if posi <> 0 then 
           begin //Suchbegriff enthalten 
           //Am Anfang des Suchbegriffs eine Anzahl Zeichen entsprechend der 
           //Position des Suchstrings in inh löschen ?????????????
           delete(sname,0,posi); 
           //Bedingung trifft nie zu, denn sname wird immer verändert 
           if sname = sname2 then //im Grid selectieren
             SG1.Selection := TGridRect(Rect(0,i,1,i))  
           end  
           else //Suchbegriff nicht in inh enthalten ?
             //Zeile löschen
             GridDeleteRow(SG1,i); // <-- hier liegt NICHT das Problem  
         end;  
    end;  
end;


Der Code, reduziert auf Grundlage der Kommentare, führt zum gleichen Ergebnis:
ausblenden 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  //Suchbegriff <> inh oder nicht in inh enthalten
    GridDeleteRow(SG1,i);        
  end;
  SG1.Selection := TGridRect(Rect(0,n,1,n));//was soll eigentlich selectiert werden  
end;

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
Lollinger Threadstarter
Hält's aus hier
Beiträge: 15

WIN XP, WIN 2000
D3 Prof.
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 15

WIN XP, WIN 2000
D3 Prof.
BeitragVerfasst: Mi 01.08.07 21:41 
so.. hab nach ein paar Schreibtischtests den Suchalgorithmus umgeschrieben...

FRAGE BEANTWORTET!
ausblenden 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;
        // eigener Suchalgorithmus
        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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Do 02.08.07 00:21 
Hallo,

1.) damit:
ausblenden 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:

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )