Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi CharFeld/Suchen/Ersetzen (https://www.delphipraxis.net/5881-charfeld-suchen-ersetzen.html)

n00b_on_knees 22. Jun 2003 10:29


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:

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.
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!
Danke im Vorraus,
mfg noob_on_knees :|

n00b_on_knees 22. Jun 2003 12:21

hat denn keiner eine Idee? :|

wäre blöd xD

Christian Seehase 22. Jun 2003 12:29

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.

n00b_on_knees 22. Jun 2003 12:38

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...

Christian Seehase 22. Jun 2003 13:07

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:
for i:= 1 to s.ColCount do
so
Delphi-Quellcode:
for i:= 1 to s.ColCount-1 do
Das dann natürlich an jeder Stelle an und für RowCount auch.
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:
TFeld = array [1..7, 1..14] of char;
heisst für mich:

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).

n00b_on_knees 22. Jun 2003 13:17

ok thx habe jetzt mal alles so abgeändert, aber der fehler bleibt der gleiche...

n00b_on_knees 22. Jun 2003 13:29

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.

Christian Seehase 22. Jun 2003 13:42

Moin Noob on Knees,

Zitat:

Zitat von n00b_on_knees
stelle ich fest das s.colcount etc einen wert an die - 129972908 angenommen hat...

:shock:

Sorry, aber da weiss ich jetzt auch nicht weiter.

n00b_on_knees 22. Jun 2003 13:54

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