![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Доступ к свойствам интерфейса через 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