Zugriff auf ein manuell in ein Panel eingedocktes Formular erhalten



  • Hallo!

    Ich docke in ein Panel ein Formular manuell ein:

    Form_Test->ManualDock(Panel_Container, Panel_Container, alClient);
    Form_Test->Show();
    

    Nun möchte ich beispielsweise den Namen des eingedockten Forms erhalten.

    void __fastcall TForm_Main::SpeedButton_TestClick(TObject *Sender)
    {
    	if (Panel_Container->DockClientCount == 1)
    	{
    		String StrTest = Panel_Container->DockClients[0]->Name;
    	}
    }
    

    Das funktioniert so leider nicht; in DockClientCount steht 0 und wenn ich die Bedingung auskommentiere, ist DockClient[0] ist NULL.
    Gibt es eine andere Möglichkeit, auf das eingedockte Formular zuzugreifen?

    Vielen Dank!

    Christian



  • Werte mal den bool-Rückgabewert von TControl.ManualDock auf Erfolg (true) aus.
    Evtl. den 2. Parameter auf nil (bzw. NULL) lassen.

    Mittels TControl.HostDockSite kannst du auch das DockSite-Control auslesen (also umgekehrt zu DockClients).



  • @Th69 Also der Rückgabewert von ManualDock ist true.
    Wenn ich den zweiten Parameter NULL setze, ist das Verhalten unverändert.
    Form_Test->HostDockSite->Name gibt mir korrekterweise das Panel_Container zurück.

    Ich habe als Container jetzt auch mal ein PageControl wie im Beispiel von Embarcadero (http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Controls_TWinControl_DockClients.html) verwendet. Auch dann ist DockClients und dessen Eigenschaften NULL.
    Scheinbar ist die ganze Dock-Geschichte ziemlich buggy 🧐



  • Schau dir mal im Debugger die ganzen Eigenschaften vom Panel_Container an - evtl. findest du da einen Hinweis, ob andere Eigenschaften stattdessen gesetzt sind (irgendwo muß dies ja gespeichert sein).



  • @Th69 Ich habe mir mal alle Eigenschaften über die "Liste überwachter Ausdrücke" angesehen. Das "Form_Test" erscheint dort nicht ein mal. Die Adresse des Forms finde ich darin zwar, aber verwerten ließ sie sich nicht.
    Ich habe es letztendlich doch über den umgekehrten Weg gelöst.

    Vereinfacht beschrieben:

    Aus dem eingedockten Form_Test greife ich auf eine Stringvariable (in Wirklichkeit war es bei mir ein ADOQuery) zu.

    ((TForm_Main *)((TPanel *)HostDockSite)->Parent)->StrTest = "Hallo";
    

    Dabei befindet sich das "Panel_Container" auf dem Form_Main, welches die Variable "StrTest" enthält.



  • Ich habe mich jetzt mal wieder mit diesem Thema befasst.
    Die Ursache für das Problem, dass der DockClientCount == 0 und ich beim Zugriff auf DockClients[0] eine Exception bekommen habe war, dass die Eigenschaft DockSite des Panel_Container auf dem Standardwert "false" stand.
    Nachdem ich die Eigenschaft auf "true" gesetzt habe, konnte ich auch auf das eingedockte Formular zugreifen und auch die Variable DockClientCount stand auf 1.

    Vielleicht stößt ja noch mal jemand über dieses Problem und ich konnte ihm damit helfen.

    Gruß

    Christian


Anmelden zum Antworten