Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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 существует ошибка (или у меня такая версия Делфи), в реализации для старых версий все работает нормально.
Спасибо за помощь!



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

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

Наверх





Память: 0.47 MB
Время: 0.005 c
3-57637
Oleon
2002-03-28 12:05
2002.04.18
Добрый день. Вопрос по базе InterBase.


1-57750
Абрек
2002-03-31 15:44
2002.04.18
Помогите! Не знаю как исправить оплошность... (+)


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


6-57824
otari
2002-01-15 21:22
2002.04.18
Я хочу отправить смс но не получается


1-57792
Vlr
2002-04-05 20:59
2002.04.18
Легкая перезагрузка Windows.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский