Главная страница
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.011 c
2-1296014917
novai
2011-01-26 07:08
2011.05.01
Помогите оптимизировать не большой код


2-1295687013
Dimonch-Ik
2011-01-22 12:03
2011.05.01
Tcalendar


15-1295343778
Knight
2011-01-18 12:42
2011.05.01
Программа regmon+filemon


2-1295978254
caHek
2011-01-25 20:57
2011.05.01
Delphi авторизация на сайте, и .....


3-1256619451
vovka-x13
2009-10-27 07:57
2011.05.01
Аутентификация в базах данных