Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Fehlermeldung bei begin und then (https://www.delphipraxis.net/122991-fehlermeldung-bei-begin-und-then.html)

foerster7892 25. Okt 2008 13:48


Fehlermeldung bei begin und then
 
Hab mal noch ne Frage heute:
Ich bekomme hier ne ganze Reihe an Fehlermeldungen rein

[Fehler] Unit3.pas(49): E2029 Ausdruck erwartet, aber 'BEGIN' gefunden
[Warnung] Unit3.pas(50): W1019 FOR-Schleifenvariable muss eine einfache lokale Variable sein
[Fehler] Unit3.pas(57): E2029 ':=' erwartet, aber '=' gefunden
[Fehler] Unit3.pas(62): E2029 'END' erwartet, aber 'THEN' gefunden
[Warnung] Unit3.pas(170): W1019 FOR-Schleifenvariable muss eine einfache lokale Variable sein
[Warnung] Unit3.pas(172): W1019 FOR-Schleifenvariable muss eine einfache lokale Variable sein
[Fataler Fehler] VierGewinnt.dpr(5): F2063 Verwendete Unit 'Unit3.pas' kann nicht compiliert werden

sehe aber nciht was ich falsch gemacht habe:

Delphi-Quellcode:
procedure Kontrolle(const Target: TStringgrid);
var a, b :integer;
begin
  y:=-1;
  if
    begin //<-- das unterstreicht er rot
      For x := 1 to 6 do
      begin
        For a := 1 to 4 do
        begin
          For b := 1 to 4 do
          begin
            y:=a+b;
            Target.cells[x,y]=IntToStr(Spieler);
          end;
        end;
      end;
    end
  then //<-- und das
    showmessage('Spieler' +IntToStr(Spieler) +'hat gewonnen!'));


end;

könnte bitte nochmal wer sein Wissen mit mir teilen???

turboPASCAL 25. Okt 2008 13:51

Re: Fehlermeldung bei begin und then
 
Delphi-Quellcode:
procedure Kontrolle(const Target: TStringgrid);
var a, b :integer;
begin
  y:=-1;
  if //  hier fehlt die Bedingung//
    begin //

Delphi-Quellcode:
procedure ...
begin
  if a = b then
  begin
    // Ja, a = b
  end else
  begin
   //nein, a ist ungleich b
  end;
end;

DeddyH 25. Okt 2008 13:51

Re: Fehlermeldung bei begin und then
 
Schleifen in einer If-Abfrage? Was soll das denn werden?

foerster7892 25. Okt 2008 13:54

Re: Fehlermeldung bei begin und then
 
Delphi-Quellcode:
begin //<-- das unterstreicht er rot
      For x := 1 to 6 do
      begin
        For a := 1 to 4 do
        begin
          For b := 1 to 4 do
          begin
          y:=a+b;
          Target.cells[x,y]=IntToStr(Spieler);//<-- wenn das bei jedem Schleifendurchlauf wahr ist soll er weiter machen(Bedingung)
          end;
        end;
      end;
    end
das gekennzeichnete ist die bedingung bei mir

foerster7892 25. Okt 2008 13:56

Re: Fehlermeldung bei begin und then
 
falls das mit der Schleife im if nicht geht

könnte ich dann nen Unterprogaufruf im If machen praktisch alles ins UP packen und dann das da aufrufen???

jfheins 25. Okt 2008 14:06

Re: Fehlermeldung bei begin und then
 
Ja, das nennt sich "Funktion mit Rückgabewert Boolean" ;)

Oder du definierst vorher ne extra Boolean-Variable, machst deine Schleifen und prüfst dann diese Variable ;)

Helmi 25. Okt 2008 14:10

Re: Fehlermeldung bei begin und then
 
Machs halt so:

Delphi-Quellcode:
procedure Kontrolle(const Target: TStringgrid);
var a, b :integer;
    gefunden: Boolean;
