Einzelnen Beitrag anzeigen

Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.840 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Warum kann man Vererbung verhindern (csInheritable)?

  Alt 24. Aug 2006, 18:11
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.
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat