Announcement

Collapse
No announcement yet.

Mdi Fenster in Package und gemeinsamer Zugriff auf ein Data Modul

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Mdi Fenster in Package und gemeinsamer Zugriff auf ein Data Modul

    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;
Working...
X