Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Applikation mit MDI Fenstern beenden (https://www.delphipraxis.net/12874-applikation-mit-mdi-fenstern-beenden.html)

BenjaminHelbig 5. Dez 2003 14:34


Applikation mit MDI Fenstern beenden
 
Hi Leute,

ich hab folgendes Problem. Ich habe eine Applikation mit momentan 3 MDI Fenster geschrieben. Läuft auch alles Prima. Beim schließen des Hauptfensters (Main) wird logischerweise das komplette Programm beendet. Das funktioniert ohne Fehler aber nur, wenn nie ein MDI Fenster aufgemacht wurde.
Ich lasse die MDI Fenster nicht beim Programmstart anzeigen sondern erst wenn man auf die entsprechenden Buttons klickt.
Wurde ein MDI geöffnet und dann mit cafree wieder geschlossen und dann das Hauptprogramm beendet kommt Runtime Error 216.
Häh?

Grüßle Ben

samson 5. Dez 2003 21:56

Re: Applikation mit MDI Fenstern beenden
 
Hallo,

hört sich interessant an.

Hast Du denn im FormClose das caFree eingebracht?

Wie sieht Dein Source aus?

Gruss


Samson

BenjaminHelbig 6. Dez 2003 10:35

Re: Applikation mit MDI Fenstern beenden
 
Hi, du sagst es, des is echt interessant.
Mein Source beim Prog start sieht so aus:

program SMCMain;

uses
Forms,
Windows,
Unit1 in 'Unit1.pas' {SMCMainApp},
Unit2 in 'Unit2.pas' {Database: TDataModule},
Unit3 in 'Unit3.pas' {Rechnungsverfolgung},
Unit4 in 'Unit4.pas' {DialogRechnungsverfolgung},
Unit5 in 'Unit5.pas' {Lager},
Unit6 in 'Unit6.pas' {Administration},
Unit7 in 'Unit7.pas' {Login},
Unit8 in 'Unit8.pas' {Splashscreen};

{$R *.RES}

begin
SplashScreen := TSplashScreen.Create(Application);
try
SplashScreen.Show;
Application.Initialize;
SplashScreen.Update;
Sleep(2000); // Or a delay command.
Application.Initialize;
Application.Title := 'SMC Main Platform';
Application.CreateForm(TSMCMainApp, SMCMainApp);
Application.CreateForm(TDatabase, Database);
Application.CreateForm(TDialogRechnungsverfolgung, DialogRechnungsverfolgung);
Application.CreateForm(TLogin, Login);
SplashScreen.Hide;
finally
SplashScreen.Free;
end;
Login.Show;
Application.ShowMainForm := False;
Application.Run;
end.

Meine Hauptunit, also die Hauptform heißt SMCMainApp. Darin hab ich in der CloseQuery noch folgendes stehen:

procedure TSMCMainApp.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
var MDIRun : Integer;
begin
// Das beenden ins Protokoll eintragen
Database.Protokoll.First;
Database.Protokoll.Last;
Database.Protokoll.Insert;
Database.Protokoll.FieldByName('TimeStamp').AsStri ng := DateTimeToStr(now);
Database.Protokoll.FieldByName('USERID').AsInteger := Unit1.USERID;
Database.Protokoll.FieldbyName('IP').AsString := Unit1.IP;
Database.Protokoll.FieldByname('Computer').AsStrin g := Unit1.Computer;
SMCMainApp.ProtokollBezeichnung.Text := 'Das Programm wird beendet';
Database.Protokoll.Post;
Database.Protokoll.Refresh;
// Die Client Fenster schließen. Sofern Sie offen sind, um den Code im OnClose der Clients auszuführen.
for MDIRun := 0 to SMCMAinApp.MDIChildCount - 1 do
begin
SMCMainApp.MDIChildren[MDIRun].close;
end;
end;

In den Clientfenstern habe ich im OnClose Ereignis folgendes stehen:

procedure TAdministration.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
if (Unit1.EveryClose = 'none') then
begin
if (Minimieren = false) then Action := cafree
else Action := caMinimize;
end
else if (Unit1.EveryClose = 'close') then Action := cafree
else if (Unit1.EveryClose = 'minimize') then Action := caMinimize;
end;

Die Clientfenster werden über folgenden Code gestartet:

Application.CreateForm(TRechnungsverfolgung, Rechnungsverfolgung);

Das ganze funzt über eine selbstgeschrieben Prozedur, die dann noch das ClientFenster unter das Menü Offene Fenster einträgt, aber das sollte eigentlich irrelevant sein.
Die Gaudi ist eigentlich, dass es auf dem Rechner wo ich programmiere nur alle 3 bis 4 Mal auftritt. Wenn ich allerdings das Prog kompiliere und auf einem anderen x-beliebigen WinXP Rechner laufen lasse tritt der Fehler 216 immer auf.

Hoffe ihr könnt mir helfen.

BenjaminHelbig 6. Dez 2003 10:42

Re: Applikation mit MDI Fenstern beenden
 
Ich habe jetzt noch ein bisschen rumprobiert und rausgefunden, dass der Fehler nicht auftritt, wenn ich den LoginScreen nicht anzeigen lasse. In also auch nicht Createn lasse. Ich kapier das aber nicht. Der Login screen ist nämlich kein MDIChild, sonder ein normales Fenster, welches ich einfach vor dem Programmstart anzeigen lasse um den Benutzer zu athentifizieren.
Wenn der USER authentifiziert ist, dann schließe ich das Loginfenster mit

Login.close

Im OnClose von Login hab ich

Action := caFree;

drinstehen. Aber selbst wenn ich des rausmache und Login.close durch Login.Hide ersetze funzt es nicht. Ich versteh das nicht.

samson 8. Dez 2003 21:12

Re: Applikation mit MDI Fenstern beenden
 
Hallo,

also ich muss ganz ehrlich sagen, das ich das nicht 100% genau weiss. Ich würde in diesem Fall folgendermassen vorgehen.

Die Projektdatei ist ein sehr anfälliges Ding und man sollte vorsichtig sein, da was zu ändern. Nicht destro trotz sind eben, wie son Login-Dialog, ein muss für eine MDI-Anwendung.

Als Tipp kann ich folgendes geben.

Zuerst Kommentierst Du den Splash Dialog aus. Es ist nicht gut vor der Anweisung:

Application.Initialize;

Source Code einzufügen.

Also mach den erstmal weg. Den Login Dialog würde ich im ShowModal-Modus öffnen. Des Weiteren würde ich zwei Buttons einfügen, einen mit dem Rückgabewert: mrOK und einen mit mrCancel. Diese Werte kannst Du dann weiter behandeln.

mrResult :TModalResult;
.
.
.
mrResult := Login.ShowModal;

Dann:

if mrResult <> mrOK then Application.Terminate;

In dem MDI-Hauptform kannst Du dann im FormActivate abfragen ob die Anwendung weiter ausgeführt werden soll.

FormActivate(...)
begin
if not Application.Terminate then
begin
//Anweisungen ausführen, wenn die Application weiter aufgeführt werden soll.
.
.
.
end;
end;

Nochmal zum Login-Formular:

Du brauchst im Close-Ereignis nicht die Anweisung: Action := caFree; diese benötigt man nur bei MDIChilds.

Wenn DU diese Sachen einhälst, sollte Deine Anwendung eigentlich funktionieren.

Gruss


Samson


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:37 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