Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - TDate in Variant


mtm - Mo 13.09.10 16:40
Titel: TDate in Variant
Hallo zusammen,

ich bin dabei mich in Delphi einzuarbeiten und probiere ein bisschen rum. Ich bin dabei eine Prozedur zu schreiben, die bei einem unbekannten Eingabewert (auch Typ ist unbekannt) den Datentyp herauszufinden. Den Eingabewert habe ich als Variant definiert und ich prüfe den Typ per VarType. Das funzt eigentlich auch ganz gut.

Probleme gibt es nur mit Datum- bzw. Zeit-Angaben. Ein Datum vom Typ TDate erkennt er nicht als Datum sondern als Double. Das ist zwar logisch, weil TDate vom Typ Double ist, aber ein Datum vom Typ TDateTime erkennt er als Datum, obwohl TDateTime auch vom Typ Double ist.
Jetzt könnte ich natürlich alle Datums-Werte als TDateTime übergeben, aber wie kann ich dann Datums- und Zeit-Werte unterscheiden ?

Kennt einer von Euch dafür eine Lösung.

Danke im Voraus
mtm

P.S. : bitte keine Sinnfrage, was die Prozedur betrifft. Wie gesagt, ich bin nur am rumprobieren.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure erkenneWert(pWert:Variant);
begin
  case VarType(pWert) of
    varSmallint,varInteger,varShortInt,varByte, varWord, varLongWord, varInt64 :
      ShowMessage('Integer');
    varSingle, varDouble:
      ShowMessage('Float');
    varString:
      ShowMessage('String');
    varDate:
      ShowMessage('Datum');
    varBoolean:
      ShowMessage('Boolean');
    varCurrency:
      ShowMessage('Währung');
  end;
end;


alzaimar - Mo 13.09.10 16:46

Soweit ich mich erinnere, ist 'TDate' an sich nicht unterstützt, sondern immer nur der TDateTime-Datentyp. Ein reines Datum ist demnach "Datum um Mitternacht" als TDateTime.


Tranx - Mo 13.09.10 19:06

Das Problem ist, dass jeder double-Wert von >-693000 ein gültiges Datum ergibt. Somit gibt es keine Möglichkeit, eine double-Variable von einer Datetime-Variable zu unterscheiden. So weit ich dies weiß.

Wenn Du die Datumsangaben zeitlich reduzieren könntest (z.B. vom 1.1.2000 - 31.12.2100), dann kannst Du ja alle double-Werte auf gültige Datumsangaben überprüfen. Aber das löst das Problem nicht.

Eine expliziete Umwandlung durch z.B. StrToDateTime führt automatisch zu einer Belegung des Vartype mit varDate, also einer Datumsangabe. Aber eine Eingabe in irgendein Textfeld oder das Auslesen irgendwelcher Felder in Datenbanken bereitet da größere Schwierigkeiten zur Entscheidung.


Martok - Mo 13.09.10 20:00

Das Problem ist, dass TDateTime teilweise Compiler-Magic ist, wie man auch daran erkennt dass er in System deklariert wird. Dafür werden dann auch spezielle Konvertierungs-funktionen vom Compiler verwendet (VarFromTDateTime z.B.).

TDate und TTime sind dagegen Typen-Aliase für TDateTime (und damit nicht mit diesem identisch), die aus Controls stammen . Deswegen werden sie vom Compiler her angesehen als "nichts besonderes" und wie jeder andere Flißekommatyp behandelt.

Kann man nichts machen, das ist by-design so.

Auch wenn mich wundert, warum TDate eigentlich kein Ganzzahl-Typ ist. Würde ja reichen...