Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.007 c
1-52152
Rim
2003-12-03 11:59
2003.12.16
Табуляция в Memo


14-52386
VictorT
2003-11-21 15:23
2003.12.16
Сортировка CDWordArray


3-52053
Vemer
2003-11-25 13:28
2003.12.16
Правильное подтверждение транзакции.


1-52268
Kott
2003-11-26 22:31
2003.12.16
RX Library


11-52126
Radmir
2003-04-03 21:49
2003.12.16
KolGif и EditBox





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский