TEdit und TMemo lösen Fehler in vcl60.bpl aus



  • Hallo,

    ich habe ein Fenster (MDIChild) mit einer TEdit- und einer TMemo-Komponente. Die beiden Komponenten wurden zur Designzeit erstellt, das Fenster zur Laufzeit mit new (s.u.). Sobald ich auf eine der beiden Komponenten per Programm zugreife, lösen diese folgende Fehlermeldung aus:

    Project xy raised an exception class EAccessViolation [...] in module 'vcl60.bpl'. Read of address 00000180'.

    Wenn ich auf <Ok> klicke, zeigt der Debugger mir die Zeile return 0 aus der WinMain an.
    Folgendermaßen wurde das Fenster erstellt:

    void __fastcall TMainForm::CreateMDIChild(String Name, HeTopic *topic)
    {
        TMDIChild *Child = new TMDIChild(Application);
        Child->Caption = Name;
        if(topic)
            Child->Topic = topic;
    }
    

    Hier kommt die kritische Stelle:

    void TMDIChild::SetTopic(HeTopic *topic)
    {
        pTopic = topic;
        EdHeader->Text = pTopic->Header;
        MmBody->Text = pTopic->Body;
    }
    

    Sowohl EdHeader als auch MmBody lösen eine Fehlermeldung aus.
    Hier noch ein kurzer Ausschnitt aus der .h:

    __property HeTopic* Topic = {read=pTopic,write=SetTopic};
    

    Der Debugger liefert mir für die Variabeln schlüssige Werte. EdHeader und MmBody, die beiden Übeltäter, haben Adressen, die völlig anders sind als die in der Fehlermeldung aufgeführten.

    Falls jemand eine Ahnung hat, woran das liegt, wäre mir sehr geholfen 🙂
    Viele Grüße und Danke im voraus,
    Christian



  • Hallo

    Es ist in deinen Codeauszügen nicht zu sehen,
    - ob in SetTopic(...) this gültig ist. Auslöser könnte so aussehen

    TMDIChild* child; 
    // keine Zuweisung einer gültigen Instanz!
    child->SetTopic(...);
    

    - ob topic auf einen gültigen Speicherbereich zeigt.

    Jedenfalls ist das Problem von deinem Aufbau verursacht und nicht von TEdit oder TMemo.

    bis bald
    akari



  • Da spricht nicht nur der Debugger gegen (s.o.), sondern auch folgender Code in SetTopic, der auch zum Absturz führt:

    EdHeader->Text = "Hallo";//pTopic->Header;
            MmBody->Text = "Welt";//pTopic->Body;
    

    während dieses hier:

    /*EdHeader->Text = "Hallo";*/ pTopic->Header = "Hallo";
            /*MmBody->Text = "Welt";*/ pTopic->Body = "Welt";
    

    ... hervorragend funktioniert.



  • Ich habe gerade einmal ausprobiert, in SetTopic this zu benutzen: auch das funktioniert.



  • *grübel* 😕

    Nachdem ich ein bißchen rumgespielt und festgestellt habe, daß ich lesend auf EdHeader und MmBody zugreifen kann (z.b. if(EdHeader->Text == "");), habe ich folgendes ausprobiert und es läuft:

    void __fastcall TMDIChild::SetTopic(PHeTopic topic)
    {
        EdHeader->Text = topic->Header;
        MmBody->Text = topic->Body;
    
        pTopic = topic;    // war vorher an erster Stelle, vor der "Header"-Zeile.
    }
    

    Einfach die Zeilen ein wenig vertauscht, und plötzlich ist alles ok. Das verstehe, wer wolle; ich definitiv nicht!!
    Aber Hauptsache es läuft erstmal!



  • Es wäre ja zu schön gewesen, wenn damit wirklich das Problem gelöst wäre.
    Schon wieder kann ich nicht auf EdHeader und MmBody zugreifen (Fehler s.o. wird ausgelöst).
    Diesmal konnte ich folgenden Zusammenhang feststellen: sobald ich für die genannten Komponenten eine Event-Methode schreibe (in diesem Fall OnChange, ich hab's aber auch mit anderen getestet), kann ich die Komponenten nicht mehr ansprechen, auch außerhalb der Event-Methode. Lasse ich diese Methoden weg, kann ich ganz normal zugreifen.
    Dummerweise müssen beide das OnChange-Event abfragen, da ich dort eine Datenklasse aktualisieren muß.

    Kann jemand erkennen, was ich falsch mache? In anderen Anwendungen ist mir dieses Problem noch nicht begegnet.

    Gruß,
    Christian


Anmelden zum Antworten