![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Получение значения по указателю. [D5, Win2k]
pusrg © (2002-04-03 20:33:00)Добрый день, уважаемые мастера.
Занимаюсь разработкой мастера под Делфи с помощью интерфейсов 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 21:11:00) [1]Нашел!!!
To MBo
Большое спасибо, за ссылку на codecentral.borland.com, на "родном" сайте нужно было искать в первую очередь!
Ларчик оказывается просто открывался, да и мне нужно было не много поднапрячь мозги:
В функцию GetPropValueByName нужно было всего лишь передавать значения типа TIComponentInterface (а не IComponent как че то мне стукнуло в голову, этот класс никакого касательства к интерфейсам не имеет...).
Очевидно в новой реализации интерфейсов для Делфи 5, в классе TOTAComponent существует ошибка (или у меня такая версия Делфи), в реализации для старых версий все работает нормально.
Спасибо за помощь!
MBo (2002-04-04 17:33:00) [2]на codecentral.borland.com не искал?
pusrg (2002-04-04 17:29:00) [3]To MBo
Да в editIntf сохранена старая реализация, для совмещения с предидущими версиями Делфи.
Спасибо за ссылки, но все знакомо...
По ссылке http://sdm.viptop.ru/articles/opentools.htmlя фактически учился работать с интерфейсами.
Уже накачал кучу экспертов из инета с целью найти исходный код по своему вопросу. Но пока ничего не нашел. Если и используется функция GetPropValueByName то для получения простых св-в типа Name и т.д.
Если Вам известны ссылки на эксперты в исходниках, работающие со св-вами TStrings компонентов не сочтите за труд кинуть ссылочку.
MBo (2002-04-04 16:45:00) [4]ксати, в соседней ветке (deleon) cсылки кое-какие
MBo (2002-04-04 16:44:00) [5]Delphi 5, из editIntf.
В ToolsApi - value is a IOTAComponent.
pusrg (2002-04-04 16:34:00) [6]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 15:41:00) [7]Виноват, не то предложение выделил ;(
Мне как раз показалось неясным возвращаемое значение
TIComponent-Interface
pusrg (2002-04-04 15:35:00) [8]To MBo
Так позвольте, класс TStrings как раз и является потомком TPersistent.
MBo (2002-04-04 15:19:00) [9]а вот еще какие есть любопытные слова
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:11:00) [10]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 скорее всего показала бы стандартное "Программа выполнила не допустимую операцию...".
Но все равно спасибо за помощь...
deleon (2002-04-04 14:01:00) [11]Насколько я понял, для свойств типа TStrings он возвращает IOTAComponent, а у того в свою очередь есть функция
GetComponentHandle, которая возвращает поинтер, так
попробуй TStringList(I.GetComponentHandle)!
pusrg (2002-04-04 13:42:00) [12]Неужели никто не занимался разработкой мастеров и не знает способ извлечения данных для свойств типа TStrings?
Буду благодарен подробным ссылкам (желательно русскоязычным)на тему Open Tools API. Те ссылки, которые мне удалось найти в основном содержат поверхностное описание работы с OTA, причем копируют свое содержание.
Заранее благодарен за любую помощь.