![]() |
AW: Verweis auf Interface-Instanz weitergeben - ist das erlaubt?
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Keine Ahnung mehr, warum ich das in meinem Projekt umbenannt hatte. Irgendwas ging nicht - war's vielleicht das mit dem "overload", was nicht ging :?? Im Testprojekt geht es auf jeden Fall problemlos so:
Delphi-Quellcode:
constructor Create( owner_ : TComponent ); virtual;
EDIT: und mit überladenen Konstruktor geht's z.B. so:
Delphi-Quellcode:
Ich habe das Testprogramm nochmals erweitert und etwas komplizierter gemacht (um es mehr Richtung Realität zu bringen).
constructor Create( owner_ : TComponent ); overload; override;
constructor Create( owner_ : TComponent; const sTestName_ : String ); reintroduce; overload; virtual; Nur funktioniert da alles wie gewünscht - sehr seltsam! Ich habe das Projekt mal wieder angehängt... |
AW: Verweis auf Interface-Instanz weitergeben - ist das erlaubt?
Zitat:
Ich wollte jetzt im tatsächlichen Projekt die Konstruktoren mit anderem Namen alle auf "Create" zurück ändern. Nachdem ich das gemacht habe, war das erste Ergebnis in der BaseForm-Klasse so:
Delphi-Quellcode:
Das lässt sich so nicht übersetzen - hier meckert der Compiler, bei den ersten drei Konstruktoren
constructor Create( compOwner_ : TComponent;
const posInitial_ : TMyPos; bIsFormSingleton_ : Boolean; iScalePercentage_ : Integer = -1 ); overload; virtual; constructor Create( compOwner_ : TComponent; bIsFormSingleton_ : Boolean; iScalePercentage_ : Integer = -1 ); overload; virtual; constructor Create( compOwner_ : TComponent; iScalePercentage_ : Integer ); overload; virtual; // aus TCustomForm: constructor Create( compOwner_ : TComponent ); overload; override; (also die mit zusätzlichen Parametern, die es in den Basisklassen gar nicht gibt):
Code:
:?
Method 'Create' hides virtual method of base type 'TCustomForm'
Also muss ich das so machen:
Delphi-Quellcode:
Und dann habe ich in der BaseFormMain (abgeleitet von BaseForm) als einzigen Konstruktor folgendes definiert:
constructor Create( compOwner_ : TComponent;
const posInitial_ : TMyPos; bIsFormSingleton_ : Boolean; iScalePercentage_ : Integer = -1 ); reintroduce; overload; virtual; constructor Create( compOwner_ : TComponent; bIsFormSingleton_ : Boolean; iScalePercentage_ : Integer = -1 ); reintroduce; overload; virtual; constructor Create( compOwner_ : TComponent; iScalePercentage_ : Integer ); reintroduce; overload; virtual; // aus TCustomForm: constructor Create( compOwner_ : TComponent ); overload; override;
Delphi-Quellcode:
Im BaseFormMain-Konstruktor steht dann am Anfang:
constructor Create( compOwner_ : TComponent;
const posInitial_ : TMyPos; bIsFormSingleton_ : Boolean; iScalePercentage_ : Integer = -1 ); override;
Delphi-Quellcode:
Das ruft auch (richtigerweise) den Konstruktor mit vier Parametern in BaseForm auf.
inherited;
Die BaseForm-Konstruktoren mit weniger Parametern rufen alle den Konstruktor mit vier Parametern auf; in diesem steht dann noch:
Delphi-Quellcode:
Gedacht ist, dass er den Konstruktor in TCustomForm aufruft.
inherited Create( compOwner_ );
Macht er aber nicht - stattdessen wird (erneut) der Konstruktor in BaseFormMain aufgerufen. Also ein prima Endlos-Rekursionsschleife gebastelt :x Nur ist mir nicht klar, warum das passiert... ...und wie ich ihn dazu bringen könnte, mit dem o.a. inherited den korrekten Konstruktor in TCustomForm aufzurufen (ohne die Konstruktoren wieder alle umzubenennen)... EDIT: Hier noch der vollständige Stack-Aufruf: Durch Application.CreateForm mit der Implementierung der MainForm (abgeleitet von BaseFormMain) wird folgendes aufgerufen:
|
AW: Verweis auf Interface-Instanz weitergeben - ist das erlaubt?
Zitat:
Meckert Heult der nur rum (Info oder Warning), oder stoppt er wirklich die Arbeit (Error oder Fatal) ? Zitat:
|
AW: Verweis auf Interface-Instanz weitergeben - ist das erlaubt?
Zitat:
Die Konstruktion ist aber seltsam. Warum ruft der überschriebene Konstruktor mit einem Parameter den mit 4 Parametern auf, wenn der doch ohnehin wieder den mit einem Parameter aufruft? Ohne zu wissen was darin passiert, lässt sich dazu aber nicht viel sagen. Das kann man sicher anders lösen. Eine Möglichkeit wäre, die Initialisierung aus dem Konstruktor auszulagern, so dass die Konstruktoren sich nicht mehr so viel gegenseitig aufrufen müssen. Im Konstruktor sollte im Normalfall auch nur die reine Initialisierung passieren, keine Ladevorgänge oder weitergehende Aktionen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:41 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-2025 by Thomas Breitkreuz