Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Beim Schließen eines Formulars, wird 2. automatisch geschlossen (https://www.delphipraxis.net/152160-beim-schliessen-eines-formulars-wird-2-automatisch-geschlossen.html)

RaSoWa1 13. Jun 2010 16:03

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:
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.
Hauptformular:
Delphi-Quellcode:
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.
About-Formular:
Delphi-Quellcode:
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.
Warum wird ShowMessage in TForm1 beim Schliessen von TForm4 auch geschlossen?
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

mkinzler 13. Jun 2010 16:08

AW: Beim Schließen eines Formulars, wird 2. automatisch geschlossen
 
Wo/Wie wird das Formular erzeugt?

himitsu 13. Jun 2010 16:21

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;
...

Bernhard Geyer 13. Jun 2010 16:22

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.

RaSoWa1 13. Jun 2010 17:14

AW: Beim Schließen eines Formulars, wird 2. automatisch geschlossen
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1028556)
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.

Das eigenartige ist, das nicht die Anwendung, sondern nur das ShowMessage-Fenster geschlossen wird. Die Anwendung läuft dann ganz normal weiter und Form1 fungiert auch als Hauptformular.

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.

xZise 13. Jun 2010 17:29

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

RaSoWa1 13. Jun 2010 17:49

AW: Beim Schließen eines Formulars, wird 2. automatisch geschlossen
 
Zitat:

Zitat von xZise (Beitrag 1028575)
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

Wenn ShowMessage nicht angezeigt wird, startet das Hauptfenster (Form1) ganz normal und Form4 wird nach der im Timer1 eingestellten Zeit geschlossen. Das Programm läuft anstandslos.


Gruß Klaus.

RaSoWa1 14. Jun 2010 08:36

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 20:20 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