Delphi-PRAXiS

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)

stoxx 15. Jun 2006 15:59


class oparator implicit funktioniert nicht (Bug??)
 
ich versteh das nicht, den String kann ich wunderbar zuweisen, aber nicht die Variable vom Typ TDateTime
Wieso ??? ist das ein Compilerbug oder mach ich was falsch ?

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;

stoxx 16. Jun 2006 13:01

Re: class oparator implicit funktioniert nicht (Bug??)
 
hmm .. weiß das denn wirklich niemand ? ist doch ein ziemlich wichtiges Grundproblem ?
Habe ich irgendeinen Compilerschalter übersehen ?
Versteh das nicht !

Klaus01 16. Jun 2006 13:13

Re: class oparator implicit funktioniert nicht (Bug??)
 
Delphi-Quellcode:
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;
Nun, ich kann jetz mal wieder total daneben liegen, aber
so wie ich das vor langer Zeit mal gelernt habe
können records nur statische Feldtypen arbeiten.
So in der Art:
Delphi-Quellcode:
TIBTeit = record
  value : TDateTime;
end;
Grüße
Klaus

stoxx 16. Jun 2006 14:05

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

Nun, ich kann jetz mal wieder total daneben liegen, aber
so wie ich das vor langer Zeit mal gelernt habe
können records nur statische Feldtypen arbeiten.
Da bist Du leider nicht mehr UpToDate .. Delphi2006 kann das ! das ist ja das coole !

Klaus01 16. Jun 2006 14:08

Re: class oparator implicit funktioniert nicht (Bug??)
 
Tja, cool oder verwirrend.
Da bleibe ich doch noch ein Weilchen bei Delphi6 ;o)

Grüße
Klaus

uligerhardt 16. Jun 2006 14:08

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

Zitat von Klaus01
Nun, ich kann jetz mal wieder total daneben liegen, aber

Tust du. :-)

Zitat:

Zitat von Klaus01
so wie ich das vor langer Zeit mal gelernt habe
können records nur statische Feldtypen arbeiten.
So in der Art:
Delphi-Quellcode:
TIBTeit = record
  value : TDateTime;
end;
Grüße
Klaus

Seit D2006 (?) können Records prinzipiell auch Methoden etc. haben. Allerdings hagelt's bei mir immer interne Compilerfehler, sobald ich irgendwas Nichttriviales mache (z.B. http://qc.borland.com/wc/qcmain.aspx?d=26014). :-(

Uli.

Klaus01 16. Jun 2006 14:11

Re: class oparator implicit funktioniert nicht (Bug??)
 
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

Dax 16. Jun 2006 14:15

Re: class oparator implicit funktioniert nicht (Bug??)
 
New-style records können nur statische Methoden haben, während objects weiterhin auch late-bound-Methoden haben können *glaub*

edit: Genauer: objects unterstützen Vererbung, records nicht

DGL-luke 16. Jun 2006 14:17

Re: class oparator implicit funktioniert nicht (Bug??)
 
ähm... dass records funktionen haben können, wär mir neu, aber das sind doch hier operatoren! und das wurde ja extra eingeführt, dass man in recordtypen (afaik aber nicht in klassen sprich objekttypen) die operatoren benutzen kann.

warum das beispiel nicht funktioniert, kann ich aber ncihtr sagen.

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

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

Elvis 16. Jun 2006 14:53

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

Zitat von Dax
New-style records können nur statische Methoden haben, während objects weiterhin auch late-bound-Methoden haben können *glaub*
edit: Genauer: objects unterstützen Vererbung, records nicht

Lol, virtuelle Methoden wären ohne die Möglichkeit zur Vererbung auch irgendwie witzlos, oder? :mrgreen:

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:07 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