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
Bodenseematze

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

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

  Alt 13. Jul 2023, 13: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
 
#2

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

  Alt 13. Jul 2023, 14: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.811 Beiträge
 
Delphi 12 Athens
 
#3

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

  Alt 13. Jul 2023, 14: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
69 Beiträge
 
#4

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

  Alt 13. Jul 2023, 15: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 15:19 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

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

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

  Alt 13. Jul 2023, 15: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
Online

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

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

  Alt 13. Jul 2023, 18: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")
Ein Therapeut entspricht 1024 Gigapeut.

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

Registriert seit: 10. Jun 2003
Ort: Berlin
9.960 Beiträge
 
Delphi 12 Athens
 
#7

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

  Alt 13. Jul 2023, 21: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
Bodenseematze

Registriert seit: 10. Jul 2023
69 Beiträge
 
#8

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

  Alt 14. Jul 2023, 07:08
Du hast es ja offenbar selbst schob erkannt: Da der protected constructor nicht sichtbar ist, wir stattdessen der von TObject genommen.
ja schon, aber warum wird dann in dem Fall nur noch der (öffentliche) Konstruktor von TObject gefunden und die anderen beiden aus meiner Klasse sind "ungültig"?
Und in dem Augenblick, wo alle öffentlich sind, funktioniert wieder aller wie gehabt? Sehr dubios!

Das müsste im Debugger auch auffallen.
Seufz - noch so ein Reizthema bei mir; der Debugger funktioniert schon seit einer ganzen Weile bei mir nicht mehr (richtig) - ich schiebe es auf irgendwelche Microsoft Betriebssystemupdates...
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

Ja, eigentlich "darf" man sichtbarkeiten nicht verringern.
Das wusste ich nicht - ich dachte, das sei zulässig...
(wer's doch versucht, muß mit den Konsequenzen leben)
Da scheinst Du Recht zu haben

Man könnte hier mehrfach ableiten.
Sehr gute Idee, das werde ich so machen!


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.
Es wird schon die Unit verwendet - es scheint tatsächlich an der (versuchten) Sichtbarkeitsänderung des Konstruktors zu liegen...

Vielen Dank für Eure Hilfestellungen!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

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

  Alt 26. Jun 2024, 22:42
[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
Falls noch was fehlt und ich es noch nicht geschrieben hab ... hab's eh vergessen[/add]

Das wusste ich nicht - ich dachte, das sei zulässig...
Nja, es ist möglich,
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;
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Bodenseematze

Registriert seit: 10. Jul 2023
69 Beiträge
 
#10

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

  Alt 2. Jul 2024, 08:39
[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
Falls noch was fehlt und ich es noch nicht geschrieben hab ... hab's eh vergessen[/add]
Ich schmeiß' mich weg - aus den Tiefen des Firefox "gerettet"
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 09:34 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