![]() |
Warum kann man Vererbung verhindern (csInheritable)?
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):
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.
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. ;-) |
Re: Warum kann man Vererbung verhindern (csInheritable)?
Zitat:
Den Rest muss ich mir mal durch den Kopf gehen lassen. ...:cat:... |
Re: Warum kann man Vererbung verhindern (csInheritable)?
Zitat:
Ich dreh mich schon so lange im Kreis, das es mir langsam schwindlig wird :spin2: DatenModul bringt mir in dem Fall nicht viel. Wäre aber OT das genau zu erklären. |
Re: Warum kann man Vererbung verhindern (csInheritable)?
Nur als Hinweis: es gibt dazu schon eine Anfrage im QC (
![]() |
Re: Warum kann man Vererbung verhindern (csInheritable)?
Zitat:
Das es von TCustomActionManager explizit entfernt wird wusste ich ja schon. Aber beruigend zu wissen, dass ich nicht der Einzige bin, der solche Probleme hat. |
Re: Warum kann man Vererbung verhindern (csInheritable)?
Zitat:
ist eigentlich eine wirklich interessante Frage. Hab noch gar nicht drüber nachgedacht, dass Delphi ja auch diese Funktionalität bietet. An sich gibt es ja auch in anderen Sprachen die Möglichkeit eine Klasse nicht erweiterbar zu deklarieren. In Java wäre eine solche Klasse dann mit dem Schlüsselwort final versehen. Ich weiß nicht warum Delphi in diesen 3 von dir genannten Fällen keine Vererbung zulässt, aber die sehr generelle Motivation sollte hier eigentlich weniger gegeben sein. So weit ich weiß ist die Motivation eigentlich, dass man Methoden statisch bindet, wenn es keine weiteren Ableitungen gibt. Dies ist in Delphi automatisch bei jeder Methode der Fall, die nicht mit virtual oder dynamic versehen wird. Sollten jetzt also Methoden "mitgeschleppt" werden, die an dieser Stelle noch nicht statisch sind, würde dies so geändert werden. Es entfällt ein Overhead (der zu vernachlässigen sein sollte). Es ist (imo) häufig mal ärgerlich, wenn man eine Klasse findet und die nicht weiter abgeleitet werden kann. Wie gesagt, ist ein wenig perfomanter (vielleicht stammt es auch aus einer Zeit als es mit der Perfomance noch nicht so weit her war). Heute wird es hauptsächlich für z.B. private Klassen eingesetzt. Hier kann der Kompiler ein wenig mehr optimieren. An sonnsten ist es vielleicht noch ein gutes Mittel um zu verhindern, dass jmd. ein Komponente die man verkauft einfach ableitet und nach eigenen Bedürfnissen anpasst. Hat jmd. die dcu stünde es ihm sonst (virtuelle Mehtoden vorrausgesetzt) frei dies zu tun, was man natürlich wieder als Leistung verkaufen könnte... Bin mir allerdings null sicher, ob eine dieser Motivationen auch bei Delphi hinter der Möglichkeit steckt (denke fast eher nicht!). Gruß Der Unwissende |
Re: Warum kann man Vererbung verhindern (csInheritable)?
Also ich vermute, dass es verschiedene Komponenten gibt, die nur einmal pro Anwendung erlaubt sind, oder genutzt werden sollen (XPManifest, TDatabase usw.).
Grad bei TDatabase darf pro Anwendung nur eine TDatabase pro Datenbank definiert sein. Wenn Du jetzt aber von einer Form erbst, die eine TDatabase implementiert, so hast du zwangsläufig 2 identische Verbindungen. ![]() |
Re: Warum kann man Vererbung verhindern (csInheritable)?
Zitat:
![]() |
Re: Warum kann man Vererbung verhindern (csInheritable)?
Zitat:
...:cat:... |
Re: Warum kann man Vererbung verhindern (csInheritable)?
Zitat:
|
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:
|
AW: Warum kann man Vererbung verhindern (csInheritable)?
Zitat:
Es wird nicht das Ableiten (Vererben) der Komponenten verhindert. Das ist weiterhin möglich. Es wird verhindert, das das TForm, auf dem die Komponente liegt vererbt werden kann. Im 1. Beitrag es es genau erklärt. |
AW: Warum kann man Vererbung verhindern (csInheritable)?
Zitat:
Es gibt in Delphi XE 4 Komponenten bei denen das der Fall ist.
TRibon wurde ja schon von sgbSoftwareEntwickler entdeckt ;-) Ich wollte nur sichergehen, dass nicht noch mehr Komponenten davon infiziert wurden. |
AW: Warum kann man Vererbung verhindern (csInheritable)?
Das Problem besteht nach wie vor. Ich will die Ribbonbar (mit Actionmanager) in einem bestehenden Grundformular einführen. Ich bin nach wie vor für Ideen offen :)
|
AW: Warum kann man Vererbung verhindern (csInheritable)?
zu TNotebook und Vererbung:
wir nutzen TNotebook intensive! und vermeiden rein aus praktischen Gründen eine Vererbung eines solchen Fensters. Mann stelle sich vor es gibt ein Fenster mit einem TNotebook auf dem sind 10 Pages. Insgesamt sind dort Hunderte von Controls drauf. Wenn ich jetzt im Basis Fenster ein paar Veränderungen mache, hab ich in den abgeleiteten Fenster meine mühe alles wieder glatt zu ziehen damit alles wieder gut funktioniert... Schon besser sind Frames die ich dann auf die Seiten des TNotebook plaziere. --- Und, wenn ich in großen Teams arbeite will ich verhindern das nicht jede Nase ungefragt wichtige, komplizierte Klasse vererbt... |
AW: Warum kann man Vererbung verhindern (csInheritable)?
Aus der Delphi Hilfe:
Zitat:
Zitat:
Zitat:
Und gerade wenn du in großen Teams arbeitest, ist doch ein Grundformular hilfreich, da jeder mit der selben Basis arbeitet / arbeiten muss und somit CorpIdent Geschichten und wichtige (geänderte, neue und/oder entfernte) Funktionalitäten sofort in allen vom Grundformular vererbten Projekten nach der nächsten Kompilierung greifen. |
AW: Warum kann man Vererbung verhindern (csInheritable)?
Das hat eigentlich nix mit Vererbung zu tun. Denn dafür wäre die Sprache zuständig (Delphi hat IMO mitttlerweile abstrakte Klassen?).
Das Problem ist diese grauenvolle Art, in der IDE und Designer einem globale Variablen und unflexibel geteilte Referenzen aufzwingen. Wenn du ein Form mit einem ActionManager 2-mal instanzierst, bekommst du auch die Actions 2-mal. Innerhalb des Forms wird er das wohl noch richtig hinkriegen, nutzt du Actions außerhalb dieser Form fangen die Probleme natürlich an. Ein anderer Grund kann sein, dass sie wohl Probleme haben, so komplexe Strukturen auch in Ableitungen noch reproduzierbar richtig aufzubauen. Wenn du vom Form ableitest und Action entfernst, hinzufügst, bestehende mit andere Handlern versiehst etc. Vllt kommt dann ein Frankenstein-ActionManager raus, der nix Halbes und nix Ganzes ist. Man kann halt nur soviel mit einem so einfach gestrickten RAD-Designer von 1995 anstellen, bevor man für 1m Weg 10m Umweg gehen muss. |
AW: Warum kann man Vererbung verhindern (csInheritable)?
Zitat:
Es ist ja durchaus möglich mehrere Instanzen zu verwenden.
Delphi-Quellcode:
Die IDE versagt nur die Vererbung:
...
var a, b, c: TMyActionForm; begin a := TMyActionForm.Create(Self); b := TMyActionForm.Create(Self); c := TMyActionForm.Create(Self); a.Show; b.Show; c.Show; ...
Delphi-Quellcode:
Man beachte: Nur die IDE verweigert das mit der Fehlermeldung:
...
type TMyForm = class(TMyActionForm) ... Zitat:
Zitat:
Ein TNotebook ist nun mal nicht sooo komplex. Und viel interesannter ist die Frage, warum eine TActionList, die auch Actions beinhaltet, erlaubt ist. Zitat:
Aber ich sehe die Frage noch nicht als beantwortet :) |
AW: Warum kann man Vererbung verhindern (csInheritable)?
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Hab gerade folgendes probiert: Ich habe eine Form erstellt, und einen Actionmanager darauf Platziert. Diesen ActionManager habe ich dann als Property dieser Form zur Verfügung gestellt. Danach habe ich auf meinem Hauptformular eine Komponente (TActionMainMenuBar) gesetzt und diese dann mit dem Actionmanager vom anderen Formular verknüpft. Die Idee dahinter: Ich muss die form, die den Actionmanager enthält nicht vererben, kann aber das Formular wo es verknüpft ist vererben. Leider bin ich an dem Versuch gescheitert, Actions von diesem Actionmanager in mein TActionMainMenuBar einzufügen. Hat jemand ne Idee ob und wie das geht? Den Code findet Ihr im Anhang |
AW: Warum kann man Vererbung verhindern (csInheritable)?
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Interesanterweise muß noch nicht mal die uses-Anweisung angepasst werden (kein uses Unit2 in der Unit1). (Beispiel im Anhang) Um die Menüs zu verknüpfen muß nur der ActionManager auf dem DataModule doppeltgeklickt werden. Das Fenster ist nicht modal (also Show statt ShowModal) damit kannst Du dann auf das Formular wechseln, in dem Deine Action Toolbars sind und loslegen. Anmerkung: TActionToolbars müssen von Hand auf das Form gelegt werden, da beim Anlegen aus dem TActionManager versucht würde, die Toolbar in das DataModul zu erzeugen. Wenn das Dein Problem lösen sollte ;-) |
AW: Warum kann man Vererbung verhindern (csInheritable)?
Versucht mal einen TActionManager auf einen TFrame zu legen :twisted:
|
AW: Warum kann man Vererbung verhindern (csInheritable)?
Zitat:
Zitat:
|
AW: Warum kann man Vererbung verhindern (csInheritable)?
Und wieder ist ein Jahr vergangen und immer noch keine Antwort in Sicht :?
|
AW: Warum kann man Vererbung verhindern (csInheritable)?
Hab zwar keine Antwort auf die Frage, also nach dem Warum und so.
Was ich sagen kann, daß auch noch die Ribbons davon betroffen sind, aber die nutzt ja eh Keiner. Und die Prüfung auf dieses Vererbungszeugs scheint direkt in der Delphi-IDE eingebaut zu sein, so daß man daran auch nicht so leicht was ändern kann. Was aber eventuell ginge,
Delphi-Quellcode:
type
TActionManager2 = class(TActionManager) public constructor Create(AOwner: TComponent); override; end; constructor TActionManager2.Create(AOwner: TComponent); begin inherited Create(AOwner); FComponentStyle := FComponentStyle + [csInheritable]; end; procedure Register; implementation procedure Register; begin RegisterComponents('Standard', [TActionManager2]); end; |
AW: Warum kann man Vererbung verhindern (csInheritable)?
Zitat:
![]() Da ist dieses Flag csInheritable ebenfalls ausgeblendet und ich suche den Sinn dahinter. Die Komponente wurde irgendwann im Grundprojekt ausgetauscht, weil die noch ältere Comport-Komponente, die bis dahin im Einsatz war, nicht mehr wollte (an die Gründe kann ich mich nicht mehr entsinnen). Vom Grundprojekt abgeleitet gibt es aber ebenfalls noch Projekte, die ähnlich sind und Grundformulare erben und ggf. modifizieren. An eines dieser abgeleiteten Projekte muss ich jetzt drangehen und habe das selbe Problem. Ich tendiere dazu, die entsprechende Programmzeile der ComPort-Komponente einfach flach zu legen, wollte aber vorher noch dazu recherchieren, ob das Vererbungsverbot einen tieferen Sinn hat. |
AW: Warum kann man Vererbung verhindern (csInheritable)?
Die Komponente nicht auf der Form, sondern erst im OnCreate erstellen, wäre auch noch eine Lösung.
|
AW: Warum kann man Vererbung verhindern (csInheritable)?
Zitat:
Zitat:
Erstaunlich: Ich habe den Thread 2006 erzeugt. Aber es scheint immer noch ab und zu jemanden zu interessieren. :thumb: |
AW: Warum kann man Vererbung verhindern (csInheritable)?
Ich weiss generell nicht, ob das Vererben von TForm nicht generell ein Ruf nach Ärger und Problemen ist.
Zum Beispiel eine Basisform mit TPanel usw. und dann in der abgeleiteten Form Komponenten in diese werfen. Theoretisch sollte das kein Problem sein ... Ich traue dem IDE Designer nur bedingt und der kommt schon bei TFrames im Designer aus dem Ruder, weshalb ich TFrames nur per Runtime nutze. Warum sollte das bei TForm anders sein? Ich verstehe die Motivation und wünsche mir das auch, aber per Runtime ist sowas viel sicherer lösbar. |
AW: Warum kann man Vererbung verhindern (csInheritable)?
Zumindest unter D2007 hatte ich damit bisher keine Probleme. Unser damaliges Hauptprodukt (welches ich noch immer aktiv pflege) basiert quasi komplett auf einer abgeleiteten TForm-Klasse. Dort sind allerdings keine weiteren Komponenten zugefügt, sondern ein Thread, der für jede Instanz im Hintergrund Dinge erledigt (und ein paar weitere nicht-visuelle Properties).
Daher ist die Benutzung vielleicht auch etwas simpler: Einfach nach Erstellen eines neuen Forms im Code-Editor die Klasse von TForm auf TMyForm ändern, und man kann sogar direkt ohne das Projekt neu zu öffnen weiter machen. Hundertfach im Einsatz - also nicht 100x das gleiche Programm, sondern in Summe ca. hundert individuelle Formulare. (Ist für eine Steuerungsvisualisierung ähnlich Siemens WinCC.) |
AW: Warum kann man Vererbung verhindern (csInheritable)?
Zitat:
Dann müsste man "nur" eine weitere Unit einbinden ;) Wenig elegant, aber ... Ich komme leider nicht dazu es zu Testen. Für die, die nicht wissen was ein ClassHelper ist und was man damit machen kann: hier ein kleines Tutorial von mir ;) ![]() |
AW: Warum kann man Vererbung verhindern (csInheritable)?
Nee, da es dort ja kein Override gibt.
und somit kennt der DFM-Reader das Create des Helpers nicht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:37 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