Variants and Type Conversions
13.1 Variants
Variants are slower and less safe. They're used for COM/OLE automation, database field values (Field.Value), and legacy code. TValue (System.Rtti) is the modern typed alternative.
uses System.Variants;
var V: Variant;
begin
V := 42; Writeln(VarTypeAsText(VarType(V))); // Integer
V := 'text'; V := 3.14; V := Now;
V := Null; if VarIsNull(V) then Writeln('null');
V := Unassigned; if VarIsEmpty(V) then Writeln('empty');
V := VarArrayOf([1, 'two', 3.0]);
Writeln(V[1]);
end;13.2 Conversions
Integer → string IntToStr, X.ToString, Format('%d'), IntToHex string → Integer
StrToInt, StrToIntDef, TryStrToInt, S.ToInteger, Val Float ↔ string
FloatToStr, FormatFloat, StrToFloat, TryStrToFloat (with TFormatSettings for culture)
DateToStr, DateTimeToStr, FormatDateTime, StrToDate, ISO8601ToDate, DateToISO8601 Boolean ↔ string BoolToStr(B, True), StrToBool
Integer(Ch), Ord, Chr, TMyEnum(N) Float → Integer Trunc, Round (banker's rounding), Ceil, Floor (System.Math)
Obj as TMyClass (checked), TMyClass(Obj) (unchecked hard cast), Obj is TMyClass
var FS := TFormatSettings.Create('en-US');
var D := StrToFloat('1234.56', FS);
Writeln(FormatFloat('#,##0.00', D, FS));
Writeln(FormatDateTime('yyyy-mm-dd hh:nn:ss', Now)); // note: nn = minutes13.3 Dates and Times
TDateTime is a Double: the integer part is days since 1899-12-30, and the fraction is the time of day.
uses System.DateUtils;
var Today := Date; var NowDT := Now;
var Tomorrow := IncDay(Today);
var Age := YearsBetween(EncodeDate(1995, 6, 15), Today);
Writeln(DayOfTheWeek(Today), ' ', FormatDateTime('dddd', Today));
Writeln(DaysBetween(Today, EncodeDate(2025, 12, 31)));
var Stamp := DateTimeToUnix(Now); var Back := UnixToDateTime(Stamp);
var Utc := TTimeZone.Local.ToUniversalTime(Now);
var SW := TStopwatch.StartNew; // System.Diagnostics
// ... work ...
Writeln(SW.ElapsedMilliseconds, ' ms');