Форум: "Основная";
Текущий архив: 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