Ich bin gerade bischen am spielen mit den neuen coolen Features von überladenen Operatoren von Delphi2006
Ich möchte folgenen Aufruf starten:
Delphi-Quellcode:
var
st : String;
IBZeit : TIBZeit;
begin
IBZeit := now;
st := IBZEit;
showmessage(st);
st := IBZEit + '5min';
showmessage(st);
end;
jetzt ist es doch in der Tat so, dass er erstaunlicherweise zu der Zeit die 5 Minuten hinzuaddiert. (schonmal cool)
Er wandelt IBZeit sozusagen in TDateTime um. und den String auch in die IBZeit.
Woher weiß ich das ?
Man hätte ja genauso annehmen können, dass IBZeit in einen String umgewandelt wrd und dann der String '5min' angehangen wird.
Die Logik verstehe ich nicht so ganz. wie kommt das ?
Delphi-Quellcode:
//==============================================================================
TIBZeit = record
strict private
Value : TDateTime; // am genauesten . unix Zeit ist ja nur bis auf eine Sekunde auflösend (Sekunden seit 1970)
public
class operator implicit(UnixTime : Int64) : TIBZeit;
class operator implicit(Zeit : TDateTime) : TIBZEit;
class operator implicit(Value : String) : TIBZeit;
class operator implicit(Self : TIBZeit) : String;
class operator implicit(Self : TIBZeit) : TDateTime;
class operator add(Zeit1, Zeit2 : TIBZeit) : TIBZeit;
end;
implementation
//==============================================================================
class operator TIBZeit.implicit(UnixTime : Int64) : TIBZEIT;
begin
result.Value := UnixToDateTime(UnixTime);
end; // implicit
//==============================================================================
class operator TIBZeit.implicit(Zeit : TDateTime) : TIBZeit;
begin
result.value := Zeit;
end; // implicit
//==============================================================================
class operator TIBZEit.implicit(Value : String) : TIBZeit;
var Stunden,Minuten, Sekunden, MilliSekunden : Word;
begin
result.Value := 0;
Stunden := 0;
Minuten := 0;
Sekunden := 0;
Millisekunden := 0;
Value := uppercase(Value);
if pos('MIN', Value) > 0 then begin
Value := StringReplace(Value,'MIN','', [rfReplaceAll]);
Minuten := StrToInt(Value);
result.Value := encodeTime(Stunden,Minuten,Sekunden,Millisekunden);
end;
end; // implicit
//==============================================================================
//==============================================================================
class operator TIBZEit.implicit(Self : TIBZeit) : String;
var formatString : STring;
begin
formatString := 'yyyymmdd hh:nn:ss';
result := FormatDateTime(formatString, self.value) + ' CET';
end;
//==============================================================================
class operator TIBZEit.implicit(Self : TIBZeit) : TDateTime;
begin
result := self.Value;
end;
//==============================================================================
class operator TIBZeit.add(Zeit1, Zeit2 : TIBZeit) : TIBZEit;
begin
result := Zeit1.Value + Zeit2.Value;
end;
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.