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

Вниз

Нет ли стандартных методов для доступа к свойствам объекта   Найти похожие ветки 

 
Slym ©   (2003-12-04 09:41) [0]

Нет ли стандартных методов для доступа к свойствам объекта ПО ИМЕНИ так как у обектов реализующих IDispatch?
например (так бы хотелось)

var d:variant;
begin
d:=TDispatch.Create(Table1);
d.active:=true; //на самом деле у TDispatch нет свойства active вызывается свойство Table1

копаюсь в TypInfo... но такое чувство что я изобретаю колесо


 
REA ©   (2003-12-04 10:14) [1]

А зачем?


 
Slym ©   (2003-12-04 10:34) [2]

чтобы отправить объект в другой модуль (параметр)(MSScriptControl)
а этот модуль нифига не знает о структуре объекта! кроме имен свойств.

типа ты как Ворд вызываешь? типа знаешь по какому адресу находится искомое свойство, чтобы напрямую его взять? за тебя это делает интерфейс IDispatch. в котором преобразуется имя свойства в номер и по номеру вызывается!

в конце концов я буду со всеми объектами обращаться как с variant


 
REA ©   (2003-12-04 10:58) [3]

Ну дык COM/DCOM зачем изобретали? Почитай - там русским по белому написано как сервер автоматизации сделать.


 
Polevi ©   (2003-12-04 11:20) [4]

пиши прокси объект, реализующий IDispatch, в реализации Invoke оного используй RTTI информацию реального объекта. есть готовое решение у Елмановой в книжке "..ADO в Delphi"


 
Slym ©   (2003-12-04 11:26) [5]

Ты не понял. Ком делать умею, но не хочу (делаю :()
Мне нужна оболочка для доступа к свойствам ЛЮБОГО! компонента с published свойствами, посредством OLE автоматизации.
чтобы любой стандартный класс превратить в COM объект

нет ли стандартных, уже готовых решений?


 
Slym ©   (2003-12-04 11:52) [6]

2 Polevi - ЗЫ... Книжки такой у меня нет! а книженка с CD... Вот бы этот примерчик.


 
Тимохов   (2003-12-04 11:55) [7]

Фантастика: "чтобы любой стандартный класс превратить в COM объект".
Неужно это правда кто-то умеет?


 
Polevi ©   (2003-12-04 12:02) [8]

я все понял, а ты нет

TVCLProxy = class(TInterfacedObject, IDispatch, IQueryPersistent)
private
FOwner: TPersistent;
public
{ IDispatch }
function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
function GetIDsOfNames(const IID: TGUID; Names: Pointer;
NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;

constructor Create(AOwner:TPersistent);
end;

constructor TVCLProxy.Create(AOwner: TPersistent);
begin
inherited Create;
FOwner := AOwner;
end;

function TVCLProxy.GetTypeInfoCount(out Count: Integer): HResult;
begin
Count := 0;
Result := E_NOTIMPL;
end;

function TVCLProxy.GetTypeInfo(Index, LocaleID: Integer;
out TypeInfo): HResult;
begin
Pointer(TypeInfo) := NIL;
Result := E_NOTIMPL;
end;

function TVCLProxy.GetIDsOfNames(const IID: TGUID; Names: Pointer; NameCount,
LocaleID: Integer; DispIDs: Pointer): HResult;
var
S: String;
Info: PPropInfo;
begin
Result := S_OK;
S := PNamesArray(Names)[0];
Info := GetPropInfo(FOwner.ClassInfo, S);
if Assigned(Info) then begin //есть паблишед свойство с таким именем
PDispIdsArray(DispIds)[0] := Integer(Info);
end else
Result := DISP_E_UNKNOWNNAME;
end;

function TVCLProxy.Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult;
begin
//Dispid содержит указатель на PropInfo свойства
//через RTTI можно получить-установить его значение
end

var
b:VCLProxy;
begin
b:=TVCLProxy.Create(Button1);
// b реализует IDispatch - можно передать его в MSScriptControl
end;


 
Digitman ©   (2003-12-04 12:11) [9]


> нет ли стандартных, уже готовых решений?


нет. и быть не может.

вникни - метод IDispatch.Invoke() требует индекс (уник.ид-р) метода диспинтерфейса, в то время как RTTI хранит published-идентификаторы, ассоциируя их с уникальным именем, а индексом ...
так что в любом случае для каждого отдельно взятого объекта придется писать "конвертор", который в ответ на вызов IDispatch.GetIDsOfNames() найдет (или не найдет, если не существует) в RTTI соотв.имя published-идентификатора и вернет некий его уник.индекс... это - одна из многих встающих задач, которые без приложения именно тобой "шаловливых ручек" никто за тебя не сделает)


 
Digitman ©   (2003-12-04 12:15) [10]

ну , собственно, Polevi © (04.12.03 12:02) [8] уже все показал на эту тему)



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

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

Наверх




Память: 0.49 MB
Время: 0.023 c
9-52042
Орлёнок
2003-05-31 10:56
2003.12.16
мерцание имаги...


1-52284
sohat
2003-12-03 10:10
2003.12.16
Окно неактивного приложения поверх модального окна активного???


9-52045
Livid
2003-06-02 22:54
2003.12.16
kf2->max


14-52346
Ord3f8h
2003-11-23 17:31
2003.12.16
Полный мануал по работе с файлами и вопрос


1-52248
Oleg_
2003-12-04 13:50
2003.12.16
webbrowser