Страница 1 из 2
как перерисовать заголовок Frame через post() из формы?
Добавлено: 19 Декабрь 2011, 14:53
Korall
Добрый день!
Кларион 5.5, работаю без АБС.
При старте программы из базы вытаскиваю запись с названием фирмы и вписываю его в заголовок фрейма:
AppFrame{prop:text} = clip(AppFrame{prop:text}) & '. ' & clip(gl_FirmName)
Возникла следующая задача: Юзер изменил название фирмы в соответствующей форме, нажал ОК, переопределил gl_FirmName.
И я хочу динамически обновить заголовок AppFrame{prop:text}.
Видимо, надо посылать post(), но как указать, что посылка для AppFrame? И как задать, чтобы заголовок перерисовался?
Re: как перерисовать заголовок Frame через post() из формы?
Добавлено: 19 Декабрь 2011, 15:13
Дед Пахом
Код: Выделить всё
! Глобальная константа
Event:ResetFrameTitle EQUATE(Event:User+33)
! Заголовок фрейма без названия фирмы
Glo:FrameTitle STRING('Моя крутая программа')
! код в AppFrame
CASE EVENT()
OF Event:ResetFrameTitle
AppFrame{prop:text} = Glo:FrameTitle & '. ' & clip(gl_FirmName)
! код в UpdateFirm
POST(Event:ResetFrameTitle,,1)
Как-то так
Re: как перерисовать заголовок Frame через post() из формы?
Добавлено: 19 Декабрь 2011, 15:59
Igor
Если без POST
!В головном модуле глобально описать переменную
FrameRef &WINDOW
!В процедуре FRAME после открытия окна
FrameRef &= AppFrame ! или FrameRef &= 0{PROP:HANDLE}
1
!В вызываемой процедуре после открытия окна
FrameRef{PROP:text} = 'Hello, world! '
Re: как перерисовать заголовок Frame через post() из формы?
Добавлено: 19 Декабрь 2011, 17:30
Korall
Спасибо!
Решил пойти по первому пути. Пока не работает.
Форма с заданием названия фирмы лежит в dll-ке, там в глобальных данных объявил событие Event:ResetFrameTitle EQUATE(Event:User+33)
в главной программе тоже в глобальных данных продублировал событие Event:ResetFrameTitle EQUATE(Event:User+33), причем external,dll(dll_mode) дает ошибку, так что просто продублировал
Event:ResetFrameTitle EQUATE(Event:User+33)
Но в цикле case EVENT() у AppFrame почему -то это событие не приходит: ставлю message() - не срабатывает
Re: как перерисовать заголовок Frame через post() из формы?
Добавлено: 19 Декабрь 2011, 17:51
Korall
Пошел по второму пути. Пока не работает, и думаю, связано с тем, что в глобальных данных dll-ки объявил FrameRef &WINDOW
и в форме вызвал FrameRef{PROP:text} = 'Hello, world!'
но в главной программе при попытке в секции глобальных данных написать
FrameRef &WINDOW external,dll(dll_mode)
компилятор дает ошибку, если же просто пишу FrameRef &WINDOW, то ошибки компиляции нет, но и результата тоже нет.
Видимо, не могу видимость обеспечить в главной программе для переменной FrameRef &WINDOW
и для первого случая Event:ResetFrameTitle EQUATE(Event:User+33)
Понятно, что форму можно перетащить из dl-ки в главную программу, но там уже много на ней понавешено, да и другой путь должен быть мне кажется.
Re: как перерисовать заголовок Frame через post() из формы?
Добавлено: 19 Декабрь 2011, 18:50
Дед Пахом
Почему не работает первый вариант, не знаю, проверьте номер треда AppFrame, должен быть равен 1: stop(AppFrame{prop:thread}). Второй вариант: объявите FrameRef в словаре, генератор сам добавит external, dll где надо.
Re: как перерисовать заголовок Frame через post() из формы?
Добавлено: 19 Декабрь 2011, 23:05
Korall
По второму варианту:
сделал описание FrameRef &WINDOW через словарь в базовой DLL, там у меня все определения сидят, и в главной программе тоже FrameRef в словаре описал, и в Storage Class выбрал "EXTERNAL - DLL" (как обычно для глобальных переменных), но при компиляции главной программы получаю синтаксическую ошибку invalid data declaration attribute
на строчке с этой переменной (вторая строчка):
gl_Flag_User BYTE,EXTERNAL,DLL(dll_mode)
FrameRef &WINDOW,EXTERNAL,DLL(dll_mode)
gl_NFerm SHORT,EXTERNAL,DLL(dll_mode)
Где ошибся?
Что делать?
Re: как перерисовать заголовок Frame через post() из формы?
Добавлено: 20 Декабрь 2011, 8:33
Igor
Первый вариант не проверял.
По второму варианту все работает.
Попробуй поискать в головном модуле типа AllFiles.clw описание FrameRef &WINDOW может там есть префикс к переменной FrameRef.
Re: как перерисовать заголовок Frame через post() из формы?
Добавлено: 20 Декабрь 2011, 10:48
Yufil
А так не катит?
SetTarget(,1)
0{Prop:Text}='....'
Display()
SetTarget
А event на окно не исполняется, если окно неактивно. Откуда следует, что другой тред вообще должен получить управление? Можно, например, повесить таймер на фрейм, тогда пойдёт...
Re: как перерисовать заголовок Frame через post() из формы?
Добавлено: 20 Декабрь 2011, 11:28
Дед Пахом
Yufil писал(а):
А event на окно не исполняется, если окно неактивно. Откуда следует, что другой тред вообще должен получить управление? Можно, например, повесить таймер на фрейм, тогда пойдёт...
Так это, у него ж фрейм, как он может быть неактивным?
Re: как перерисовать заголовок Frame через post() из формы?
Добавлено: 20 Декабрь 2011, 12:07
Дед Пахом
Сейчас проверил вариант с POST(Event:ResetFrameTitle) - всё прекрасно работает. C5.5 ABC.
Re: как перерисовать заголовок Frame через post() из формы?
Добавлено: 20 Декабрь 2011, 14:53
Yufil
Так это, у него ж фрейм, как он может быть неактивным?
Ещё как может. Правда, обычно на фрейм сажают дату-часики, там тикает таймер и всё обновляется на автомате...
Re: как перерисовать заголовок Frame через post() из формы?
Добавлено: 20 Декабрь 2011, 15:25
Дед Пахом
Вот пример, никакой таймер не обрабатывается (хотя шаблон DateTime во фрейме торчит).
Re: как перерисовать заголовок Frame через post() из формы?
Добавлено: 20 Декабрь 2011, 15:43
Admin
В чем прикол, какой в ж%$# таймер ?
Всегда помнится работало!
Re: как перерисовать заголовок Frame через post() из формы?
Добавлено: 20 Декабрь 2011, 15:45
Yufil
Да видел я тонну примеров. Только за последние лет десять это вопрос кучу раз обсуждался. И сам наталкивался... Возможно, начиная с какой-то версии вылечили. Если работает - я рад...