Текущий архив: 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.47 MB
Время: 0.005 c