Autor Beitrag
DaRkFiRe
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 526

WinXP Home & Professional
C, C++, Delphi
BeitragVerfasst: So 26.02.06 15:03 
Hallo liebes Delphi-Forum.

Ich programmiere zwar längere Zeit mit dem CBuilder, aber das Problem muss sich ja auch auf Delphi abwälzen lassen können.
Folgendes: ich hab eine große Anwendung und die soll modular erweiterbar sein.
Die Anwendungsform soll AppForm heißen, sie beinhaltet eine leere Scrollbox, die die neuen Controls beinhalten soll.

D.h.: die Module gibts als DLL.
In den DLLs ist nun je eine Form drin - ein vordefiniertes Formular mit Controls und deren Events. Nennen wir sie DLLForm

Nun möchte ich quasi aus der Hauptanwendung dynamisch zur Laufzeit die anderen Forms hinzuladen. Nun ist das kein Problem, ich will aber NUR die Controls, die in der Form drin sind, nicht die DLLForm selbst anzeigen.

Quasi: alle Controls, die auf DLLForm drauf sind in eine Scrollbox von AppForm laden, ohne die DLLForm anzuzeigen.

s. Skizze im Anhang.

Einfaches Parent von DLLForm-Controls auf Scrollbox aus AppForm zuweisen geht nicht.


Hat jemand Vorschläge oder andere Möglichkeiten!?

Danke im Voraus, DaRkFiRe
Einloggen, um Attachments anzusehen!
_________________
Lang ist der Weg durch Lehren - kurz und wirksam durch Beispiele! Seneca
afk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 102

Win 2K, Win XP
Delphi 2006 Arch., Delphi 6 Ent., MS-SQL 2005 & 2000
BeitragVerfasst: So 26.02.06 15:18 
Warum nimmst Du nicht statt der TForm in der dll den TFrame ?

Der ist meines Wissens für solche Zwecke doch da und kann dann mitsamt der enthaltenen Komponenten in die Scrollbox eingefügt werden.

Gruß Axel

_________________
Man muß sparn wo mn knn !
DaRkFiRe Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 526

WinXP Home & Professional
C, C++, Delphi
BeitragVerfasst: So 26.02.06 15:31 
Ich werde aus dem Frame nicht schlau.
Kann ich den auslagern!?

Ich will ja nun konkret ein Panel (oder ne Groupbox oder einen anderen Container) in ein TabSheet einbinden, so als ob es aussieht, als wäre das (eigentlich in einer DLL liegende) Control schon immer in dem Tabsheet gewesen, anstatt DYNAMISCH DAZUGELINKT.

_________________
Lang ist der Weg durch Lehren - kurz und wirksam durch Beispiele! Seneca
afk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 102

Win 2K, Win XP
Delphi 2006 Arch., Delphi 6 Ent., MS-SQL 2005 & 2000
BeitragVerfasst: So 26.02.06 16:21 
user profile iconDaRkFiRe hat folgendes geschrieben:
Ich werde aus dem Frame nicht schlau.
Kann ich den auslagern!?

Ich hab's zwar selbst noch nicht probiert, aber ich gehe mal davon aus.

Schau mal hier nach, da geht es wohl genau um Dein Thema.


Gruß Axel

_________________
Man muß sparn wo mn knn !
DaRkFiRe Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 526

WinXP Home & Professional
C, C++, Delphi
BeitragVerfasst: So 26.02.06 16:24 
Jau, das hab ich auch schon gefunden, nachdem Du mir den Tipp mit Frames gegeben hast.

Hab auch gegoogelt und bin gerade am Nachprogrammieren, kriege aber keine sichtbaren ergebnisse.

_________________
Lang ist der Weg durch Lehren - kurz und wirksam durch Beispiele! Seneca
DaRkFiRe Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 526

WinXP Home & Professional
C, C++, Delphi
BeitragVerfasst: So 26.02.06 16:52 
Nachtrag:

In der DLL wird zwar der Frame erzeugt und gültig gemacht und zurückgegeben, aber er wird nicht angezeigt, weil Parent auf NULL (nil) steht (wird in der DLL zugewiesen).

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
TFrame * __stdcall form_load(TWinControl * lp) {
  if (!mainFrame)
      mainFrame = new TmainFrame(NULL); // geht auch mit new TmainFrame (lp) nicht
//    mainFrame->ParentWindow = lp; //egal, ob auskommentiert oder nicht
    mainFrame->Parent = lp;
    mainFrame->Left = 0;
    mainFrame->Top = 0;
    return (mainFrame);
}


In der Anwendung zeigt mir dann das ShowMessage, dass Parent 0 ist:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
void __fastcall TformMain::btnLoadClick(TObject *Sender)
{

  if (!hDLL)
    hDLL = LoadLibrary((sPath+"plugins\\orders\\plugin_xtch_orders.dll").c_str());

    if (hDLL && !frm) {
    func_formload *dll_func1;
    dll_func1 = (func_formload*)GetProcAddress(hDLL,"form_load");
    Caption = "DLL loaded";
    if (dll_func1) {
      Caption = "ready";
      frm = dll_func1(Form1);
      ShowMessage(IntToStr(frm->Parent));
        }
    }
}


Er geht also wirklich in den letzten Zweig hinein, ein ShowMessage frm->Name zeigt auch (wie erwartet) "mainFrame" an.

Aber er kann Parent nicht zuweisen...

PS: Ich weiß, es ist C/C++, aber Ihr dürftet damit wohl auch zurecht kommen...
UND: form_load ist in Deklaration UND Export stdcall!

_________________
Lang ist der Weg durch Lehren - kurz und wirksam durch Beispiele! Seneca
DaRkFiRe Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 526

WinXP Home & Professional
C, C++, Delphi
BeitragVerfasst: So 26.02.06 17:36 
Nach langer Google-Suche hab ich das Problem gelöst:

Das Problem kommt bei der Zuweisung der Font-Eigenschaft. Abhilfe schafft eine neue Erstellungsfunktion des Frames:

www.developerssuperp...odID=1&KeyID=808

Das is echt ne Spur zu krank!

_________________
Lang ist der Weg durch Lehren - kurz und wirksam durch Beispiele! Seneca