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 [только новые]


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




Пост N: 4325
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.06.23 11:18. Заголовок: gfilatov2002 Вроде ..


gfilatov2002
Вроде поймал ситуацию, которая возникает у Андрея.
Пример на базе SPLASHDEMO_3: https://TransFiles.ru/vz2sa
На кнопках входим в окно STANDARD с тсб, выбираем запись и входим в окно AlertInfo(...)
Не смотря на заданный _HMG_InplaceParentHandle при первом входе в окно по кнопке, выбора записи и выхода из AlertInfo(), окно с тсб убегает под окно MAIN. Окно STANDARD имеет родителя окно DeskTop. Повторные выборы записи и все ok! окно STANDARD на переднем плане, но закрыв его и снова жмем кнопку, та же картина, окно под main. Т.е. поведение окна STANDARD первый раз правильное, раз привязана к desktop, то на desktop и убежало (хоть и было поверх main), тогда надо дать возможность, как и у модал, привязывать родителя, может через тот же _HMG_InplaceParentHandle, сейчас стоит в _DefineWindow()
ParentHandle := iif( child == .T., _HMG_MainHandle, 0 )

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




Пост N: 2164
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 25.06.23 11:54. Заголовок: SergKis Большое спа..


SergKis
Большое спасибо за Ваш пример
Решил эту проблему с помощью вызова функции SwitchToThisWindow() после выхода из модального окна.
      (This.Object):Event(VK_RETURN, {|ow| my_Modal(ow), SwitchToThisWindow( GetFormHandle( cForm ), 1 ) }) 

где вспомогательная функция определена в одну строку:
DECLARE DLL_TYPE_VOID SwitchToThisWindow( DLL_TYPE_LONG hWnd, DLL_TYPE_BOOL lRestore ) ; 
IN USER32.DLL


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




Пост N: 4326
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.06.23 12:53. Заголовок: gfilatov2002 пишет Р..


gfilatov2002 пишет
 цитата:
Решил эту проблему с помощью вызова функции SwitchToThisWindow() после выхода из модального окна


Дело не в этом, а во внутренней работе hmg (ф-я events()), которая перемещает окно standard на desktop после первого вызова, т.е. убирает окно с переднего плана, окно должно оставаться как было на переднем плане или привязывать parentHandle к main например. Поднять окно после модального можно и To_Focus(...) можно
 
FUNCTION my_Modal( oWnd )
LOCAL nBrw, oBrw, cBrw, cAls, cWnd
LOCAL cMsg := ""
LOCAL o := oWnd:Cargo

cWnd := oWnd:Name
nBrw := o:nBrw
oBrw := o:oBrw
cBrw := o:cBrw
cAls := o:cAls

cMsg := hb_valtoexp({cWnd, nBrw, cBrw, cAls, oBrw:cControlName})

AlertInfo(cMsg, "INFO - "+cWnd)

To_Focus(cWnd, cBrw)

RETURN Nil

Последующие выборы строки (не выходя из STANDARD) работают не перемещая окно STANDARD после modal

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




Пост N: 4327
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.06.23 13:32. Заголовок: PS Проявление ситуац..


PS
Проявление ситуации хорошо видно на следующем примере (добавил модальное окно на выбор записи с таблицей тсб). Выбор в этом окне и выход из окна AlertInfo() дает перенос окна STANDARD под main, т.е. с окна модального с таблицей улетели под main.
Пример https://TransFiles.ru/0s7wp

PS
Попробовал простое (для теста) в
 
FUNCTION _DefineWindow ( FormName, Caption, x, y, w, h, nominimize, nomaximize, ;
...
//ParentHandle := iif( child == .T., _HMG_MainHandle, 0 )
ParentHandle := iif( child == .T., _HMG_MainHandle, _HMG_InplaceParentHandle )
...
и в примере в ф-ии (цветом)
STATIC FUNCTION my_Btn( nEvnt, cButt, oWnd )
LOCAL cBtn, cWnd, o, cForm, y, x

cWnd := oWnd:Name
cBtn := "ButtonEX_" + hb_ntos(nEvnt)
cForm := "w"+cBtn

IF cBtn != cButt
? ProcName(), "ERROR", cBtn, "!=", cButt
RETURN .F.
ENDIF

SET WINDOW THIS TO cWnd

o := This.(cBtn).Cargo
cAls := "CUST_"+hb_ntos(o:nBtn)
cTitle := cBtn+": "+hb_ntos(o:nBtn)+" "+o:cCap
y := o:nY - 100
x := o:nX + 50

_HMG_InplaceParentHandle := This.Handle

? ProcName(), nEvnt, cBtn, o:cBtn, o:nBtn, o:cCap, cForm, cTitle

my_Standard( cForm, o:nBtn, cTitle, o:aBClr, y, x, o:nW, o:nH, cAls )

_HMG_InplaceParentHandle := 0

SET WINDOW THIS TO

RETURN .T.

Окна не убегают под main, но при выходе из окна modal с тсб, окно STANDARD без фокуса (это все про первый вход с кнопки, потом все ok!)

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




Пост N: 4328
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.06.23 14:39. Заголовок: Григорий Есть эффект..


Григорий
Есть эффект не оч. красивый, если в последнем примере, например кнопку "Sample 2" нажать, сделать выбор строки, попадаем на окно модал с таблицей, теперь, если кликнуть мышкой по заголовку окна STANDARD (пред. таблица), то будет мелькание окон и только потом звук с возвратом фокуса на тек. модальное окно

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




Пост N: 4329
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.06.23 15:32. Заголовок: gfilatov2002 пишет Р..


gfilatov2002 пишет
 цитата:
Решил эту проблему с помощью вызова функции SwitchToThisWindow() после выхода из модального окна.
(This.Object):Event(VK_RETURN, {|ow| my_Modal(ow), SwitchToThisWindow( GetFormHandle( cForm ), 1 ) })


Тогда получается, что код в ф-ии Events(...), для окна modal, не работает
 
...
****************************************************************************
CASE WM_CLOSE
****************************************************************************
...
_hmg_OnHideFocusManagement ( i )
...
*-----------------------------------------------------------------------------*
PROCEDURE _hmg_OnHideFocusManagement ( i )
*-----------------------------------------------------------------------------*
...
* Modal

IF ( x := AScan ( _HMG_aFormHandles, _HMG_aFormParenthandle [ i ] ) ) > 0

IF _HMG_aFormType [ x ] == "M"

* Modal Parent

_HMG_IsModalActive := .T.
_HMG_ActiveModalHandle := _HMG_aFormParenthandle [ i ]

EnableWindow ( _HMG_aFormParenthandle [ i ] )

SetFocus ( _HMG_aFormParenthandle [ i ] )

ELSE
...

Может есть смысл здесь подключить вместо SetFocus ( _HMG_aFormParenthandle [ i ] )
SwitchToThisWindow( _HMG_aFormParenthandle [ i ], 1 )

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




Пост N: 2165
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 25.06.23 16:03. Заголовок: SergKis пишет: Може..


SergKis пишет:

 цитата:
Может есть смысл здесь подключить вместо SetFocus ( _HMG_aFormParenthandle [ i ] )
SwitchToThisWindow( _HMG_aFormParenthandle [ i ], 1 )


Да, тоже подумываю об этом.
Благодарю за наводку

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




Пост N: 2167
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 25.06.23 18:22. Заголовок: Добавил в ядро библи..


Добавил в ядро библиотеки функцию SwitchToThisWindow(hWnd,[lRestore]).
По умолчанию значение lRestore = .T.
Теперь конструкции вида

 цитата:
IF IsIconic( hForm ) ; _Restore( hForm )
ENDIF

можно заменить на

 цитата:
SwitchToThisWindow( hForm )



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




Пост N: 4330
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 26.06.23 09:52. Заголовок: gfilatov2002 Малень..


gfilatov2002
Маленькая добавка
 
METHOD LoadFields( lEditable, aColSel, cAlsSel, aNameSel, aHeadSel ) CLASS TSBrowse
...
ATail( ::aColumns ):nFieldDec := aStru[ nE, 4 ] // 18.07.2018

IF aStru[ nE, 2 ] $ "=@T^+"
ATail( ::aColumns ):lEdit := .F.
ENDIF

IF HB_ISARRAY( aNameSel ) .AND. Len( aNameSel ) > 0 .AND. n <= Len( aNameSel )
...
для режима SET DELETED OFF
METHOD DeleteRow( lAll, lUpStable ) CLASS TSBrowse
...
::lHasChanged := .T.
::DrawSelect()


CASE ::lIsArr
...

Без этой строки надо
oBrw:bPostDel := {|ob| ob:DrawSelect() }
добавлять

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




Пост N: 2168
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 26.06.23 10:38. Заголовок: SergKis пишет: Мале..


SergKis пишет:

 цитата:
Маленькая добавка


Принято

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




Пост N: 7448
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.06.23 10:59. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Добавил в ядро библиотеки функцию SwitchToThisWindow(hWnd,[lRestore]).


Когда обновление будет ?

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




Пост N: 2169
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 26.06.23 11:02. Заголовок: Andrey пишет: Когда..


Andrey пишет:

 цитата:
Когда обновление будет ?


Послезавтра, в среду

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




Пост N: 4331
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 27.06.23 01:55. Заголовок: gfilatov2002 Поймал..


gfilatov2002
Поймал ситуацию, как у Андрея. Не лечится To_Focus(), SwitchToThisWindow( hForm, 1 )
Пример https://TransFiles.ru/eudq8
После запуска, например, жмем "Sample 1", потом "Sample 2"
Снова жмем "Sample 1", что бы перевести окно STANDARD на передний план.
Не получается, окно приходит поверх main и опять прячется под него, т.е. мелькает
Так же ведет себя и кнопка "Sample 2" и остальные тоже.
Мышкой или Alt+TAB все работает
Ф-я my_Btn() находится в table.prg. Работает для всех кнопок окна standard.

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




Пост N: 2170
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 27.06.23 11:00. Заголовок: SergKis пишет: Пойм..


SergKis пишет:

 цитата:
Поймал ситуацию, как у Андрея.


Благодарю за пример!
SergKis пишет:

 цитата:
Мышкой или Alt+TAB все работает


Не понятен выбор окон типа STANDARD для внутренних окон приложения.
Окна STANDARD являются самостоятельными по отношению к главному окну.
Для внутренних окон, конечно, надо использовать окна CHILD.
Думаю, это решит проблему с иерархией окон в приложении.

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




Пост N: 4332
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 27.06.23 12:07. Заголовок: gfilatov2002 пишет Д..


gfilatov2002 пишет
 цитата:
Думаю, это решит проблему с иерархией окон в приложении.


У Андрея, я так понимаю, запускается ~5 окон STANDARD, которые получают фокус для работы пользователем по выбору в TaskBar, все работает на один раз открытые базы (наверно исторически так сложилось).

 цитата:
Окна STANDARD являются самостоятельными по отношению к главному окну


Это да, но это не значит, что Main окно, должно захватывать фокус. Немного подработал, почистил пример и сделал TABSTOP на кнопки main окна и стало видно, что повторно поднять окно standard кнопкой не получается, оно мелькает и фокус на main визуально, реально не понятно, т.к. (добавил в my_Standard() на входе)
 
IF _IsWindowDefined(cForm)
hW := GetFormHandle(cForm)
nI := GetFormNameByHandle( hW, @cVal )
? "*Form =", hW, nI, cVal
hW := GetFocus()
cVal := ""
nI := -1
IF hW <> 0
nI := GetFormNameByHandle( hW, @cVal )
ENDIF
? "*Focus=", hW, nI, cVal
To_Focus(cForm)
hW := GetFocus()
cVal := ""
nI := -1
IF hW <> 0
nI := GetFormNameByHandle( hW, @cVal )
ENDIF
? "#Focus=", hW, nI, cVal

IF select(cAls) > 0 ; dbSelectArea(cAls)
ENDIF
RETURN Nil
ENDIF
...
выдает следующее
*Form = 23594206 2 wButton_1
*Focus= 6030820 0 ''
Call from: TO_FOCUS(20) --> main_misc.prg wButton_1 23594206 NIL
#Focus= 45286518 0 ''
...

Если интересно, пример с правками тут https://TransFiles.ru/hjqmk

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




Пост N: 4333
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 27.06.23 12:41. Заголовок: PS Заменил ссылку на..


PS
Заменил ссылку на пример, т.к. потерял bmp в ресурсах для индикации удаленных записей

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




Пост N: 7449
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 27.06.23 12:51. Заголовок: Не понятен выбор око..


gfilatov2002 пишет:

 цитата:
Не понятен выбор окон типа STANDARD для внутренних окон приложения.
Окна STANDARD являются самостоятельными по отношению к главному окну.
Для внутренних окон, конечно, надо использовать окна CHILD.
Думаю, это решит проблему с иерархией окон в приложении.


Во многих приложениях есть главное окно, с которого юзер запускает нужные ему окна для работы.
У меня юзер запускает STANDARD окна с заявками, договорами, абонентами и т.д.
Заставить юзера работать только с одним окном это не по современному, пускай что хочет, то и делает.
STANDARD окно ОЧЕНЬ удобно для юзера, оно остаётся на панели задач со своим значком и юзеру это нравиться.
Пример SAMPLES\Advanced\Tsb_5Win тоже такой же, и я думаю его так же можно поломать - поставив окно ожидания с прелодером и вызовом нескольких MODAL окон.

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




Пост N: 4334
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 27.06.23 12:55. Заголовок: gfilatov2002 Есть е..


gfilatov2002
Есть еще интересное поведение modal окон.
Запускаем "Sample 1", "Sample 2"
Поднимаем фокус на "Sample 1" (оба окна Sample над main)
Жмем Enter на "Sample 1" -> попадаем на окно modal, кусочек окна "Sample 2" виден
Жмем мышкой на видимый заголовок окна "Sample 2"
Активируется окно "Sample 1" как будто на нем нажали Enter несколько раз -> попадаем на окно modal AlertInfo()


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




Пост N: 4335
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 27.06.23 13:06. Заголовок: Andrey пишет STANDAR..


Andrey пишет
 цитата:
STANDARD окно ОЧЕНЬ удобно для юзера, оно остаётся на панели задач со своим значком и юзеру это нравиться.


Ты получишь то же самое, если запустишь свой exe 6 раз (можно в потоке, как пример FileChangeControl2), т.е.
0. main 0 // main окно с кнопками запуска в потоке пунктов ниже
1. main 1 // main окно заменяющее окно STANDARD 1
...
5. main 5 // main окно заменяющее окно STANDARD 5
программа бы сильно упростилась, по мне

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




Пост N: 7450
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 27.06.23 13:19. Заголовок: SergKis пишет: Ты п..


SergKis пишет:

 цитата:
Ты получишь то же самое, если запустишь свой exe 6 раз (можно в потоке, как пример FileChangeControl2),


Нужно тогда менять иконку и титул окна задачи.
Время запуска и открытия баз при запуске нового ехе-ника намного БОЛЬШЕ чем создание STANDART окна, базы все уже открыты.
А так юзер будет нервничать, при каждом запуске ругаясь на "тормозную" программу.
Уже такое видел и не раз.

И логику программирования свою менять.
Это можно, но уже в новых проектах.

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