Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.12.2012, 06:08
front242 front242 вне форума
Прохожий
 
Регистрация: 12.11.2011
Сообщения: 10
Репутация: 10
По умолчанию Delphi7: GetPropList

Уважаемые, имею траблы с GetPropList. Функция честно возвращает список
property, но когда property имеет тип record, то функция не включает её
в возвращаемый список.

Код:
program enumerator;

{$APPTYPE CONSOLE}

uses
  TypInfo,
  Classes,
  SysUtils;

type

    tRec = record
     x,y : Single;
    end ;

    tBaseClass = class ( TPersistent )
    end ;

    tChild = class( tBaseClass )
    private
      Fbeta: Boolean;
      Falpha: string;
      Flazha: tRec;
    published
      property alpha : string read Falpha write Falpha;
      property beta : Boolean read Fbeta write Fbeta;
      property lazha : tRec read Flazha write Flazha;
    end ;

var
  List: PPropList;
  Count, i : integer;

begin
  with tChild.Create do
   begin
     GetMem(List, 3);
     Count := GetPropList(ClassInfo, tkAny, List);
     for i := 0 to count -1 do
      with List[ I ]^ do
        writeln( format( '%s %s (%s)', [ Name, PropType^.Name, getenumname( typeinfo(TTypeKind ), Integer(PropType^.Kind ) )  ] ) );
     FreeMem( List );
     Free;
   end;
  Readln;
end.

Вывод:

Код:
alpha String (tkLString)
beta Boolean (tkEnumeration)

Можно ли с этим как нибудь побороться?

Последний раз редактировалось front242, 14.12.2012 в 06:39.
Ответить с цитированием
  #2  
Старый 16.12.2012, 10:54
front242 front242 вне форума
Прохожий
 
Регистрация: 12.11.2011
Сообщения: 10
Репутация: 10
По умолчанию

спасибо за помощь, нашел самостоятельно вот этот хак
http://alex.ciobanu.org/?p=55
Ответить с цитированием
  #3  
Старый 16.12.2012, 16:07
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от front242
спасибо за помощь, нашел самостоятельно вот этот хак
http://alex.ciobanu.org/?p=55
А разве этот хак будет работать на Delphi7 ?
Ответить с цитированием
  #4  
Старый 16.12.2012, 19:49
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,055
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от poli-smen
А разве этот хак будет работать на Delphi7 ?

Возможно, будет работать другой "хак". Просто модуль, в котором описана запись, надо скомпилить с поддержкой RTTI ({$M+}, если не ошибаюсь).
Ответить с цитированием
  #5  
Старый 16.12.2012, 20:38
front242 front242 вне форума
Прохожий
 
Регистрация: 12.11.2011
Сообщения: 10
Репутация: 10
По умолчанию

да. к сожалению в 7 это не работает. вопрос остаётся открытым. {$M+} тоже не помогает, видимо потому что TPersistent в Classes уже объявлен режиме $M+

Последний раз редактировалось front242, 16.12.2012 в 20:45.
Ответить с цитированием
  #6  
Старый 16.12.2012, 20:49
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от lmikle
Возможно, будет работать другой "хак". Просто модуль, в котором описана запись, надо скомпилить с поддержкой RTTI ({$M+}, если не ошибаюсь).
Класс TPersistent уже скомпилирован с директивой {$M+}. Следовательно и он, и все его потомки умеют генерировать RTTI информацию для published свойств (ну конечно кроме тех которые скомпилированы с директивой {$M-} и их потомками).
Ответить с цитированием
  #7  
Старый 16.12.2012, 21:31
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 577
Версия Delphi: 6
Репутация: выкл
По умолчанию

Цитата:
Сообщение от poli-smen
ну конечно кроме тех которые скомпилированы с директивой {$M-} и их потомками
ЕМНИП, {$M+} -- логически неотключаемая директива. Достаточно скомпилировать один из предков с {$M+}, чтобы все его потомки были тоже {$M+} вне зависимости от расставленных в коде {$M-}, которые попросту игнорируются.
Ответить с цитированием
  #8  
Старый 16.12.2012, 21:43
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Freeman
ЕМНИП, {$M+} -- логически неотключаемая директива. Достаточно скомпилировать один из предков с {$M+}, чтобы все его потомки были тоже {$M+} вне зависимости от расставленных в коде {$M-}, которые попросту игнорируются.
Совершенно верно. Только что проверил - так в действительности и оказалось.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:29.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter