Получение имени метки контрола в отчете

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Гость

Сообщение Гость »

Hello ClaList,

Собственно сабж.
Для окна получить символьное имя метки контрола по его номеру не проблема (Cla$FIELDNAME).
А для отчета можно ли как-то получить имя метки контрола на рантайме?

--
Best regards,
Vadim mailto:vadim@softcreator.com
ICQ: 82308757
Написал: ClaList(2)
Гость

Сообщение Гость »

Похоже, что Cla$FIELDNAME работает только для окон. Но поскольку она для окон работает, то можно сделать предположение, что символьные имена контролов присутствуют в заголовке окна и возможно в заголовке отчета. Т.е., нужно вычислить формат заголовка окна и отчета и сделать всех счастливыми ;) А по этой части Олег Руденко самый главный специалист ;)
Подозреваю, что у него даже есть наработки по этой теме. ы?

Удачи!
__________________________________
Владимир Якимченко (IСQ 16 993 194)
Написал: ClaList(2)
Гость

Сообщение Гость »

В принципе, внутренняя структура окна и отчета, как ты правильно подметил, практически идентична. Более того, большинство функций RTL работают одинаково и с окнами и с отчетами. Что-же касается FIELDNAME, то разработчики там допустили ошибочку - в начале вызывается функция ядра для определения активного окна. Правда, в отличие от многих других функций, так-же требующих информации об активном окне, в FIELDNAME вызывается какая-то "левая" функция, которая напрочь игнорирует текущее значение Target и определяет верхнее в данном потоке ОКНО.
А по этой части Олег Руденко самый главный специалист ;)
Подозреваю, что у него даже есть наработки по этой теме. ы?
Наработок особых нет - когда-то "копал" структуру окна, но быстро забросил это дело - там очень сильно все "наворочено", а практического толку от знаний этой структуры - ноль.
Мне, в принципе, вполне хватает легальных инструментов работы с окном и его контролами, включая переопределение обработчика событий и функций 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)
Работает в 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)
Гость

Сообщение Гость »

Спасибо Олег, буду пробовать этот вариант.

--
Best regards,
Vadym
Написал: ClaList(2)
Ответить