![]() |
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 |
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 |
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. |
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. |
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