Форум: "Начинающим";
Текущий архив: 2011.05.01;
Скачать: [xml.tar.bz2];
ВнизВызов свойства 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.055 c