![]() |
Beim Schließen eines Formulars, wird 2. automatisch geschlossen
Hallo,
ich habe in einem Projekt einen eigenartigen Fehler. Beim Programmstart wird ein About-Fenster angezeigt, im OnShow-Ereignis des Hauptformulars Daten ausgewertet und das Ergebis in einem Dialog-Formular angezeigt. Dieses wird aber zusammen mit dem About-Fenster wieder geschlossen. Zur Verdeutlichung hier folgender Beispielcode:
Delphi-Quellcode:
Hauptformular:
program Project1;
uses Forms, Unit1 in 'Unit1.pas' {Form1}, Unit4 in 'Unit4.pas' {Form4}; {$R *.res} begin Form4 := TForm4.Create(Application); Form4.Show; Form4.Update; Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end.
Delphi-Quellcode:
About-Formular:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure FormShow(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormShow(Sender: TObject); begin Showmessage('Test'); // wird zusammen mit Form4 beendet !?!? Wieso? end; end.
Delphi-Quellcode:
Warum wird ShowMessage in TForm1 beim Schliessen von TForm4 auch geschlossen?
unit Unit4;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TForm4 = class(TForm) Timer1: TTimer; // schliesst nach 1 sek. das Formular wieder. Label1: TLabel; procedure Timer1Timer(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form4: TForm4; implementation {$R *.dfm} procedure TForm4.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caFree; end; procedure TForm4.Timer1Timer(Sender: TObject); begin Timer1.Enabled := False; close; end; end. Wenn "Action := caFree; " in TForm4 auskommentiert wird, funktioniert es wie gewünscht. Aber das Formular muß doch freigegeben werden! Oder? Kann mir das jemand erklären? Gruß Klaus |
AW: Beim Schließen eines Formulars, wird 2. automatisch geschlossen
Wo/Wie wird das Formular erzeugt?
|
AW: Beim Schließen eines Formulars, wird 2. automatisch geschlossen
Form4 wird als Erstes erzeugt, dabei an Application gebunden (siehe Owner) und wird somit zum Hauptformular.
Wird nun das Hauptformular (also die Form4) geschlossen, wird auch die ganze Anwendung beendet. PS: Es wäre besser, wenn Application erst initialisiert und erst dann verwendet würde. OK, in Delphi passiert zum Glück nichts in Initialize, aber das muß nicht so bleiben und auch Lazarus reagiert da anders.
Delphi-Quellcode:
Application.Initialize;
Form4 := TForm4.Create(nil); try Form4.Show; Form4.Update; Application.CreateForm(TForm1, Form1); Application.Run; finally Form4.Free; end;
Delphi-Quellcode:
Application.Initialize;
Application.CreateForm(TForm1, Form1); Form4 := TForm4.Create(Application); Form4.Show; Form4.Update; Application.Run;
Delphi-Quellcode:
...
Application.Initialize;
Application.CreateForm(TForm1, Form1); Application.CreateForm(TForm4, Form4); Form4.Show; Application.Run; |
AW: Beim Schließen eines Formulars, wird 2. automatisch geschlossen
Such mal im Forum nach Splash-Screnn. Dein Ansatz des About-Dialogs vor dem Hauptfenster zu erzeugen bringt einiges in der VCL durcheinander so das TForm4 als Hauptfenster angesehen wird. Und wird dieses geschlossen wird die Amwendung geschlossen.
|
AW: Beim Schließen eines Formulars, wird 2. automatisch geschlossen
Zitat:
Die Art der Splash-Screen-Erzeugung ist nicht auf meinen Mist gewachsen. Hat aber über viele Jahre in allen Projekten bisher anstandslos funktioniert. Ich werde jetzt trotzdem mal mit den Vorschlägen aus den Splash-Screnn-Tutorial experimentieren. Gruß Klaus. |
AW: Beim Schließen eines Formulars, wird 2. automatisch geschlossen
Moin.
Ich habe gerade kein Delphi zur Hand, aber was passiert, wenn keine ShowMessage angezeigt wird? Und ansonsten wenn das ne Aboutbox ist, warum machst du das dann so umständlich? Wäre nicht das standardmäßige erstellen ausreichend? Oder das du die Form nur erzeugst, wenn der About-Button gedrückt wird? MfG Fabian |
AW: Beim Schließen eines Formulars, wird 2. automatisch geschlossen
Zitat:
Gruß Klaus. |
AW: Beim Schließen eines Formulars, wird 2. automatisch geschlossen
Fehler gefunden:
Die Ursache sind die Laufzeit-Themes. Einfach das Häckchen bei den Auftragsoptionen herausnehmen und schon funktioniert mein Code! ohne Laufzeit-Themes: 1. SplashScreen wird angezeigt 2. ShowMessage wird angezeigt 3. SplashScreen wird nach der eingestellten Zeit geschlossen und freigegeben 4. ShowMessage wird nach Klick auf OK-Button geschlossen 5. HautForm (Form1) wird angezeigt. mit Laufzeit-Themes: 1. SplashScreen wird angezeigt 2. ShowMessage wird angezeigt 3. SplashScreen wird nach der eingestellten Zeit gemeinsam mit ShowMessage geschlossen und freigegeben 4. Nutzer hatte Pech, konnte nichts lesen. 5. HautForm (Form1) wird angezeigt. Ich habe gelernt: Die Laufzeit-Themes beeinflussen nicht nur das Design der Anwendung, sondern auch den Programmablauf, warum auch immer!!! Gruß Klaus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:53 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