Das mag manchem C++ Builder Programmierer schon widerfahren sein: Man denkt sich nichts böses, schließt eine Form und plötzlich erscheint eine noch nicht da gewesene AV:
In diesem Fall ist der Debugger gleich zur Setter-Methode einer __property gesprungen:
void __fastcall TFormSetup::SetDatabaseConnected( bool AConnected )
{
this->FDatabaseConnected = AConnected;
/*
Do something else...
*/
}
Hier noch das Entsprechende aus dem Header:
#ifndef UnitFormSetupH #define UnitFormSetupH #include <System.Classes.hpp> #include <Vcl.Controls.hpp> #include <Vcl.StdCtrls.hpp> #include <Vcl.Forms.hpp> class TFormSetup : public TForm { __published: /* .... */ private: bool FDatabaseConnected; public: __fastcall TFormSetup(TComponent* Owner); void __fastcall SetDatabaseConnected( bool AConnected ); __property bool DatabaseConnected = { read=FDatabaseConnected, write=SetDatabaseConnected }; }; #endif
Grund für die AV ist nun, dass die TForm beim Schließen auch noch gleich eine geöffnete Datenbank-Komponente schließt (nicht im Code-Beispiel angeführt). Diese wiederum setzt im AfterDisconnect()-Event die Property DatabaseConnected auf false.
Zu diesem Zeitpunkt sind die Klassenmember aber bereits nicht mehr verfügbar, daher muss dies im Setter der __property berücksichtigt werden:
void __fastcall TFormSetup::SetDatabaseConnected( bool AConnected ) { if ( this != NULL ) { this->FDatabaseConnected = AConnected; /* Do something else... */ } }
Dies ist ein funktionierender Weg. Ob er elegant ist, sei dahingestellt. Sollte ich einen eleganteren finden, werde ich ihn posten. Sollte jemand einen solchen kennen, bitte ich um Kommenar 🙂