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

Вниз

Вызов свойства OLEVariant, название которого задано в строке   Найти похожие ветки 

 
И. Павел ©   (2011-01-26 13:11) [0]

Здравствуйте.

У меня есть объект SomeObj типа OLEVariant. Мне нужно вызвать его свойство, название которого содержится в строке SomeStr и присвоить ему некоторое значение.
Подскажите, пожалуйста, есть ли какой-нибудь стандартный механизм выполнить эту операцию?
Т.е. что-то вроде:
...
...
f("SomeProperty");
...
function f(s)
begin
SomeObj.SetProperty(s, "value");
...

Заранее спасибо.

PS: у меня пока только есть идея создать интерфейс с одним методом, который будет возвращать нужное свойство и переопределять его от объекта к объекту, и в функцию передавать объект с правильной в данной ситуации реализацией метода, но это очень громоздко и тогда уж проще перебирать варианты через case...


 
Сергей М. ©   (2011-01-26 14:08) [1]

диспинтерфейс, ссылка на который хранится в OleVariant-переменной, обязан поддерживать и реализовывать методы GetIdsOfNames и Invoke.

Явное использование этих методов есть ключ к решению задачи.


 
oxffff ©   (2011-01-26 14:23) [2]


> Подскажите, пожалуйста, есть ли какой-нибудь стандартный
> механизм выполнить эту операцию?


Есть руки.com :)


 
И. Павел ©   (2011-01-26 14:31) [3]

> Сергей М. ©

Спасибо.


 
oxffff ©   (2011-01-26 15:08) [4]

Попробуй

const CPropertySet = $04;

procedure SetDynaNameProperty(const source:olevariant;
                            const propertyname:ansistring;
                            const Value);
var desc:TCallDesc;
begin
desc.CallType:=CPropertySet;
desc.ArgCount:=1;
desc.NamedArgCount:=0;
ZeroMemory(@desc.ArgTypes[0],sizeof(desc.ArgTypes));
desc.ArgTypes[0]:=$B;
CopyMemory(@desc.ArgTypes[1],@propertyname[1],length(propertyname));
VarDispProc(nil,source,@desc,@value);
end;

procedure TForm4.FormCreate(Sender: TObject);
var a:oleVariant;
   value:boolean;
   disp:olevariant;
begin
disp:=createoleObject("Word.Application");
value:=TRUE;
SetDynaNameProperty(disp,"visible",value);
end;


 
И. Павел ©   (2011-01-26 15:39) [5]

> oxffff ©

Спасибо.
Судя по коду SetDynaNameProperty как раз и есть уже готовая реализация [2]. Очень удобно.


 
И. Павел ©   (2011-01-26 15:40) [6]

> SetDynaNameProperty

т.е. не SetDynaNameProperty а VarDispProc.


 
И. Павел ©   (2011-01-26 15:44) [7]

> уже готовая реализация [2].

Реализация не [2] а [1]... Мозги кипят, путаюсь, а редактировать посты нельзя...


 
oxffff ©   (2011-01-26 15:46) [8]


> И. Павел ©   (26.01.11 15:39) [5]
> > oxffff ©
>
> Спасибо.
> Судя по коду SetDynaNameProperty как раз и есть уже готовая
> реализация [2]. Очень удобно.


Усовершенствуем

Тогда для любого типа

procedure SetDynaNameProperty(const source:olevariant;
                           const propertyname:ansistring;
                           Value:variant);
var desc:TCallDesc;
begin
desc.CallType:=CPropertySet;
desc.ArgCount:=1;
desc.NamedArgCount:=0;
ZeroMemory(@desc.ArgTypes[0],sizeof(desc.ArgTypes));
desc.ArgTypes[0]:=$C;
CopyMemory(@desc.ArgTypes[1],@propertyname[1],length(propertyname));
VarDispProc(nil,source,@desc,@value);
end;


 
И. Павел ©   (2011-01-26 19:46) [9]


> oxffff ©   (26.01.11 15:46) [8]

Спасибо.



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

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

Наверх




Память: 0.49 MB
Время: 0.01 c
15-1295199597
12
2011-01-16 20:39
2011.05.01
Объединенная Земля, будет ли и когда, если да?


15-1295532470
DevilDevil
2011-01-20 17:07
2011.05.01
pf15bit. Потестируйте код


2-1296040315
ZV
2011-01-26 14:11
2011.05.01
Как быстро найти нужный массив, и сделать запись в него.


15-1295299790
Юрий
2011-01-18 00:29
2011.05.01
С днем рождения ! 18 января 2011 вторник


2-1296122380
ZV
2011-01-27 12:59
2011.05.01
ServerSocket , напрягает отправка ответа клиенту по номеру конне