@ Sherlock:
Was würdest Du dann für eine Repräsentation von "nicht vorhanden" in einem Double-Wert verwenden, der als gültiger Wert beispielsweise zwischen -1E6 und 1E6 liegen kann. Früher wurde in dem System so etwas wie 1E32 dafür verwendet, was sich aber als besch^^^^^ungünstig herausgestellt hat.
Interpretation oder Kodierung allgemein (1E32 ist 'nicht vorhanden') zur Darstellung von Eigenschaften ist immer Murks. Immer. Du könntest dann auch '1234567' nehmen. Genauso blöd.
Ich würde mit Variants arbeiten. Dort kannst Du wunderbar mit dem als Zahl oder Datum nicht existierenden Wert 'nicht vorhanden' arbeiten, ohne irgendwelche Werte zu interpretieren. Variants haben explizite Konstanten (eigentlich sind das Funktionen, aber wie nicht veränderbare Konstanten zu behandeln), die da heißen 'Unassigned' und 'Null'. Damit hast Du deinen 'nicht vorhanden' Wert explizit dargestellt, kannst vor dem Zugriff prüfen etc.
Wenn Dir Variants nicht passen (es soll Leute geben, die rümpfen die Nase, weil Variants angeblich ultralangsam sind. Oder old school), dann verwende doch einen Record, so in etwa.
Delphi-Quellcode:
Type
TDateTimeRec =
Record
private
var
fValue : TDateTime;
fIsValid : Boolean;
function GetValue: TDateTime;
procedure SetValue(
const Value: TDateTime);
public
Property Value : TDateTime
Read GetValue
Write SetValue;
Property IsValid : Boolean
Read fIsValid
Write fIsValid;
End;
{ TDateTimeRec }
function TDateTimeRec.GetValue: TDateTime;
begin
if not isValid
Then Raise Exception.Create('
Datetime not valid');
result := fValue;
end;
procedure TDateTimeRec.SetValue(
const Value: TDateTime);
begin
fValue := Value;
IsValid := True;
end;
Allerdings sind Variants auch nichts anderes als Records...
Und: Ja, man muss ab und zu ein wenig mehr tippen, wenn man es richtig(er) machen will.