Как в published property обрабатывать record, или ...

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Как в published property обрабатывать record, или ...

Сообщение Aleh » 23.10.2018 11:56:40

Как в published property обрабатывать record, или как опросить publiс property функций типа GetPropList(self, PropList) из модуля typinfo.
Есть record, например
Код: Выделить всё
 
PMapPt = ^TMapPt
TMapPt = packed record
   case Integer of
   1:(N, n1:integer;  x, y, z:double);
   2:(N64:int64);
   end;


есть класс
Код: Выделить всё
  TMapObject = Class
.....
FScale, FBasePoint:TMapPt;
......

есть property BasePoint:TMapPt read FBasePoint write FBasePoint;
если она в секции public - компилируется, но BasePoint невидима для функций типа GetPropList(self, PropList) из модуля typinfo
если она в секции published - не компилируется - ругается что так нельзя, и PMapPt тоже нельзя.
У меня только 1 мысль- написание классов-обёрток для таких record. Но сие трудозатратно.
Может кто с этим столкнулся, и поборол, поделитесь опытом.
Заранее благодарен.
Aleh
новенький
 
Сообщения: 53
Зарегистрирован: 08.08.2016 12:27:45

Re: Как в published property обрабатывать record, или ...

Сообщение serbod » 23.10.2018 12:09:20

Сделай функции конвертации TMapPt в строку и обратно, и в published property размещай эту самую строку.
Аватара пользователя
serbod
постоялец
 
Сообщения: 342
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Как в published property обрабатывать record, или ...

Сообщение Aleh » 23.10.2018 12:38:10

Нет, это хуже классов-обёрток.
Вот пришла в обработчик BasePoint:string. откуда обработчик узнает, что это TMapPt? У класса-обёртки есть инфа, у строчки-нет.

Добавлено спустя 12 минут 39 секунд:
Немного поясню по обработчику
Код: Выделить всё
var TypInf:TPropInfo;//описание текущей проперти
begin
.....
if TypInf.PropType.Kind=tkRecord then//это структура - вот чего я хочу !!!!!!
      begin
       if TypInf.PropType.Name='TMapPt' then//это точка
          begin
           ... примитивные тотальные проверки  и обработки ВСЕХ точек
          end else
       if TypInf.PropType.Name='TCanvasParam' then//это раскраска
          begin
           ... примитивные тотальные проверки  и обработки ВСЕХ параметров ВСЕХ раскрасок
          end else
........

и избежать например такой обработки (что б бесполезные нули в xml не писать)
Код: Выделить всё
 
.......
Value:='';
........
  2:if FClassCod<>0 then Value:=inttostr(FClassCod);
   3:if FMapType<>0 then Value:=inttostr(FMapType);
   4:if PointFormat<>0 then Value:=inttostr(PointFormat);
   5:if FCapsFlag<>0 then Value:=inttostr(FCapsFlag);
..... и далее 300 шт

if Value='' then exit; //пустая
... пишем


заменив на
if Value='0' then//получена штатно
   begin
    if(TypInf.PropType.Kind=tkInteger)or(TypInf.PropType.Kind=tkInt64)or(TypInf.PropType.Kind=tkFloat)//числовая проперть
     then Value:='';
   end else .....
.......
if Value='' then exit; //пустая
... пишем


Aleh
новенький
 
Сообщения: 53
Зарегистрирован: 08.08.2016 12:27:45

Re: Как в published property обрабатывать record, или ...

Сообщение serbod » 23.10.2018 16:16:33

Aleh писал(а):Нет, это хуже классов-обёрток.
Вот пришла в обработчик BasePoint:string. откуда обработчик узнает, что это TMapPt? У класса-обёртки есть инфа, у строчки-нет.


Обработчик чего? Всякие TReader и TWriter сами умеют отличать базовые типы published свойств классов. Но твой record не является базовым типом, поэтому его по-любому нужно конвертировать в какой-то базовый тип. Да, ты можешь его зарегистрировать в системе типов под конкретным именем, но базовым типом он от этого не станет.

Строковое представление всегда в хозяйстве пригодится, а разбор и валидацию принятой строки сделать не такая уже и большая задача. =) Класс-обертка тоже конвертируется в строку, так что вряд ли что-то изменится.
Аватара пользователя
serbod
постоялец
 
Сообщения: 342
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Как в published property обрабатывать record, или ...

Сообщение Aleh » 24.10.2018 09:42:51

serbod писал(а):Обработчик чего?

Сказано же - пропертей. Код (рамочно) в посте выше.
Написал первую обёртку TCoverMapRect. Что-то не то. Получается, на такие проперти надо писать персональные обработчики, что не есть хорошо. ...думаю.

Добавлено спустя 5 минут 12 секунд:
Aleh писал(а):Строковое представление в хозяйстве пригодится
раньше был согласен, хотя практика показала, что не так уж нужно. Сейчас старым пользуюсь, новое не пишу.
Aleh писал(а):Класс-обертка тоже конвертируется в строку
- НЕТ, он служит для передачи нативного!!! рекорда "из пункта А в пункт Б"

Добавлено спустя 7 минут 49 секунд:
вот
Код: Выделить всё
  TCoverProp  = class
  end;

  TCoverMapRect = class(TCoverProp)
   R:TMapRect;
  end;


Добавлено спустя 13 минут 29 секунд:
далее
Код: Выделить всё
   property Gabarits:TCoverMapRect read GetGabarits  write SetGabarits;//сама проперть
function TMapObject.GetGabarits: TCoverMapRect;
begin
result:=TCoverMapRect.Create;
result.R:=MapRect;//MapRect - рекорд в классе
end;

procedure TMapObject.SetGabarits(AValue:TCoverMapRect);
begin
  if AValue=nil then exit;
  MapRect:=AValue.R;
  AValue.Free;
end;
// в потомке
   property ExtendRect:TCoverMapRect read GetExtendRect  write SetExtendRect2; //   FExtendRect:TMapRect;//фиксированный экстент pulkovo42

function TMapFrame.GetExtendRect: TCoverMapRect;
begin
result:=TCoverMapRect.Create;
result.R:=FExtendRect;
end;

procedure TMapFrame.SetExtendRect2(AValue: TCoverMapRect);
begin
  if AValue=nil then exit;
  SetExtendRect(AValue.R);
  AValue.Free;
end;


в общем на каждую проперть этого типа надо писать эти примитивные обработчики.
нормальная эволюция проги, когда рекорды эволюционируют в классы, тогда тема закроется, но выходит с рекордами в пропертях беда.
Aleh
новенький
 
Сообщения: 53
Зарегистрирован: 08.08.2016 12:27:45

Re: Как в published property обрабатывать record, или ...

Сообщение serbod » 24.10.2018 10:28:11

Нужно публиковать элементы самой TMapPt:
Код: Выделить всё
TMapPoint = class
private
  FMapPt: TMapPt;
published
  property N: Integer read FMapPt.N write FMapPt.N;
  property n1: Integer read FMapPt.n1 write FMapPt.n1;
  property x: Double read FMapPt.x write FMapPt.x;
  property y: Double read FMapPt.y write FMapPt.y;
  property z: Double read FMapPt.z write FMapPt.z;
end;


Но через строковое представление было бы проще. Есть международный стандарт ISO 6709, описывающий формат записи координат.
Аватара пользователя
serbod
постоялец
 
Сообщения: 342
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Как в published property обрабатывать record, или ...

Сообщение Aleh » 24.10.2018 11:01:50

Да, блин, TMapPt просто взят для примера, как самый простой рекорд, а вообще в рекордах обычно 10-20 полей. С публикацией элементов я уже пробовал - ерунда. Лазарь "недолюбливает" такие вещи как "read FMapPt.x", об них сильно спотыкался TTIPropertyGrid. В частности для точки положения карты этот способ загонит функции проецирования в экстремальные режимы ((0,0)Атлантич.океан возле Нигерии, 30, 0 Конго, 30,53-Витебская обл.). точка нужна вся сразу и с масштабом.
Но я понял, что ты мне хочешь сказать на "вербальном" уровне. Ща попробую...

Добавлено спустя 18 минут 44 секунды:
Код: Выделить всё
в interface
  TSerbod = type string;// твоя
  TAleh = type string;//моя
  TMapRectStr = type string;//рамка карты
........

в классе
......
   Text1: String;
.......
   property SerbodPost:TSerbod read Text1 write Text1;
   property AlehPost:TAleh read Text1 write Text1;

в Обработчике пропертей
     if TypInf.PropType.Kind=tkAString then //строчка
      begin
       if TypInf.PropType.Name='TSerbod' then//строчка твоя
        begin
          ........
        end else
       if TypInf.PropType.Name='TAleh' then//строчка моя
        begin
          ........
        end else
       if TypInf.PropType.Name='TMapRectStr' then//рамка карты
        begin
          ........
        end else
        begin//просто строчка
          ........
        end;

Вот теперь строка "заметно подорожала"....
Aleh
новенький
 
Сообщения: 53
Зарегистрирован: 08.08.2016 12:27:45


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

Рейтинг@Mail.ru