Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Problem StringGrid-Vergleich (https://www.delphipraxis.net/171780-problem-stringgrid-vergleich.html)

Topher 24. Nov 2012 22:01

Problem StringGrid-Vergleich
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Leute!
Ich bin noch ziemlich neu hier und programmiere mit Delphi 7 in der Schule.
Unser Projekt ist momentan quasi einen beliebeigen endlichen Automaten zu programmieren, auf Grundlagen einer Automatentabelle.

Nachdem man nun die Anzahl der Zustände und Einwirkungsmöglichkeiten einstellen kann, soll das Programm nun die Eingabe mit dem ersten Zeichen in jeder Zelle
der Tabelle/ des StringGrids vergleichen. Dazu habe ich diese procedure geschrieben:
Delphi-Quellcode:
procedure Eingabe_Reaktion;
var cnt,x,y,x_achse,y_achse:integer;

begin
x_Achse:=form1.StringGrid1.colcount;
y_Achse:=form1.stringgrid1.RowCount;

 for cnt:=1 to 5 do                                            //Schleife für Zeichen bei Eingabe
  for x:=2 to x_Achse do                                        //Schleife x-Achse
   for y:=2 to y_Achse do                                         //Schleife y-Achse

     if form1.edit3.Text[cnt]=form1.StringGrid1.cells[x,y][1] //Vergleich
      then
       form1.Edit4.Text:=form1.edit3.Text[1];                 //Ausgabe
end;
Das Problem nun ist: Sie funktioniert nicht. Es kommt jedes Mal die Meldung (wenn ich den Button zum Start drücke):
"Access Violation at address 00460719 in module 'Project1.exe'. Read of address 00000000"

Kann mir bitte jemand helfen??

LG
Topher

Sir Rufo 24. Nov 2012 22:31

AW: Problem StringGrid-Vergleich
 
Erstmal ein herzliches Willkommen hier.

Mit dem ersten Beitrag ist man hier nicht nur ziemlich sondern ganz neu ;)

Zum Code posten:

Bitte benutze doch für Delphi Code die Code Tags
Code:
[DELPHI]hier dein Code[/DELPhI]
und ein Code mit der korrekten Einrückung hilft allen beim Verstehen des selbigen.

Bitte ändere doch deinen ersten Beitrag dahingehend ab.

Zu deinem Problem:

Du hast in deinem StringGrid x Spalten und y Zeilen.
Der Index der ersten Spalte/Zeile ist 0

Somit ist der Index der letzten Spalte
Delphi-Quellcode:
x - 1
und der letzen Zeile
Delphi-Quellcode:
y - 1
.
Greifst du darüber hinaus zu, dann bekommst du diesen Zugriffsfehler.

Es ist auch suboptimal eine procedure zu schreiben, die über die globale Form Variable auf die Form zugreift.

Topher 24. Nov 2012 23:18

AW: Problem StringGrid-Vergleich
 
Vielen Dank für die schnelle Antwort! Ja so tritt zumindestens dieser Fehler nicht mehr auf.

himitsu 24. Nov 2012 23:30

AW: Problem StringGrid-Vergleich
 
Delphi speichert sich die beiden Werte am Anfang der FOR-Schleifen, so daß du da keine Extravariablen (x_achse und y_achse) brauchst.

Aber mal eine andere Frage:
Warum ist Eingabe_Reaktion keine Methode der Form1, obwohl darin ausschließlich darauf zugegriffen wird?


Der grundsätzliche Fehler war übrigens:
StringGrid1.cells[x,y][1], denn rate mal was passiert, wenn kein String mit mindestens einem Zechen darin ist.
Das Stringgrid selber gibt zum Glück keinen Fehler, wenn man auf nichtexistierende Felder zugreift, sondern gibt stattdessen nur einen Leer-String zurück.

Zitat:

wenn ich den Button zum Start drücke
Den Debugger solltest du mal kennenlernen.
Der zeigt dir wo es knallt.

Und in diesem Fall hätte man auch mal die Bereichsprüfung in den Projektoptionen aktivieren können.
Denn diese baut Prüfcodes ein, wovon Einer z.B. prüft, ob man auf ein nichtexistierendes Zeichen eines Strings zugreifen will, was bei dir ja geknallt hatte.

Das Selbe tritt auch auf, wenn in Edit1 nicht mindestens 5 Zeichen drin sind, da du dort auch einfach so ungeprüft drauf zugreifst.


Dann mußt du lernen, daß praktisch alles bei 0 anfängt mit Zählen (Listen und dynamische Arrays),
außer dem String, welcher kompatibilitätsbedingt bei 1 anfängt.
Delphi-Quellcode:
for x := 1 to x_Achse - 1 do


Info: Der ShortString hatte in Index 0 das Längenbyte und ab 1 die Zeichen, was in die "neueren" LongStrings (AnsiString, UnicodeString und Co.), sowie den WideString übernommen wurde.
(also praktisch fingen Strings früher auch mal bei 0 an, wenn man die Indizierung genau nimmt)


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:09 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