Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Lazarus (IDE) (https://www.delphipraxis.net/81-lazarus-ide/)
-   -   Unerklärlicher Syntaxfehler (https://www.delphipraxis.net/167794-unerklaerlicher-syntaxfehler.html)

Basetyp 18. Apr 2012 18:00

Unerklärlicher Syntaxfehler
 
Hi, ich arbeite grade an einem Snake. Es steckt noch in den Kinderschuhen und eigentlich brauche ich auch keine Hilfe. Nur eine Sache macht mich stutzig. Lässt man im angefügten Code bei den uses die Windows.pas raus (welche ich allerdings für OnKeyDown Events brauche), wird das Programm einwandfrei kompiliert. Habe ich "Windows" allerdings in den uses stehen, führt dies zu einem Syntaxfehler (snake.pas(95,46) Fatal: Syntax error, ")" expected but "," found). Ändere ich den Fehler, so wie vorgeschlagen, gibt er in der nächsten Klammer welche Kommas enthält nach dem ersten Komma den selben fehler. Ich kann also davon ausgehen, das irgendwo im Code weiter oben ein Fehler ist. Und zwar zwischen dem auftretenden Fehler und der vorherigen Klammer mit Kommas drin. Doch ich finde einfach keine Lösung.

Das gesamte Problem scheint mir sehr suspekt, da alles einwandfrei funktioniert, bis ich "Windows" in die Uses setze (alle anderen uses die ich hinzufüge funktionieren).

Delphi-Quellcode:
unit Snake;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, Windows;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
   // procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

  private
    { private declarations }
  public
    { public declarations }
  end;
  procedure Zeichnen(StartPoint_Rect: TPoint; Transparenz: Integer);

var
  Form1: TForm1;
  Koerper: Array of TPoint;
  Richtung: Integer;
  const
  Groesse_Pixel: Integer = 5;

implementation

{$R *.lfm}

{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
begin
 Repeat
 Memo1.Clear;
   For i := 0 to Length(Koerper) -1 do // Schleife um alle Abschnitte zu zeichnen
     begin
       Zeichnen(Koerper[i],0);
       Memo1.Lines.Insert(i, InttoStr(i) + ' = ' + InttoStr(Koerper[i].X) + ',' + InttoStr(Koerper[i].Y));
     end;
     Zeichnen(Koerper[Length(Koerper)-1],1);
     sleep(1000);
   For i:= High(Koerper) downto 0 do // Verschieben der abschnitte auf den Abschnitt näher des Kopfes
     begin
       If i = 0 Then // Kopfrichtung bestimmen
       begin
       If Richtung = 1 Then
       begin
       Koerper[0].Y := Koerper[0].Y + Groesse_Pixel;
       end
       else if Richtung = 2 Then
       begin
       Koerper[0].X := Koerper[0].X + Groesse_Pixel;
       end
       else if Richtung = 3 Then
       begin
       Koerper[0].Y := Koerper[0].Y - Groesse_Pixel;
       end
       else if Richtung = 4 Then
       begin
       Koerper[0].X := Koerper[0].X - Groesse_Pixel;
       end;
       Memo1.Lines.Insert(High(Koerper),InttoStr(Richtung));
       end
       else Koerper[i] := Koerper[i-1];
     end;
   Application.ProcessMessages;
 Until Koerper[0].X >= Form1.Width;
end;

{procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState
  );
begin
  if key = vk_up then Richtung := 1;
  if key = vk_right then Richtung := 2;
  if key = vk_down then Richtung := 3;
  if key = vk_left then Richtung := 4;
end;}


Procedure Zeichnen(StartPoint_Rect: TPoint; Transparenz: Integer);
begin
 If Transparenz = 0 Then
   Form1.Canvas.Brush.Color := clblack
 else if Transparenz = 1 Then
   Form1.Canvas.Brush.Color := clbtnFace;
 Form1.Canvas.FillRect(Rect(StartPoint_Rect.X,StartPoint_Rect.Y, StartPoint_Rect.X + Groesse_Pixel,StartPoint_Rect.Y + Groesse_Pixel));
 Form1.Canvas.Brush.Color := clblack;
end;

begin
  Setlength(Koerper,7);
  Koerper[0] := Point(30,100);
  Koerper[1] := Point(25,100);
  Koerper[2] := Point(20,100);
  Koerper[3] := Point(15,100);
  Koerper[4] := Point(10,100);
  Koerper[5] := Point(5,100);
  Koerper[6] := Point(0,100);
end.

himitsu 18. Apr 2012 18:04

AW: Unerklärlicher Syntaxfehler
 
Wo/Was ist die Zeile 95?

[edit]
Schön daß man selber nachzählen darf.

Vermutung:
In der Unit Windows existiert auch ein Rect.

Tipp: Entweder mit Namespace arbeiten, bzw.
Delphi-Quellcode:
Types.Rect(...
, oder in welcher Unit das drinsteckt.
Oder füge Windows einfach weiter vorne in die Usesklausel ein.



PS: Warum ist Zeichnen keine Methode der Form?
Tipp: Sobald du auf globale Variablen, wie Form1 zugreifen mußt, dann kannst du dir denken, daß da vermutlich irgendwo ein Fehler in deiner Planung vorliegt.

jaenicke 18. Apr 2012 18:06

AW: Unerklärlicher Syntaxfehler
 
Zu welcher Prozedur soll denn der Quelltext ganz unten gehören? :zwinker:
Delphi-Quellcode:
begin
  Setlength(Koerper,7);
  Koerper[0] := Point(30,100);
  Koerper[1] := Point(25,100);
  Koerper[2] := Point(20,100);
  Koerper[3] := Point(15,100);
  Koerper[4] := Point(10,100);
  Koerper[5] := Point(5,100);
  Koerper[6] := Point(0,100);
end.
Der hängt da irgendwie lose herum.

himitsu 18. Apr 2012 18:15

AW: Unerklärlicher Syntaxfehler
 
@jaenicke: Befüllen einer bösen globalen Variable.

Läge Diese in der Form (z.B. Private), dann könnte man es nach OnCreate verschieben. :roll:

implementation 18. Apr 2012 18:17

AW: Unerklärlicher Syntaxfehler
 
Zitat:

Zitat von jaenicke (Beitrag 1162568)
Zu welcher Prozedur soll denn der Quelltext ganz unten gehören? ... Der hängt da irgendwie lose herum.

Wenn der da lose rumhängt, wird der als Initialization-Teil behandelt.

himitsu 18. Apr 2012 18:18

AW: Unerklärlicher Syntaxfehler
 
Zitat:

Zitat von implementation (Beitrag 1162571)
Wenn der da lose rumhängt, wird der als Initialization-Teil behandelt.

Auch gut zu Erkennen am end.

Basetyp 18. Apr 2012 18:19

AW: Unerklärlicher Syntaxfehler
 
Zitat:

Zitat von himitsu (Beitrag 1162567)
Wo/Was ist die Zeile 95?

[edit]
Schön daß man selber nachzählen darf.

Vermutung:
In der Unit Windows existiert auch ein Rect.

Tipp: Entweder mit Namespace arbeiten, bzw.
Delphi-Quellcode:
Types.Rect(...
, oder in welcher Unit das drinsteckt.
Oder füge Windows einfach weiter vorne in die Usesklausel ein.

PS: Warum ist Zeichnen keine Methode der Form?

Sry, hatte nich dran gedacht, dass die zeilen nich nummeriert sind.
Ich habe jetzt einfach Windows als erstes in die uses eingetragen. Damit scheint es zu funktionieren.

Zitat:

Zitat von jaenicke (Beitrag 1162568)
Zu welcher Prozedur soll denn der Quelltext ganz unten gehören? :zwinker:
Delphi-Quellcode:
begin
  Setlength(Koerper,7);
  Koerper[0] := Point(30,100);
  Koerper[1] := Point(25,100);
  Koerper[2] := Point(20,100);
  Koerper[3] := Point(15,100);
  Koerper[4] := Point(10,100);
  Koerper[5] := Point(5,100);
  Koerper[6] := Point(0,100);
end.
Der hängt da irgendwie lose herum.

Das Stück Code soll einmal zum Start des Programms ausgeführt werden. Tadelt mich doch nicht so, ich bin noch relavtiv neu und habe erst seit einem Jahr Informatik in der Schule.

himitsu 18. Apr 2012 18:24

AW: Unerklärlicher Syntaxfehler
 
Ach, wer tadelt hier denn?

@jaenicke: Pssst, versteck die Peitsche. :roll:


Tipp: Glaub nicht alles, was die Leerer Lehrer sagen (die haben manchmal selber keine Ahnung).
Und sieh es als gut gemeinte Tipps an.


Denn Vieles hat einen gewissen Hintergrund.
Globale Variablen, sorgen für die selben Probleme, wie du auch gerade einen hattest.
z.B. erstell mal eine lokale Variable (oder was Anderes), mit dem selben Namen ... und wundere dich dann, warum du nicht mehr auf die globale Variable zugreifen kannst.

Darum immer alles so nach wie möglich am Bestimmungsort deklarieren.
Die Funktion und die Variablen werden ja wohl nur innerhalb der Form verwendet, also sollten sie dort auch rein. :zwinker:

JamesTKirk 19. Apr 2012 09:52

AW: Unerklärlicher Syntaxfehler
 
Zitat:

Zitat von Basetyp (Beitrag 1162574)
Ich habe jetzt einfach Windows als erstes in die uses eingetragen. Damit scheint es zu funktionieren.

Die Unit
Delphi-Quellcode:
Windows
weiter nach vorne zu setzen ist eine Möglichkeit der Lösung (diese Unit definiert übrigens auch einen von der LCL abweichenden Typ
Delphi-Quellcode:
TBitmap
, was auch öfters der Ursprung eines ähnlichen Fehlers ist). Eine andere Möglichkeit ist es die Unit
Delphi-Quellcode:
LCLType
an Stelle von
Delphi-Quellcode:
Windows
zu verwenden, welche ebenfalls die VK_* Konstanten enthält und noch dazu auch auf nicht-Windows-Systemen verfügbar ist.

Gruß,
Sven


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