| Автор | Сообщение |
|
gfilatov
|
| модератор
|
Пост N: 699
Зарегистрирован: 25.05.05
|
|
Отправлено: 29.01.08 13:59. Заголовок: Новая версия Расширенного релиза библиотеки MiniGUI (часть VI ) (продолжение)
Начало темы находится здесь, а теперь АНОНС * АНОНС * АНОНС * АНОНС * АНОНС Готовится к опубликованию новая сборка №48, которая выйдет в конце недели. Если у Вас есть интересные наработки для включения в новый релиз, то сейчас самое удобное время для их отправки мне Кратко, что нового: - исправление обнаруженных ошибок и неточностей кода; - новый класс HEADERIMAGE для Grid и Browse; - свойство Address в Hyperlink может теперь открывать папку или файл на диске; - добавлен NOTABSTOP класс для Browse; - поддержка пользовательских компонентов (заимствована из оффициального релиза); - расширения и исправления в библиотеках TsBrowse и PropGrid; - обновлены сборки Харбор и HMGS-IDE; - новые и обновленные старые примеры (как обычно  ).
|
 |
|
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|
|
gfilatov2002
|
| moderator
|
Пост N: 2451
Зарегистрирован: 11.02.10
|
|
Отправлено: 05.06.25 09:05. Заголовок: Опубликована финальн..
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4748
Зарегистрирован: 17.02.12
|
|
Отправлено: 05.06.25 14:32. Заголовок: gfilatov2002 Может ..
gfilatov2002 Может стоит, сделать, что бы все контролы, на запрос width, height выдавали 0 при отсутствии ? IF ( Upper( Arg2 ) == "VSCROLLBAR" .OR. Upper( Arg2 ) == "HSCROLLBAR" ) IF .NOT. _IsWindowDefined ( Arg1 ) MsgMiniGuiError ( "Window: " + Arg1 + " is not defined." ) ENDIF /* ELSEIF Upper( Arg2 ) == "SPLITBOX" IF ( ix := GetFormIndex ( Arg1 ) ) > 0 .AND. GetControlIndex( Arg2, Arg1 ) == 0 IF IsWindowHandle ( Arg8 := _HMG_aFormReBarHandle [ix] ) IF Arg3 == "WIDTH" RETURN GetWindowWidth ( Arg8 ) ELSEIF Arg3 == "HEIGHT" RETURN GetWindowHeight ( Arg8 ) ENDIF ELSE RETURN 0 ENDIF ENDIF ELSEIF Upper( Arg2 ) == "STATUSBAR" IF ( ix := GetControlIndex( Arg2, Arg1 ) ) > 0 IF Arg3 == "HEIGHT" RETURN _HMG_aControlHeight [ix] ELSEIF Arg3 == "WIDTH" RETURN _HMG_aControlWidth [ix] ENDIF ELSE RETURN 0 ENDIF[ */ ELSEIF ( Arg3 == "HEIGHT" .or. Arg3 == "WIDTH" ) .and. !Empty( Arg1 ) IF GetControlIndex( Arg2, Arg1 ) == 0 IF Upper( Arg2 ) == "SPLITBOX" .and. IsWindowHandle ( Arg8 := _HMG_aFormReBarHandle [ix] ) RETURN iif( Arg3 == "WIDTH", GetWindowWidth ( Arg8 ), GetWindowHeight ( Arg8 ) ) ELSE RETURN 0 ENDIF ENDIF ELSE VerifyControlDefined ( Arg1 , Arg2 ) ENDIF
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2452
Зарегистрирован: 11.02.10
|
|
Отправлено: 05.06.25 16:26. Заголовок: SergKis пишет: сдел..
SergKis пишет: | цитата: | | сделать, что бы все контролы, на запрос width, height выдавали 0 при отсутствии |
| Нет, стандартным способом определить наличие контрола на форме остается вызов функции _IsControlDefined(). Исключение было сделано для SPLITBOX и STATUSBAR для удобства расчета размеров клиентской области, как ты и предлагал. 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4749
Зарегистрирован: 17.02.12
|
|
Отправлено: 09.06.25 20:13. Заголовок: gfilatov2002 Можно ..
gfilatov2002 Можно получить PRO версию на посмотреть
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2453
Зарегистрирован: 11.02.10
|
|
Отправлено: 09.06.25 21:25. Заголовок: SergKis пишет: Можн..
SergKis пишет: | цитата: | | Можно получить PRO версию |
| Да, конечно. Полная версия дистрибутива 25.06 есть у Андрея. 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4750
Зарегистрирован: 17.02.12
|
|
Отправлено: 10.06.25 11:35. Заголовок: gfilatov2002 Нужен ..
gfilatov2002 Нужен пароль для архива, у Андрея его нет. Архив я взял из Пост N: 2451 этой темы
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2454
Зарегистрирован: 11.02.10
|
|
Отправлено: 10.06.25 11:45. Заголовок: SergKis пишет: Нуже..
SergKis пишет: Отправил пароль по почте bilance@bilance... 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4751
Зарегистрирован: 17.02.12
|
|
Отправлено: 10.06.25 12:03. Заголовок: gfilatov2002 пишет О..
gfilatov2002 пишет | цитата: | | Отправил пароль по почте bilance@bilance... |
| Для меня, этой почты\фирмы уже нет, фирму купили литовцы
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2455
Зарегистрирован: 11.02.10
|
|
Отправлено: 10.06.25 12:29. Заголовок: SergKis пишет: Для ..
SergKis пишет: | цитата: | | Для меня, этой почты\фирмы уже нет |
| Тогда куда кинуть? 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4752
Зарегистрирован: 17.02.12
|
|
Отправлено: 10.06.25 14:00. Заголовок: gfilatov2002 пишет Т..
gfilatov2002 пишет Спасибо, Андрей уже дал пароль, он отработал 
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 8001
Зарегистрирован: 12.09.06
|
|
Отправлено: 12.06.25 00:41. Заголовок: Версия МиниГуи 25.06..
Версия МиниГуи 25.06 Что то WaitWindows() формы передергивает. При закрытии моей формы MODAL вот такое событие: :Event({98,"_1Cancel"}, {|ow,ky,cn| // выход _LogFile(.T., " -->> Button: ",cn, ow:Name, ky) _SetThisFormInfo(ow) // запись всей записи базы WaitWindow( {'Запись данных в БД-' + ow:Cargo:cAls, App.ExeName }, .T., 400, 16, NIL, WHITE, PURPLE ) .... WaitWindow() _SetThisFormInfo() aRet := {} _wSend(99,ow:Name) Return Nil } ) Появляется окно MAIN, потом WaitWindow(), после записи переход на предыдущую форму. Мелькают формы на экране... Некрасиво очень, да и юзеру тоже непонятно. Почему окно MAIN появляется, как его убрать ? 
|
 |
|
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 4753
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.06.25 15:28. Заголовок: Andrey пишет Появляе..
Andrey пишет | цитата: | | Появляется окно MAIN, потом WaitWindow(), после записи переход на предыдущую форму. Мелькают формы на экране... |
| gfilatov2002 Такую ситуацию получить не удалось, но бяка нашлась. Пример https://TransFiles.ru/hvick Жмем кнопки <Test 1> => <Modal> => <Modal> => <Calculation> по завершению можем мышкой переключить фокус на main окно, а находимся на modal окне, если сразу запустить кнопку <Info>, то снова все Ok! на main окно фокус не поставить PS. Вариант WaitWindow(cMsg, bWait) так же приводит к такому результату, т.е работа ф-ии Скрытый текст
STATIC FUNCTION my_Report_1(ob) Local ct := 'Waiting ... Calculation in progress - ' + ; ob:cAlias + ";" + App.ExeName + ";" Local bw := {|| Local cww := ThisWindow.Name, nn Local alb := HMG_GetFormControls(cww, "LABEL") Local clb := ATail(alb) This.&(clb).Alignment := "Center" FOR nn := 1 TO 5 This.&(clb).Value := hb_ntos(nn) wApi_Sleep(1000) NEXT This.&(clb).Value := "" wApi_Sleep(300) ThisWindow.Release Return Nil } WaitWindow( ct, bw, 400, 16, NIL, YELLOW, BLUE ) RETURN Nil
| Примеры положил на ftp
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2456
Зарегистрирован: 11.02.10
|
|
Отправлено: 12.06.25 21:38. Заголовок: SergKis пишет: по з..
SergKis пишет: | цитата: | | по завершению можем мышкой переключить фокус на main окно |
| Да, я подтверждаю эту проблему. Вывод: не стоит применять вызов функции WaitWindow() из модального окна, поскольку в этом случае вызывается дочернее окно, что, на самом деле, запрещено в системе. 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4754
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.06.25 22:14. Заголовок: gfilatov2002 пишет п..
gfilatov2002 пишет Для варианта WaitWindow(..., .T., ...) - это child окно, но вариант WaitWindow(..., bBlock, ...) - это modal окно (пример из архива Tsb_2tsb_a.7z), т.е. работа блока кода в окне ожидания (событие ON INIT окна) так же приводит к проблемной ситуации. В ф-ии работает цепочка, выделенная цветом IF lNoWait _HMG_IsModalActive := .F. DEFINE WINDOW _HMG_CHILDWAITWINDOW CHILD ELSE DEFINE WINDOW _HMG_CHILDWAITWINDOW MODAL IF HB_ISBLOCK( bOnInit ) l_No_Wait := .F. ENDIF ENDIF т.е. запуск модального окна ожидания под модальным окном, должно быть Ok!, а ситуация такая же как с child
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 8002
Зарегистрирован: 12.09.06
|
|
Отправлено: 12.06.25 22:20. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: | цитата: | | Вывод: не стоит применять вызов функции WaitWindow() из модального окна, поскольку в этом случае вызывается дочернее окно, что, на самом деле, запрещено в системе. |
| Какой тогда выход из такой проблемы ? Делать своё окно, хорошее решение. НО, хочется иметь стандартную функцию в МиниГуи, которая предназначена для таких случаев !!! Может типа WaitWindowModal() с возможностью расположить ещё и иконку слева. Григорий - можно ли это сделать ? 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2457
Зарегистрирован: 11.02.10
|
|
Отправлено: 12.06.25 22:27. Заголовок: SergKis пишет: запу..
SergKis пишет: | цитата: | | запуск модального окна ожидания под модальным окном, должно быть Ok |
| Решил эту проблему добавлением всего одной строки в код этой функции: STATIC FUNCTION my_Report_2(ob) Local ct := 'Waiting ... Calculation in progress - ' + ; ob:cAlias + ";" + App.ExeName + ";" Local bw := {|| Local cww := ThisWindow.Name, nn Local alb := HMG_GetFormControls(cww, "LABEL") Local clb := ATail(alb) This.&(clb).Alignment := "Center" FOR nn := 1 TO 5 This.&(clb).Value := hb_ntos(nn) wApi_Sleep(1000) NEXT This.&(clb).Value := "" wApi_Sleep(300) ThisWindow.Release Return Nil } _HMG_IsModalActive := .T. WaitWindow( ct, bw, 400, 16, NIL, WHITE, PURPLE ) RETURN Nil P.S. Уже поправил функцию WaitWindow() для этого случая - работает! 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4755
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.06.25 22:45. Заголовок: gfilatov2002 пишет Р..
gfilatov2002 пишет К сожалению это не совсем так, пример положил на ftp (в нем еще пробный вариант h_windows.prg, задание параметра WaitWindow(..., "M",...) для модал окна вместо child) Жмем <Test 1> => <Modal> => <Modal> => <Counting> мышкой на main окно нет доступа, жмем <Exit> и мышкой на main окно доступ есть, находимся на 1-ом modal окне
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4756
Зарегистрирован: 17.02.12
|
|
Отправлено: 14.06.25 10:07. Заголовок: gfilatov2002 Не оч...
gfilatov2002 Не оч. понятно назначение переменной _HMG_IsModalActive ? Назначил в примере на все окна ON KEY F1 ACTION _LogFile(.T., ThisWindow.Name, ThisWindow.Type, _HMG_IsModalActive) При нажатии на всех вызванных окнах, в логе имеем значение _HMG_IsModalActive == .F. После нажатия <Calculation> тоже .F. (без добавки _HMG_IsModalActive := .T. WaitWindow( ct, bw, 400, 16, NIL, WHITE, PURPLE ) ), но после кнопки <Info>, значение, полученное по F1, _HMG_IsModalActive == .T. по выходу из окон значение, полученное по F1, _HMG_IsModalActive == .F. 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2458
Зарегистрирован: 11.02.10
|
|
Отправлено: 14.06.25 11:13. Заголовок: SergKis пишет: Не о..
SergKis пишет: | цитата: | | Не оч. понятно назначение переменной _HMG_IsModalActive ? |
| Переменная _HMG_IsModalActive используется в коде как глобальный флаг для определения, активна ли в данный момент модальная форма (или окно). Вот как она используется и какая логика стоит за её применением: --- ### 📌 Назначение _HMG_IsModalActive — логическая (boolean) переменная, которая: * Принимает значение .T. (истина), когда активна модальная форма. * Устанавливается в .F. (ложь), когда модальная форма закрыта или не используется. --- ### 🔍 Основные сценарии использования Вот ключевые моменты: 1. Проверка перед инициализацией окна: IF _HMG_IsModalActive .AND. bInit == NIL → Не разрешать открытие обычного окна, если активна модальная форма. 2. Контроль выполнения логики при показе окон: IF _HMG_IsModalActive .AND. lNoWait == .F. 3. Установка состояния: _HMG_IsModalActive := .T. _HMG_IsModalActive := .F. 4. Сохранение и восстановление статуса: lIsModal := _HMG_IsModalActive ... _HMG_IsModalActive := lIsModal → Например, при временном переключении контекста. --- ### 🧠 Логика использования 1. Обеспечение модальности: * Модальное окно блокирует доступ к другим окнам. Этот флаг гарантирует, что в это время нельзя открыть другие формы. 2. Избежание повторного запуска модальных окон: * Проверки с .AND. _HMG_IsModalActive предотвращают наложение нескольких модальных окон друг на друга. 3. Сброс флага при завершении окна: * После закрытия модального окна переменная обязательно сбрасывается в .F.. --- ### ✅ Вывод Переменная _HMG_IsModalActive — это управляющий флаг на уровне всей GUI-системы, который поддерживает корректную логику модальности окон: не позволяет открыть обычные окна или другие модальные окна, пока активна одна модальная форма, и корректно восстанавливает поведение после её закрытия. Вот функции, в которых используется переменная _HMG_IsModalActive, а также краткий разбор их ролей: --- ### 🔹 1. FUNCTION _ActivateWindow Использование: IF _HMG_IsModalActive .AND. bInit == NIL ... IF _HMG_IsModalActive .AND. lNoWait == .F. Назначение: Эта функция проверяет, активна ли модальная форма, перед тем как активировать новое окно. Если модальное окно активно, инициализация нового окна либо запрещается, либо обрабатывается особым образом. --- ### 🔹 2. FUNCTION _GenActivateId Использование: IF _HMG_IsModalActive == .F. _HMG_IsModalActive := .T. ... _HMG_IsModalActive := .F. Назначение: Функция генерирует активацию формы и устанавливает флаг модальности. После завершения действия модальность сбрасывается. Это типичная обертка для временного включения модального состояния. --- ### 🔹 3. FUNCTION _ShowWindow Использование: IF _HMG_IsModalActive _HMG_IsModalActive := .T. Назначение: При показе окна проверяется текущая модальность. Возможно, эта функция повторно устанавливает флаг, если окно уже должно быть модальным, чтобы гарантировать, что статус не будет потерян. --- ### 🔹 4. FUNCTION WaitWindow Использование: lIsModal := _HMG_IsModalActive ... _HMG_IsModalActive := .F. _HMG_IsModalActive := .T. ... _HMG_IsModalActive := lIsModal Назначение: Функция временно приостанавливает интерфейс (ждёт действия пользователя). Она сохраняет текущее состояние модальности, выключает его, выполняет действие, потом возвращает обратно. Это предотвращает "залипание" модального состояния при вложенных вызовах. --- ### 🧩 Вывод Все эти функции работают как части механизма управления модальными окнами. Поведение строится на следующей логике: * При показе или активации формы модальность устанавливается. * Перед запуском новой формы модальность проверяется. * После завершения — сбрасывается или восстанавливается предыдущее состояние.
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4757
Зарегистрирован: 17.02.12
|
|
Отправлено: 14.06.25 11:30. Заголовок: gfilatov2002 Спасиб..
gfilatov2002 Спасибо большое за детальное объяснение Примерно так я и понял из кода, но меня смущает краткость действия этой переменной, т.е. если несколько модальных окон, то ее состояние, по мне, должно быть всегда .T. и не быть .F. (по F1 выше из примера в лог). Возможно, надо обрабатывать счетчик модальных окон в работе, т.к. добавка в пример еще одного уровня вызова простого модального окна ничего не дала, уже сразу по выходу из него, ситуация с переключением фокуса на др. окна работает, а по идее при наличии счетчика модальных окон > 0, этого не должно быть Пример положил на ftp
|
 |
|
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|