Fehler in StringGrid Suche ?!? Help !
-
Hi@all
Nachdem ich nun nach zahlreichen Hilfestellungen durch dieses Bord hier ( THX@all ) meine Suchfunktion für mein stringGrid fertiggestellt habe ergeben sich darin doch leider noch einige Fehler die ich nicht zuordnen kann .
Vielleicht kann sich ja mal jemand dem Quelltext annehmen und mir die Fehler zeigen .
Thx
Fehler: nach mehreren Durchläufen einer Suche stürzt das Prog ab .Ich hab keine Ahnung warum .
void __fastcall TfrmMain::Button2Click(TObject *Sender) { String suchString = AnsiUpperCase(Edit1->Text); String celldata, upperdata; String founddata[100]; int long found_anz=0; int rowline[10]; for(int ilLine = 0; ilLine < StringGrid1->RowCount-1; ilLine++) { for(int ilCol = 0; ilCol < StringGrid1->ColCount-1; ilCol++) { celldata = StringGrid1->Cells[ilCol][ilLine+1]; upperdata = AnsiUpperCase(celldata); if (upperdata.Pos(suchString)) { founddata[found_anz]=celldata; rowline[found_anz]= (ilLine+1); found_anz++; } } } if (found_anz!=0) { ShowMessage("Found :" + AnsiString(found_anz)); for(int i=0; i<found_anz;i++) { StringGrid1->Row = rowline[i]; ShowMessage(founddata[i]); } } else ShowMessage("Not Found !"); }
Die Funktion soll also ein StringGrid nach einem Suchbegriff aus einem TEdit-feld durchsuchen , die anzhal der gefundenen Übereinstimmung zählen und dann der Reihe nach anzeigen und die entsprechende zeile markieren .
Thx
-
ich glaube, da sind ettliche Fehler drin...? Ich empfehle Dir, mit dem Debugger durch die Schleifen zu tracen und dann wirst Du die meisten sicher schnell finden.
Spontan gefällt mir das Array rowline[] nicht. Dort ist nur Platz für 10 Einträge (Index 0 bis 9). Es wird aber nicht geprüft, ob das Array "überläuft". Wenn das nämlich der Fall ist, werden irgendwelche andere Daten überschrieben und es gibt üble Seiteneffekte (wie alles, was wild im Speicher herumschreibt) und führt zu komischen Ergebnisse oder gleich saftigen Abstürzen.
Ist der Ausdruck
Cells[ilCol][ilLine+1]
so korrekt?
-
Vielleicht auch mal etwas über die Methodik des Debuggens nachlesen.
-junix
-
RowCount (bzw. ColCount) gibt dir anzahl der zeilen (spalten) an. wenn du also 5 zeilen hast, gibt dir RowCount 5 zurück. die erste zeile hat dabei aber den index 0 und die letzte RowCount - 1 also 4. wenn du in einer schleifen von 0 bis < RowCount - 1 gehst, dann gehst du lediglich von 0 bis 3. es reicht daher von 0 bis < RowCount gehst (um von 0 bis 4 zu gehen).
genauso ist die abfrage der zelle fehlerhaft. da du dort die zeile wieder erhöhst. sicherlich hast du die erste zeile als FixedRow deklariert, was du mal mit dazu hättest schreiben sollen. dann kannst du deine schleifen mit 1 beginnen statt mit 0.
for(int ilLine = 0; ilLine < StringGrid1->RowCount-1; ilLine++) { for(int ilCol = 0; ilCol < StringGrid1->ColCount-1; ilCol++) { celldata = StringGrid1->Cells[ilCol][ilLine+1]; // ... } }