Zugriff auf Elemente von Child
-
Danke Dir erst mal für Deinen Post,
die Funktion wird beim Compilieren
zumindest nicht beanstandet, jetzt habe ich aber folgende
Fehlermeldung:
Im Projekt mdiapp.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: "'Zugrifsverletzung bei Adresse 0040271D in Modul 'mdiapp.exe'. Lesen von Adresse 000002F4'.
Prozeß´wurde angehalten. Mit ......"
Der Zeiger steht dann eben auf der von Dir o. g. Anweisung, die bei mir abgewandelt
so aussieht:((TMDIChild *)ActiveMDIChild)->Edit1->Text = "TEST";Ich bin jetzt wirklich ratlos was das Pörobl. ist, da es ab Edit1 nicht liegen kann.
währe klasse wenn Du dazu einen Rat hättest.
-
Hört sich so an, als ob zum Zeitpunkt des Aufrufes (noch) kein Child existiert. Also vorher z.B. die Child-Zahl ermitteln, oder prüfen, ob ActiveMDIChild NULL ist.
-
Das war ein heißer tipp, denn ich habe mal ActiveMDIChild überprüft,
und dabei hat sich herausgestellt, dass - obwohl 6 Child-Fenster geöffnet sind -
der Wert tatsächlich NULL ist!
Ich poste mal am besten die drei Form's:[main.cpp]
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Main.h" #include "About.h" #include "UnitPopUp1.h" //--------------------------------------------------------------------------- #pragma resource "*.dfm" TMainForm *MainForm; //--------------------------------------------------------------------------- __fastcall TMainForm::TMainForm(TComponent *Owner) : TForm(Owner) { TRegistryIniFile *ini; ini = new TRegistryIniFile( ChangeFileExt( Application->ExeName, ".INI" ) ); Top = ini->ReadInteger( "Form", "Top", 100 ); Left = ini->ReadInteger( "Form", "Left", 100 ); Caption = ini->ReadString( "Form", "Caption", "Default Caption" ); ini->ReadBool( "Form", "InitMax", false ) ? WindowState = wsMaximized : WindowState = wsNormal; delete ini; } //--------------------------------------------------------------------------- void __fastcall TMainForm::CreateMDIChild(String Name) { TMDIChild *Child; //--- neues Fenster für untergeordnetes MDI erstellen ---- Child = new TMDIChild(Application); Child->Caption = Name; if (FileExists (Name)) Child->Memo1->Lines->LoadFromFile(Name); Child->Edit1->Text="EEE"; } //--------------------------------------------------------------------------- void __fastcall TMainForm::FileNew1Execute(TObject *Sender) { CreateMDIChild("NONAME" + IntToStr(MDIChildCount + 1)); } //--------------------------------------------------------------------------- void __fastcall TMainForm::FileOpen1Execute(TObject *Sender) { if (OpenDialog->Execute()) CreateMDIChild(OpenDialog->FileName); } //--------------------------------------------------------------------------- void __fastcall TMainForm::HelpAbout1Execute(TObject *Sender) { AboutBox->ShowModal(); } //--------------------------------------------------------------------------- void __fastcall TMainForm::FileExit1Execute(TObject *Sender) { Close(); } //--------------------------------------------------------------------------- void __fastcall TMainForm::Button1Click(TObject *Sender) { PopUp1->ShowModal(); } void __fastcall TMainForm::Button2Click(TObject *Sender) { Edit2->Text=PopUp1->Edit1->Text; } //--------------------------------------------------------------------------- void __fastcall TMainForm::Button3Click(TObject *Sender) { TIniFile* Ini = new TIniFile("skins.ini"); Ini = new TIniFile(ExtractFilePath(Application->ExeName) + "skins.ini"); } //--------------------------------------------------------------------------- void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction &Action) { TRegistryIniFile *ini; ini = new TRegistryIniFile(ChangeFileExt( Application->ExeName, ".INI" ) ); ini->WriteInteger( "Form", "Top", Top ); ini->WriteInteger( "Form", "Left", Left ); ini->WriteString ( "Form", "Caption", Caption ); ini->WriteBool ( "Form", "InitMax", WindowState == wsMaximized ); delete ini; } //---------------------------------------------------------------------------[unitpopup1.cpp]
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Main.h" #include "UnitPopUp1.h" #include "ChildWin.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TPopUp1 *PopUp1; //--------------------------------------------------------------------------- __fastcall TPopUp1::TPopUp1(TComponent* Owner) : TForm(Owner) { TRegistryIniFile *ini; ini = new TRegistryIniFile( ChangeFileExt( Application->ExeName, ".INI" ) ); Edit1->Text = ini->ReadString( "PopUP1-Edit", "Edit1", "TEST-TEXT"); delete ini; } //--------------------------------------------------------------------------- void __fastcall TPopUp1::Button1Click(TObject *Sender) { PopUp1->Close(); MainForm->Edit2->Text=PopUp1->Edit1->Text; ((TMDIChild *)ActiveMDIChild)->Edit1->Text = "TEST"; //((Child *)ActiveMDIChild)->Edit1->Text = "TEST"; //MainForm->MDIChildren->ActiveMDIChild->Next(); //MainForm->MDIChildren[0]->Edit1->Text=PopUp1->Edit1->Text; } //--------------------------------------------------------------------------- void __fastcall TPopUp1::FormClose(TObject *Sender, TCloseAction &Action) { TRegistryIniFile *ini; ini = new TRegistryIniFile(ChangeFileExt( Application->ExeName, ".INI" ) ); ini->WriteString( "PopUP1-Edit", "Edit1", Edit1->Text); delete ini; } //--------------------------------------------------------------------------- void __fastcall TPopUp1::Button2Click(TObject *Sender) { if(ActiveMDIChild==NULL) {Label1->Caption="NULL";} else {Label1->Caption="NICHT NULL";} } //---------------------------------------------------------------------------[childwin.cpp]
//--------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "ChildWin.h" //--------------------------------------------------------------------- #pragma resource "*.dfm" //--------------------------------------------------------------------- __fastcall TMDIChild::TMDIChild(TComponent *Owner) : TForm(Owner) { } //--------------------------------------------------------------------- void __fastcall TMDIChild::FormClose(TObject *Sender, TCloseAction &Action) { Action = caFree; } //---------------------------------------------------------------------
-
-
Ungetestet:
[cpp]((TMDIChild*)**MainForm->**ActiveMDIChild)->Edit1->Text = "TEST";[/cpp]
-
Vielleicht kannst du es auch mal so versuchen.
TMDIChild *Child = dynamic_cast<TMDIChild*>(ActiveMDIChild);
Child->Edit1->Text = "Hallo";Konnte es leider nicht testen, da im Moment kein BCB
-
Wozu soll das gut sein, wenn du den eigentlichen Vorteil von dynamic_cast ignorierst?
... dynamic_cast ... if (Child) Child->Edit1->...Um die explizite Nennung der MainForm kommt er aber nicht herum. Schliesslich wird der Code aus einem Child heraus aufgerufen, und die verfügen üblicherweise über keine eigenen Childs, somit auch nicht über eine ActiveMDIChild.
-
Ja da hat Jansen recht, aber leider funktioniert die ungeprüfte Funktion
((TMDIChild*)MainForm->ActiveMDIChild)->Edit1->Text = "TEST";leider auch nicht. Übre MainForm muss man gehen, aber wie.
Ich habe mit Folgender Funktion zumidest schon einmal das Aktive Child
ansprechen können, und es minimieren können:TForm* TheForm; TheForm = MainForm->ActiveMDIChild; if (TheForm) TheForm->WindowState = wsMinimized;leider habe ich dies nicht so modifizieren können, das ich Elemente (Edit1)
ansteuern kann. Ich währe also für weitere Vorschläge sehr sehr dankbar,
denn ich bin so langsam mit meinem Latain am Ende und auch das WWW gibt irgendwie
nicht mehr her.
-
coder-beginner schrieb:
Ja da hat Jansen recht, aber leider funktioniert die ungeprüfte Funktion
((TMDIChild*)MainForm->ActiveMDIChild)->Edit1->Text = "TEST";leider auch nicht.
"Funktioniert nicht" ist keine ausreichende Problembeschreibung.
-
Asso ja klaro, es kommt fast die gleiche Fehlermeldung wie bei der vorhergehenden
Version:
Fehlermeldung:
"Im Projekt mdiapp.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: "'Zugrifsverletzung bei Adresse 004031EF in Modul 'mdiapp.exe'. Lesen von Adresse 000002F4'.
Prozeß´wurde angehalten. Mit ......"
-
Hast du denn mal die sichere Variante mit dynamic_cast getestet?
TMDIChild *child = dynamic_cast<TMDIChild *>(MainForm->ActiveMDIChild); if (child) child->Edit1->Text = "bla";Ggf. solltest du statt ActiveMDIChild aber auch lieber den Index der Zielform im Children-Array verwenden. Das setzt natürlich voraus, dass der Index der Form immer derselbe oder zur Laufzeit zumindest bekannt ist.
Also MainForm->MDIChildren[1] für das zweite Child, entsprechend deines ursprünglichen Postings
-
Ich danke Dir vielmals! Der letzte Code war die Lösung,
im Prinzip war das ja der von "maam", ganz gering verändert:
(MainForm->ActiveMDIChild)DANKE
-
Ich würde sagen entscheidend verändert!

Wie gesagt, ohne das if nützt dir dynamic_cast auch nichts.
-
Jep, got sei dank bzw. Jansen sei dank

Währe super wenn Du noch einige Zeilen der Anweisung widmen würdest,
denn ich verstehe erlichgesagt die Anweisung der ersten Zeile nicht:TMDIChild *child = dynamic_cast<TMDIChild *>(MainForm->ActiveMDIChild);noch mal thx
coder-beginner
-
Zu dynamic_cast gibt's einen eigenen FAQ-Eintrag, unter "Allgemein".