Konstruktion eines Fensterobjekts

Zurück zu Fenster    

Viele ObjektWindows-Klassen erben von TWindow oder davon abgeleiteten Klassen, wobei Klassen auch als virtuelle Basisklassen verwendet werden. Wenn Sie sich das Klassenhierarchie-Diagramm der OWL ansehen, können Sie erkennen, daß beispielsweise die Klasse TDecoratedMDIFrame von TDecoratedFrame und TMDIFrame durch Mehrfachvererbung abgeleitet sind. TDecoratedFrame ist von TLayoutWindow und TMDIFrame von TFrameWindow abgeleitet. Sowohl TFrameWindow als auch TLayoutWindow sind von TWindow abgeleitet. Daher wird TWindow von TFrameWindow und TLayoutWindow als virtuelle Basisklasse eingesetzt.

Nun werden in C++ bei der Konstruktion aber zuerst die virtuellen Basisklassen konstruiert, weshalb der Konstruktor der abgeleiteten Klasse keine Möglichkeit hat Standardargumente für den Basisklassen-Konstruktor anzugeben. Wenn Sie diesbezüglich Verständnisprobleme haben, sollten Sie in Ihrem C++ nachschauen.

Wir können bei diesem Problem folgende Lösungen verwenden:

 

Explizite Konstruktion aller unmittelbaren Basisklassen und jeder virtuellen Basisklasse.

 
class CNewFrameWindow : public TFrameWindow
{

public:

CNewFrameWindow(TWindow* parent, const char far* title, TWindow* clientWnd) :

TFrameWindow(parent,title,clientWnd), TWindow(parent,title) {}

};
 

 

Verwendung des Standardkonstruktors der virtuellen Basisklasse und Aufruf der Init()-Funktion im Konstruktor der neuen Klasse

 
class CNewFrameWindow : public TFrameWindow
{

public:

CNewFrameWindow(TWindow* parent, const char far* title, TWindow* clientWnd)

{ Init(); }

};
 

Die Funktion Init() dient dazu alle notwendigen Parameter in der Basisklasse zu setzen.

 

Obwohl wir jetzt zur Demonstrationzwecken eine neue Klasse für ein Rahmenfenster von TFrameWindow abgeleitet haben, empfehlen die OWL Programmierrichtlinien keine Ableitung von Rahmenfenstern wie TFrameWindow, TMDIFrame oder TDecoratedFrame vorzunehmen, da es durch einen Bug in der OWL beim Abfangen von Botschaften auf Rahmenebene passieren kann, daß der Rahmen die Botschaft nicht an den Client weiterleitet. Benutzerspezifische Fenster sollten daher immer von TWindow abgeleitet werden und als Client in einem Rahmenfenster eingefügt werden.

 

Zurück zu Fenster    

Stand: 25.02.00 00:07:07
© 1998 by Hans Joachim Kiefer, hajokiefer@handshake.de