TForm1 Fehler?

Für Fragen von Einsteigern und Programmieranfängern...
PascalHST
Beiträge: 29
Registriert: So 18. Mai 2014, 16:16

TForm1 Fehler?

Beitrag von PascalHST »

Hey, ich bin ein Anfänger in Pascal und programmiere grade Pong, das Spiel ;)
Könnte mal bitte wer über den Code rüberscheuen, ich bekomme neuerdings den Fehler:
fmain.pas(175,3) Error: Illegal expression
fmain.pas(175,13) Fatal: Syntax error, ";" expected but "identifier TFORM1" found

Das ganze bezieht sich auf "procedure TForm1.FormKeyPress"
EDIT: Es scheint sich auf jede procedure zu beziehen ausser:

"procedure TForm1.FormCreate(Sender: TObject);"
Bitte keine zu große Fachsprache ;) - Danke schonmal vorab

Hier der Code:

Code: Alles auswählen

 unit FMain;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    tmrMoveBall: TTimer;
    procedure FormCreate(Sender: TObject);               {Gestaltung}
    procedure FormKeyPress(Sender: TObject; var Key: char);  {Steuerung}
    procedure tmrMoveBallTimer(Sender: TObject);                {KI (Bewegung) des Balls}
  private
    FBallX: integer;
    FBallY: integer;
    FDirection: integer;
    FSpeed: integer;
    FBatRightY: integer;
    FBatLeftY: integer;
    FScreenCenterX: integer;
    FScreenCenterY: integer;
    FBatRightX:integer;
    FBatLeftX: integer;
 
 
    procedure DrawBall(
      const AXNew, AYNew: integer);
    procedure DrawBatLeft(const AYNew: integer);
    procedure DrawBatRight(const AYNew: integer);
 
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
uses
  LCLType, MMSystem;
 
{$R *.lfm}
 
{ TForm1 }
 
const
  CHeight = 500;
  CWidth = 700;
  CBallSpeed = 35;
  CWinScore = 10;
 
  CBatHeight = 80;
  CBallSize = 15;
  CServeAngle = 25;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Color:= clBlack;
  Height:= CHeight;
  Width:= CWidth;
  Position:= poScreenCenter;
  BorderStyle:= bsNone;
 
  FBallX:= 0;
  FBallY:= 0;
  FSpeed:= CBallSpeed;
 
  FScreenCenterX:= ClientWidth div 2;
  FScreenCenterY:= ClientHeight div 2;
  FBatRightX:= ClientWidth - 30 - CBallSize;
  FBatLeftX:= 30;
 
  procedure TForm1.FormKeyPress (Sender: TObject; var Key: char);    {Steuerung}
  begin
    if Ord(Key) = VK_ESCAPE  then
       Close;
    if Ord(Key) = VK_SPACE then
       begin
         DrawBall(FScreenCenterX, FScreenCenterY);
         DrawBatRight(300);
         DrawBatLeft (300);
         tmrMoveBall.Enabled:= true;   {Timer an}
       end;
       if Key in ['i', 'I'] then
         DrawBatRight(FBatRightY + 20);
       if Key in ['k', 'K'] then
         DrawBatRight(FBatRightY - 20);
       if Key in ['x', 'X'] then
         DrawBatLeft(FBatLeftY + 20);
       if Key in ['s', 'S'] then
         DrawBatLeft(FBatLeftY - 20);
  end;
 
procedure TForm1.tmrMoveBallTimer(Sender: TObject); {Selbstbewegung des Balles durch Timer/
                                                     Richtungsänderung}
var
  LXChange: integer;
  LYCHange: integer;
begin
 
  // x2 = x1 + cos(direction) x speed
  // y2 = y1 + sin(direction) x speed
 
  LXChange:= trunc(cos(Pi / 180 * FDirection) * FSpeed);
  LYChange:= trunc(sin(Pi / 180 * FDirection) * FSpeed);
 
 
     DrawBall(FBallX + LXChange, FBallY + LYChange);
 
     if (FBallX <= 0) or (FBallX >= ClientWidth - CBallSize) then
        FDirection:= FDirection + (90 - FDirection) * 2
     else if (FBallY <= 0) or (FBallY >= ClientHeight - CBallSize) then
        FDirection:= FDirection + (180 - FDirection) * 2;
     //   FDirection:= FDirection * -1;
end;
 
 
procedure TForm1.DrawBall(const AXNew, AYNew: integer);   {Ball/Größe}
begin
  Canvas.Pen.Style:= psClear;
  Canvas.Brush.Color:= ClWhite;
  Canvas.Rectangle(FBallX, FBallY, FBallX + CBallSize, FBallY + CBallSize);
  Canvas.Brush.Color:= ClBlack;
  Canvas.Rectangle(AXNew, AYNew, AXNew + CBallSize, AYNew + CBallSize);
  FBallX:= AXNew;
  FBallY:= AYNew;
  end;
 
