AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Fehler nach Schließen

Ein Thema von Theo1994 · begonnen am 16. Apr 2011 · letzter Beitrag vom 16. Apr 2011
Antwort Antwort
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.658 Beiträge
 
Delphi 12 Athens
 
#1

AW: Fehler nach Schließen

  Alt 16. Apr 2011, 10:19
Wenn Form1 nicht instanziert wäre, könntest Du darauf auch keinen Button anklicken. Machst Du noch etwas im FormClose oder FormCloseQuery?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Theo1994

Registriert seit: 16. Apr 2011
5 Beiträge
 
#2

AW: Fehler nach Schließen

  Alt 16. Apr 2011, 10:43
Ok:
Die Programmdatei:
Delphi-Quellcode:
program bewegen;

uses
  Forms,
  Eingabe in 'eingabe.pas{FormE},
  ubewegen in 'ubewegen.pas{Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TFormE, FormE);
  Application.Run;
  Application.Destroy; //mit Application.free kommt der gleiche Fehler
                         {ohne einem der beiden kommt zwar die Meldung nicht, aber das Programm erscheint auch nicht wieder in Delphi ohne Strg+F2 zu drücken (passiert nach den Meldungen auch nicht)}
end.
Die Unit vom ersten Form:
Delphi-Quellcode:
unit Eingabe;

interface

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

type
  TFormE = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    ScrollBar1: TScrollBar;
    Button1: TButton;
    Label5: TLabel;
    procedure ScrollBar1Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  FormE: TFormE;

implementation

{$R *.dfm}

procedure TFormE.ScrollBar1Change(Sender: TObject);
//...

procedure TFormE.Button1Click(Sender: TObject);
begin
  Application.CreateForm(TForm1,Form1); //Formular mit Spiel aufbauen

  Form1.Label1.Caption:=FormE.Edit1.Text; //Eingegebenen Name für Spieler 1 übergeben
  Form1.Label2.Caption:=FormE.Edit2.Text; //Eingegebenen Namen für Spieler 2 übergeben
  Form1.Label5.Caption:=IntToStr(FormE.ScrollBar1.Position); //Übergabe der Gewinnpunktzahl

  FormE.Destroy; //Eingabe-Formular schließen
  Form1.Show; //Spiel-Formular anzeigen

end;

end.
Und das Form1:
Delphi-Quellcode:
unit ubewegen;

interface

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

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Feld: TShape;
    Ball: TShape;
    Button2: TButton;
    EditTastenEingabe: TEdit;
    Schl2: TShape;
    Button1: TButton;
    Schl1: TShape;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Button4: TButton;
    Button3: TButton;

    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);

    procedure Timer1Timer(Sender: TObject);
    procedure EditTastenEingabeKeyPress(Sender: TObject; var Key: Char);
    procedure Aus (Seite: Byte);
    procedure Button4Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure Angabe (Seite: Byte);
    procedure BallPos (x,y: Integer);


  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
      x1, y1: Integer; //Position des Balles zum Rechnen
      Durchmesser: Byte; //Durchmesser des Balles um ggf. einzustellen
      Hoch: Integer; //Bewegung des Balles nach oben (in Pixeln je Timer)
                                      //wenn negativ -> nach unten
      Rechts: Integer; //Bewegung des Balles nach rechts (in Pixeln je Timer)
                                      //wenn negativ -> nach links
      Sp1Name, Sp2Name: Shortstring; //Spielernammen
      Gewinnpkt: Word; //Spielstand, bei dem ein Spieler gewonnen hat
      Seite: Word; //Seitenangabe
      Speed: Byte; //Geschwindigkeit des Balles (in Pixeln je Timer)

implementation

