![]() |
Re: Warum kann man Vererbung verhindern (csInheritable)?
Zitat:
Man packe eine TActionManager auf das Form und das Form ist nicht mehr vererbbar. Man kann trotzdem noch von TActionManager ableiten. Zitat:
Im obigen Artikel steht As a result of form inheritance being introduced in Delphi 2.0, the ComponentStyle property was added to the TComponent class. This property represents a set of style attributes that govern how a component behaves. In particular, the set can hold two possible styles: csInheritable and csCheckPropAvail. The csInheritable style indicates that the component can be inherited by a descendent form type. For a form to be inheritable (that is, serve as an ancestor to another form), all components on the form must have the csInheritable style set. If any of the components do not include this style, then Delphi will display an error when you attempt to create a new form descendant. The TComponent class sets the csInheritable style by default in its constructor, and for most circumstances, you will not need to change it. However, it may be necessary to remove this style because of how the component is implemented. For example, the TDatabase component class removes this style because there can only be one Database component per database in an application. If this style is not removed, then a form and its ancestor could be used in the same application, thereby causing the Database component on each form to reference the same physical database. Das ist aber definitiv falsch !!! Man sollte nicht alles glauben, was im Internet steht. ;-) TDatabase auf ein TForm und ich kann es trotzdem vererben !!! (Das habe ich gerade in D7 getestet.) In Delphi 7 haben nur die 3 oben angegebenen Komponenten diese "Ich will nicht, dass mein OwnerForm vererbt wird" Eigenschaft implementiert. Das kann es also nicht sein. Auch kann ich mehrere TActionManager auf ein Formular legen. Das kann es also auch nicht sein. Selbst das XPManifest kannst du auf beliebige Formulare beliebig oft legen. Diese Komponente ist nur ein Dummy. Das Wichtige ist das {$R WindowsXP.res} in der XPMan Unit. Und das wird nur einmal pro App eingebunden, da die Unit XPMan ja nur einmal in die App gelinkt wird. Trotzdem Danke für Eure Gedanken ;-) Hat jemand weitere Ideen (oder gar das Wissen) ? |
Re: Warum kann man Vererbung verhindern (csInheritable)?
Zum "Warum ?" kann ich auch nicht viel sagen, aber eventuell einige Hinweise liefern.
Zitat:
Delphi-Quellcode:
Erzeuge ich ein leeres Form, dann aber so :
inherited frmArtNrAus: TfrmArtNrAus
Delphi-Quellcode:
Das vererbte Formular sieht weiter so aus :
object Form2: TForm2
Delphi-Quellcode:
Das Panel "pnlOben" ist mit allen Eigenschaften vom Vorfahr-Formular geerbt. Die Checkbox darauf wurde erst jetzt mit diesem Formular eingeführt. Vererbe ich es weiter, so stehen in der DFM nur noch die geänderten Sachen drin. Soll nun irgendwo die Vererbung unterbrochen werden, so könnte es eventuell schon genügen ein inherited wegzulassen. Ein Blick in die DFM eines Formulars, das nicht mehr vererbt werden kann sollte das klären. Oder mal dasselbe Form per Objektablage vererben und nicht von Hand. Da sind sicherlich Unterschiede zu bemerken.
inherited pnlOben: TPanel
Height = 161 object ckbAlpha: TCheckBox Left = 296 Top = 120 Width = 129 Height = 17 Caption = 'alphabetisch sortieren' TabOrder = 1 end object btnStart: TButton |
Re: Warum kann man Vererbung verhindern (csInheritable)?
Zitat:
Deine DFM-Dateien sehen genau so aus. Sicherlich werden die Basisformulare in die Objektablage kommen, aber wenn dort ein TActionManager enthalten ist, kann man auch nicht vererben!!! Das ist die selbe Technologie. Diese verwenden wir ja auch schon einige Jahre ;-) Ich habe es im Beispiel nur ohne die Objektablage gemacht um es nicht unnötig zu komplizieren. Zitat:
Es wird doch die selbe Technologie verwendet. Die Änderungen an den DFM Dateien macht die Delphi IDE doch von selbst. Das Kopieren oder Verwenden in der Objektablage umgeht zwar das Problem, aber ich verliere dann auch die Möglichkeiten. Ich will ein SDI- sowie ein MDI-Basisformular haben, das in allen Applikationen verwendet werden kann. Änderungen am Basisformular sollen sich direkt auch auf die abgeleiteten Formulare auswirken (beim nächsten kompilieren). Ich möchte ein MDI Child Basisformular haben, das von allen MDI-Applikationen verwendet wird. In dem MDI Child sind auch abstrakte Methoden enthalten, die in der Applikation implementiert werden müssen. z.B. procedure TMDIChild.SaveData; Wenn im Menü Speichern gedrückt wird, wird automatisch SaveData des MDI Fensters aufgerufen. Außerdem möchten wir bestimmte Merkmale in den MDI Child Fenstern über Interfaces realisieren, um sie im Framework besser ansprechen zu können. Das klappt auch soweit sehr gut. Und ist wie gesagt schon seit Jahren hier im Einsatz. Die Applikation soll nun eine neue Optik bekommen und so werden gerade die Basisformulare angepasst. ABER es kann z.B. kein TActionManager verwendet werden. Egal ob mit oder ohne Objektablage. Zitat:
Du kannst ja auch nicht die Vererbungskette von Objekten trennen. Wie willst Du das denn machen. Die DFM-Datei ist ja nur eine Resource, die in die Unit mit {$R *.dfm} eingebunden wird. Die IDE sorgt im Normalfall dafür, das immer das Richtige drinnsteht. Warum sollte also die Vererbung unterbrochen werden? Ich versteh Dein Problem nicht. Aber danke für den Hinweis ;-) [edit]@all: ps: bitte in diesem Thread keine Diskussion über den Sinn und Zweck von Interfaces und abstrakten Methoden führen, dafür gibt es schon andere Threads ;-) [/edit] |
Re: Warum kann man Vererbung verhindern (csInheritable)?
Zitat:
|
AW: Re: Warum kann man Vererbung verhindern (csInheritable)?
Zitat:
Das Problem ist zwar nicht mehr aktuell, aber eine Antwort würde mich schon interessieren. :glaskugel: |
AW: Re: Warum kann man Vererbung verhindern (csInheritable)?
Zitat:
|
AW: Warum kann man Vererbung verhindern (csInheritable)?
Kann es sein das all diese Komponenten deprecated sind? Dann würde es Sinn machen. So verhindert man das neue Formulare auf veralteten Komponenten aufbauen und zwingt somit den Programmierer auf andere Komponenten auszuweichen.
|
AW: Warum kann man Vererbung verhindern (csInheritable)?
Zitat:
Ich habe Vorhin mal etwas ausprobiert: Ich habe mir eine eigene Klasse TMeinRibbon von TRibbon abgeleitet und mir daraus eine komponente gebaut:
Code:
Danach habe ich ein Formular erstellt und MeinRibbon1 darauf gesetzt.
unit MeinRibbon;
interface uses Ribbon, Classes, ActnMan; type TMeinRibbon = class(TRibbon) public constructor Create(AOwner: TComponent); override; end; implementation procedure Register; begin RegisterComponents('Test', [TMeinRibbon]); end; { TMeinRibbon } constructor TMeinRibbon.Create(AOwner: TComponent); begin inherited Create(AOwner); FComponentStyle := FComponentStyle + [csInheritable]; end; Wenn ich das Ganze per Delphi vererbe (Neu -> Vererbare Elemente ...) haut es mir meine komplette konfiguration von MeinRibbon1 zusammen. Wenn ich es per Hand vererbe (Neu -> Formular ... TForm1 = class(TMeinGrundFormular) <- per Hand im Quellcode), funktioniert soweit alles, aber ich sehe die Ribbonbar nur zur Laufzeit und hab nur Bedingt Zugriff auf die Ribbonbar. Ich spiele noch mit den Möglichkeiten und versuche das ganze auch für den TActionManager Falls Ihr eine andere Idee habt, her damit! Ich werde euch auf dem Laufenden halten. |
AW: Warum kann man Vererbung verhindern (csInheritable)?
Zitat:
Dafür, einer Komponente die Vererbung zu verbieten, fällt mir nur ein Szenario ein: Als Anbieter von closed source Komponenten könnte man durchaus ein (wirtschaftliches) Interesse daran haben, das Dritte die Komponente nicht erweitern können. |
AW: Warum kann man Vererbung verhindern (csInheritable)?
Zitat:
Weder bei Delphi 7 (1. Beitrag) noch bei der aktuellen XE. Zitat:
Welchen Sinn das hat, ist mit klar. (sealed Objects) Es geht darum, dass eine Komponente verhindert das das Owner/Parent-Formular nicht mehr vererbt werden kann. Also nochmal:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz