Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Рекорды с методами в Delphi 2007  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 890
Реализовал безобидный на первый взгляд рекорд:

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 не всё хорошо
2 июл 19, 12:05    [21918881]     Ответить | Цитировать Сообщить модератору
 Re: Рекорды с методами в Delphi 2007  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3789
DmSer,

2006, 2007 имеют такие проблемы при вызове методов у возвращаемых записей. Решений два: сохранять в переменную или использовать with (with adataset.valuebyname['name'] do). Есть ещё способ, но он может не подойти - возвращать указатель на запись.
2 июл 19, 12:12    [21918889]     Ответить | Цитировать Сообщить модератору
 Re: Рекорды с методами в Delphi 2007  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11192
Kazantsev Alexey
2006, 2007 имеют такие проблемы при вызове методов у возвращаемых записей
Спорить не буду, но как-то ни разу не сталкивался
2 июл 19, 13:12    [21918946]     Ответить | Цитировать Сообщить модератору
 Re: Рекорды с методами в Delphi 2007  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2198
Kazantsev Alexey
2006, 2007 имеют такие проблемы при вызове методов у возвращаемых записей. Решений два: сохранять в переменную или использовать with (with adataset.valuebyname['name'] do). Есть ещё способ, но он может не подойти - возвращать указатель на запись.
С учетом дженериков подобные проблемы тянутся до Delphi XE. Только вчера фиксил...
2 июл 19, 16:50    [21919223]     Ответить | Цитировать Сообщить модератору
 Re: Рекорды с методами в Delphi 2007  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6526
OFF

я правильно понимаю, что "рекорды с методами" это вернувшееся из Turbo Pascal понятие "object" (когда объекты могли быть статическими) вместо дельфийского "class"?
2 июл 19, 16:55    [21919228]     Ответить | Цитировать Сообщить модератору
 Re: Рекорды с методами в Delphi 2007  [new]
rgreat
Member

Откуда:
Сообщений: 5359
Кроик Семён
OFF

я правильно понимаю, что "рекорды с методами" это вернувшееся из Turbo Pascal понятие "object" (когда объекты могли быть статическими) вместо дельфийского "class"?
Нет.
2 июл 19, 16:57    [21919232]     Ответить | Цитировать Сообщить модератору
 Re: Рекорды с методами в Delphi 2007  [new]
rgreat
Member

Откуда:
Сообщений: 5359
Объекты кстати и сейчас существуют и работают.

Но у объектов и рекордов разные модели памяти.
2 июл 19, 16:58    [21919233]     Ответить | Цитировать Сообщить модератору
 Re: Рекорды с методами в Delphi 2007  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3789
white_nigger
С учетом дженериков подобные проблемы тянутся до Delphi XE. Только вчера фиксил...

Я дженериками активно не пользуюсь, но с ними проблемы и на XE2 вылазят.
2 июл 19, 17:08    [21919252]     Ответить | Цитировать Сообщить модератору
 Re: Рекорды с методами в Delphi 2007  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5192
rgreat
Объекты кстати и сейчас существуют и работают.

Но у объектов и рекордов разные модели памяти.
это как?
2 июл 19, 17:36    [21919303]     Ответить | Цитировать Сообщить модератору
 Re: Рекорды с методами в Delphi 2007  [new]
rgreat
Member

Откуда:
Сообщений: 5359
kealon(Ruslan)
это как?

http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Internal_Data_Formats_(Delphi)#Class_Types
vs
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Internal_Data_Formats_(Delphi)#Record_Types
2 июл 19, 18:32    [21919347]     Ответить | Цитировать Сообщить модератору
 Re: Рекорды с методами в Delphi 2007  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5192
rgreat,

как связаны упоминавшийся Object и Class ?
2 июл 19, 20:10    [21919428]     Ответить | Цитировать Сообщить модератору
 Re: Рекорды с методами в Delphi 2007  [new]
Bali
Member

Откуда:
Сообщений: 56
Попробуйте объявить вот так:
TDataValue = packed 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;
2 июл 19, 21:48    [21919486]     Ответить | Цитировать Сообщить модератору
 Re: Рекорды с методами в Delphi 2007  [new]
Dimitry Timokhov
Member

Откуда: Москва
Сообщений: 33
Бывают проблемы в Delphi2007 - то internal/external error, то память течет. Но разбираюсь по месту.

Посмотрел сейчас у себя. У меня есть обертка над varDecimal (которого, я так понял до сих пор в дельфи нет). И методы есть, и операции.

Как раз запись, но packed. Работает.
9 июл 19, 21:05    [21923795]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить