AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Konstruktor-Aufruf "Too many actual parameters" - warum?
Thema durchsuchen
Ansicht
Themen-Optionen

Konstruktor-Aufruf "Too many actual parameters" - warum?

Ein Thema von Bodenseematze · begonnen am 13. Jul 2023 · letzter Beitrag vom 2. Jul 2024
Antwort Antwort
Seite 1 von 2  1 2      
Bodenseematze

Registriert seit: 10. Jul 2023
68 Beiträge
 
#1

Konstruktor-Aufruf "Too many actual parameters" - warum?

  Alt 13. Jul 2023, 11:36
Delphi-Version: 7
Hallo,

ich habe eine eigene Klasse in einer Unit, deren Konstruktoren in folgender Art deklariert sind:
Delphi-Quellcode:
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;
Jetzt versuche ich in einer anderen Unit, die Klasse zu verwenden:
Delphi-Quellcode:
procedure Irgendwas()
var test : TMyClass;
begin
  test := TMyClass.Create( 0.0, 2 );
end;
Da kommt dann in der Zeile, die den Konstruktor aufruft vom Delphi7-Compiler die Fehlermeldung "Too many actual parameters"
Warum?

Noch komischer finde ich dann, dass wenn ich das in folgendes ändere, keine Fehlermeldung mehr kommt:
Delphi-Quellcode:
procedure Irgendwas()
var test : TMyClass;
begin
  test := TMyClass.Create();
end;
Ich kann also den als "protected" gekennzeichneten Konstruktor von außerhalb benutzen, die öffentlich deklarierten aber nicht?
Verstehe ich nicht...

Hat mir jemand eine Erklärung (und Lösung) dafür?

Geändert von Bodenseematze (13. Jul 2023 um 13:19 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.800 Beiträge
 
Delphi 12 Athens
 
#2

AW: Konstruktor-Aufruf "Too many actual parameters" - warum?

  Alt 13. Jul 2023, 11:56
In D11.3 läuft das genauso anstandslos.

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Konstruktor-Aufruf "Too many actual parameters" - warum?

  Alt 13. Jul 2023, 12:26
In Delphi 7 auch. Da fehlt ein komplettes reproduzierbares Beispiel.

Vielleicht wird die falsche Unit verwendet oder ähnliches.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Bodenseematze

Registriert seit: 10. Jul 2023
68 Beiträge
 
#4

AW: Konstruktor-Aufruf "Too many actual parameters" - warum?

  Alt 13. Jul 2023, 14:00
In Delphi 7 auch. Da fehlt ein komplettes reproduzierbares Beispiel.

Vielleicht wird die falsche Unit verwendet oder ähnliches.
Sowas in der Art muss es wohl sein - ich habe schon 'zig Klassen in der Art ohne Probleme definiert, nur hier macht es komischerweise Probleme.
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...


Hier habe ich es versucht, nachzuvollziehen in einem Mini-Projekt, bestehend aus zwei Units:
Unit1.pas:
Delphi-Quellcode:
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.
Unit2.pas:
Delphi-Quellcode:
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.
Project1.dpr:
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.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Konstruktor-Aufruf "Too many actual parameters" - warum?

  Alt 13. Jul 2023, 15:19
Delphi-Quellcode:
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;
Keine Probleme in Turbo Delphi 2005.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.800 Beiträge
 
Delphi 12 Athens
 
#6

AW: Konstruktor-Aufruf "Too many actual parameters" - warum?

  Alt 13. Jul 2023, 15:38
Dann hätte ich jetzt Projekteinstellungen und eventuell noch Bibliothekspfade oder Suchpfade im Verdacht.

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Bodenseematze

Registriert seit: 10. Jul 2023
68 Beiträge
 
#7

AW: Konstruktor-Aufruf "Too many actual parameters" - warum?

  Alt 13. Jul 2023, 16:04
  test := TMyClass.Create(); Keine Probleme in Turbo Delphi 2005.
Zumindest der dritte Aufruf sollte ja außerhalb der Unit2 nicht funktionieren, da die Methode ja "protected" ist !

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!!!

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...

Geändert von Bodenseematze (13. Jul 2023 um 16:19 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#8

AW: Konstruktor-Aufruf "Too many actual parameters" - warum?

  Alt 13. Jul 2023, 16:38
Zumindest der dritte Aufruf sollte ja außerhalb der Unit2 nicht funktionieren, da die Methode ja "protected" ist !
Du hast es ja offenbar selbst schob erkannt: Da der protected constructor nicht sichtbar ist, wir stattdessen der von TObject genommen. Das müsste im Debugger auch auffallen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

AW: Konstruktor-Aufruf "Too many actual parameters" - warum?

  Alt 13. Jul 2023, 19:16
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")
$2B or not $2B

Geändert von himitsu (13. Jul 2023 um 19:19 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Konstruktor-Aufruf "Too many actual parameters" - warum?

  Alt 13. Jul 2023, 22:16
Du solltest einfach mal z.B. mit Everything nach Units mit dem gleichen Namen suchen, .dcu oder .pas.

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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz