Форум: "Основная";
Текущий архив: 2003.12.16;
Скачать: [xml.tar.bz2];
ВнизНет ли стандартных методов для доступа к свойствам объекта Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.011 c