BCB2010 TPanel in BCB6 Anwendung



  • Hallo zusammen,

    sorry für den Titel, jedoch irgendwie fällt mir nichts besseres ein.
    Ich habe eine BCB6 Anwendung welche erweitert und auf BCB2010 portiert werden soll.
    Da die komplette Portierung am Stück zu lange dauern würde habe ich nun versucht die Erweiterungen im BCB2010 in eine DLL auszulagern.

    Da die Erweiterung auch neue Steuer und Anzeigeelemente benötigt, habe ich in der BCB6 Anwendung ein TPanel für die Erweiterung angelegt.
    In der BCB2010 DLL habe ich auch ein TPanel, in welchem die ganzen neuen Steuerelemente dynamisch erzeugt werden.
    Das Handle des BCB6 TPanel übergebe ich nun als HWND an die BCB2010 DLL und das BCB2010 TPanel wird mit dem BCB6 TPanel Handle im Kornstruktor erzeugt.
    Das Parent des BCB2010 Panels ist NULL.
    Ich hoffe dies ist soweit verständlich.

    //BCB6 Code
    TPanel *pnlDllFullTxtSearch;
    DllUiInit(pnlDllFullTxtSearch->Handle, pnlDllFullTxtSearch->Width, pnlDllFullTxtSearch->Height);
    
    //BCB2010 DLL Code
    void DllUiInit(HWND panelBcb6, int width, int height)
    {
         pnl = new TPanel(panelBcb6);
         pnl->Parent = NULL;
         ...
    }
    

    Soweit funktioniert das ganze auch ganz gut. Das erzeugen der Steuerelemente ist zwar deutlich aufwändiger jedoch es geht.
    Das Problem ist jetzt allerdings, daß wenn ich ein TEdit anlege ich wunderbar Text eingeben kann, jedoch läßt sich der Cursor mit den Pfeiltasten nicht verschieben.
    Gleiches bei einem Grid, kein Scrollen per Mausrad oder Pfeiltasten.
    Ich könnte mir vorstellen, daß dies etwas mit den Windows Botschaften Verarbeiteung/Weiterleitung zu tun hat.
    Hat hier irgendjemand einen Tip?
    Bin gerade ziemlich ratlos.

    MfG Stephan



  • Ich habe nen ähnliches Problem nut das meine Hostanwendung Delphi ist. Ich setze das BCB Panel so

    void    __stdcall Manager::SetFrameParentWindow (HWND parentWnd)
    {
      HWND hWnd = tfPanel->Handle;
      SetParent(hWnd, parentWnd);
    
      SetWindowLong(tfPanel->Handle, GWL_EXSTYLE,
              GetWindowLong(tfPanel->Handle, GWL_EXSTYLE) | WS_EX_TOOLWINDOW);
    }
    

    tfPanel wäre Dein pnl und parentWnd ist tpClientPanel.Handle aus der Hauptanwendung. Bei mir funktionieren die Tasteneingaben auf diese Weise.



  • Achja und bei mir ist es kein tfPanel sondern eine TForm. Musste da auch rumprobieren; anscheinend habe ich die Variablen dann nicht mehr umbenannt.

    Die Form wird bei mir quasi über das Panel gelegt, das mache ich so:

    TRect wndRect;
    
    Win32Check (GetWindowRect (parentWnd, &wndRect));
    tfPanel->SetBounds(tfPanel->Left, tfPanel->Top, wndRect.Width (), wndRect.Height ());
    tfPanel->Show();
    

    Dies wird noch vor der Funktion SetParentWindow ausgeführt.



  • Nur nebenbei gesagt, es gibt hier mittlerweile Code-Highlighting für Delphi (mit ( [delphi][/delphi] ).

    Das Problem hängt wahrscheinlich damit zusammen, daß einige Messages nicht an das Child-Panel weitergeleitet werden. Vielleicht ist es sinnvoller, in C++Builder 2010 ein ActiveForm zu erzeugen, das dann in der C++Builder 6-Anwendung eingebunden wird (mal angenommen, daß die ActiveForm-Implementation der VCL das Message-Forwarding korrekt handhabt).

    Edit: dieser Satz kein Verb



  • Vielen Dank für die Infos.

    @Morle
    Das hört sich ja mal vielversprechend an.
    D.h. du erzeugst in einer BCB DLL(?) ein TForm und dieses legst Du in deiner Delphi Anwendung in/auf ein TPanel.
    Verwendet Delphi und Builder die selbe Version der Laufzeitumgebung?

    @Audacia
    Meinst Du mit AcvtiveForm das ein ActiveX Steuerelement auf die BCB6 Anwendung gelegt wird?

    MfG Stephan



  • Stephan schrieb:

    @Morle
    Das hört sich ja mal vielversprechend an.
    D.h. du erzeugst in einer BCB DLL(?) ein TForm und dieses legst Du in deiner Delphi Anwendung in/auf ein TPanel.
    Verwendet Delphi und Builder die selbe Version der Laufzeitumgebung?

    Nein. Es werden unterschiedliche Versionen der RTL/VCL verwendet (sonst wäre es ja einfach). Ansonsten ist es so wie du beschrieben hast.

    Ursprünglich geht mein Code übrigens auf Tips von Audacia zurück. Ich hatte nämlich seinerzeit hier eine ähnliche Frage gestellt. Vielleicht findest Du den Thread hier noch irgendwo im Forum. Der Code den ich gepostet habe ist der, bei dem ich dann nach einigem rumprobieren geblieben bin.



  • @Morle
    habe den ursprünglichen Thread gefunden http://www.c-plusplus.net/forum/272787-full
    Allerdings hat dies bei mir auch etwas Verwirrung verursacht.
    Auf meinen Post hast Du geschrieben, daß Du ein TForm verwendest.
    Im ursprünglichen Thread steht etwas von TFrame bzw TPanel.

    Die beiden DLL Funktionen von Audacia habe ich mal implementiert hat jedoch nicht wirklich etwas gebracht. Es ist egal ob ich auf den TFrame oder das TPanel zeichne.

    Was für mich wichtig wäre, welche VCL Versionen Du in deiner Anwendung kombiniert hast. Ich hab hier BCB6 (müßte VCL4 sein) als Basis.
    Mein Problem ist eben nach wie vor, daß alles richtig angezeigt wird, nur eben beispielsweise die Pfeiltasten zur Navigation im Grid oder des Cursors im TEdit nicht funktioniert.
    Ich habe so langsam die Vermutung das es eben ein Bug in der VCL4 des BCB6 ist und einige Windows Messages einfach nicht richtig weitergeleitet werden und ich dagegen nichts tun kann (zumindest mit diesem Ansatz).

    MfG Stephan



  • Ich sagte ja, ich habe selbst da einige Zeit rumprobieren müssen. Aktuell erstelle ich ein TForm dessen Größe genau auf die des TPanels gesetzt wird und das Panel als Parent bekommt.

    Als Host kommt Delphi mit der VCL5 zum Einsatz und die Client DLL ist BCB mit VCL10.



  • Also, ich hab mir nun eine Test DLL (BCB2010) und eine Test Hostanwendung (BCB6 und BCB2009) gebaut, und damit funktioniert es mit einem TForm.
    Der einzige Unterschied zu meinen echten Anwendungen ist, daß die Testanwendungen die Steuerelemente nicht dynamisch erstellen sondern im Formdesigner erstellt wurden.
    Das muß ich jetzt mal noch genauer untersuchen.
    Nochmals besten Dank für die Hilfe.
    MfG Stephan


Anmelden zum Antworten