On-line: гостей 10. Всего: 10 [подробнее..]
АвторСообщение
постоянный участник




Пост N: 8144
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 28.01.26 13:26. Заголовок: Некоторый опыт по МиниГуи


Уже 2 месяца как перевел свою большую прогу на версию МиниГуи 25.11 Update 1 (PRO)
Прога устойчиво работает, меньше стала падать и меньше стало подвисаний в программе, т.е.
потеря фокуса с окна перестало мучить пользователей (есть такое в МиниГуи)

Правда для этого пришлось переделать вызовы окон MODAL на события и правильно это делать !
Спасибо ОГРОМНОЕ Сергею !!!

У меня в большой проге ранее была большая проблема с вызовом окон MODAL,
схема примерно такая MAIN + STANDART + Modal(1) + Modal(2) + Modal(3)

После возврата из Modal(3) можно было переключиться на MAIN или STANDART окна и всё,
окна Modal прятались под MAIN окно.
После переделки на события и добавки кода - этого эффекта теперь нет (СПАСИБО Сергею !)

Вот код как правильно нужно вызывать окна:
      o:Event(11, {|ow,ky,cn| // pressing buttons 
Local lIsModal := _HMG_IsModalActive
Local obt := This.&(cn).Cargo
Local cBuf := ow:Cargo:cFocus
_HMG_IsModalActive := .T.
Modal_1(oWnd, ky, cn, obt:cObj, obt:aBClr, obt:nBtn, obt:cIcon)
_HMG_IsModalActive := lIsModal
AEval(HMG_GetForms(,.T.), {|oo| EnableWindow(oo:Handle) })
ow:Enabler(cn, .T.)
ow:Setfocus('Buff')
ow:Setfocus(cBuf)
Return Nil
} )

Вот этот проект полностью - https://cloud.mail.ru/public/Kn2j/u4BX5e8hs


Вообще за последние года два я полностью перешёл на события.
Удобней и понятней стало в коде - нажатие кнопок, ввода в GetBox, событий по окнам и т.д.
Конечно это требует перестройки в мозгах, но это того стоит !

В качестве примера как это делается смотрите в МиниГуи 26.01 (Standard)
проект C:\MiniGUI_2601\SAMPLES\Advanced\mg_zip

Пример создания/копирования архивов по сценарию:
1) темная тема в МиниГуи
2) фильтры по ТСБ по массиву
3) архивация и копирование файлов
4) меню на кнопках + контекстное меню и т.д.

Вот так примерно строяться окна:
 
DEFINE WINDOW ... MAIN ...
...
This.Cargo := oHmgData() ; o := This.Object ; owc := o:Cargo

oMenu := MenuMainBtn() // считать меню (кнопки, цвета, иконки, события и т.д.)
TopMenuButtons(owc,oMenu,nY,nX,,,nG,,nW,nH) // нарисовать меню на форме - menu_topButtons.prg

// события на форме
o:Event( 0, {|ow,ky| // ON INIT
....
o:Event({11,"_Help"}, {|ow,ky,cn| //
....
o:Event({12,"_Config"}, {|ow,ky,cn| //
....
o:Event(99, {|ow| ow:Release() })

END WINDOW

ACTIVATE WINDOW &cForm

Код короче, понятней, все действия в событиях и стабильней работает программа !

Спасибо: 1 
ПрофильЦитата Ответить
Ответов - 12 [только новые]


постоянный участник




Пост N: 8145
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 30.01.26 10:41. Заголовок: Вопрос возник такой...


Вопрос возник такой...
Пропадает форма MAIN на экране, вернее она появляется на окне Фара, если мышкой по окну Фара поводить, то кнопки
формы MAIN появляются на окне ФАРА, потом окантовка окна появляется, но фон окна MAIN остаётся из Фара.
Глюк какой то...
Поменял в большой системе вызов с MAIN на окно MODAL (было CHILD) и вот стал такой эффект проявляться.
Делаю при нажатии кнопки так: 
Form_Main.Minimize
и делаю запуск функции через
hb_ExecFromArray( cFuncName, aFunParam )
После выхода из MODAL окна делаю
Domethod(cFormMain,"Restore")

И вот такой эффект на экране ...
Как перерисовать MAIN форму чтобы картинка формы проявилась ?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 8237
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 30.01.26 20:48. Заголовок: Andrey Приложение с..


Andrey
Приложение своё ты запускаешь из под Far или из проводника винды ?
Если из под Far, пробни запустить его из проводника и после наложить на это
окно, окно Far и поиграться. Если проблемы нет, скорее всего это проблема в Far.....но это не точно

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 2031
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 31.01.26 13:03. Заголовок: Andrey пишет: Как п..


Andrey пишет:

 цитата:
Как перерисовать MAIN форму


Form_main.Refresh() не работает что ли? Это в стандартном случае, далее
может требуется обслуживание очереди сообщений doEvents() или принудительно
через invalidateRect(...), SendMessage(... WM_PAINT ...) или вызов RedrawWindow ( ... )
Вариантов масса , примеры скорее всего в исходниках по работе с окнами minigui

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 8146
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 31.01.26 21:46. Заголовок: Haz пишет: SendMess..


Haz пишет:

 цитата:
SendMessage(... WM_PAINT ...)


Это не работает !
Другие варианты попробую ! Спасибо !

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 2032
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 01.02.26 10:23. Заголовок: Andrey пишет: SendM..


Andrey пишет:

 цитата:
SendMessage(... WM_PAINT ...)


Это не работает !


Это надо использовать с предварительным doEvents() и invalidateRect ()

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 8147
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 02.02.26 03:21. Заголовок: https://i.postimg.cc..




Вот так выглядит MAIN окно после возврата из MODAL окна.
Т.е. что на экране лежит, на том и рисуется.
Попробовал - RedrawWindow( oWnd:Handle ), все заработало !
Спасибо Haz !

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 8161
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 05.03.26 23:17. Заголовок: Опять столкнулся с з..


Опять столкнулся с зависанием большой проги в отдельном меню.
Т.е. потеря фокуса формы.
Можно ТОЛЬКО через Диспетчер программ снять свою прогу.
Если потеря фокуса формы происходит на проге запускаемой на Сервере-Терминалов, то труба !
Юзер никак не может закрыть свою сессию программы, нужен админ чтобы на сервере закрыть сессию юзера.

Нашёл выход из такого тупика.
Делаем в трее меню как в проекте C:\MiniGUI\SAMPLES\Advanced\APP_OOPTEMPLATE\Demo_timer.exe
      NOTIFYICON cIcon NOTIFYTOOLTIP cTitle          ; 
ON NOTIFYCLICK _wPost(70) ; // контекстное меню в трее панели задач

Там есть такое меню
      ITEM "Список окон этой программы"  ACTION {|| PromptGetForms()   }  FONT "DlgFont"

Добавляем ещё одно меню:
         ITEM "Убрать подвисание"    ACTION {|| myEnableWindow() }  FONT "DlgFont" 
....
////////////////////////////////////////////////////////////////////////////
FUNCTION myEnableWindow()
LOCAL cFormFocus := _WindowObj(_HMG_MainHandle):Cargo:cFormFocus
//или (если This среда окна Main, проверить)
//LOCAL cFormFocus := ThisWindow.Cargo:cFormFocus

AEval(HMG_GetForms(,.T.), {|oo| EnableWindow(oo:Handle) })

IF !Empty(cFormFocus) .and. _IsWindowDefined(cFormFocus)
DoMethod(cFormFocus, "SetFocus")
ENDIF

RETURN NIL

И везде при создании окон ставить такую строку:
 
DEFINE WINDOW ....
....
_WindowObj(_HMG_MainHandle):Cargo:cFormFocus := _HMG_ThisFormName
// или так
// This.Cargo := oHmgData() ; o := This.Object ; owc := o:Cargo
// _WindowObj(_HMG_MainHandle):Cargo:cFormFocus := o:Name

Когда прога подвиснет, а это бывает, не часто но бывает, то юзер вызывает это меню и может дальше работать.
Ещё если юзер открывает несколько программ 1С, браузер и проги на МиниГуи,
то фокус тоже иногда теряется на проге МиниГуи.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 8172
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 29.03.26 16:56. Заголовок: Сиситема Win10, Mini..


Сиситема Win10, MiniGUI Extended Edition 25.11 Update 1 (PRO)
Системный трей компа:


Сколько запусков, столько иконок программы на МиниГуи в трее.
Мышкой на иконку наведешь, тогда исчезает.
Почему иконка задачи МиниГуи в системном трее остаётся после выхода из программы ?
Как правильно закрыть программу, чтобы иконка в трее тоже ушла ?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 8255
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 29.03.26 17:09. Заголовок: Andrey пробнул Mini..


Andrey
пробнул MiniGUI\SAMPLES\Applications\TRAY_CALENDAR
все норм , следов в трее нет
посмотри как там устроено

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 8173
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 29.03.26 18:06. Заголовок: Посмотри пример - C:..


Посмотри пример - C:\MiniGUI\SAMPLES\Advanced\APP_OOPTEMPLATE
Я делал как там !

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 8256
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 29.03.26 18:26. Заголовок: Andrey так может у ..


Andrey
так может у тебя и не срабатывает процедура закрытия иконки в трее.....
повесь туда лог какой (или MSG..) ..что бы понимать что работает и не глючит

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 8174
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 29.03.26 18:50. Заголовок: Разница между пример..


Разница между примером и моей программой есть.
У себя при выходе из программы делаю - RELEASE WINDOW ALL
Давно это работает, а недавно добавил иконку в трее и вот такой глюк с иконкой появился.
Что нужно добавить для закрытия иконки в трее ?
На Win 2008/2012/2022 нет такого.
У меня на Win10 только такое.
Другие системы пока не смотрел.

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 15
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет