Hallo,
ich habe mal eine grundsätzliche Frage:
Warum ist es möglich zu verhindern, dass ein Formular abgeleitet werden kann?
Aber nun das Ganze im Detail (am Beisp. von D7):
- Wir erstellen eine neue Anwendung.
- Auf das Form1 legen wir einen TButton mit dem onClick Ereignis:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
Close;
end;
- Dann speichern wie das Projekt ab.
- Im Menüpunkt "Datei -> Neu... -> Weitere..." wechseln wir zu dem "Project1" Tab und wählen das Form1 aus.
- die IDE zeigt nun ein Formular Form2 an dass vom Typ TForm2 = class(TForm1) ist:
Delphi-Quellcode:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm2 =
class(TForm1)
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
end.
- Nun ändern wir die Peoject1.dpr wie folgt ab:
Delphi-Quellcode:
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
Application.Initialize;
// Application.CreateForm(TForm1, Form1); // <- Diese Zeile auskommentieren
Application.CreateForm(TForm2, Form2);
Application.Run;
end.
- Dann starten wir das Programm.
Es ist nun ein Form2 zu sehen mit dem Close Button.
So weit so gut.
Mit dieser Technik kann man sich Formulare erstellen, die eine gewisse Basisfunktionalität haben.
Diese können dann in den Anwendungen verwendet werden, ohne das man alles noch mal neu programmieren muß.
Änderungen an den Basisformularen sind auch sofort in allen abgeleiteten Formularen (nach einem Recompile der Programme) verfügbar.
Super !!!
Genau das will ich haben.
Aber:
Wenn man nun eine Komponente auf das TForm1 legt, die in ComponentState kein csInheritable hat, dann kann ich das Formular nicht mehr vererben.
Es gibt 3 Komponenten bei denen das der Fall ist.
- TActionManager (bzw. TCustomActionManager)
- TNotebook
- TTabbedNotebook
Man kann auch sehr leicht eigene Komponenten schreiben, die das Vererben verhindern:
Delphi-Quellcode:
unit VererbungIstDoof;
interface
uses
SysUtils, Classes;
type
TVererbungIstDoof =
class(TComponent)
private
{ Private-Deklarationen }
protected
{ Protected-Deklarationen }
public
{ Public-Deklarationen }
constructor Create(AOwner: TComponent);
override;
published
{ Published-Deklarationen }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('
Beispiele', [TVererbungIstDoof]);
end;
{ TVererbungIstDoof }
constructor TVererbungIstDoof.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Exclude(FComponentStyle, csInheritable);
end;
end.
Die Hilfe von Delphi 7 schreibt dazu
csInheritable
Abgeleitete Formulartypen können von der Komponente erben. Wenn bei einer der Komponenten eines Formulars das Flag csInheritable nicht gesetzt ist, kann das Formular nicht als Vorfahr für andere Formulare verwendet werden.
Meine Frage ist nun: "Warum kann man das Vererben verhindern?"
bzw. Warum ist das bei den 3 Komponenten der Fall. Sind die etwa nicht "vererbungssicher"?
Weiß das jemand hier im Forum?
Für eine Antwort wäre ich dankbar.
ps: Auch für Vorschläge, wie man trotzdem Formulare mit einem TActionManager vererben kann.