AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Problem StringGrid-Vergleich

Offene Frage von "himitsu"
Ein Thema von Topher · begonnen am 24. Nov 2012 · letzter Beitrag vom 25. Nov 2012
Antwort Antwort
Topher

Registriert seit: 24. Nov 2012
2 Beiträge
 
#1

Problem StringGrid-Vergleich

  Alt 24. Nov 2012, 23:01
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
Miniaturansicht angehängter Grafiken
automat.jpg  

Geändert von Topher (25. Nov 2012 um 00:04 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Problem StringGrid-Vergleich

  Alt 24. Nov 2012, 23:31
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 x - 1 und der letzen Zeile 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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (24. Nov 2012 um 23:33 Uhr)
  Mit Zitat antworten Zitat
Topher

Registriert seit: 24. Nov 2012
2 Beiträge
 
#3

AW: Problem StringGrid-Vergleich

  Alt 25. Nov 2012, 00:18
Vielen Dank für die schnelle Antwort! Ja so tritt zumindestens dieser Fehler nicht mehr auf.

Geändert von Topher (25. Nov 2012 um 00:22 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.145 Beiträge
 
Delphi 12 Athens
 
#4

AW: Problem StringGrid-Vergleich

  Alt 25. Nov 2012, 00:30
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.
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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.

Geändert von himitsu (25. Nov 2012 um 00:38 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 02:47 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