![]() |
Delphi-Version: 7
Konstruktor-Aufruf "Too many actual parameters" - warum?
Hallo,
ich habe eine eigene Klasse in einer Unit, deren Konstruktoren in folgender Art deklariert sind:
Delphi-Quellcode:
Jetzt versuche ich in einer anderen Unit, die Klasse zu verwenden:
type
TMyClass = class( TPersistent ) public constructor Create( const dVal_ : Extended; const iNumDigits_ : ShortInt ); overload; constructor Create( const sVal_ : String; const iNumDigits_ : ShortInt ); overload; protected constructor Create(); overload; end;
Delphi-Quellcode:
Da kommt dann in der Zeile, die den Konstruktor aufruft vom Delphi7-Compiler die Fehlermeldung "Too many actual parameters"
procedure Irgendwas()
var test : TMyClass; begin test := TMyClass.Create( 0.0, 2 ); end; Warum? Noch komischer finde ich dann, dass wenn ich das in folgendes ändere, keine Fehlermeldung mehr kommt:
Delphi-Quellcode:
Ich kann also den als "protected" gekennzeichneten Konstruktor von außerhalb benutzen, die öffentlich deklarierten aber nicht?
procedure Irgendwas()
var test : TMyClass; begin test := TMyClass.Create(); end; Verstehe ich nicht... Hat mir jemand eine Erklärung (und Lösung) dafür? |
AW: Konstruktor-Aufruf "Too many actual parameters" - warum?
In D11.3 läuft das genauso anstandslos.
Sherlock |
AW: Konstruktor-Aufruf "Too many actual parameters" - warum?
In Delphi 7 auch. Da fehlt ein komplettes reproduzierbares Beispiel.
Vielleicht wird die falsche Unit verwendet oder ähnliches. |
AW: Konstruktor-Aufruf "Too many actual parameters" - warum?
Zitat:
Ich hatte zuerst die Ableitung von TPersistent im Verdacht, aber das mache ich an anderen Stellen auch :? Interessanterweise zeigt mir die kontextabhängige Hilfe bei der Eingabe des Punktes nach "TMyClass" alle drei Create-Methoden an, wenn ich dann aber das "Create" hingeschrieben habe und die "(" eingebe (also insgesamt "TMyClass.Create("), wird nur noch "*No parameters expected*" angezeigt... :roll: Hier habe ich es versucht, nachzuvollziehen in einem Mini-Projekt, bestehend aus zwei Units: Unit1.pas:
Delphi-Quellcode:
Unit2.pas:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Unit2; type TForm1 = class(TForm) protected procedure DoCreate(); override; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.DoCreate(); var test : TMyClass; begin test := TMyClass.Create( 0.20, 1 ); end; end.
Delphi-Quellcode:
Project1.dpr:
unit Unit2;
interface uses Classes; type TMyClass = class( TPersistent ) public constructor Create( dVal_ : Extended; iDigits_ : ShortInt ); overload; virtual; constructor Create( dVal_ : Extended ); overload; virtual; protected constructor Create(); overload; virtual; end; implementation constructor TMyClass.Create( dVal_ : Extended; iDigits_ : ShortInt ); begin Create(); end; constructor TMyClass.Create( dVal_ : Extended ); begin Create(); end; constructor TMyClass.Create(); begin inherited Create(); end; end.
Delphi-Quellcode:
program Project1;
uses Forms, Unit1 in 'Unit1.pas' {Form1}, Unit2 in 'Unit2.pas'; {$R *.res} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. |
AW: Konstruktor-Aufruf "Too many actual parameters" - warum?
Delphi-Quellcode:
Keine Probleme in Turbo Delphi 2005.
procedure TForm4.FormCreate(Sender: TObject);
var test: TMyClass; begin test := TMyClass.Create(2.0, 4); try finally test.Free; end; test := TMyClass.Create(22.33); try finally test.Free; end; test := TMyClass.Create(); try finally test.Free; end; end; |
AW: Konstruktor-Aufruf "Too many actual parameters" - warum?
Dann hätte ich jetzt Projekteinstellungen und eventuell noch Bibliothekspfade oder Suchpfade im Verdacht.
Sherlock |
AW: Konstruktor-Aufruf "Too many actual parameters" - warum?
Zitat:
EDIT: zur Info: wenn ich in der IDE beim "test := TMyClass.Create" mit STRG+linke Maustaste auf "Create" klicke, komme ich bei System.Object.Create raus... und wenn ich die o.a. öffentlichen "Create"-Methoden in "Create2" umbenenne (und dann natürlich auch bei der Instanzierung Create2 verwende), lässt sich das ohne Fehler compilieren!!! :shock: EDIT2: wenn ich alle drei Konstruktoren mit dem Namen "Create" in den public-Bereich schiebe, und den Konstruktor ohne Parameter mit "reintroduce" kennzeichne, lässt es sich ebenfalls ohne Compilerwarnung/-fehler übersetzen... |
AW: Konstruktor-Aufruf "Too many actual parameters" - warum?
Zitat:
|
AW: Konstruktor-Aufruf "Too many actual parameters" - warum?
Ja, eigentlich "darf" man sichtbarkeiten nicht verringern. (wer's doch versucht, muß mit den Konsequenzen leben)
Durch das "overload" an allen Create (was hier aber nöig ist, da mehr als ein Create im Typ), ist/bleibt auch das originale Create des TObject sichtbar. Man könnte hier mehrfach ableiten. Einmal nur mit dem Protected-Create, ohne ein Overload, und davon dann das mit den neuen Create's. Dann müsste der Compiler beim "protected" aufhören zu suchen und dort meckern, das Jenes nicht verwendet werden kann (wenn man nicht in der selben Unit steht und da dann private und protected wie "public" wirkt, bzw. man arbeit mit "strict protected" und "strict private") |
AW: Konstruktor-Aufruf "Too many actual parameters" - warum?
Du solltest einfach mal z.B. mit
![]() Du kannst aber auch ganz einfach herausfinden, ob die beabsichtigte Unit verwendet wird: Baue einfach einen Syntaxfehler in die Unit ein. Wenn der nicht bemängelt wird, wird sie auch nicht verwendet. |
AW: Konstruktor-Aufruf "Too many actual parameters" - warum?
Zitat:
Und in dem Augenblick, wo alle öffentlich sind, funktioniert wieder aller wie gehabt? Sehr dubios! Zitat:
Sobald ich ein Programm im Debugger versuche zu starten, hängt sich Delphi zu 95% komplett auf (die restlichen 5% funktioniert es). In vielen Fällen funktioniert es, wenn ich auf der eigenen Maschine Remote-Debugging verwende, aber auch nicht immer... Aber das ist ein anderes (leidiges) Thema :x Zitat:
Zitat:
Zitat:
Zitat:
Vielen Dank für Eure Hilfestellungen! |
AW: Konstruktor-Aufruf "Too many actual parameters" - warum?
[add] OMG, einen vergessenen Tab gefunden und wo Firefox sich so Mühe gegeben hat das Geschriebene im Editor, trotz mehrfacher Abstürze, Neustarts und disableter Tabs zu merken ......... klick ich mal auf Senden :duck:
Falls noch was fehlt und ich es noch nicht geschrieben hab ... hab's eh vergessen[/add] Zitat:
aber widerspricht den Grundsätzen der OOP. Durch die Vererbung werden Dinge hinzugefügt, aber niemals nicht entfernt. Ein TMemoryStream kann alles, was ein TStream kann, also es macht keinen Unterschied, ob ich VariableAlsTMemoryStream.Write oder VariableAlsTStream.Write ausführe, solange da wirklich ein TMemoryStream drin steckt.
Delphi-Quellcode:
type
TTest = class(TComponent) strict private procedure SetName(const NewName: TComponentName); override; strict protected property Tag; end; procedure TForm4.FormCreate(Sender: TObject); begin Tag := TTest.Create(Self).Tag; var Edit: TEdit; var Cont: TControl; Edit := TEdit.Create(Self); Cont := Edit; TLabel(Edit).Caption := ''; // Ja, Caption gibt es seit TControl, aber meistens ist es einfach nur im Protected versteckt. TLabel(Cont).Caption := ''; Edit.Caption := ''; // [dcc32 Fehler] E2362 Auf protected-Symbol TControl.Caption kann nicht zugegriffen werden Edit.Text := ''; Cont.Text := ''; // [dcc32 Fehler] E2362 Auf protected-Symbol TControl.Text kann nicht zugegriffen werden end; |
AW: Konstruktor-Aufruf "Too many actual parameters" - warum?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:20 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