On-line: гостей 1. Всего: 1 [подробнее..]
АвторСообщение
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;
- новые и обновленные старые примеры (как обычно ).




Спасибо: 5 
Профиль
Ответов - 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. Заголовок: Опубликована финальн..


Опубликована финальная MiniGUI сборка 25.06

Стандартная сборка (zip архив)

Профессиональная сборка (7z архив под паролем)

---
Также были подготовлены дополнительные сборки для следующих C компиляторов:

- MinGW GNU C 15.1.0 (64-bit)

- BCC 7.70 (32-bit)

Эти сборки доступны для всех доноров проекта

Желаю всем хорошего дня!

Спасибо: 0 
Профиль
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


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2452
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 05.06.25 16:26. Заголовок: SergKis пишет: сдел..


SergKis пишет:

 цитата:
сделать, что бы все контролы, на запрос width, height выдавали 0 при отсутствии


Нет, стандартным способом определить наличие контрола на форме остается вызов функции _IsControlDefined().
Исключение было сделано для SPLITBOX и STATUSBAR для удобства расчета размеров клиентской области, как ты и предлагал.

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




Пост N: 4749
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.06.25 20:13. Заголовок: gfilatov2002 Можно ..


gfilatov2002
Можно получить PRO версию на посмотреть

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2453
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 09.06.25 21:25. Заголовок: SergKis пишет: Можн..


SergKis пишет:

 цитата:
Можно получить PRO версию


Да, конечно. Полная версия дистрибутива 25.06 есть у Андрея.

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




Пост N: 4750
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.06.25 11:35. Заголовок: gfilatov2002 Нужен ..


gfilatov2002
Нужен пароль для архива, у Андрея его нет.
Архив я взял из Пост N: 2451 этой темы

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2454
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 10.06.25 11:45. Заголовок: SergKis пишет: Нуже..


SergKis пишет:

 цитата:
Нужен пароль для архива


Отправил пароль по почте bilance@bilance...


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




Пост N: 4751
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.06.25 12:03. Заголовок: gfilatov2002 пишет О..


gfilatov2002 пишет
 цитата:
Отправил пароль по почте bilance@bilance...


Для меня, этой почты\фирмы уже нет, фирму купили литовцы

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2455
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 10.06.25 12:29. Заголовок: SergKis пишет: Для ..


SergKis пишет:

 цитата:
Для меня, этой почты\фирмы уже нет


Тогда куда кинуть?

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




Пост N: 4752
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.06.25 14:00. Заголовок: gfilatov2002 пишет Т..


gfilatov2002 пишет
 цитата:
Тогда куда кинуть?


Спасибо, Андрей уже дал пароль, он отработал

Спасибо: 0 
Профиль
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 появляется, как его убрать ?

Спасибо: 0 
Профиль
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) так же приводит к такому результату, т.е работа ф-ии
Скрытый текст

Примеры положил на ftp

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 2456
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 12.06.25 21:38. Заголовок: SergKis пишет: по з..


SergKis пишет:

 цитата:
по завершению можем мышкой переключить фокус на main окно


Да, я подтверждаю эту проблему.
Вывод: не стоит применять вызов функции WaitWindow() из модального окна, поскольку в этом случае вызывается дочернее окно, что, на самом деле, запрещено в системе.

Спасибо: 0 
Профиль
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

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




Пост N: 8002
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 12.06.25 22:20. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Вывод: не стоит применять вызов функции WaitWindow() из модального окна, поскольку в этом случае вызывается дочернее окно, что, на самом деле, запрещено в системе.


Какой тогда выход из такой проблемы ?
Делать своё окно, хорошее решение.
НО, хочется иметь стандартную функцию в МиниГуи, которая предназначена для таких случаев !!!
Может типа WaitWindowModal() с возможностью расположить ещё и иконку слева.
Григорий - можно ли это сделать ?

Спасибо: 0 
Профиль
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() для этого случая - работает!

Спасибо: 0 
Профиль
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 окне

Спасибо: 0 
Профиль
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.


Спасибо: 0 
Профиль
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

Назначение:
Функция временно приостанавливает интерфейс (ждёт действия пользователя). Она сохраняет текущее состояние модальности, выключает его, выполняет действие, потом возвращает обратно. Это предотвращает "залипание" модального состояния при вложенных вызовах.

---

### 🧩 Вывод

Все эти функции работают как части механизма управления модальными окнами. Поведение строится на следующей логике:

* При показе или активации формы модальность устанавливается.
* Перед запуском новой формы модальность проверяется.
* После завершения — сбрасывается или восстанавливается предыдущее состояние.

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




Пост N: 4757
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 14.06.25 11:30. Заголовок: gfilatov2002 Спасиб..


gfilatov2002
Спасибо большое за детальное объяснение
Примерно так я и понял из кода, но меня смущает краткость действия этой переменной, т.е. если несколько модальных окон, то ее состояние, по мне, должно быть всегда .T. и не быть .F. (по F1 выше из примера в лог). Возможно, надо обрабатывать счетчик модальных окон в работе, т.к. добавка в пример еще одного уровня вызова простого модального окна ничего не дала, уже сразу по выходу из него, ситуация с переключением фокуса на др. окна работает, а по идее при наличии счетчика модальных окон > 0, этого не должно быть
Пример положил на ftp

Спасибо: 0 
Профиль
Ответов - 300 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All [только новые]
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 152
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет