Autor Beitrag
mtm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64

Windows 10 Pro 64 Bit
Delphi XE 6
BeitragVerfasst: Mo 13.09.10 16:40 
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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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.

_________________
Na denn, dann. Bis dann, denn.
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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...

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."