Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi class oparator implicit funktioniert nicht (Bug??) (https://www.delphipraxis.net/71458-class-oparator-implicit-funktioniert-nicht-bug.html)

Dax 16. Jun 2006 14:56

Re: class oparator implicit funktioniert nicht (Bug??)
 
Stimmt, aber das is mir eben als erstes eingefallen, der Rest kam erst später^^

Khabarakh 16. Jun 2006 15:00

Re: class oparator implicit funktioniert nicht (Bug??)
 
Zitat:

Zitat von DGL-luke
ähm... dass records funktionen haben können, wär mir neu, [...]

D2006 _ist_ neu :zwinker: .
Wäre etwas sinnlos, nur Operatoren zu unterstützen, da es im Endeffekt auch nur Methoden sind.

BTT: Auch wenn das Beispiel mit C# anstandslos läuft *g*, macht es IMHO eher wenig Sinn. Der TIBZeit-DateTime-Operator sollte mit einer stinknormalen Property und das Gegenstück mit einem Konstruktor ersetzt werden. Der dritte Operator muss dann von TDateTime selbst implementiert werden. Falls die Borländer die Implementation nicht erweitert haben, Pech ;) . Helper Records gibt es ja AFAIK nicht.
Allgemein sollte man wohl so wenig implizite Operatoren wie möglich verwenden oder auf einen Bugfix hoffen.

uligerhardt 16. Jun 2006 15:23

Re: class oparator implicit funktioniert nicht (Bug??)
 
Zitat:

Zitat von Klaus01
Ein wenig OT:

Da habe ich dann mal eine Frage wo ist
denn dann der prinzipielle Unterschied
zwischen records und Objects?

Ist das ganze dann eher mir einer Class in Java
zu vergleichen?

Grüße
Klaus

Soweit ich das verstanden habe:
  • "class" in Delphi entspricht ungefähr "class" in Java - muss dynamisch alloziert werden, kann virtuelle Methoden haben, erben etc.
  • Die "old-style"-Klassen in Delphi (Schlüsselwort "object") entsprechen eher struct's/class's in C++ - sie können auch auf dem Stack leben (wie Delphi-Records), können virtuelle Methoden haben, erben etc. Sie sind seit anno dunnemals in der Hilfe als deprecated gebrandmarkt, funktionieren aber ganz gut.
  • Die neuen "advanced records" von Delphi sind ähnlich wie diese alten object's, nur das sie weniger Features haben (nix virtuell, nix erben) und nicht funktionieren - s.o. :-)
Uli.

stoxx 16. Jun 2006 15:26

Re: class oparator implicit funktioniert nicht (Bug??)
 
Also nochmal zur Sicherheit, ich rede von Win32, nicht .Net
den String kann ich doch auch problemlos "bestücken"
Warum kann man dann eine Variable von einem anderen Typ nicht zuweisen

Umgekehrt funktioniert es schließlich auch.

Zeit := d; // das geht

Zitat:

Zitat von DGL-luke

Im übrigen ist "funktioniert nicht" keine befriedigende fehlermeldung ;)

Nervt der COmpiler? kommen falsche ergbnisse raus? oder was?


er mein: Incompatible types: 'TDateTiem' and 'TIBZeit'

Klaus01 16. Jun 2006 15:37

Re: class oparator implicit funktioniert nicht (Bug??)
 
Hallo stoxx
geht es denn so?

d := Zeit as TDateTime;

Grüße
der nichtsahnende Klaus

stoxx 16. Jun 2006 15:43

Re: class oparator implicit funktioniert nicht (Bug??)
 
Zitat:

Zitat von Klaus01
Hallo stoxx
geht es denn so?

d := Zeit as TDateTime;

Grüße
der nichtsahnende Klaus

den as Operator gibt es nur bei Klassen, nicht bei records.
Ausserdem wäre das Quark und nicht Sinn und Zweck einer impliciten Typumwandlung im Sinne von class operatoren.

um das zu umgehen gibts ja auch eine property like in .NET
Delphi-Quellcode:
    property ToDateTime : TDateTime read Value;
somit geht es d := Zeit.ToDateTime;

Aber das ist ja nicht Sinn und Zweck der Übung ! und der Quellcode wird mir zu unübersichtlich, um sowas will man sich ja keine Gedanken machen ! Darum gehts ja gerade !

stoxx 21. Aug 2007 16:54

Re: class oparator implicit funktioniert nicht (Bug??)
 
Delphi-Quellcode:
type

TIBZeit = record
private
  Value : TDateTime;
public
  class operator implicit(Zeit : TDateTime) : TIBZEit;
  class operator implicit(a : TIBZeit) : TDateTime;
  class operator implicit(a : TIBZEit) : String;

end;

implementation

{$R *.dfm} 

class operator TIBZeit.implicit(Zeit : TDateTime) : TIBZeit;
begin
result.value := Zeit;
end;

class operator TIBZeit.implicit(a : TIBZeit) : TDateTime;
begin
result := a.Value;
end;

class operator TIBZeit.Implicit(a : TIBZeit) : String;
begin
  result := DateTimeToStr(a.value);
end;

//==============================================================================

procedure TForm1.Button1Click(Sender: TObject);
var d : TDateTime;
    Zeit : TIBZEit;
    st : String;
begin

  Zeit := now;
  st := Zeit;
  d := Zeit; /// geht nicht

end;

isch habe mir gerade mal die Trial von Delphi 2007 rungergeladen .. und das Beispiel geht jetzt ... coole Sache ....

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var d : TDateTime;
    Zeit : TIBZEit;
    st : String;
begin

  Zeit := now;

  d := Zeit;

  showmessage(Zeit);
  Showmessage(DateTimeToStr(d));


end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:17 Uhr.
Seite 2 von 2     12   

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