begin
  y:=-1;
  gefunden := false;

  begin
    For x := 1 to 6 do
      begin
        For a := 1 to 4 do
          begin
            For b := 1 to 4 do
              begin
                y:=a+b;
                gefunden := Target.cells[x,y] = IntToStr(Spieler);

                If gefunden then
                  break;
              end;
            If gefunden then
              break;
          end;
        If gefunden then
          break;
      end;
  end
 
  If not gefunden then
    showmessage('Spieler' +IntToStr(Spieler) +'hat gewonnen!'));
end;
[Edit]
aus dem Stregreif geschrieben, kann leicht fehlerhaft sein....

foerster7892 25. Okt 2008 14:33

Re: Fehlermeldung bei begin und then
 
thx helmi und auch allen anderen danke

Delphi-Quellcode:
procedure Kontrolle(const Target: TStringgrid);
var a, b, r, richtig :integer;
    gefunden :boolean;
begin
  y:=-1;

    begin
      For r := 1 to 6 do
      begin
        For a := 1 to 4 do
        begin
          richtig:=0;
          For b := 1 to 4 do
          begin
            y:=a+b;
            gefunden:=Target.cells[r,y]=IntToStr(Spieler);
            if
              gefunden=true
            then
              richtig:=richtig+1
          end;
          if
            richtig=4
          then
            break;
        end;
        if
          richtig=4
        then
          break;
      end;
      if
        richtig=4
      then
        break;
    end;

  if
    richtig=4
  then
    showmessage('Spieler' +IntToStr(Spieler) +'hat gewonnen!');


end;
das scheint jetzt erstmal zu funzen aber jetzt bekomme ich immer ne Fehlermeldung

"Zugriffsverletzung bei Addresse 07FF0652 in Modul 'dcc90.dll'. Lesen von Adresse 00000000." (8mal 0)



was heißt das jetzt?????

jfheins 25. Okt 2008 14:46

Re: Fehlermeldung bei begin und then
 
Du hast kein Stringgrig übergeben, sondern nil.

Lass das Target weg und schreib einfach Form1.Stringgrid1... ;)

Helmi 25. Okt 2008 14:51

Re: Fehlermeldung bei begin und then
 
Auch wenn es nichts mit deiner Fehlermeldung zu tun hat,
aber ändere:
Delphi-Quellcode:
If gefunden=true then
in
Delphi-Quellcode:
If gefunden then
das ist sauberer.

Es gab darüber auch schon einige Threads....

foerster7892 25. Okt 2008 15:22

Re: Fehlermeldung bei begin und then
 
@helmi hab ich geändert danke für den tipp

@jfhans aber ich hab ne frage kannst du mir kurz GANZ GENAU sagen was ich in procedure zeile ändern muss (hab mir das heute erst erfragt mit dem unterprogramm auf formular beziehen(das mit dem target))


plz :roteyes:

DeddyH 25. Okt 2008 15:25

Re: Fehlermeldung bei begin und then
 
Zeig doch mal den Aufruf der Prozedur. Außerdem musst Du noch nicht einmal nil übergeben, sondern es genügt, wenn Du Dich mit dem Zeilen-/Spaltenindex vertan hast.

taaktaak 25. Okt 2008 15:28

Re: Fehlermeldung bei begin und then
 
Hallo Foerster.
Du hast jetzt eine freie Prozedur, aus dieser kannst du nicht direkt auf Controls des Forms zugreifen. Mache daraus eine Methode, dann brauchst du den Parameter gar nicht mehr, weil du das Grid direkt ansprechen kannst.

DeddyH 25. Okt 2008 15:30

Re: Fehlermeldung bei begin und then
 
Zitat:

Zitat von taaktaak
Du hast jetzt eine freie Prozedur, aus dieser kannst du nicht direkt auf Controls des Forms zugreifen.

Wie bitte?

foerster7892 25. Okt 2008 15:32

Re: Fehlermeldung bei begin und then
 
so also mein stringgrid hat 7 Spalten(6 die ich benutze) und 8 Zeilen (7 die ich benutze)

das is der ganze quelltext (soll mal nen 4 Gewinnt werden(muss danach nur noch die Abfrage für spalten und diagonalen machen (nichts vorsagen was die beiden abfragen angeht das will ich alleine austüfteln 8) )))

Delphi-Quellcode:
unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;

type
  TForm3 = class(TForm)
    StringGrid1: TStringGrid;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Label1: TLabel;
    Button8: TButton;
    Button9: TButton;
    procedure Button8Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form3: TForm3;
  Spieler, y, x :integer;
implementation

{$R *.dfm}

procedure Kontrolle(const Target: TStringgrid);
var a, b, r, richtig :integer;
    gefunden :boolean;
begin
  y:=-1;

    begin
      For r := 1 to 6 do
      begin
        For a := 1 to 4 do
        begin
          richtig:=0;
          For b := 1 to 4 do
          begin
            y:=a+b;
            gefunden:=Target.cells[r,y]=IntToStr(Spieler);
            if
              gefunden
            then
              richtig:=richtig+1
          end;
          if
            richtig=4
          then
            break;
        end;
        if
          richtig=4
        then
          break;
      end;
      if
        richtig=4
      then
        break;
    end;

  if
    richtig=4
  then
    showmessage('Spieler' +IntToStr(Spieler) +'hat gewonnen!');


end;

procedure Spielstein(const Target: TStringgrid);
begin
  If
    Spieler=2
  then
    Spieler:=0;
    Spieler:=Spieler+1;

  If
    (Target.cells[y,1] ='1') or (Target.Cells[y,1] ='2')
  then
    showmessage('Hier passt kein Spielstein mehr rein wählen sie eine andere Reihe!')
  else
    begin
      If
        (target.cells[y,2] ='1') or (target.Cells[y,2] ='2')
      then
        target.cells[y,1]:=IntToStr(Spieler)
      else
        begin
          If
            (target.cells[y,3] ='1') or (target.Cells[y,3] ='2')
          then
            target.cells[y,2]:=IntToStr(Spieler)
          else
            begin
              If
                (target.cells[y,4] ='1') or (target.Cells[y,4] ='2')
              then
                target.cells[y,3]:=IntToStr(Spieler)
              else
                begin
                  If
                    (target.cells[y,5] ='1') or (target.Cells[y,5] ='2')
                  then
                    target.cells[y,4]:=IntToStr(Spieler)
                  else
                    begin
                      If
                        (target.cells[y,6] ='1') or (target.Cells[y,6] ='2')
                      then
                        target.cells[y,5]:=IntToStr(Spieler)
                      else
                        target.cells[y,6]:=IntToStr(Spieler)
                    end;
                end;
            end;
        end;
    end;
end;

procedure TForm3.Button1Click(Sender: TObject);
begin
  y:=1;
  Spielstein(Stringgrid1);
  Kontrolle(Stringgrid1)
end;

procedure TForm3.Button2Click(Sender: TObject);
begin
  y:=2;
  Spielstein(Stringgrid1);
  Kontrolle(Stringgrid1)
end;

procedure TForm3.Button3Click(Sender: TObject);
begin
  y:=3;
  Spielstein(Stringgrid1);
  Kontrolle(Stringgrid1)
end;

procedure TForm3.Button4Click(Sender: TObject);
begin
  y:=4;
  Spielstein(Stringgrid1);
  Kontrolle(Stringgrid1)
end;

procedure TForm3.Button5Click(Sender: TObject);
begin
  y:=5;
  Spielstein(Stringgrid1);
  Kontrolle(Stringgrid1)
end;

procedure TForm3.Button6Click(Sender: TObject);
begin
  y:=6;
  Spielstein(Stringgrid1);
  Kontrolle(Stringgrid1)
end;

procedure TForm3.Button7Click(Sender: TObject);
begin
  y:=7;
  Spielstein(Stringgrid1);
  Kontrolle(Stringgrid1)
end;

procedure TForm3.Button8Click(Sender: TObject);
begin
  For y:= 1 to 7 do
  begin
    For x:= 1 to 6 do
    begin
      Stringgrid1.Cells[y,x]:='';
    end;
  end;
end;

procedure TForm3.Button9Click(Sender: TObject);
begin
  close;
end;

end.

DeddyH 25. Okt 2008 15:38

Re: Fehlermeldung bei begin und then
 
Zitat:

Delphi-Quellcode:
        For a := 1 to 4 do
        begin
          richtig:=0;
          For b := 1 to 4 do
          begin
            y:=a+b;
            gefunden:=Target.cells[r,y]=IntToStr(Spieler);

Wenn a = 4 und b = 4, wird y zu 8, da Du 8 Zeilen hast, hat die letzte den Index 7. Du liest also über die verfügbaren Zeilen hinaus. Vermutlich gibt es noch mehrere solche Stellen, ich habe beim ersten Fund aufgehört zu suchen.

foerster7892 25. Okt 2008 15:44

Re: Fehlermeldung bei begin und then
 
ich lese nciht über die zeilen hinaus :gruebel:

mit dem ersten kontrolliere ich die spalten
mit dem zweien such ich mir jeweils eine spalte aus
und mit dem letzten kontrolliere ich die diese und die 3 folgenden auf true
wo gehe ich da über die zeilen hinaus???????????????? 1-7 nutze ich und die 0.Zeile lass ich weg

taaktaak 25. Okt 2008 15:46

Re: Fehlermeldung bei begin und then
 
Zitat:

Wie bitte?
Detlef, sorry! Hab es anders gemeint, als geschrieben! Bitte meine Bemerkung ganz schnell vergessen :oops:

DeddyH 25. Okt 2008 15:51

Re: Fehlermeldung bei begin und then
 
Bei 8 Zeilen hat die erste Index 0 und die letzte Index 7. Jeder Zugriff auf Cells[x,8] führt ins Nirvana.

foerster7892 25. Okt 2008 15:55

Re: Fehlermeldung bei begin und then
 
ja richtig
und wann bitte greif ich auf die 8. zu???

Die Muhkuh 25. Okt 2008 15:57

Re: Fehlermeldung bei begin und then
 
Zitat:

Zitat von DeddyH
Zitat:

Delphi-Quellcode:
        For a := 1 to 4 do
        begin
          richtig:=0;
          For b := 1 to 4 do
          begin
            y:=a+b;
            gefunden:=Target.cells[r,y]=IntToStr(Spieler);

Wenn a = 4 und b = 4, wird y zu 8, da Du 8 Zeilen hast, hat die letzte den Index 7. Du liest also über die verfügbaren Zeilen hinaus. Vermutlich gibt es noch mehrere solche Stellen, ich habe beim ersten Fund aufgehört zu suchen.

Da sagt er es doch :)

foerster7892 25. Okt 2008 15:57

Re: Fehlermeldung bei begin und then
 
y:=-1

Die Muhkuh 25. Okt 2008 15:58

Re: Fehlermeldung bei begin und then
 
Und was soll uns das nun sagen?

Fakt ist, was Detlef gesagt hat. :gruebel:

foerster7892 25. Okt 2008 15:59

Re: Fehlermeldung bei begin und then
 
da ich anfangs y auf -1 setze siehe seite 1
is dann y erst 7 d.h. ich greife auf die 7. Zeile zu

DeddyH 25. Okt 2008 16:00

Re: Fehlermeldung bei begin und then
 
Du kannst auch 1000 mal y auf -1 setzen, sobald Du a und b addierst, ist y wieder 8.

Die Muhkuh 25. Okt 2008 16:01

Re: Fehlermeldung bei begin und then
 
:roll:

Wenn aber in der Schleife a = 4 und b = 4 ist, ist y = 8, da beißt die Maus kein Faden ab.

foerster7892 25. Okt 2008 16:08

Re: Fehlermeldung bei begin und then
 
aso stimmt mein Fehler :wall: :wall: :wall: :wall: :wall: :wall:
hab da irgendwie garnicht nachgedacht naja das weg und einfach y:=a+b-1;
jetzt kann ichs starten aber er ignort dsa up........... naja mal gucken was sich machen lässt thx dann nochma


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