Рекорды с методами в Delphi 2007

DmSer
Дата: 02.07.2019 12:05:04
Реализовал безобидный на первый взгляд рекорд:

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 не всё хорошо
Kazantsev Alexey
Дата: 02.07.2019 12:12:32
DmSer,

2006, 2007 имеют такие проблемы при вызове методов у возвращаемых записей. Решений два: сохранять в переменную или использовать with (with adataset.valuebyname['name'] do). Есть ещё способ, но он может не подойти - возвращать указатель на запись.
_Vasilisk_
Дата: 02.07.2019 13:12:33
Kazantsev Alexey
2006, 2007 имеют такие проблемы при вызове методов у возвращаемых записей
Спорить не буду, но как-то ни разу не сталкивался
white_nigger
Дата: 02.07.2019 16:50:03
Kazantsev Alexey
2006, 2007 имеют такие проблемы при вызове методов у возвращаемых записей. Решений два: сохранять в переменную или использовать with (with adataset.valuebyname['name'] do). Есть ещё способ, но он может не подойти - возвращать указатель на запись.
С учетом дженериков подобные проблемы тянутся до Delphi XE. Только вчера фиксил...
Кроик Семён
Дата: 02.07.2019 16:55:16
OFF

я правильно понимаю, что "рекорды с методами" это вернувшееся из Turbo Pascal понятие "object" (когда объекты могли быть статическими) вместо дельфийского "class"?
rgreat
Дата: 02.07.2019 16:57:35
Кроик Семён
OFF

я правильно понимаю, что "рекорды с методами" это вернувшееся из Turbo Pascal понятие "object" (когда объекты могли быть статическими) вместо дельфийского "class"?
Нет.
rgreat
Дата: 02.07.2019 16:58:29
Объекты кстати и сейчас существуют и работают.

Но у объектов и рекордов разные модели памяти.
Kazantsev Alexey
Дата: 02.07.2019 17:08:11
white_nigger
С учетом дженериков подобные проблемы тянутся до Delphi XE. Только вчера фиксил...

Я дженериками активно не пользуюсь, но с ними проблемы и на XE2 вылазят.
kealon(Ruslan)
Дата: 02.07.2019 17:36:31
rgreat
Объекты кстати и сейчас существуют и работают.

Но у объектов и рекордов разные модели памяти.
это как?