Hello ClaList,
Собственно сабж.
Для окна получить символьное имя метки контрола по его номеру не проблема (Cla$FIELDNAME).
А для отчета можно ли как-то получить имя метки контрола на рантайме?
--
Best regards,
Vadim mailto:vadim@softcreator.com
ICQ: 82308757
Написал: ClaList(2)
Получение имени метки контрола в отчете
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Похоже, что Cla$FIELDNAME работает только для окон. Но поскольку она для окон работает, то можно сделать предположение, что символьные имена контролов присутствуют в заголовке окна и возможно в заголовке отчета. Т.е., нужно вычислить формат заголовка окна и отчета и сделать всех счастливыми
А по этой части Олег Руденко самый главный специалист 
Подозреваю, что у него даже есть наработки по этой теме. ы?
Удачи!
__________________________________
Владимир Якимченко (IСQ 16 993 194)
Написал: ClaList(2)


Подозреваю, что у него даже есть наработки по этой теме. ы?
Удачи!
__________________________________
Владимир Якимченко (IСQ 16 993 194)
Написал: ClaList(2)
В принципе, внутренняя структура окна и отчета, как ты правильно подметил, практически идентична. Более того, большинство функций RTL работают одинаково и с окнами и с отчетами. Что-же касается FIELDNAME, то разработчики там допустили ошибочку - в начале вызывается функция ядра для определения активного окна. Правда, в отличие от многих других функций, так-же требующих информации об активном окне, в FIELDNAME вызывается какая-то "левая" функция, которая напрочь игнорирует текущее значение Target и определяет верхнее в данном потоке ОКНО.
Мне, в принципе, вполне хватает легальных инструментов работы с окном и его контролами, включая переопределение обработчика событий и функций WinAPI.
Что-же касается меток контролов отчета, то мы их получим в обход функции Cla$FIELDNAME:
Работает в C55/C60/C61. В С50 не проверял по причине "списания" этой версии в архив - хороша была "старушка", но пора полностью переключатся на новые версии.
Как видно из кода, функция корректно обрабатывает текущее значение Target.
Так что, будет нормально работать в обеих вариантах:
Open(Report)
name" = GetControlName(2,Report)
...
SetTarget(Report)
name" = GetControlName(2)
Естественно, прекрасно работает и с Window-структурами.
=============================
С уважением, Олег А. Руденко.
Oleg_Rudenko@mail.ru
Oleg_Rudenko@mail333.com
Библиотека DynaLib
http://dynalib.narod.ru
Написал: ClaList(2)
Наработок особых нет - когда-то "копал" структуру окна, но быстро забросил это дело - там очень сильно все "наворочено", а практического толку от знаний этой структуры - ноль.А по этой части Олег Руденко самый главный специалист
Подозреваю, что у него даже есть наработки по этой теме. ы?
Мне, в принципе, вполне хватает легальных инструментов работы с окном и его контролами, включая переопределение обработчика событий и функций WinAPI.
Что-же касается меток контролов отчета, то мы их получим в обход функции Cla$FIELDNAME:
Код: Выделить всё
MAP
GetControlName(LONG _ControlID,<WINDOW _Window>),STRING
MODULE('ClarionRTL')
GetFieldData(LONG _WinAddr,LONG _Field,LONG=0),LONG,NAME('_12reportscreen__GetFieldData@Fii'),DLL(dll_mode)
GetAtomName(LONG _AtomAddr),CSTRING,NAME('_4Atom__GetAtomNamePtr@CF'),DLL(dll_mode)
END
END
GetControlName PROCEDURE(LONG _ControlID,<WINDOW _Window>)
AtomObjSeek EQUATE(13h)
loc:Target LONG,AUTO
loc:FieldObj LONG,AUTO
loc:AtomObj LONG,AUTO
loc:ControlName STRING(100)
Code
if Omitted(2)
loc:Target = System{PROP:Target}
else
loc:Target = Address(_Window)
.
if loc:Target
loc:FieldObj = GetFieldData(loc:Target,_ControlID)
if loc:FieldObj
PEEK(loc:FieldObj+AtomObjSeek,loc:AtomObj)
if loc:AtomObj then loc:ControlName = GetAtomName(loc:AtomObj).
. .
Return(loc:ControlName)
Как видно из кода, функция корректно обрабатывает текущее значение Target.
Так что, будет нормально работать в обеих вариантах:
Open(Report)
name" = GetControlName(2,Report)
...
SetTarget(Report)
name" = GetControlName(2)
Естественно, прекрасно работает и с Window-структурами.
=============================
С уважением, Олег А. Руденко.
Oleg_Rudenko@mail.ru
Oleg_Rudenko@mail333.com
Библиотека DynaLib
http://dynalib.narod.ru
Написал: ClaList(2)