AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

CharFeld/Suchen/Ersetzen

Ein Thema von n00b_on_knees · begonnen am 22. Jun 2003 · letzter Beitrag vom 22. Jun 2003
Antwort Antwort
Benutzerbild von n00b_on_knees
n00b_on_knees

Registriert seit: 5. Apr 2003
128 Beiträge
 
#1

CharFeld/Suchen/Ersetzen

  Alt 22. Jun 2003, 11:29
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
Against TCPA & And I think we should live our dreams
  Mit Zitat antworten Zitat
Benutzerbild von n00b_on_knees
n00b_on_knees

Registriert seit: 5. Apr 2003
128 Beiträge
 
#2
  Alt 22. Jun 2003, 13:21
hat denn keiner eine Idee?

wäre blöd xD
Against TCPA & And I think we should live our dreams
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#3
  Alt 22. Jun 2003, 13: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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von n00b_on_knees
n00b_on_knees

Registriert seit: 5. Apr 2003
128 Beiträge
 
#4
  Alt 22. Jun 2003, 13: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...
Against TCPA & And I think we should live our dreams
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#5
  Alt 22. Jun 2003, 14: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:
for i:= 1 to s.ColCount do so
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.

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).
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von n00b_on_knees
n00b_on_knees

Registriert seit: 5. Apr 2003
128 Beiträge
 
#6
  Alt 22. Jun 2003, 14:17
ok thx habe jetzt mal alles so abgeändert, aber der fehler bleibt der gleiche...
Against TCPA & And I think we should live our dreams
  Mit Zitat antworten Zitat
Benutzerbild von n00b_on_knees
n00b_on_knees

Registriert seit: 5. Apr 2003
128 Beiträge
 
#7
  Alt 22. Jun 2003, 14: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.
Against TCPA & And I think we should live our dreams
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#8
  Alt 22. Jun 2003, 14:42
Moin Noob on Knees,

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


Sorry, aber da weiss ich jetzt auch nicht weiter.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von n00b_on_knees
n00b_on_knees

Registriert seit: 5. Apr 2003
128 Beiträge
 
#9
  Alt 22. Jun 2003, 14:54
das ist ungut
Against TCPA & And I think we should live our dreams
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz