Hallo, folgendes Problem:
Gegeben: Eine Anwendung die je nach Installation Module als MDI Child aufruft. In der Hauptanwendung wird ein Datenmodul ertsellt, welches die Verknüpfung zur Datenbank herstellt.
MDI Child's sollen in verschiedenen Packages (ein Package pro Modul) abgelegt werden..
1 stes Problem:
Beim dynamischen laden des Packages ist das Datenmodul aus der Hautanwendung nicht bekannt.
Kann über USES DataModul und Application.CreateForm(Datamodule ....) übergangen werden.
Das funktioniert bei einem Modul !
Dann trittt folgendes auf:
2tes Problem:
Wird aus dem Hauptprogramm ein weiteres Modul gestartet, welches ebenfalls die Uses Anweisung " USES DataModule" enthält, so kommt es zur Fehlermeldung:
"DataModule ist schon in Unit ... " (der vorhergeladenen Unit) vorhanden".
Wie kann das Child in dem Package das DateModul der Hauptanwenung nutzen?
Info:
Hauptprogtamm erstellt Child über:
// mdiDll kommt von D4 Anwendung, da konnte man noch ein MDI Child vernünftig in einer DLL verpacken !!!!
function TForm1.OpenMdiDll(mDll, mProgName : PChar; mCaption : String) : Byte;
var
aExecProc : TExecProc;
aPackage : HModule; // HModul, wird gesichert
begin
aPackage := LoadPackage(aDll); // aDll ist der Package Name
if aPackage <> 0 then begin
try
@aExecProc := GetProcAddress(aPackage,mProgName);
if Assigned(aExecProc) then begin
aChildHandle := aExecProc(Handle);
SaveChildHandle(aPackage, aChildHandle, mCaption); // Hier wird das Module (aPackage) gespeichert, um es später wieder freigeben zu können
end;
except
//display an error message if we fail
ShowMessage ('Package not found');
end;
end;
end;
// Hier die der Client:
unit UserMgrUnit;
interface
uses ...
// aMainWndHandle = Handle des Hauptformulares,,
// Rückgabe = Handle des neuen Child Fensters)
function Function1(aMainWndHandle : Thandle) : THandle;
type
TChildForm1= class(TForm)
...
implementation
uses DataModule;
{$R *.DFM}
function Function1(aMainWndHandle : Thandle) : THandle;
var
F1Form: TF1Form;
begin
// DataModul erstellen ?!?!?!?!?
try
Application.CreateForm(Data.TDataModule, DataModule);
if Data.DataBase.Connected = False then begin
Data.DataBase.Close;
Data.DataBase.Paramters := ....
end;
except
end;
ChildForm1:= TChildForm1.Create(Application);
ChildForm1.MainFormWHnd := aMainWndHandle;
Result := ChildForm1.Handle;
end;
Gegeben: Eine Anwendung die je nach Installation Module als MDI Child aufruft. In der Hauptanwendung wird ein Datenmodul ertsellt, welches die Verknüpfung zur Datenbank herstellt.
MDI Child's sollen in verschiedenen Packages (ein Package pro Modul) abgelegt werden..
1 stes Problem:
Beim dynamischen laden des Packages ist das Datenmodul aus der Hautanwendung nicht bekannt.
Kann über USES DataModul und Application.CreateForm(Datamodule ....) übergangen werden.
Das funktioniert bei einem Modul !
Dann trittt folgendes auf:
2tes Problem:
Wird aus dem Hauptprogramm ein weiteres Modul gestartet, welches ebenfalls die Uses Anweisung " USES DataModule" enthält, so kommt es zur Fehlermeldung:
"DataModule ist schon in Unit ... " (der vorhergeladenen Unit) vorhanden".
Wie kann das Child in dem Package das DateModul der Hauptanwenung nutzen?
Info:
Hauptprogtamm erstellt Child über:
// mdiDll kommt von D4 Anwendung, da konnte man noch ein MDI Child vernünftig in einer DLL verpacken !!!!
function TForm1.OpenMdiDll(mDll, mProgName : PChar; mCaption : String) : Byte;
var
aExecProc : TExecProc;
aPackage : HModule; // HModul, wird gesichert
begin
aPackage := LoadPackage(aDll); // aDll ist der Package Name
if aPackage <> 0 then begin
try
@aExecProc := GetProcAddress(aPackage,mProgName);
if Assigned(aExecProc) then begin
aChildHandle := aExecProc(Handle);
SaveChildHandle(aPackage, aChildHandle, mCaption); // Hier wird das Module (aPackage) gespeichert, um es später wieder freigeben zu können
end;
except
//display an error message if we fail
ShowMessage ('Package not found');
end;
end;
end;
// Hier die der Client:
unit UserMgrUnit;
interface
uses ...
// aMainWndHandle = Handle des Hauptformulares,,
// Rückgabe = Handle des neuen Child Fensters)
function Function1(aMainWndHandle : Thandle) : THandle;
type
TChildForm1= class(TForm)
...
implementation
uses DataModule;
{$R *.DFM}
function Function1(aMainWndHandle : Thandle) : THandle;
var
F1Form: TF1Form;
begin
// DataModul erstellen ?!?!?!?!?
try
Application.CreateForm(Data.TDataModule, DataModule);
if Data.DataBase.Connected = False then begin
Data.DataBase.Close;
Data.DataBase.Paramters := ....
end;
except
end;
ChildForm1:= TChildForm1.Create(Application);
ChildForm1.MainFormWHnd := aMainWndHandle;
Result := ChildForm1.Handle;
end;