В принципе, внутренняя структура окна и отчета, как ты правильно подметил, практически идентична. Более того, большинство функций 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)