Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1295213390
Юрий
2011-01-17 00:29
2011.05.01
С днем рождения ! 17 января 2011 понедельник


2-1296210428
lemparius
2011-01-28 13:27
2011.05.01
Еще одна задача на PageControl


15-1294829907
Пит
2011-01-12 13:58
2011.05.01
Русские символы в Apache


2-1295860172
Артём
2011-01-24 12:09
2011.05.01
Склонение женских и мужских фамилий.


4-1248097401
dmitry_12_08_73
2009-07-20 17:43
2011.05.01
Как по Handle окна определить скроллбар это или нет?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский