Was ist Subclassing, und wann braucht man es?


In unserem allerersten Tutorial haben wir gelernt, dass jedes Fenster mit einer Fensterprozedur verknüpft ist. Da es sich bei jedem Control auf unserem Hauptfenster um ein Fenster handelt (ich erwähnte es ja schon), besitzen auch Schaltflächen, Texteingabefenster, Listboxen usw. eine Fensterprozedur. Diese möchte ich als Standard-Fensterprozedur bezeichnen.

Diese Standard-Fensterprozedur bekommen wir normalerweise nicht zu sehen, da sie von Windows bereitgestellt wird. Sie ist für das äußere Erscheinungsbild (Darstellung) und für das Verhalten des Controls verantwortlich. Wollen wir nun das Standardverhalten beeinflussen, müssen wir die Standard-Fensterprozedur durch unsere eigene ersetzen und unseren Code implementieren, um das Verhalten des Controls unseren Wünschen anzupassen. In diesem Zug kann man auch gleich noch das Aussehen des Controls beeinflussen.
Letzteres könnte man machen, indem man den Controls den Fensterstil XX_OWNERDRAW gibt und sie selbst zeichnet. Dies hat allerdings den Nachteil, dass der Code recht unübersichtlich wird, will man das Aussehen mehrerer Elemente ändern. Mittels Subclassing kann man den Code auslagern und nach Belieben in zukünftige Projekte einbinden. Lediglich die Standard-Fensterprozedur des Controls ist auf die eigene Fensterprozedur "umzubiegen".

Will man das Standardverhalten eines Controls ändern, kommt man um eine eigene Fensterprozedur sowieso nicht herum.

Grob betrachtet ließe sich Subclassing also mit dem Entwerfen eigener VCL-Komponenten vergleichen, die man von einer existierenden ableitet. Da macht man ja auch nichts anderes, als das Standardverhalten und -aussehen seinen Wünschen anzupassen und die bestehenden Methoden und Eigenschaften zu überschreiben.


Demonstrieren möchte ich das Subclassing nun an Hand eines Texteingabefeldes. Ich werde das Aussehen verändern und das Eingabeverhalten so ändern, dass man nur noch Ziffern und Komma eingeben kann.