Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вызов свойства 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.

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо