MDIChild Datenübergabe
-
TMDIChild* kind = dynamic_cast<TMDIChild*>(ActiveMDIChild); kind = new TMDIChild(Application);
Nochmal: Wieso "new"?
Btw. Der Grund wiesos jetzts funktioniert war eben das mit den ähnlichen Bezeichnern von denen man absehen sollte (wie ich das hier etwa 3 mal erwähnt habe). Auch Programmieren ist präzisionsarbeit bei der man mit Sorgfalt vorgehen muss (o; Wenn ich shcon sage schaus dir nochmal an, dann solltest du dem folge leisten (o;
-junix
[ Dieser Beitrag wurde am 19.05.2003 um 10:43 Uhr von junix editiert. ]
-
wenn ich das so schreibe:
TMDIChild* kind = dynamic_cast<TMDIChild*>(ActiveMDIChild); kind->Edit1->Text = "hbhvbvb";
Darauvf folgt:
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt mdiapp.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 0040262F in Modul 'mdiapp.exe'. Lesen von Adresse 000002F8'. Prozeß wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.So hatte ich das am anfang: Dann erhielt ich den Tip mit der Speicherplatzreservierung. Als Newbie hat man es nicht leicht. Aber danke für die Hilfe.
-
Naja wenn du durch ActiveMDIChild den Zeiger auf das aktive MDI-Child holst, so ist der Speicher eigentlich schon reserviert.
Das Resultat von dynamic_cast ist nicht NULL?
Übergib beim Erstellen des MDI-Childs mal statt der Application das MDIParent als Parent.
-junix
-
Auf if (kind) solltest du auf keinen Fall verzichten.
Davon abgesehen: hast du das Ganze mal, wie empfohlen, mit dem Default-MDI-Projekt getestet?
-
Habe neues MDI-Projekt erstellt.
Wenn ich das so schreibe:void __fastcall TfrmTest::Button1Click(TObject *Sender) { TMDIChild* kind = dynamic_cast<TMDIChild*>(ActiveMDIChild); if(kind!=NULL) { kind->Edit1->Text = "hbhvbvb"; } }
Gibt es keine Fehlermelung, es wird aber auch nicht übergeben.
Parent habe ich auch getestet.
-
Ähm ... in dem Default-Projekt gibt es doch gar kein TEdit!?
Für einen nachvollziehbaren Vergleich solltest du das Default-Projekt auch im Default-Zustand belassen, also statt in ein Edit zB. in das bereits vorhandene Memo ausgeben.
-
habe mit:
TMDIChild* kind = dynamic_cast<TMDIChild*>(ActiveMDIChild); if(kind!=NULL) { kind->Memo1->Lines->Add("blabla") ; }
Gibt es keine Reaktion. Ich werde verrückt....!!!!
-
Wo rufst du das denn auf? Ich habe hier einen zusätzlichen Toolbutton, über dessen OnClick funktioniert dein Code 100pro (vorhandenes MDI-Fenster vorausgesetzt ;)).
-
Ich rufe eine normale Form von einem MDIChild auf. Auf der normalen Form ist ein Button der bei onClick einen Wert an das aktive MDIChild übergeben soll.
-
Ahja, das hatte ich übersehen/vergessen.
Aber! Vom Debuggen hast du wohl noch nichts gehört?
Sonst hättest du eigentlich feststellen müssen, dass if(kind!=NULL) niemals true wird, weil es kein ActiveMDIChild gibt. Beim Aufruf von der zusätzlichen Form aus bist du nicht mehr im Scope bzw. Namespace der MDI-Form. Wenn du auf Elemente der anderen Form zugreifen willst musst du sie also explizit aufrufen:
TMDIChild* kind = dynamic_cast<TMDIChild*>(MainForm->ActiveMDIChild); if(kind) kind->Memo1->Lines->Add("blabla");
-
Jetzt klappt es!
Dir gebührt großer Dank. Das mit dem Debuggen, na ja. Ich schäme mich!