Реализовал безобидный на первый взгляд рекорд:
TDataValue = record
Value: string;
function AsString: string;
function AsInteger(DefVal: Integer = 0): Integer;
function AsFloat(DefVal: Double = 0.0): Double;
function AsDateTime(DefVal: TDateTime = 0.0): TDateTime;
function AsDate(DefVal: TDateTime = 0.0): TDateTime;
function AsTime(DefVal: TDateTime = 0.0): TDateTime;
function AsBoolean(DefVal: Boolean = False): Boolean;
end;
function TDataValue.AsBoolean(DefVal: Boolean): Boolean;
begin
if Value = '' then
Result := DefVal
else
Result := Value = '1';
end;
function TDataValue.AsDate(DefVal: TDateTime): TDateTime;
begin
Result := StrToDateDef(Value, DefVal, SafeIniFormatSettings);
end;
function TDataValue.AsDateTime(DefVal: TDateTime): TDateTime;
begin
Result := StrToDateTimeDef(Value, DefVal, SafeIniFormatSettings);
end;
function TDataValue.AsFloat(DefVal: Double): Double;
begin
Result := StrToFloatDefEx(Value, DefVal);
end;
function TDataValue.AsInteger(DefVal: Integer): Integer;
begin
Result := StrToIntDef(Value, DefVal)
end;
function TDataValue.AsString: string;
begin
Result := Value;
end;
function TDataValue.AsTime(DefVal: TDateTime): TDateTime;
begin
Result := StrToTimeDef(Value, DefVal, SafeIniFormatSettings);
end;
Хотелось ощутить преимущество рекордов с методами в D2007.
Планировал такой способ доступа к значениям:
ADataSet.ValueByName('SUMMA').AsFloat, причем метод ValueByName датасета должен был возвращать TDataValue.
Однако при его использовании возникает External exception (в разных местах). Переделал (избавился от этого рекорда, ошибка пропала, теперь доступ ADataSet.ValF('SUMMA')). Похоже, с такими рекордами в D2007 не всё хорошо