Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];

Вниз

Доступ к свойствам интерфейса через 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.051 c
1-1138349420
MMM_corp
2006-01-27 11:10
2006.02.26
как приобщить мне FreeReport к BDS 2006


3-1136285879
Стелс
2006-01-03 13:57
2006.02.26
Обращение к полям


15-1139174677
kilonet
2006-02-06 00:24
2006.02.26
Инструмент для автоматической замены имён переменных


15-1139037393
Репортер
2006-02-04 10:16
2006.02.26
Вывод графики и текста


15-1138827650
Fenik
2006-02-02 00:00
2006.02.26
Странная местная фобия - боязнь анонимов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский