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)
- 
				Гость
