AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Applikation mit MDI Fenstern beenden

Ein Thema von BenjaminHelbig · begonnen am 5. Dez 2003 · letzter Beitrag vom 8. Dez 2003
Antwort Antwort
BenjaminHelbig

Registriert seit: 23. Okt 2003
Ort: Mannheim
80 Beiträge
 
Delphi 5 Professional
 
#1

Applikation mit MDI Fenstern beenden

  Alt 5. Dez 2003, 15:34
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
--------
Es ist schon über so viele Dinge Gras gewachsen, dass ich keinem Rasen mehr traue.
  Mit Zitat antworten Zitat
Benutzerbild von samson
samson

Registriert seit: 26. Aug 2003
Ort: Hövelhof Riege
105 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Applikation mit MDI Fenstern beenden

  Alt 5. Dez 2003, 22:56
Hallo,

hört sich interessant an.

Hast Du denn im FormClose das caFree eingebracht?

Wie sieht Dein Source aus?

Gruss


Samson
Frank Gellermann
Wer Informationen hat, hat Macht. Wer Macht hat, hat Informationen!!!
  Mit Zitat antworten Zitat
BenjaminHelbig

Registriert seit: 23. Okt 2003
Ort: Mannheim
80 Beiträge
 
Delphi 5 Professional
 
#3

Re: Applikation mit MDI Fenstern beenden

  Alt 6. Dez 2003, 11:35
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.
--------
Es ist schon über so viele Dinge Gras gewachsen, dass ich keinem Rasen mehr traue.
  Mit Zitat antworten Zitat
BenjaminHelbig

Registriert seit: 23. Okt 2003
Ort: Mannheim
80 Beiträge
 
Delphi 5 Professional
 
#4

Re: Applikation mit MDI Fenstern beenden

  Alt 6. Dez 2003, 11:42
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.
--------
Es ist schon über so viele Dinge Gras gewachsen, dass ich keinem Rasen mehr traue.
  Mit Zitat antworten Zitat
Benutzerbild von samson
samson

Registriert seit: 26. Aug 2003
Ort: Hövelhof Riege
105 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Applikation mit MDI Fenstern beenden

  Alt 8. Dez 2003, 22:12
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
Frank Gellermann
Wer Informationen hat, hat Macht. Wer Macht hat, hat Informationen!!!
  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 21:41 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