dynamic cast in wxWidgets (Zugriff auf zur Laufzeit erstelltes Element)
-
Hallo,
ich habe folgendes Szenario:
Meine Applikation erstellt zur Laufzeit Splitterwindows auf einem NoteBook als neue Seiten. Diese Seiten enthalten wiederum zwei TextCtrl Elemente./*h-Datei:*/ ... public: ... ////@begin FormMain member variables wxPanel* Panel1; wxNotebook* NoteBook1; wxSplitterWindow* SplitterWindow1; wxTextCtrl* Text1; wxTextCtrl* Text2; ////@end FormMain member variables /*CPP Datei:*/ SplitterWindow1 = new wxSplitterWindow( NoteBook1, ID_SPLITTERWINDOW1, wxDefaultPosition, wxSize(100, 100), 0 ); SplitterWindow1->SetMinimumPaneSize(0); Text1 = new wxTextCtrl( SplitterWindow1, ID_TEXTCTRL1, _T(""), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE ); Text2 = new wxTextCtrl( SplitterWindow1, ID_TEXTCTRL2, _T(""), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE ); SplitterWindow1->SplitVertically(Text1, Text2, 200); NoteBook1->AddPage(SplitterWindow1, _("untitled"));
Nun möchte ich Daten in die TextCtrl Elemente einfügen lassen (Öffnendialog).
Wie komme ich aber an die Textfelder der gerade aktiven Seite. Unter BCB verwende ich dazu einen dynamic cast.TRichEdit* tmpRE1 = dynamic_cast<TRichEdit*>(PageControl1->ActivePage->Components[5]); TRichEdit* tmpRE2 = dynamic_cast<TRichEdit*>(PageControl1->ActivePage->Components[7]);
die beiden RichEdits wurden jeweils als 5. und 7. Child auf der neu erstellten Page des PageControl-Komponente erzeugt.
So ähnlich muss das doch auch bei wxW gehen. Meine Bemühungen kommen hier in's stocken:
wxTextCtrl *TE1 = wxDynamicCast(NoteBook1->GetCurrentPage, wxTextCtrl); TE1->WriteText("TestString");
Hier "NoteBook1->GetCurrentPage" sollte wohl eigentlich ein zeiger auf die Klasse stehen.
Gruß M
-
Im Unterschied zur VCL greift man in wxWidgets auf alle Attribute per Methode zu.
Auch enthält dein Notebook ja ein Splitterwindow, und keine TextCtrl.
D.h. du müsstest erst auf das SplitterWindow casten, und dann den richtigen Pane davon dir holen.
wxDynamicCast kannst du auch durch dynamic_cast ersetzen.
Und den Zeiger danach auf NULL prüfen.