Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.26;
Скачать: CL | DM;

Вниз

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

 
sally   (2006-01-25 10:25) [0]

Можно ли сделать следующее:
 есть объет, который реализует некоторый интерфейс. Доступиться к его свойствам через 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.


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

IDispatch


 
jack128 ©   (2006-01-25 10:37) [2]

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

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


 
Ega23 ©   (2006-01-25 10:40) [3]

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


 
sally   (2006-01-25 11:01) [4]

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


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

>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. Можно ли заставить аналогично получать значения свойств для интерфейса и если можно, то как??


 
Digitman ©   (2006-01-25 11:26) [6]


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


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

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


 
jack128 ©   (2006-01-25 11:26) [7]

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

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


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


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


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


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

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

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


 
Digitman ©   (2006-01-25 11:41) [10]


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


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


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


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


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

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

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


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


> sally   (25.01.06 11:48) [11]


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


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

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


 
jack128 ©   (2006-01-25 12:36) [13]

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


 
Digitman ©   (2006-01-25 12:47) [14]


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


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


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

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


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


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


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

--
Regards, LVT.



Страницы: 1 вся ветка

Текущий архив: 2006.02.26;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.048 c
8-1127121475
NightLord
2005-09-19 13:17
2006.02.26
Графические форматы


15-1138014947
Laymer
2006-01-23 14:15
2006.02.26
Web - server


15-1139141206
Gero
2006-02-05 15:06
2006.02.26
Jpeg2000


2-1139411905
GoshaT
2006-02-08 18:18
2006.02.26
Изменить массив


11-1120230729
Dodfr
2005-07-01 19:12
2006.02.26
Known problems with KOL DLL using forms and applet ?