Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Overload-Problem bei currency und TDateTime (https://www.delphipraxis.net/142501-overload-problem-bei-currency-und-tdatetime.html)

VizeTE 29. Okt 2009 12:17


Overload-Problem bei currency und TDateTime
 
Hallo,

ich habe da ein Problem mit einer überladenen Funktion.
Delphi-Quellcode:
  ...
  protected
    procedure Test(Value: currency); overload; virtual; abstract;
    procedure Test(Value: TDateTime); overload; virtual; abstract;
  ..
In einer Methode rufe ich dann folgendes auf:
Delphi-Quellcode:
...
var
  Value : currency;
begin
  Test(Value);
...
Das wird mit der Fehlermeldung "Doppeldeutiger überladener Aufruf von 'Test'" quittiert.
Abstrakt ist es nur zum testen, das gleiche Problem habe ich auch wenn die Prozeduren nicht abstrakt sind. Getestet habe ich das in Delphi5 und Delphi7.

TDateTime ist ja eigentlich ein double. Daher verstehe ich nicht warum es hier ein Problem gibt. Und noch viel mehr würde mich eine Lösung interessieren :zwinker:

Vielen Dank

Bernhard Geyer 29. Okt 2009 12:20

Re: Overload-Problem bei currency und TDateTime
 
Zitat:

Zitat von VizeTE
TDateTime ist ja eigentlich ein double. Daher verstehe ich nicht warum es hier ein Problem gibt. Und noch viel mehr würde mich eine Lösung interessieren :zwinker:

currency ist auch 8 Byte und wird vermutlich auf double mit fester nachkommastellenanzahl gemappt. vermutlich kann der Compiler auf dieser Ebene nicht mehr unterscheiden.

Du brauchst also unterschiedliche Methodennamen.

mkinzler 29. Okt 2009 12:21

Re: Overload-Problem bei currency und TDateTime
 
Currencz ist auch ein Fliesskommatyp, da weiss der Compiler dann wohl nicht welcher gemeint ist

himitsu 29. Okt 2009 12:27

Re: Overload-Problem bei currency und TDateTime
 
Nein, Currency ist eigentlich ein Int64, welcher als Festkommatyp interpretiert wird.
Delphi sieht ihn leider zu oft als Fließkommatyp an und übersieht erstmal andere Currency-Definitionen.
TDateTime ist auch ein Double.


Was du versuchen kannst ist die Reihenfolge zu tauschen (erst TDateTime und dann Currency)
oder ist dieses
Delphi-Quellcode:
type
  TCurrency = type Currency;

...
protected
  procedure Test(Value: TCurrency); overload; virtual; abstract;
  procedure Test(Value: TDateTime); overload; virtual; abstract;
  ...

var
  Value : TCurrency;
begin
  Test(Value);
Ob das geht, ist nicht sichergestellt.

Aber direkt ist es nicht möglich Double und Currency zu mischen :cry:
Mein Ausweg war daher immer die Currency-Funktion umzubennen (TestC ... also überall ein C anzuhängen).

VizeTE 29. Okt 2009 12:32

Re: Overload-Problem bei currency und TDateTime
 
Zitat:

Zitat von mkinzler
Currencz ist auch ein Fliesskommatyp, da weiss der Compiler dann wohl nicht welcher gemeint ist

Wenn ich in dem Beispiel TDateTime durch extended austausche funktioniert es aber.
Also scheint das nicht an den reinen Fließkomma-Format zu liegen. Vielleicht machen dort die 2 Byte mehr schon den Unterschied...

Zitat:

Zitat von himitsu
Aber direkt ist es nicht möglich Double und Currency zu mischen :cry:
Mein Ausweg war daher immer die Currency-Funktion umzubennen (TestC ... also überall ein C anzuhängen).

Werde mal probieren ob ich den TDateTime-Aufruf auch mit einem extended umsetzen kann.

himitsu 29. Okt 2009 13:00

Re: Overload-Problem bei currency und TDateTime
 
Single oder Extended + Currency

hier wird vermutlich TDateTime auch die Funktion von Currency aufrufen :nerd:

VizeTE 29. Okt 2009 13:42

Re: Overload-Problem bei currency und TDateTime
 
Zitat:

Zitat von himitsu
Single oder Extended + Currency

hier wird vermutlich TDateTime auch die Funktion von Currency aufrufen :nerd:

Das hast du wohl (leider) recht.

Zitat:

Zitat von himitsu
Delphi-Quellcode:
type
  TCurrency = type Currency;

...
protected
  procedure Test(Value: TCurrency); overload; virtual; abstract;
  procedure Test(Value: TDateTime); overload; virtual; abstract;
  ...

var
  Value : TCurrency;
begin
  Test(Value);

Das hat leider auch nicht funktioniert.

Also bleibt mir wohl nichts anderes als die Methoden nicht zu überladen und stattdessen eindeutige Methodenbezeichner zu verwenden.
:(


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:34 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