Страница 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
Да видел я тонну примеров. Только за последние лет десять это вопрос кучу раз обсуждался. И сам наталкивался... Возможно, начиная с какой-то версии вылечили. Если работает - я рад...