MDIChild Datenübergabe
-
TfrmChild* frChild = dynamic_cast<TfrmChild*>(ActiveMDIChild); frChild = new TfrmChild(Application); if(frChild!=NULL) { frmChild->Edit1->Text = "blablabla"; }
Mit dem new das ist schon klar und das funktioniert auch, aber ich will kein neues MDIChild erzeugen sondern in das bestehende aktive Child schreiben.
-
Der Fehler dürfte wohl bei deiner Child-Form bzw. deren Erstellung zu suchen sein. Wie du am Default-MDI-Projekt des BCB ausprobieren kannst war dein ursprünglicher Ansatz (vom Tippfehler in der if-Abfrage abgesehen) vollkommen korrekt und prinzipiell funktionsfähig.
-
So erzeuge ich das Child
CreateMDIChild("Name" + IntToStr(MDIChildCount + 1));
-
[cpp]TfrmChild* frChild = dynamic_cast<TfrmChild*>(ActiveMDIChild);
frChild = new TfrmChild(Application);
if(frChild!=NULL)
{frmChild->Edit1->Text = "blablabla";
}
[/cpp]Jetzt schau dir nochmals deine Bezeichner an... ich habs mal fett hervorgehoben. Und das new wird ja wohl etwas witzlos wenn du kein neues erzeugen willst?
Übrigens zum Thema "So erzeuge ich das Child" ... ich kenn die Funktion CreateMDIChild nicht... und meiner Hilfe gehts genau so... also sagt dein Posting in diesem Punkt genau nichts aus... hmmm
-junix
[ Dieser Beitrag wurde am 19.05.2003 um 10:19 Uhr von junix editiert. ]
-
Ich habe das jetzt so geschrieben:
TMDIChild* kind = dynamic_cast<TMDIChild*>(ActiveMDIChild); kind = new TMDIChild(Application); if(kind!=NULL) { kind->Edit1->Text = "hbhvbvb"; }
Das schreiben in dem Textfeld funktioniert. Aber es wird gleichzeitig eine neue Form erstellt. Ich möchte aber in eine schon aktivierte MDIChil schreiben.
das CreateMDIChild kommt aus:void __fastcall TMainForm::CreateMDIChild(String Name) { TMDIChild *Child; Child = new TMDIChild(Application); }
-
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!