procedure TForm1.DrawBatRight (const AYNew: integer);
begin
  if (AYNew <= 0) or (AYNew + CBatHeight >= ClientHeight) then
     Exit;
  Canvas.Brush.Color:= ClWhite;
  Canvas.Rectangle(FBatRightX, FBatRightY, FBatRightX + CBallSize, FBatRightY + CBatHeight);
  Canvas.Brush.Color:= ClBlack;
  Canvas.Rectangle(FBatRightX, AYNew, FBatRightX + CBallSize, AYNew + CBatHeight);
  FBatRightY:= AYNew;
end;
procedure TForm1.DrawBatLeft (const AYNew: integer);     {Marcel}
begin
    if (AYNew <= 0) or (AYNew + CBatHeight>= ClientHeight) then     {Thomas}
     Exit;
  Canvas.Brush.Color:= ClWhite;
  Canvas.Rectangle(FBatLeftX, FBatLeftY, FBatLeftX + CBallSize, FBatLeftY + CBatHeight);
  Canvas.Brush.Color:= ClBlack;
  Canvas.Rectangle(FBatLeftX, AYNew, FBatLeftX + CBallSize, AYNew + CBatHeight);
  FBatLeftY:= AYNew;
end;
 
end.
Zuletzt geändert von Lori am So 18. Mai 2014, 19:57, insgesamt 1-mal geändert.
Grund: Highlighter

Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: TForm1 Fehler?

Beitrag von Socke »

Die Methode TForm1.FormCreate() wird nicht mit einem end; beendet. Damit wären alle anderen Methoden innerhalb von FormCreate(), was natürlich nicht zulässig ist. Vielleicht wird dir das klarer, wenn du einen Quelltext einrückst (jeder Block/Methode -> 2 Leerzeichen einrücken).

Bitte verwende in Zukunft den Syntax-Highlighter, den du über dem Eingabebereich hier im Forum findest.

P.S. Herzlich Willkommen im Forum!
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

PascalHST
Beiträge: 29
Registriert: So 18. Mai 2014, 16:16

Re: TForm1 Fehler?

Beitrag von PascalHST »

Danke dir :)
Manchmal sind es die einfachsten Dinge sie man übersieht ;)
Kannst du mir etwas dazu sagen?
Werde, wenn ich das Programm starte darauf verwiesen, diese procedure befindet sich unter "Forms".

Code: Alles auswählen

procedure NotifyApplicationUserInput(Target: TControl; Msg: Cardinal);
begin
  if Assigned(Application) then
    Application.NotifyUserInputHandler(Target, Msg);
end; 

Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: TForm1 Fehler?

Beitrag von Socke »

PascalHST hat geschrieben:Werde, wenn ich das Programm starte darauf verwiesen, diese procedure befindet sich unter "Forms".
Aus diesem "Satz" werde ich nicht ganz schlau, vielleicht kannst du das nochmal ein wenig anders schreiben (in welcher Form wirst du darauf verwiesen?).
PascalHST hat geschrieben:procedure NotifyApplicationUserInput(Target: TControl; Msg: Cardinal);
Ein kurze Einschätzung dazu, ohne das im Detail zu kennen:
Die (kurze) Dokumentation findest du hier: http://lazarus-ccr.sourceforge.net/docs ... input.html

Mit der Methode kannst du deine gesamte Anwendung (Application) darüber informieren, dass der Benutzer ein Eingabegerät verwendet hat. Mögliche Messages sind in der Unit LMessages definiert. Inwiefern vordefinierte Aktionen (Ereignis an Steuerelement weiterreichen oder so) ausgeführt werden, kann ich nicht sagen.

Konkret wird das Event TApplication.OnUserInput (kann man bequem über die Komponente TApplicationProperties auf dem Reiter "Additional" setzen) aufgerufen; weitere Event-Handler kann man selbst definieren (so viele man will):

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  // als ersten Event-Handler hinzufügen
  Application.AddOnUserInputHandler(@UserInput, True);
  // als letzten Event-Hanlder hinzufügen
  Application.AddOnUserInputHandler(@UserInput, False);
  // Event-Hanlder löschen
  Application.RemoveOnUserInputHandler(@UserInput);
end;
 
procedure TForm1.UserInput(Sender: TObject; Msg: Cardinal);
begin
  // was man auch immer machen möchte
end;
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

PascalHST
Beiträge: 29
Registriert: So 18. Mai 2014, 16:16

Re: TForm1 Fehler?

Beitrag von PascalHST »

Also wenn ich das Programm jetzt starte, startet es im Hintergrund. Pascal öffnet sich, mit dem Reiter "Forms", und dann werde ich auf diese ebend genanntew Procedure verwiesen. Verständlicher? ;)

Wie muss ich meinen Code jetzt ändern? Es scheiont dann wohl was mit der Steuerung nicht zu stimmen?

EDIT:
Steuerung funktionierte schon mal, ich weis nicht woran es liegen könnte.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2807
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: TForm1 Fehler?

Beitrag von m.fuchs »

PascalHST hat geschrieben:Also wenn ich das Programm jetzt starte, startet es im Hintergrund. Pascal öffnet sich, mit dem Reiter "Forms", und dann werde ich auf diese ebend genanntew Procedure verwiesen.
Was meinst du denn mit "verwiesen"?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

PascalHST
Beiträge: 29
Registriert: So 18. Mai 2014, 16:16

Re: TForm1 Fehler?

Beitrag von PascalHST »

Bild

Guck in den Reiter...
FMain ist mein Programm.
Dann starte ich es - es startet sich im Hintergrund und ich kann auf das Programm nicht zugreifen.
Dann öffnet Pascal den Reiter "Forms" und zeigt mir diese Procedure, wie im Bild.
Die procedure "NotifyApplicationUserInput" habe ich in meinem Programm ja garnicht verwendet.

Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: TForm1 Fehler?

Beitrag von Socke »

PascalHST hat geschrieben:Also wenn ich das Programm jetzt starte, startet es im Hintergrund. Pascal öffnet sich, mit dem Reiter "Forms", und dann werde ich auf diese ebend genanntew Procedure verwiesen. Verständlicher? ;)
Nicht wirklich; kannst du einen Screenshot davon hochladen? Wenn die Meldung erscheint, wenn du Lazarus startest, aber dein Projekt noch gar nicht gestartet ist, kommt die Meldung nicht von deinem Programm.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

PascalHST
Beiträge: 29
Registriert: So 18. Mai 2014, 16:16

Re: TForm1 Fehler?

Beitrag von PascalHST »

Bild

Hier, mein Programm ist gestartet.
Das Fenster von meinem Programm ist jetzt sichtbar wenn ich es starte, sobald icha ber eine Taste drücke wechselt das Programm in den Hintergrund und die Meldung ist zu sehen.
Zuletzt geändert von PascalHST am So 18. Mai 2014, 17:36, insgesamt 1-mal geändert.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2807
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: TForm1 Fehler?

Beitrag von m.fuchs »

PascalHST hat geschrieben:Dann öffnet Pascal den Reiter "Forms" und zeigt mir diese Procedure, wie im Bild.
Wenn du jetzt das Nachrichten-Fenster komplett sichtbar in den Vordergrund geschoben hättest, könnte man eventuell auch die Meldung lesen, die dort steht.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

PascalHST
Beiträge: 29
Registriert: So 18. Mai 2014, 16:16

Re: TForm1 Fehler?

Beitrag von PascalHST »

m.fuchs hat geschrieben:
PascalHST hat geschrieben:Dann öffnet Pascal den Reiter "Forms" und zeigt mir diese Procedure, wie im Bild.
Wenn du jetzt das Nachrichten-Fenster komplett sichtbar in den Vordergrund geschoben hättest, könnte man eventuell auch die Meldung lesen, die dort steht.
Es ist ja nicht das Nachichten Fenster, es ist dieser Reiter der dann geöffnet wird. Das Nachichten Fenster ist leer.

creed steiger
Beiträge: 958
Registriert: Mo 11. Sep 2006, 22:56

Re: TForm1 Fehler?

Beitrag von creed steiger »

schaut aus als würdest du debugen
irgendwo einen Breakpoint gesetzt?

PascalHST
Beiträge: 29
Registriert: So 18. Mai 2014, 16:16

Re: TForm1 Fehler?

Beitrag von PascalHST »

creed steiger hat geschrieben:schaut aus als würdest du debugen
irgendwo einen Breakpoint gesetzt?
Was genau meinst du damit? Bzw wo sehe ich das?

Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: TForm1 Fehler?

Beitrag von Socke »

PascalHST hat geschrieben:
creed steiger hat geschrieben:schaut aus als würdest du debugen
irgendwo einen Breakpoint gesetzt?
Was genau meinst du damit? Bzw wo sehe ich das?
Bei einem Haltepunkt (Breakpoint) wird dein Programm angehalten, sofern du es in durch Lazarus startest. Die Liste aller Haltepunkte kannst findest du im Menü unter Ansicht->Debuggerfenster->Haltepunkte
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

PascalHST
Beiträge: 29
Registriert: So 18. Mai 2014, 16:16

Re: TForm1 Fehler?

Beitrag von PascalHST »

Danke, hat geholfen :)

So letztes Problem ;)
Ich habe einen Timer eingebaut, dieser soll die Richtung des Balles ändern sobald er die Wand berührt, tut er aber nicht.
Der Ball bewegt sich nur von links nach rechts und zurück, findet wer einen Fehler?
Siehe Procedure "TForm1.tmrMoveBallTimer(Sender: TObject)"

Code: Alles auswählen

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    tmrMoveBall: TTimer;
    procedure FormCreate(Sender: TObject);               {Gestaltung}
    procedure FormKeyPress(Sender: TObject; var Key: char);  {Steuerung}
    procedure tmrMoveBallTimer(Sender: TObject);      {KI (Bewegung) des Balls}
 
  private
    FBallX: integer;
    FBallY: integer;
    FDirection: integer;
    FSpeed: integer;
    FBatRightY: integer;
    FBatLeftY: integer;
    FScreenCenterX: integer;
    FScreenCenterY: integer;
    FBatRightX:integer;
    FBatLeftX: integer;
 
    procedure DrawBall(const AXNew, AYNew: integer);
    procedure DrawBatLeft(const AYNew: integer);
    procedure DrawBatRight(const AYNew: integer);
 
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
uses
  LCLType;
 
{$R *.lfm}
 
{ TForm1 }
 
const
  CHeight = 600;
  CWidth = 1024;
 
  CBallSpeed = 35;
 
  CBatHeight = 80;
  CBallSize = 15;
 
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Color:= clWhite;
  Height:=CHeight;
  Width:=CWidth;
  WindowState:= wsmaximized;
  BorderStyle:= bsnone;
 
  FBallX:= 0;
  FBallY:= 0;
  FSpeed:= CBallSpeed;
 
  FScreenCenterX:= ClientWidth div 2;
  FScreenCenterY:= ClientHeight div 2;
  FBatRightX:= ClientWidth - 30 - CBallSize;
  FBatLeftX:= 30;
 
  end;
 
  procedure TForm1.FormKeyPress (Sender: TObject; var Key: char);    {Steuerung}
  begin
    if Ord(Key) = VK_ESCAPE  then
       Close;
    if Ord(Key) = VK_SPACE then
       begin
         DrawBall(FScreenCenterX, FScreenCenterY);
         DrawBatRight(300);
         DrawBatLeft (300);
         tmrMoveBall.Enabled:= True;
       end;
       if Key in ['i', 'I'] then
         DrawBatRight(FBatRightY + 20);
       if Key in ['k', 'K'] then
         DrawBatRight(FBatRightY - 20);
       if Key in ['x', 'X'] then
         DrawBatLeft(FBatLeftY + 20);
       if Key in ['s', 'S'] then
         DrawBatLeft(FBatLeftY - 20);
  end;
 
procedure TForm1.tmrMoveBallTimer(Sender: TObject); {Selbstbewegung des Balles durch Timer/
                                                     Richtungsänderung}
var
  LXChange: integer;
  LYCHange: integer;
begin
 
  // x2 = x1 + cos(direction) x speed
  // y2 = y1 + sin(direction) x speed
 
  LXChange:= trunc(cos(Pi / 180 * FDirection) * FSpeed);
  LYChange:= trunc(sin(Pi / 180 * FDirection) * FSpeed);
 
 
     DrawBall(FBallX + LXChange, FBallY + LYChange);
 
     if (FBallX <= 0) or (FBallX >= ClientWidth - CBallSize) then
        FDirection:= FDirection + (90 - FDirection) * 2
     else if (FBallY <= 0) or (FBallY >= ClientHeight - CBallSize) then
        FDirection:= FDirection + (180 - FDirection) * 2;
     //   FDirection:= FDirection * -1;
end;
 
 
procedure TForm1.DrawBall(const AXNew, AYNew: integer);   {Ball/Größe}
begin
  Canvas.Pen.Style:= psClear;
  Canvas.Brush.Color:= ClWhite;
  Canvas.Rectangle(FBallX, FBallY, FBallX + CBallSize, FBallY + CBallSize);
  Canvas.Brush.Color:= ClBlack;
  Canvas.Rectangle(AXNew, AYNew, AXNew + CBallSize, AYNew + CBallSize);
  FBallX:= AXNew;
  FBallY:= AYNew;
end;              

Antworten