Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Доступ к свойствам интерфейса через RTTI


sally ©   (2006-01-25 10:25:00) 

Можно ли сделать следующее:
 есть объет, который реализует некоторый интерфейс. Доступиться к его свойствам через RTTI(GetPropValue) не проблема. Но если данный объект имеет свойство типа Interface и нужно получить свойства данногоInterface-свойства, то вроде как проблема. Т.е. хотелось бы иметь метод для объекта типа Values(PropName), который бы находил ЛЮБЫЕ PUBLISHEDсвойства данного объекта.
 TSomeObject = class(TPersistent)
 public
   function Values(PropName): variant;
 published
    property A: integer;
    property Obj: ISomeInterface;
 end;
 
Хотелось бы чтобы крректно выполнялся данный код
SomeObject: TSomeObject;
 ShowMessage(VarToStr(SomeObject.Values['A'])); // значение свойства A
 ShowMessage(VarToStr(SomeObject.Values['Obj.SomeProp'])); // значение свойства SomeProp объекта Obj.


Leonid Troyanovsky   (2006-01-25 15:50:00) [1]


> sally   (25.01.06 10:25)  
> Можно ли сделать следующее:


На сайте Анатолия Подгорецкого (http в анкете) есть сборник "Весь Тенцер".
Найдя статью "Использование Microsoft ScriptControl" можно почерпнуть
оттуда много полезного, вкл. вызов GetIdsOfNames, Invoke и трансляцию
вызовов OLE-Automation в обращения к свойствам компонентов VCL и т.д.

--
Regards, LVT.


Digitman   (2006-01-25 12:47:00) [2]


> jack128 ©   (25.01.06 12:36) [13]


> Странно, конечно...


Ничего странного.

Серверу автоматизации св-ва не нужны, а нужны они лишь контроллеру автоматизации (для удобства) и фигурируют они лишь в объявлении соответствующего интерфейсу диспинтерфейсе. При обнаружении обращения кл.приложения к св-ву диспинтерфейса компилятор находит соотв.методы в соотв.интерфейсе и подставляет код вызова того или иного метода.


jack128   (2006-01-25 12:36:00) [3]

Хе, эксперемент показал, что о свойствах интерфесов rtti не генерится, а вот о методах - без проблем. Странно, конечно...


Digitman   (2006-01-25 12:14:00) [4]


> sally   (25.01.06 11:48) [11]


> нет, не используются.


Тогда есть резон наследовать объекты, интерфейсы которых фигурируют в кач-ве ISomeInterface, от класса TTypedComObject либо TAutoIntfObject

И в том и в другом случае будет фигурировать библиотека типов, которую можно не регистрировать в реестре (параметр ClassInstancing = ciInternal при создании фабрики класса).
Через интерфейс ITypeInfo соответствующей фабрики класса можно получить инф-цию о типах.


sally   (2006-01-25 11:48:00) [5]

>ЛЮБОЙ интерфейс есть наследник IUnknown.
трудно спорить  :)

>Ты сначала скажи, эти интерфейсы используются где-либо кем-либо ЗА >пределами твоего приложения ?
нет, не используются.


Digitman   (2006-01-25 11:41:00) [6]


> sally   (25.01.06 11:38) [9]
> нет, не IUnknow


ЛЮБОЙ интерфейс есть наследник IUnknown.


> поподробнее можно?


Ты сначала скажи, эти интерфейсы используются где-либо кем-либо ЗА пределами твоего приложения ?


sally   (2006-01-25 11:38:00) [7]

нет, не IUnknow. Просто класс может иметь несколько свойств-интерфейсов и как прикажете доставать свойства этих свойств-интерфейсов. Для классов - никаких проблем.

>digitman
а поподробнее можно?


Ega23   (2006-01-25 11:31:00) [8]


> как это не знаешь?
>


Я так понял, что у него IUnknown.


Digitman   (2006-01-25 11:26:00) [9]


> Можно ли заставить аналогично получать значения свойств
> для интерфейса


Аналогично нельзя.

Но можно воспользоваться библиотеками типов (если таковые зарегистрированы в системе) тех объектов, интерфейсы которых в дан.ситуации фигурируют в кач-ве ISomeInterface


jack128   (2006-01-25 11:26:00) [10]

sally   (25.01.06 11:15) [5]
А если я не знаю какой интерфейс??

как это не знаешь?


sally   (2006-01-25 11:15:00) [11]

>jack128
А если я не знаю какой интерфейс??

function TSomeObject.Values(AName: string): variant;
var
 AObjectPropName: string;
 AInstance: TObject;
 i, N: integer;
begin
 Result := Null;
 if pos('.', AName) = 0 then
 begin
   if IsPublishedProp(Self, AName) then
     Result := GetPropValue(Self, AName);
 end
 else
 begin
   AInstance := Self;
   N := WordCount(AName, ['.']);
   for i := 1 to N - 1 do
   begin
     AObjectPropName := ExtractWord(i, AName, ['.']);
     if IsPublishedProp(AInstance, AObjectPropName) then
       AInstance := GetObjectProp(AInstance, AObjectPropName);
   end;
   AObjectPropName := ExtractWord(N, AName, ['.']);
   if Assigned(AInstance) and IsPublishedProp(AInstance, AObjectPropName) then
     Result := GetPropValue(AInstance, AObjectPropName);
 end;

Все хорошо работает пока в качестве свойства не появляется Interface. Можно ли заставить аналогично получать значения свойств для интерфейса и если можно, то как??


sally   (2006-01-25 11:01:00) [12]

>ega23
>Только из описания интерфейса.
Непонятно... Что это значит?


Ega23   (2006-01-25 10:40:00) [13]

Только из описания интерфейса.


jack128   (2006-01-25 10:37:00) [14]

возможно твой интерфейс нужно обрамить в {$M+} {$M-}.    В структуре TTypeData есть свой раздел под интерфейсы
     tkInterface: (
       IntfParent : PPTypeInfo; { ancestor }
       IntfFlags : TIntfFlagsBase;
       Guid : TGUID;
       IntfUnit : ShortStringBase;
      {PropData: TPropData});

так что проблем теоритически быть не должно.


Lamer@fools.ua   (2006-01-25 10:35:00) [15]

IDispatch


Наверх

Титульная страница Поиск, карта сайта Написать письмо