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! 😕


Anmelden zum Antworten