Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi ClassOperator Implict greift nicht (https://www.delphipraxis.net/114122-classoperator-implict-greift-nicht.html)

himitsu 20. Mai 2008 00:18


ClassOperator Implict greift nicht
 
Moin ihr,
ich hab da ein kleines Problemchen mit den Klassenoperatoren. :cry:

Und zwar geht Einiges einfach nicht, obwohl ich dachte es würde so gehn? :gruebel:
Code:
Type TWindow = Record
  Public
    Class Operator Implicit(Handle: HWND): TWindow;
    Class Operator Implicit(Rec: TWindow): HWND;
  End;

Procedure Test(H: HWND);
  Begin
  End;

Var H: HWND;
  W: TWindow;


42: W := H;         // [color=green]geht[/color]
43: W := 123;       // [color=green]geht[/color]
44: H := W;         // [color=red]geht nicht[/color]
45: Test(W);        // [color=red]geht auch nicht[/color]
46: If W = H Then ; // [color=red]geht nicht[/color]
Zitat:

[Pascal Error] Unit1.pas(44): E2010 Incompatible types: 'HWND' and 'TWindow'
[Pascal Error] Unit1.pas(45): E2010 Incompatible types: 'HWND' and 'TWindow'
[Pascal Error] Unit1.pas(46): E2015 Operator not applicable to this operand type
Abgsehn von "123" (Integer) sind die Typen doch eigentlich identisch und Delphi sollte entsprechend umwandeln. :?

Der "Witz" dabei ist, wenn ich das Ganze z.B. mit String statt HWND versucht, dann geht plötzlich alles. :schock:

stoxx 20. Mai 2008 05:06

Re: ClassOperator Implict greift nicht
 
schau mal hier:

http://www.delphipraxis.net/internal...light=operator


funktioniert erst ab Delphi2007 richtig .....

stoxx 20. Mai 2008 05:13

Re: ClassOperator Implict greift nicht
 
Zitat:

46: If W = H Then ; // geht nicht[/pre]
dafür brauchst auch den class operator Equal ...

guck Dich mal in den .NET Sourcen um für Currency .. da wirds ersichtlich, wie alles funktioniert :-)

man kann lustige Sachen damit machen .... wir weisen neuerdings sogar Pointer auf den Record Typ zu, und umgekehrt, dabei findet eine automatische Kopie statt.

p := W;

W := P;

:-)

himitsu 20. Mai 2008 20:58

Re: ClassOperator Implict greift nicht
 
Equal hatte ich ja ... sozusagen :stupid:

Delphi-Quellcode:
HWND = type LongWord;
TDateTime = type Double;
dann könnte es also an dem TYPE liegen :gruebel:

meine Test haben letztendlich ergeben, daß es so geht,
aber so ganz 100%ig bin ich damit nicht wirklich zufrieden :freak:
Delphi-Quellcode:
Type TnWindow = Record
  Class Operator Implicit(Handle: LongWord{HWND}): TnWindow;
  Class Operator Implicit(Rec: TnWindow): LongWord{HWND};
  Class Operator Equal  (Left, Right: LongWord{HWND}): Boolean;
  Class Operator NotEqual(Left, Right: LongWord{HWND}): Boolean;
End;

stoxx 21. Mai 2008 00:01

Re: ClassOperator Implict greift nicht
 
Zitat:

aber so ganz 100%ig bin ich damit nicht wirklich zufrieden
na was für eine Delphi Version hast Du denn?
Wie gesagt, in BDS2006 geht das alles noch nicht wirklich so richtig ...

himitsu 21. Mai 2008 01:01

Re: ClassOperator Implict greift nicht
 
BDS2006, da es in D7 noch nicht geht.

ich glaub ich bau erstmal Compilerschlater ein,
denn so wie es aussieht, werd' ich bis zum Commodore (RAD Studio 2009 ??) noch damit leben müssen :?


nja, zumindestens ist das Programm so lauffähig
und im Commodore sollte es dann ja endlich richtig funktionieren :angel2:


Zitat:

isch habe mir gerade mal die Trial von Delphi 2007 rungergeladen .. und das Beispiel geht jetzt ... coole Sache ....
Bist du eigentlich auf Delphi 2007 umgestiegen, oder hast'e das Problem bei dir anders gelöst?

stoxx 22. Mai 2008 15:30

Re: ClassOperator Implict greift nicht
 
Zitat:

Zitat von himitsu
Bist du eigentlich auf Delphi 2007 umgestiegen, oder hast'e das Problem bei dir anders gelöst?

Ich selber nutze noch D2005, für ein Projekt für eine Fremdfirma steht mir allerdings D2007 zur Verfügung.
Es funktioniert wie gesagt in D2006 noch nicht. Ein Workarround ist mir da noch nicht eingefallen, ist einfach eben ncoh ein Bug.


was allerdings jetzt noch schick wäre, wenn sowas gehen würde :)

Delphi-Quellcode:
PLetter =^TLetter;
TLetter = packed record
   class operator implicit(const Value : Boolean) : PLetter;
end;


und dann


function Test;
var p : PLetter;
begin
   p := true;
end;

sowas wie weiter unten funktioniert übrigens jetzt schon und ist recht lustig :-)
Man ist sehr flexibel und einheitlich, man spart sich das schreiben des "^" Zeichens.
Und kann automatisch umkopieren.


Delphi-Quellcode:
PLetter =^TLetter;
TLetter = packed record
    class operator implicit(const Value : TLetter) : PLetter;
    class operator implicit(const Value : PLetter) : TLetter;
end;

function Test;
var p : PLetter;
    letter1, letter2 : TLetter;
begin
   p := letter1;
   letter2 := p;
end;

wenn ich gerade beim Wünschen bin, Default Properties (nicht nur bei ArrayProperties) in Klassen und Property überladung wäre noch schick...
hmmm .. ob das jemand liest von GodeGear? :-)

himitsu 22. Mai 2008 16:02

Re: ClassOperator Implict greift nicht
 
tja, ist schade, also heißt es warten (oder die bringen doch noch Turbo Delphi 2007 raus)

das mit den Default Properties klingt gut, aber am Verhalten bei Pointern spiele ich lieber nicht rum ... hab mir vorgenommen es so nutzbar zu machen, daß es sich wie eine "normale" Variable verhält (z.B. 'nen Integer),

aber für sowas wie "String" wären ein Konsruktor und Destruktor nett, welcher auch automatisch bei Definiion einer Variable von Delphi angewendet werden ... halt so wie beim "String" und all den anderen dynamischen Arrays

stoxx 22. Mai 2008 16:13

Re: ClassOperator Implict greift nicht
 
Zitat:

Zitat von himitsu
aber für sowas wie "String" wären ein Konsruktor und Destruktor nett, welcher auch automatisch bei Definiion einer Variable von Delphi angewendet werden ... halt so wie beim "String" und all den anderen dynamischen Arrays


ähm, ja, da hast Du allerdings Recht .. Konstruktoren wie in C++ wären gut.
Am liebesten noch automatischer Aufruf, dass man noch den Record initialisieren kann.
Bei Interfaces geht ja die AddRef Zählung auch automatisch..
Noch schöner, wenn man Klassen auch statisch verwenden könnt.
Aber man will ja nicht zuviel träumen.
ABER vielleicht, weil der Compiler mit 64 Bit eh mal entstaubt werden muss, und man dann ja nicht mehr die Ausrede benutzen kann, dass Delphi Programme noch auf 386 laufen und laufen müssen, vielleicht schaffen sie ja eine Art Plattformcompiler für C++ und Delphi, der dann alles kann :-)


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