B
Ich hab' den Fehler gefunden!
Die Exception wurde durch eine fehlerhafte Initialisierung und Instanzierung in den aufrufenden Formularklassen verursacht.
Folgender Hilfe Eintrag enthielt die entscheidenden Informationen:
Initialisierung von Klassen
[...]
Wie bereits oben erwähnt, werden die Basisklassen in der Reihenfolge ihrer Deklaration initialisiert. Anschließend ***erfolgt die Initialisierung der Elemente (ebenfalls in der Deklarationsreihenfolge)***, unabhängig von der Initialisierungsliste.
Hier ist der Code der Klassen:
TfrmNotizen
-> TTabFilter
-> TNotizenTabFilterDataSource
// Header Forumlar Klasse
//---------------------------------------------------------------------------
#ifndef NotizenH
#define NotizenH
//---------------------------------------------------------------------------
.....
//---------------------------------------------------------------------------
class TfrmNotizen : public TMDIChild
{
__published: // Von der IDE verwaltete Komponenten
................
private:
/* Achtung!! Reihenfolge der Deklaration entscheidet über Instanzierungsreihenfolge */
TNotizen * FNotizen;
TNotizenTabFilterDataSource * FNotizenTabFilterDataSource;
TTabFilter * FTabFilter;
public: // Anwender-Deklarationen
__fastcall TfrmNotizen(TComponent* Owner);
__fastcall ~TfrmNotizen();
};
//---------------------------------------------------------------------------
extern PACKAGE TfrmNotizen *frmNotizen;
//---------------------------------------------------------------------------
#endif
// Cpp Formular Klasse
//---------------------------------------------------------------------------
#include <vcl.h>
#include "pch.h"
#pragma hdrstop
#include "Notizen.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "ChildWin"
#pragma resource "*.dfm"
TfrmNotizen *frmNotizen;
//---------------------------------------------------------------------------
__fastcall TfrmNotizen::TfrmNotizen(TComponent* Owner)
: TMDIChild(Owner), FNotizen(new TNotizen(this, DatenModul->kdbMainDB)),
FNotizenTabFilterDataSource(new TNotizenTabFilterDataSource(FNotizen)),
FTabFilter(new TTabFilter(tbcAktionsplaene, FNotizenTabFilterDataSource,
TNotizenTabFilterIdentCollection()))
{
dscNotizen->DataSet = FNotizen;
FNotizen->Open();
FNotizen->First();
}
//---------------------------------------------------------------------------
........
//---------------------------------------------------------------------------
__fastcall TfrmNotizen::~TfrmNotizen()
{
delete(FTabFilter);
delete(FNotizenTabFilterDataSource);
}
// Header TTabFilter
//---------------------------------------------------------------------------
#ifndef TTabFilterH
#define TTabFilterH
............
//---------------------------------------------------------------------------
class TTabFilter
{
public:
__fastcall TTabFilter(TTabControl * TabControl,
TCustomTabFilterDataSource * TabFilterDataSource,
TCustomTabFilterIdentCollection IdentCollection);
__fastcall ~TTabFilter();
void __fastcall CreatePage();
void __fastcall DeletePage();
__property AnsiString ActiveTab = { read=GetActiveTab };
private:
TTabControl * FTabControl;
TCustomTabFilterDataSource * FTabFilterDataSource;
TCustomTabFilterIdentCollection FIdentCollection;
void __fastcall FilterTab();
void __fastcall TabControlChange(TObject * Sender);
void __fastcall TabControlChanging(TObject * Sender, bool & AllowChange);
AnsiString __fastcall GetActiveTab();
};
#endif
// Cpp TTabFilter
//---------------------------------------------------------------------------
#include <vcl.h>
#include "pch.h"
#pragma hdrstop
#include "TTabFilter.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
__fastcall TTabFilter::TTabFilter(TTabControl * TabControl, TCustomTabFilterDataSource * TabFilterDataSource, TCustomTabFilterIdentCollection IdentCollection)
: FTabControl(TabControl), FTabFilterDataSource(TabFilterDataSource),
FIdentCollection(IdentCollection)
{
AnsiString Register = FTabFilterDataSource->GetTabString(); // Hier schlug das Programm auf, wenn FTabFilterDataSource fehlerhaft instanziert wurde
FTabControl->OnChange = TabControlChange;
FTabControl->OnChanging = TabControlChanging;
if(Register != "")
FTabControl->Tabs->CommaText = Register;
FilterTab();
}
.................
// Den Code von TNotizenTabFilterDataSource kennt Ihr ja schon.
// Dieser hat sich nicht geändert!
PS: Kennt jemand von Euch einen Style Guide für die Klassen Initialisierung???
David