![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вызов свойства OLEVariant, название которого задано в строке
И. Павел © (2011-01-26 13:11:00)Здравствуйте.
У меня есть объект SomeObj типа OLEVariant. Мне нужно вызвать его свойство, название которого содержится в строке SomeStr и присвоить ему некоторое значение.
Подскажите, пожалуйста, есть ли какой-нибудь стандартный механизм выполнить эту операцию?
Т.е. что-то вроде:
...
...
f('SomeProperty');
...
function f(s)
begin
SomeObj.SetProperty(s, 'value');
...
Заранее спасибо.
PS: у меня пока только есть идея создать интерфейс с одним методом, который будет возвращать нужное свойство и переопределять его от объекта к объекту, и в функцию передавать объект с правильной в данной ситуации реализацией метода, но это очень громоздко и тогда уж проще перебирать варианты через case...
И. Павел (2011-01-26 19:46:00) [1]
> oxffff © (26.01.11 15:46) [8]
Спасибо.
oxffff (2011-01-26 15:46:00) [2]
> И. Павел © (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 15:44:00) [3]> уже готовая реализация [2].
Реализация не [2] а [1]... Мозги кипят, путаюсь, а редактировать посты нельзя...
И. Павел (2011-01-26 15:40:00) [4]> SetDynaNameProperty
т.е. не SetDynaNameProperty а VarDispProc.
И. Павел (2011-01-26 15:39:00) [5]> oxffff ©
Спасибо.
Судя по коду SetDynaNameProperty как раз и есть уже готовая реализация [2]. Очень удобно.
oxffff (2011-01-26 15:08:00) [6]Попробуй
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 14:31:00) [7]> Сергей М. ©
Спасибо.
oxffff (2011-01-26 14:23:00) [8]
> Подскажите, пожалуйста, есть ли какой-нибудь стандартный
> механизм выполнить эту операцию?
Есть руки.com :)
Сергей М. (2011-01-26 14:08:00) [9]диспинтерфейс, ссылка на который хранится в OleVariant-переменной, обязанподдерживать и реализовывать методы GetIdsOfNames и Invoke.
Явное использование этих методов есть ключ к решению задачи.