Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Рекорды с методами в Delphi 2007 / 13 сообщений из 13, страница 1 из 1
02.07.2019, 12:05
    #39832680
DmSer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекорды с методами в Delphi 2007
Реализовал безобидный на первый взгляд рекорд:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
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 не всё хорошо
...
Рейтинг: 0 / 0
02.07.2019, 12:12
    #39832687
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекорды с методами в Delphi 2007
DmSer,

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

я правильно понимаю, что "рекорды с методами" это вернувшееся из Turbo Pascal понятие "object" (когда объекты могли быть статическими) вместо дельфийского "class"?
...
Рейтинг: 0 / 0
02.07.2019, 16:57
    #39832884
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекорды с методами в Delphi 2007
Кроик СемёнOFF

я правильно понимаю, что "рекорды с методами" это вернувшееся из Turbo Pascal понятие "object" (когда объекты могли быть статическими) вместо дельфийского "class"?Нет.
...
Рейтинг: 0 / 0
02.07.2019, 16:58
    #39832885
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекорды с методами в Delphi 2007
Объекты кстати и сейчас существуют и работают.

Но у объектов и рекордов разные модели памяти.
...
Рейтинг: 0 / 0
02.07.2019, 17:08
    #39832898
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекорды с методами в Delphi 2007
white_niggerС учетом дженериков подобные проблемы тянутся до Delphi XE. Только вчера фиксил...
Я дженериками активно не пользуюсь, но с ними проблемы и на XE2 вылазят.
...
Рейтинг: 0 / 0
02.07.2019, 17:36
    #39832929
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекорды с методами в Delphi 2007
rgreatОбъекты кстати и сейчас существуют и работают.

Но у объектов и рекордов разные модели памяти.это как?
...
Рейтинг: 0 / 0
02.07.2019, 18:32
    #39832967
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекорды с методами в Delphi 2007
...
Рейтинг: 0 / 0
02.07.2019, 20:10
    #39833006
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекорды с методами в Delphi 2007
rgreat,

как связаны упоминавшийся Object и Class ?
...
Рейтинг: 0 / 0
02.07.2019, 21:48
    #39833023
Bali
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекорды с методами в Delphi 2007
Попробуйте объявить вот так:
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;
...
Рейтинг: 0 / 0
09.07.2019, 21:05
    #39835702
Dimitry Timokhov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекорды с методами в Delphi 2007
Бывают проблемы в Delphi2007 - то internal/external error, то память течет. Но разбираюсь по месту.

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

Как раз запись, но packed . Работает.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Рекорды с методами в Delphi 2007 / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]