{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
begin
  //Variable Durchmesser mit Durchmesser des Balles belegen
  Durchmesser:=Ball.Width;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
 //...
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 //noch leer, das wird der Neustart des Spiels
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 //noch leer, das wird Neues Spiel -> Aufruf FormE
end;


//----------------------------------------------------------------------
procedure TForm1.Timer1Timer(Sender: TObject); //zeitliche Schrittbestimmung des Balles
begin
 //... Verschiebung des Balles mit verschiedenen Prüfungen
end;

procedure TForm1.EditTastenEingabeKeyPress(Sender: TObject; var Key: Char);
begin
 //... Steuerung der Schläger
end;

procedure TForm1.Aus(Seite: Byte); //wenn der Ball hinter die Seitenlinie kommt
begin
  //... Einsetzen des Balls
end;



procedure TForm1.Button4Click(Sender: TObject); (Beenden-Button)
begin
  Application.Terminate;
end;

procedure TForm1.Angabe (Seite: Byte);
begin
  //... neue Angabe des Balles
end;

procedure TForm1.BallPos(x,y: Integer);
begin
  Ball.Left:=x;
  Ball.Top:=y;
end;

end.

Ich hoffe, ich habe alles unwichtige rausgestrichen und alles wichtige drin gelassen...

@DeddyH: Diese beiden Dinge habe ich noch nie gehört... Also unwahrscheinlich...

Ich habe auch nichts gegen das rausschmeißen des Beenden-Buttons, aber mein Lehrer will den immer mit haben...

Danke auch schonmal für die schnellen Kommentare.
Theo1994

Geändert von Theo1994 (16. Apr 2011 um 10:45 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.658 Beiträge
 
Delphi 12 Athens
 
#3

AW: Fehler nach Schließen

  Alt 16. Apr 2011, 11:02
Nimm die ganzen Destroy-Aufrufe raus.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Theo1994

Registriert seit: 16. Apr 2011
5 Beiträge
 
#4

AW: Fehler nach Schließen

  Alt 16. Apr 2011, 11:44
Danke, so kommt der Fehler nicht mehr.
Bleibt nur das FormE sichtbar, das mache ich dann mit FormE.visible:=False unsichtbar und jetzt gehts.

Stellt sich mir die Frage, wozu man das Desrtoy verwendet?

Danke an alle, die mir da geholfen haben!
Theo1994
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.874 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Fehler nach Schließen

  Alt 16. Apr 2011, 11:49
Direkt gar nie, entweder werden sie von ihrem Owner freigegeben ( beim Formular Application) oder man ruft .Free auf, welches verschidene Überprüfungen ausführt und dann .Destroy aufruft).
Markus Kinzler
  Mit Zitat antworten Zitat
Theo1994

Registriert seit: 16. Apr 2011
5 Beiträge
 
#6

AW: Fehler nach Schließen

  Alt 16. Apr 2011, 12:03
ok, vielen Danke nochmal.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Fehler nach Schließen

  Alt 16. Apr 2011, 13:07
Man ruft eben nicht Destroy us, sondern Free. (sollte sogar in der OH erwähnt werden)

Zitat:
Delphi-Quellcode:
FormE.Destroy; //Eingabe-Formular schließen
Form1.Show;
Sowas Application.CreateForm(TForm1,Form1); gehört in die DPR, sonst hat dieses woanders nicht unbedingt etwas zu suchen.
> Form1 := TForm1.Create(Self); oder Form1 := TForm1.Create(FormE); Wobei ich dir dringend Empfehle diese globalen Variablen, wie FormE und Form1 garnicht zu verwenden.

Innerhalb einer Komponente nutzt man nicht die externe Variable, also innerhalb der Methoden von TFormE wird nicht FormE verwendet. höchstens Self oder man läßt es weg, wenn möglich.



So und nun zum Problem.
Wie dir schon gesagt wurde, wird das Programm beendet, wenn man die Hauptform schließt.

FormE ist deine Hauptform, da sie als erstes Erzeugt und bei Application angemeldet wurde.
FormE.Destroy; Self.Free; oder Free; , aber eigentlich besser Self.Close; oder Close; schließt die Form.

Schließen = Close
Zerstören = Destroy
Freigeben = Free

So, nun gibst du also die Hauptform frei, welches intern auch alle, bei Application registrierten, Forms schließt/freigibt.
Somit vrschwindet nun auch Form1, weswegen nun Form1.Show nicht klappen kann, aber bei dir durch einen Fehler doch zufäälig mal halbwegs gut geht.

Delphi-Quellcode:
// Application.Destroy;
Application.Free; // ...kommt der gleiche Fehler
Man gibt Application nicht frei.

Schau dir mal eine DPR an, wie se standardmäßig aussieht.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort


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 03:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz