Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.18;
Скачать: [xml.tar.bz2];




Вниз

Получение значения по указателю. 


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 существует ошибка (или у меня такая версия Делфи), в реализации для старых версий все работает нормально.
Спасибо за помощь!




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.18;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.75 MB
Время: 0.04 c
3-57599           Vlad_Leon             2002-03-27 09:13  2002.04.18  
Как узнать пароль?


14-57878          VictorT               2002-03-12 11:48  2002.04.18  
О понятии “информация”


3-57638           Alxn                  2002-03-28 14:22  2002.04.18  
Имя текущего поля


3-57646           phantom2040           2002-03-26 15:59  2002.04.18  
Как упаковать таблицу??


7-57898           AlexanderV            2002-01-23 10:15  2002.04.18  
Получение информации о правах текущего пользователя