Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi EExternal Exception beim Schließen eines Formulars (https://www.delphipraxis.net/147264-eexternal-exception-beim-schliessen-eines-formulars.html)

schweindi 4. Feb 2010 19:01


EExternal Exception beim Schließen eines Formulars
 
Hallo alle :)
mein Problem ist wahrscheinlich ganz einfach und schnell zu lösen, aber ich komme einfach nicht zur Lösung und zerbreche mir den Kopf darüber:
Ich habe ein Hauptformular, auf dem unter anderem ein Button ist der ein neues Formular "f_about" erstellt.
Diese neue Form hat dann drauf noch einen Button und ein Label bt_end & l_about.
Delphi-Quellcode:
procedure TForm1.ber1Click(Sender: TObject);
var BtClick1:TNotifyEvent;
begin
f_about:=TForm.Create(Application);
...
f_about.ParentWindow:=0;
bt_end:=TButton.Create(f_about);
bt_end.Parent:=f_about;
...
bt_end.OnClick:=BtClick1;
l_about:=TLabel.Create(f_about);
l_about.Parent:=f_about;
...
f_about.Show;
end;
so und dann hab ich noch die procedure BtCklick1:
Delphi-Quellcode:
procedure BtClick1 (Sender: TObject);
begin
f_about.Release;
end;
eigentlich ja ganz einfach... wenn ich das Programm jetzt aber ausführe kommt folgender Fehler: "Project test.exe raised exception class EExternalException with message 'External Exception C000001D'. Process stopped. Use Step or run to continue."
danach springt das programm in die dpr:

Delphi-Quellcode:
program Ptest;

uses
  Forms,
  test in 'test.pas' {Form1};

{$R *.RES}
begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
bei "end." ist der "debug-pfeil"...

ich habe leider keinen Plan, wieso der Button nicht die form f_about schließt. Ich habe schon probiert die procedure "procedure f_about.BtClick1(Sender: TObject);" zu nennen, dann kommt aber der Fehler "identifier redeclared: f_about".

ich hoffe jemand kann mir da helfen :)

lg

implementation 4. Feb 2010 19:12

Re: EExternal Exception beim Schließen eines Formulars
 
Zitat:

Zitat von schweindi
Delphi-Quellcode:
procedure TForm1.ber1Click(Sender: TObject);
var BtClick1:TNotifyEvent;
begin
...
end
...
procedure BtClick1 (Sender: TObject);
begin
f_about.Release;
end;

TNotifyObject erwartet eine "procedure(Sender:TObject) of object", also eine passende Methode. Deine Prozedur BtClick1 ist aber keine Methode.
Zitat:

Zitat von schweini
Ich habe schon probiert die procedure "procedure f_about.BtClick1(Sender: TObject);" zu nennen, dann kommt aber der Fehler "identifier redeclared: f_about".

Ich nehme an, f_about ist der Variablenbezeichner, oder?
In dem Fall ist f_about.BtClick ja auch ganz klar ein syntaktischer Fehler, vor den Methodennamen muss eine Klasse / ein Object / ein Record.
Versuchs mal mit TForm1.BtClick :wink:

schweindi 4. Feb 2010 19:32

Re: EExternal Exception beim Schließen eines Formulars
 
wie soll ich mir die proc genau vorstellen??

procedure BtClick1(Sender: TObject) of [??] ;

wenn ich
Delphi-Quellcode:
procedure TForm1.BtClick1(Sender: TObject);
schreibe und sie in Tform1 registriere, kommt der selbe Fehler...

oder wie genau?

f_about ist der TForm name von der Form die erstellt wird.

schweindi 5. Feb 2010 00:44

Re: EExternal Exception beim Schließen eines Formulars
 
so... ich hab mich jetzt mal nach einer längeren Pause hingesetzt und hab mir nochmal alles angeschaut und ganz schnell das Problem gefunden :)

Die procedure, die das neue Formular schließen soll sieht so aus:
Delphi-Quellcode:
procedure TForm1.BtClick1(Sender: TObject);
begin
f_about.Free;
end;
dh sie muss deklariert werden, genau wie du es geschrieben hast, im Hauptformular TForm1:
Delphi-Quellcode:
  private
    { Private-Deklarationen }
    procedure BtClick1(Sender: TObject);
und was ich dann vergessen hab und ich bekam ja die Warnung: "BtCklick1 might not have been initialized"
Die Variable muss natürlich global sein:
Delphi-Quellcode:
var
  Form1: TForm1;
...
//forms var ----------------
//f_about vars
f_about:TForm;
bt_end:TButton;
l_about:TLabel;
[u]BtClick1:TNotifyEvent;[/u]
also ich hab den Fehler gemacht, alles lokal zu deklarieren, jetzt funzt alles - danke dir :)

sx2008 5. Feb 2010 07:53

Re: EExternal Exception beim Schließen eines Formulars
 
Sehr unschön, was du da machst.
Der erste Schritt zur Besserung wäre, wenn du eine eigene Klasse von TForm ableiten würdest:
Delphi-Quellcode:
TDynamicAboutForm = class(TForm)
public
  bt_end:TButton;
  l_about:TLabel;
  constructor Create(AOwner:TComponent);override;
end;
In einem weiteren Schritt kannst du den Button und das Label auch private machen.

schweindi 5. Feb 2010 10:46

Re: EExternal Exception beim Schließen eines Formulars
 
danke, ich habe mir fast gedacht, dass ich da ziemlich viel misch masch programmiere, da ich nur sehr wenig in der Schule gelernt habe...

soll ich jetzt für jede neue Form die ich machen will eine eigene Klasse machen?
die wären dann TDynamic"name"Form?

und bezüglich "privat machen", ich probier das mal...danke :)

shmia 5. Feb 2010 17:21

Re: EExternal Exception beim Schließen eines Formulars
 
Formulare kannst du mit Hilfe der IDE erzeugen oder aber auch zur Laufzeit erzeugen.
Mit der IDE ist das natürlich wesentlich einfacher.
Einfach im Menue Datei -> Neues Formular aufrufen und die IDE legt ein leeres Formular in einer neuen Unit an.
Namen des Fomulars ändern und am Besten gleich speichern.
Und dann per "Klickedi-Klick" mit Inhalt füllen.

Wenn man Formulare zur Laufzeit mit Buttons, Labels usw. bestückt ist das natürlich wesentlich aufwändiger.
Manchmal tut man das trotzdem um spezielle Effekte (Grössenanpassung, offene Anzahl von Buttons,...) zu erreichen.
Ich dachte, du würdest dein Formular mit Absicht zur Laufzeit zusammenbauen.
Aber mir scheint du hast dir andere Programmiersprachen zum Vorbild genommen, bei denen man in der Tat jeden einzelnen Button von Hand erzeugen muss.

schweindi 6. Feb 2010 11:03

Re: EExternal Exception beim Schließen eines Formulars
 
ja ich habe eig alles in Laufzeit erstellt... und jetzt funktioniert auch alles, obwohl es "unschön" ist das weiß ich, aber es ist nur wichtig, dass es läuft :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:57 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 by Thomas Breitkreuz