Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.18;
Скачать: CL | DM;

Вниз

Получение значения по указателю.   Найти похожие ветки 

 
pusrg ©   (2002-04-03 20:33) [0]

Добрый день, уважаемые мастера.
Занимаюсь разработкой мастера под Делфи с помощью интерфейсов Open Tools API.
Для получения значений свойств компонентов использую функцию GetPropValueByName интерфейса IOTAComponent, описанного в модуле toolsapi.pas
Ниже привожу описание этой функции:
function GetPropValueByName(const Name: string; var Value): Boolean;

В переменную Value записывается значение соответствующего св-ва для компонента. Если св-ва "простых" типов, например strings, integer и т.д. то все работает прекрасно...
Но мне нужно получить значение для св-в типа TStrings, например для TRadioGroup.Items. В этом случае в переменную Value как я понимаю записывается указатель на обьект.

Проблема в том, что я не могу извлечь по этому указателю реальное значение списка.
Пробовал например передавать в функцию значение типа Pointer, а затем явно приводить его к типу TStrings(Pointer), ничего не выходит...Так же перебрал массу других вариантов...

Обьясните, как в этом случае корректно получить значение списка.


 
pusrg ©   (2002-04-04 13:42) [1]

Неужели никто не занимался разработкой мастеров и не знает способ извлечения данных для свойств типа TStrings?
Буду благодарен подробным ссылкам (желательно русскоязычным)на тему Open Tools API. Те ссылки, которые мне удалось найти в основном содержат поверхностное описание работы с OTA, причем копируют свое содержание.
Заранее благодарен за любую помощь.


 
deleon ©   (2002-04-04 14:01) [2]

Насколько я понял, для свойств типа TStrings он возвращает IOTAComponent, а у того в свою очередь есть функция
GetComponentHandle, которая возвращает поинтер, так
попробуй TStringList(I.GetComponentHandle)!


 
pusrg ©   (2002-04-04 15:11) [3]

To Deleon
Спасибо за Ваш ответ. Идея была не плоха, но к сожалению - неудача. Пытаюсь выполнить следующий код для компонента TRadioGroup:
var CurControl, CurValue:IOTAComponent;
CurStringsValue: TStringValue;
...
CurStringsValue:=TStringList.create;
//CurControl представляет собой указатель на интерфейс компонента TRadioGroup.
CurControl.GetPropValueByName(StringsProperty[i], CurValue);

//Далее пробовал 3 различных варианта
CurStringsValue:=TStringList(CurValue.GetComponentHandle));
CurStringsValue.Assign(TStringList(CurValue.GetComponentHandle));
CurStringsValue.Assign(TStrings(CurValue.GetComponentHandle));
...
CurStringsValue.Free;

В любом из трех вариантов, при выполнении этой строки, Делфи аккуратно закрывается не выдавая ни одного сообщения. У меня Windows 2000, поэтому пожалуй и тишина... Под 95 скорее всего показала бы стандартное "Программа выполнила не допустимую операцию...".
Но все равно спасибо за помощь...


 
MBo ©   (2002-04-04 15:19) [4]

а вот еще какие есть любопытные слова
GetPropValueByName - Given the index or name, returns the property value.
The untyped var must be large enough to hold the
returned value. If the property is a descendant of
TPersistent, the return value is a TIComponent-
Interface. For properties of any other object type, the return value is nil.



 
pusrg ©   (2002-04-04 15:35) [5]

To MBo
Так позвольте, класс TStrings как раз и является потомком TPersistent.


 
MBo ©   (2002-04-04 15:41) [6]

Виноват, не то предложение выделил ;(
Мне как раз показалось неясным возвращаемое значение
TIComponent-Interface


 
pusrg ©   (2002-04-04 16:34) [7]

To MBo
Вы эту фразу вытащили перед описанием функции в модуле ToolsApi.pas? Если так, хотелось бы узнать какая у Вас версия Делфи. У меня 5.0. И в ней текст практически полностью совпадает, кроме фразы:
If the property is a descendant of TPersistent, the return value is a TIComponent-Interface.

У меня фраза такая:
If the property is a descendant of TPersistent, the return value is a IOTAComponent.

Но этот вариант уже был опробован, см. дискуссию выше.
Справедливости ради (и от безисходности) я решил проверить и Ваш вариант с передачей в функцию GetPropValueByName значения типа IComponent, но этот вариант естественно закончился неудачей - при явном приведении типа к TStrings (или TStringList) выскакивает исключение.


 
MBo ©   (2002-04-04 16:44) [8]

Delphi 5, из editIntf.
В ToolsApi - value is a IOTAComponent.


 
MBo ©   (2002-04-04 16:45) [9]

ксати, в соседней ветке (deleon) cсылки кое-какие


 
pusrg ©   (2002-04-04 17:29) [10]

To MBo
Да в editIntf сохранена старая реализация, для совмещения с предидущими версиями Делфи.
Спасибо за ссылки, но все знакомо...
По ссылке http://sdm.viptop.ru/articles/opentools.html я фактически учился работать с интерфейсами.
Уже накачал кучу экспертов из инета с целью найти исходный код по своему вопросу. Но пока ничего не нашел. Если и используется функция GetPropValueByName то для получения простых св-в типа Name и т.д.
Если Вам известны ссылки на эксперты в исходниках, работающие со св-вами TStrings компонентов не сочтите за труд кинуть ссылочку.


 
MBo ©   (2002-04-04 17:33) [11]

на codecentral.borland.com не искал?


 
pusrg ©   (2002-04-04 21:11) [12]

Нашел!!!
To MBo
Большое спасибо, за ссылку на codecentral.borland.com, на "родном" сайте нужно было искать в первую очередь!

Ларчик оказывается просто открывался, да и мне нужно было не много поднапрячь мозги:
В функцию GetPropValueByName нужно было всего лишь передавать значения типа TIComponentInterface (а не IComponent как че то мне стукнуло в голову, этот класс никакого касательства к интерфейсам не имеет...).
Очевидно в новой реализации интерфейсов для Делфи 5, в классе TOTAComponent существует ошибка (или у меня такая версия Делфи), в реализации для старых версий все работает нормально.
Спасибо за помощь!



Страницы: 1 вся ветка

Текущий архив: 2002.04.18;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.018 c
14-57874
Kozhanov
2002-03-12 13:47
2002.04.18
Поддержка программой нескольких языков...


1-57759
Митрий
2002-04-05 16:32
2002.04.18
Помогите чайнику. Не разобраться с TExcelworksheet


1-57787
Rammst
2002-04-06 06:23
2002.04.18
Клавиатура


3-57656
fishka
2002-03-28 14:24
2002.04.18
InterBase. Обновить таблицу значениями из другой таблицы другой


1-57690
lipskiy
2002-04-07 15:34
2002.04.18
Как определить доступность каталога для записи?