AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Beim Schließen eines Formulars, wird 2. automatisch geschlossen
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von RaSoWa1 · begonnen am 13. Jun 2010 · letzter Beitrag vom 14. Jun 2010
Antwort Antwort
RaSoWa1

Registriert seit: 1. Jun 2006
Ort: Halle/Saale
140 Beiträge
 
Delphi 2010 Professional
 
#1

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

  Alt 13. Jun 2010, 16:03
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
Klaus
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

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

  Alt 13. Jun 2010, 16:08
Wo/Wie wird das Formular erzeugt?
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 13. Jun 2010, 16:21
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;
...
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (13. Jun 2010 um 16:26 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#4

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

  Alt 13. Jun 2010, 16:22
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
RaSoWa1

Registriert seit: 1. Jun 2006
Ort: Halle/Saale
140 Beiträge
 
Delphi 2010 Professional
 
#5

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

  Alt 13. Jun 2010, 17:14
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.
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#6

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

  Alt 13. Jun 2010, 17:29
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
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
RaSoWa1

Registriert seit: 1. Jun 2006
Ort: Halle/Saale
140 Beiträge
 
Delphi 2010 Professional
 
#7

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

  Alt 13. Jun 2010, 17:49
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.
Klaus
  Mit Zitat antworten Zitat
RaSoWa1

Registriert seit: 1. Jun 2006
Ort: Halle/Saale
140 Beiträge
 
Delphi 2010 Professional
 
#8

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

  Alt 14. Jun 2010, 08:36
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
Klaus
  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 23:45 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