![]() |
CharFeld/Suchen/Ersetzen
Hi Leute...
Ich hab mal so nebenbei an nem Programm gearbeitet, das aus einem StringGrid eben was einlesen soll, und dann als Charelemente in ein Feld speichern soll. Der Benutzer soll ein gesuchtes Element eingeben, das wird dann durchlaufen bis es gefunden wird, und dann alle Elemente ab da sollen mit einem Leerstring gefüllt werden. Aber wie meinem Nickname nach zu urteilen ist, hab ich das wiedermal nicht ohne Fehler geschafft ;). Das ganze zeigt einen DebuggerFehler in der Procedure GetMatrix auf, in dem das ganze eingelesen werden soll. Das ganze lässt sich außerdem compilieren, aber wenn ich auf Start drücke und alles vergleichen will funktioniert das natürlich nicht... hier mal der Quellcode:
Delphi-Quellcode:
Ich hoffe ihr könnt mir sagen was diesen groben Fehler heraufbeschwört, und falls es sonst noch etwas gibt was nicht funktionieren könnte, bitte ich mir das mitzuteilen!unit fcharfeld; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, ExtCtrls; type TFeld = array [1..7, 1..14] of char; TForm1 = class(TForm) Panel1: TPanel; gbEingabe: TGroupBox; StringGrid1: TStringGrid; GroupBox1: TGroupBox; edGesucht: TEdit; btStart: TButton; procedure btStartClick(Sender: TObject); private function SubMatrix(var A: TFeld; var x, y: integer; var ges: char; s: TStringGrid): boolean; { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} //***********************************************// // // // UP: GetMatrix // // Zweck: Einlesen der Feldelemente, und // // nur speichern, wenn sich darin kein // // Leerstring befindet. // // // //***********************************************// procedure GetMatrix(var a: TFeld; var s: TStringGrid); //Variablendeklaration var i, j: integer; begin //Vom 1. Zeilenelement bis zum letzten, mache for i:= 1 to s.ColCount do //Vom 1. Spaltenelement bis zum letzten, mache for j:= 1 to s.RowCount do //Überprüfe ob sich im Feld etwas befindet, if s.Cells[i, j] <> '' then //Wenn ja, speichere es ab A[i, j]:= Chr(StrToInt(s.Cells[i, j])); end; //***********************************************// // // // UP: SubMatrix // // Zweck: Eingegebenes Elemt im Feld suchen, // // und speichern. // // // //***********************************************// function TForm1.SubMatrix(var A: TFeld; var x, y: integer; var ges: char; s: TStringGrid): boolean; //Variablendeklaration var i, j: integer; begin result:= false; //Einlesen des Gesuchten Elements ges:= Chr(StrToInt(edGesucht.Text)); for i:= 1 to s.ColCount do for j:= 1 to s.RowCount do if A[i, j] = ges then begin x:= i; y:= j; result:= true; end else result:= false; end; procedure GetLeer(var A: TFeld; s: TStringGrid; var x, y: integer); //Variablendeklaration var i, j: integer; begin for i:= (x+1) to s.ColCount do for j:= (y+1) to s.RowCount do A[i, j]:= #240; end; procedure TForm1.btStartClick(Sender: TObject); //Variablendeklaration var A: TFeld; x, y: integer; ges: char; s: TStringGrid; isGefunden: boolean; begin GetMatrix(A, s); SubMatrix(A, x, y, ges, s); if isGefunden = True then ShowMessage('Der gesuchte Text befindet sich in der ' + IntToStr(x) + '. Reihe und ' + IntToStr(y) + '. Spalte.') else ShowMessage('Der gesuchte Text konnte nirgends gefunden werden!'); end; end. Danke im Vorraus, mfg noob_on_knees :| |
hat denn keiner eine Idee? :|
wäre blöd xD |
Moin Noob On Knees,
was ich mir als falsch denken könnte (ist bei einem StringGrid so eine Sache), ist, dass Du bis RowCount (bzw. ColCount) gehst, und nicht bis RowCount-1, denn auch die Indizes eines StringGrid sind nullbasiert. Die sichtbaren Zellen haben also Indizes von 0 bis Row/ColCount-1. |
habe das mit Col und RowCount nun durch die Anzahl der Spalten-1/Zeilen-1 ersetzt, jetzt bleibt das ganze bei s.Cells[i, j] stehen, wie soll ich das deiner Meinung nach ändern? Außerdem ist anscheinend plötzlich isGefunden, also das Result von SubMatrix nicht initialisiert, obwohl es das eigentlich sein sollte...
|
Moin Noob On Knees,
also das mit der fehlenden Intialisierung kann ich mir jetzt auch nicht erklären. Nur um es klarzustellen. Ich dachte mir das so: Statt:
Delphi-Quellcode:
so
for i:= 1 to s.ColCount do
Delphi-Quellcode:
Das dann natürlich an jeder Stelle an und für RowCount auch.
for i:= 1 to s.ColCount-1 do
Ob Du bei 1 beginnen musst, oder 0 hängt davon ab, ob Du FixedRows/Columns hast (z.B. 2 FixedRows => die Schleife muss bei 2 beginnen). Ausserdem solltest bei allen Feldern die die Indizes in irgendeiner Form verwenden berücksichtigen, dass die Indizes des StringGrid nullbasiert sind.
Delphi-Quellcode:
heisst für mich:
TFeld = array [1..7, 1..14] of char;
Das zugehörige StringGrid hat 7 Spalten und 14 Zeilen die mit Werten belegt werden können (also nicht Fixed sind). ColCount wäre dann 8, RowCount 15 (bei jeweils 1 x Fixed). |
ok thx habe jetzt mal alles so abgeändert, aber der fehler bleibt der gleiche...
|
ich habe jetzt mal alles mit dem debugger durchlaufen lassen, und plötzlich stelle ich fest das s.colcount etc einen wert an die - 129972908 angenommen hat... das ist doch auch nicht normal, deswegen hatte ich das ganze vorher statt auf s.ColCount-1 auf 14-1 gesetzt.
|
Moin Noob on Knees,
Zitat:
Sorry, aber da weiss ich jetzt auch nicht weiter. |
das ist ungut :freak:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz