Einzelnen Beitrag anzeigen

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