Автор | Сообщение |
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: 2161
Зарегистрирован: 11.02.10
|
|
Отправлено: 21.06.23 17:56. Заголовок: SergKis пишет: Поче..
SergKis пишет: Ваш ответ в посте № 3211 от 19.05.20 10:57 цитата: | Выяснил, наверно, почему не было Footers в METHOD LDblClick( nRowPix, nColPix, nKeyFlags ) CLASS TSBrowse Если одновременно использовать с :LDblClick() :LButtonClick() или :RButtonClick(), то при нажатии LDblClick делая левый или правый клик "ложно" срабатывает после них LDblClick Это надо отметить для себя, что можно использовать или :LDblClick() или :LButtonClick(), :RButtonClick(). |
|
| |
|
SergKis
|
| постоянный участник
|
Пост N: 4317
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.06.23 18:15. Заголовок: gfilatov2002 Спасиб..
gfilatov2002 Спасибо Не использовал для Footer LDblClick, но просят, если не отпадет, то решу след. образом Скрытый текст
... oBrw := _TBrowse( oTsb, cAls, cBrw, nY, nX, nW, nH ) oBrw:bEvents := {|ob,nMsg,nWParam,nLParam| Local lRet, nCell, nHead, nFoot, nSpec // события назначаем (можно не все, тогда должен работать и ob:bLdblClick) nHead := 30 nFoot := 31 nSpec := 32 nCell := 33 lRet := bEvents_LDblClick( ob, nMsg, nWParam, nLParam, nCell, nHead, nFoot, nSpec ) Return lRet } ... :Event(30, {|ow,ky,ap| Local nI, xv ? "E-"+StrZero(ky, 2), ow:Name, ap, ap[3]:cControlName for nI := 1 TO Len(ap) xv := ap[nI] ? nI, xv IF Valtype(xv) == "O" ; ?? xv:ClassName ENDIF next ? Return Nil }) :Event(31, {|ow,ky,ap| Local nI, xv ? "E-"+StrZero(ky, 2), ow:Name, ap, ap[3]:cControlName for nI := 1 TO Len(ap) xv := ap[nI] ? nI, xv IF Valtype(xv) == "O" ; ?? xv:ClassName ENDIF next ? Return Nil }) :Event(32, {|ow,ky,ap| Local nI, xv ? "E-"+StrZero(ky, 2), ow:Name, ap, ap[3]:cControlName for nI := 1 TO Len(ap) xv := ap[nI] ? nI, xv IF Valtype(xv) == "O" ; ?? xv:ClassName ENDIF next ? Return Nil }) :Event(33, {|ow,ky,ap| Local nI, xv ? "E-"+StrZero(ky, 2), ow:Name, ap, ap[3]:cControlName for nI := 1 TO Len(ap) xv := ap[nI] ? nI, xv IF Valtype(xv) == "O" ; ?? xv:ClassName ENDIF next ? Return Nil }) ... FUNCTION bEvents_LDblClick( ob, nMsg, nWParam, nLParam, nCell, nHead, nFoot, nSpec ) Local nRowPix, nColPix, nRow, nCol, lPost, nPost, o //#define WM_LBUTTONDBLCLK 515 // 0x203 IF nMsg == 515 .and. !_GetKeyState( VK_SHIFT ) .and. ! ob:IsEdit .and. ob:lCellBrw IF ! ob:lEnabled .or. ob:lDontChange ; RETURN lPost ENDIF o := ob:Cargo ; Default o := oHmgData() Default nCell := o:nEventCell Default nHead := o:nEventHead Default nFoot := o:nEventFoot Default nSpec := o:nEventSpec Default nCell := 0, nHead := 0, nFoot := 0, nSpec := 0 IF Empty( nCell + nHead + nFoot + nSpec) ; RETURN lPost ENDIF nRowPix := HiWord( nLParam ) nColPix := LoWord( nLParam ) nRow := ob:GetTxtRow( nRowPix ) nCol := ob:nAtColActual( nColPix ) lPost := .F. nPost := 0 IF ! Empty(nCell) .and. nRow == ob:nRowPos .and. nRow > 0 lPost := .T. nPost := nCell ELSEIF ! Empty(nHead) .and. nRow == 0 .and. ! Empty( ob:lDrawHeaders ) lPost := .T. nPost := nHead ELSEIF ! Empty(nFoot) .and. nRow == -1 .and. ! Empty( ob:lDrawFooters ) lPost := .T. nPost := nFoot ELSEIF ! Empty(nSpec) .and. nRow == -2 .and. ! Empty( ob:lDrawSpecHd ) lPost := .T. nPost := nSpec ENDIF IF lPost ; DO EVENTS ; _wPost( nPost, ob:cParentWnd, { nRow, nCol, ob, nWParam } ) ENDIF ENDIF RETURN lPost ...
| Это тест, что в oBrw:bLDblClick - не важно, отключен цитата: | можно использовать или :LDblClick() или :LButtonClick(), :RButtonClick(). |
| Для Footers :LDblClick() не работает, отключена #if 0 ... :LButtonClick(), :RButtonClick() не назначены (:lCellBrw := .T.)
| |
|
Andrey
|
| постоянный участник
|
Пост N: 7438
Зарегистрирован: 12.09.06
|
|
Отправлено: 21.06.23 18:49. Заголовок: Григорий, а почему п..
Григорий, а почему при ошибке в программе - заново срабатывает MYINITWIN$() ? Он же не должен 2 раза вызываться. Вот лог из моей программы: [_fFind] 2: Forms: ARRAY[4] {"Form_Main", "Form_Table_Abon", "Form_TbrwFiltr", "Form_Find"} Вот здесь была ошибка!!! ********** Вызов из: MYINITWIN$(281) --> Source\main.prg Free Open Source Software: Harbour 3.2.0dev (r2301151017) Free Compiler: Embarcadero C++ 7.30 (32-bit) Free Gui library: Harbour MiniGUI Extended Edition 23.01.0 (32-bit) ANSI ... далее показ самой ошибки Error MGERROR/0 Window: Form_Seek is not defined. Program terminated. Called from MSGMINIGUIERROR(0) Called from GETPROPERTY(0) Called from FORMA_FILTER(878) in module: Source\Tbrw_fFind.prg Called from MYFINDEDIT(762) in module: Source\Tbrw_fFind.prg
| |
|
gfilatov2002
|
| moderator
|
Пост N: 2162
Зарегистрирован: 11.02.10
|
|
Отправлено: 21.06.23 19:26. Заголовок: Andrey пишет: почем..
Andrey пишет: цитата: | почему при ошибке в программе - заново срабатывает MYINITWIN$() ? |
| Точно не могу сказать, но, возможно, эта функция определена как INIT процедура.
| |
|
SergKis
|
| постоянный участник
|
Пост N: 4318
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.06.23 19:46. Заголовок: Andrey Сделай STAT..
Andrey Сделай STATIC lStaticMyInitWin := .F. INIT PROCEDURE MyInitWin() IF lStaticMyInitWin ; RETURN ENDIF lStaticMyInitWin := .T. ... может поможет
| |
|
Andrey
|
| постоянный участник
|
Пост N: 7439
Зарегистрирован: 12.09.06
|
|
Отправлено: 21.06.23 23:11. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Точно не могу сказать, но, возможно, эта функция определена как INIT процедура. |
| Да, у меня в программе эта функция определена, как было вами сделано ещё в 2013 году ! Пример \SAMPLES\BASIC\SPLASHDEMO_3 А она разве должна при ошибке ещё раз вызываться ? Я считал что инициализация переменных прошла и всё, больше это функция не вызывается. У меня в этой функции стоит удаление лог-файла. И получается, что при ошибке лог стирается. SergKis пишет: цитата: | Сделай STATIC lStaticMyInitWin := .F. |
| Спасибо !
| |
|
Andrey
|
| постоянный участник
|
Пост N: 7441
Зарегистрирован: 12.09.06
|
|
Отправлено: 22.06.23 12:16. Заголовок: Григорий, что делать..
Григорий, что делать с MODAL окнами ? У меня пропала очередность возврата этих окон. Я писал об этом в другой теме. И ещё обнаружил проблемы с этими окнами в другом месте программы. На экране открыто MODAL окно (1), открываю по кнопке другое MODAL окно (2), видно построение этого окна, а потом бац и оно пропадает с экрана. Закрываешь все окна программы, а оно (2) обнаруживается под всеми окнами. Причём фокус на окна совсем пропадает, окно приходиться закрывать по Alt+F4, ну и будет сразу вылет, типа нет такого окна. Как такое может быть и как исправить ? До этого года всё отлично работало и юзера не жаловались !!! Тестировал на BCC 5.5 и MiniGUI 22.12.2
| |
|
SergKis
|
| постоянный участник
|
Пост N: 4319
Зарегистрирован: 17.02.12
|
|
Отправлено: 22.06.23 12:27. Заголовок: Andrey Попробуй пос..
Andrey Попробуй после DEFINE WINDOW ... MODAL ... сделать This.Topmost := .T. или _ChangeWindowTopmostStyle ( This.Handle , .T. ) или _ChangeWindowTopmostStyle ( GetFormHandle( This.Name ) , .T. ) каждому modal окну Что будет ? PS Проверь, есть Topmost == .T. у окна на котором вызываешь modal, т.е. DEFINE WINDOW ... TOPMOST ... ON INIT {|| This.Topmost := .F., ... } на этом окне идет вызов DEFINE WINDOW ... MODAL ... Есть выделенное цветом ?
| |
|
Andrey
|
| постоянный участник
|
Пост N: 7442
Зарегистрирован: 12.09.06
|
|
Отправлено: 22.06.23 12:44. Заголовок: Откатился до версии ..
Откатился до версии MiniGUI 21.11.1 - пропали эти проблемы !!! Т.е. ошибка пошла с версии 21.12
| |
|
Andrey
|
| постоянный участник
|
Пост N: 7443
Зарегистрирован: 12.09.06
|
|
Отправлено: 22.06.23 13:21. Заголовок: SergKis пишет: Есть..
SergKis пишет: Сделал ! Помогло ! Спасибо ! Но это всё равно что окна прибить гвоздями... Оно же по умолчанию MODAL
| |
|
SergKis
|
| постоянный участник
|
Пост N: 4320
Зарегистрирован: 17.02.12
|
|
Отправлено: 22.06.23 14:52. Заголовок: Andrey пишет Но это ..
Andrey пишет цитата: | Но это всё равно что окна прибить гвоздями... Оно же по умолчанию MODAL |
| цитата: | — Мы не будем полагаться на случай. Мы пойдем простым логическим путем. — Пойдем вместе. |
| Так что, " Если не мы, то кто же ..."
| |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7444
Зарегистрирован: 12.09.06
|
|
Отправлено: 22.06.23 15:14. Заголовок: У меня в проге было:..
У меня в проге было: DEFINE WINDOW Form_YACIMP ; .... MODAL NOSIZE /*NOSYSMENU*/ ; ON INIT {|| This.Topmost := .T., aDimInit := InitYACIMP(nYear) ,; ..... FUNCTION InitYACIMP(nYear,lCreateIndex) .... WaitThreadCreateIcon( 'Поиск оплат абонента', ) DO EVENTS ... WaitThreadCloseIcon() // kill the window waiting DO EVENTS DbSelectArea(nSel) RETURN aRetDim Функция WaitThreadCreateIcon( 'Поиск оплат абонента',) создаёт окно MODAL и назначает This.Topmost := .T. В версии MiniGUI 21.11.1 - работало отлично, окно не пропадало и возврат вызова чепочки MODAL окон срабатывало как надо. Ошибка пошла с версии 21.12, я в эти модули не лазил, юзера начали жаловаться... Я перепроверил, собираешь с новой версии 21.12 и выше - ошибка, окно убегает, т.е. теряет Topmost := .T. И что делать ? Приколачивать каждое окно, это не выход ?
| |
|
Andrey
|
| постоянный участник
|
Пост N: 7445
Зарегистрирован: 12.09.06
|
|
Отправлено: 22.06.23 15:20. Заголовок: Собираю с новой верс..
Собираю с новой версии BCC 7.30 вообще фигня получается... .... WaitThreadCloseIcon() // kill the window waiting DO EVENTS DbSelectArea(nSel) Form_YACIMP.Topmost := .T. // добавил так !!! RETURN aRetDim Окно на переднем плане, но НЕТ возможности нажать на кнопки на форме !!! Прога висит ! Нажатие Alt+F4 тоже не помогает... Потыкаешь и прога сваливается с ошибкой... Повторюсь - при сборке MiniGUI 21.11.1 - работает отлично ! P.S. убрал WaitThreadCreateIcon() - тогда всё заработало !!! Функцию WaitThreadCreateIcon() вместе писали...
| |
|
SergKis
|
| постоянный участник
|
Пост N: 4321
Зарегистрирован: 17.02.12
|
|
Отправлено: 22.06.23 15:39. Заголовок: Andrey Смотрю в Tsb..
Andrey Смотрю в Tsb_DemoMdi WaitThreadCreateIcon( cTitle, cIndicator ), если у тебя такой же, то неточности есть: - нет _HMG_InplaceParentHandle - на передний план ставил бы сразу после DEFINE WINDOW &cFormName ; CLIENTAREA nMaxWidth, 104 ; MODAL NOCAPTION ; ... This.Topmost := .T. ... - в ON INIT можно делать This.Topmost := .F. (что бы можно было на excel окно, или другое не твое, переключиться) Так как нет _HMG_InplaceParentHandle, то после Release фокус идет на MAIN окно, а на передний план ты переводишь Form_YACIMP В целом все объяснимо
| |
|
SergKis
|
| постоянный участник
|
Пост N: 4322
Зарегистрирован: 17.02.12
|
|
Отправлено: 22.06.23 15:42. Заголовок: Andrey пишет Функцию..
Andrey пишет цитата: | Функцию WaitThreadCreateIcon() вместе писали... |
| Тогда я говорил, что ЭТО плохая затея с потоками, т.к. надо использовать нормальное окно modal и внутри его исполнять, например, блок кода, для длит. операций и было бы значительно проще FUNC Wait_Modal(..., bBlock ) LOCAL cForm := ... ... _HMG_InplaceParentHandle := ThisWindow:Handle ... DEFINE WINDOW ... MODAL ... ON INIT {|| This.Topmost := .F., This.TimerSetIcon.Enabled := .T., DoEvents(), _wPost(0) } This.Topmost := .T. ... DEFINE TIMER TimerSetIcon ... ACTION {|| SetProperty(cForm, "TimerSetIcon", "Enabled", .F.), ; CheckTimerSetIcon(cForm), SetProperty(cForm, "TimerSetIcon", "Enabled", .T.) } This.TimerSetIcon.Enabled := .F. This.TimerSetIcon.Visible := .F. ... (This.Object):Event( 0, bBlock ) ... END WINDOW ... _HMG_InplaceParentHandle := 0 RETURN Nil STATIC FUNC CheckTimerSetIcon( cForm ) ...
| |
|
Andrey
|
| постоянный участник
|
Пост N: 7446
Зарегистрирован: 12.09.06
|
|
Отправлено: 23.06.23 22:14. Заголовок: Что-то в МиниГуи пош..
Что-то в МиниГуи пошло не так. У меня 2 проекта, один полный (вес ехе-ника 26 Мб), второй сокращённый для отладки модулей (вес ехе-ника 16 Мб). Собираю оба проекта на: Harbour 3.2.0dev (r2301231146) Borland C++ 5.8.2 (32-bit) Harbour MiniGUI Extended Edition 23.01.0 (32-bit) ANSI Сокращённый проект собирается быстрей, да и удобней с ним отлаживать. В обоих проектах есть меню (модальное окно с выбором 4 кнопки) Сокращённый проект прекрасно работает с этими кнопками и выбор/возврат есть по этим кнопкам. Если запускаю полный проект, то кнопки отрабатывают ТОЛЬКО один раз, а потом при возврате на это окно - оно ТУПО ВЕШАЕТСЯ.... ни мышкой окно подвинуть, ни кнопки не доступны. Срабатывает только клавиша ESC, потому что назначил эту клавишу сам. Вопрос на засыпку, почему такое СТРАННОЕ поведение окна ? Как это побороть ? Окно обычное, без всяких наворотов. Сделал назначение AlertInfo() по клавише F2 - то в полном проекте, Т ОЖЕ СРАЗУ ВЕШАЕТ окно... Вот такой простой код: Скрытый текст
FUNCTION FindListZa(...) ... hOld := _HMG_InplaceParentHandle _HMG_InplaceParentHandle := ThisWindow.Handle DEFINE WINDOW Form_NZ ; MODAL ; ON INIT {|| MyInitFormNZ(...) } ... cText := "1.Меню" @ BUTTONEX Button_1 ... ACTION {|| _wSend(10), DoEvents(), _wPost(12) } cText := "2.Меню" @ BUTTONEX Button_2 ... ACTION {|| _wSend(20), DoEvents(), _wPost(22) } cText := "3.Меню" @ BUTTONEX Button_3 .... ACTION {|| _wSend(30), DoEvents(), _wPost(32) } cText := "Выход" @ BUTTONEX Button_5 ... ACTION {|| _wSend(97) } ON KEY ESCAPE OF Form_NZ ACTION _wPost(97) ON KEY F2 OF Form_NZ ACTION _wPost(87, ThisWindow.Name) WITH OBJECT This.Object :Event( 0, {| | InkeyGui(200) } ) :Event( 1, {| | This.Button_1.Setfocus , _PushKey( VK_RETURN ) } ) :Event( 2, {| | This.Button_2.Setfocus , _PushKey( VK_RETURN ) } ) :Event( 3, {| | This.Button_3.Setfocus , _PushKey( VK_RETURN ) } ) :Event( 4, {| | This.Button_4.Setfocus , _PushKey( VK_RETURN ) } ) :Event(10, {| | This.Button_1.Enabled := .F. } ) :Event(11, {|ow| This.Button_1.Enabled := .T. , _wPost(90, ow) } ) :Event(12, {|ow| // 1.Меню IniSaveFileThisNZ(...) ReListNZ1(...) DoEvents() _wPost(11, ow:Name) RETURN NIL } ) :Event(20, {| | This.Button_2.Enabled := .F. } ) :Event(21, {|ow| This.Button_2.Enabled := .T. , _wPost(90, ow) } ) :Event(22, {|ow| // 2.Меню LOCAL nMsg IniSaveFileThisFNZ(...) aNew := ReListNZ2(...) nMsg := iif( LEN(aNew) > 0, 99, 21 ) DoEvents() _wPost(nMsg, ow:Name) RETURN NIL } ) :Event( 30, {| | This.Button_3.Enabled := .F. } ) :Event( 31, {|ow| This.Button_3.Enabled := .T. , _wPost(90, ow) } ) :Event( 32, {|ow| // 3.Меню LOCAL nMsg IniSaveFileThisFNZ(...) aNew := ReListNZ3(...) nMsg := iif( LEN(aNew) > 0, 99, 31 ) DoEvents() _wPost(nMsg, ow:Name) RETURN NIL } ) :Event( 87, {|ow| HelpThisWindow() , DoEvents(), _wPost(90, ow) } ) :Event( 90, {|ow| // остаться в окне выбора Local cMsg := "Window not found ! " + ow:Name + ";" + ProcNL() IF ! To_Focus(ow:Name , "Label_0") AlertStop(cMsg, "ERROR") ENDIF DO EVENTS wApi_Sleep(100) Return Nil } ) :Event( 97, {|ow| IniSaveFileThisFNZ(...) ,; aNew := {} , DoEvents(), _wPost(99, ow:Name) } ) :Event(99, {|ow| ow:Release() } ) END WITH END WINDOW CENTER WINDOW Form_NZ ACTIVATE WINDOW Form_NZ IF ! ISNIL(hOld) ; _HMG_InplaceParentHandle := hOld ENDIF RETURN aNew
|
| |
|
SergKis
|
| постоянный участник
|
Пост N: 4323
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.06.23 05:55. Заголовок: Andrey Сделай так ..
Andrey Сделай так ... ON KEY F2 OF Form_NZ ACTION _wPost(87, ThisWindow.Name) ... :Event( 87, {|ow| _HMG_InplaceParentHandle := This.Handle , HelpThisWindow(), ; _HMG_InplaceParentHandle := 0 , DoEvents(), _wPost(90, ow) } ) Используемая AlertInfo() -> HMG_Alert() - MODAL окно и нет заданого _HMG_InplaceParentHandle
| |
|
SergKis
|
| постоянный участник
|
Пост N: 4324
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.06.23 10:32. Заголовок: gfilatov2002 Может ..
gfilatov2002 Может добавить что такое для окна modal (_HMG_InplaceOwnerHandle - new variable) #xtranslate SET WINDOW MODAL [ PARENT ] HANDLE <x:ON,OFF> => _HMG_InplaceOwnerHandle := ( Upper(<(x)>) == "ON" ) FUNCTION _DefineModalWindow ( FormName, Caption, x, y, w, h, Parent, nosize, nosysmenu, nocaption, aMin, aMax, ; ... IF ! Empty( _HMG_InplaceOwnerHandle ) _HMG_InplaceParentHandle := iif( _HMG_BeginWindowMDIActive, GetActiveMdiHandle(), GetActiveWindow() ) ENDIF IF _HMG_InplaceParentHandle <> 0 Parent := _hmg_InplaceParentHandle ELSEIF ! _HMG_BeginWindowMDIActive Parent := _hmg_MainHandle ENDIF ... IF ! Empty( _HMG_InplaceOwnerHandle ) _HMG_InplaceParentHandle := 0 ENDIF RETURN ( FormHandle )
| |
|
gfilatov2002
|
| moderator
|
Пост N: 2163
Зарегистрирован: 11.02.10
|
|
Отправлено: 24.06.23 12:44. Заголовок: SergKis пишет: для ..
SergKis пишет: цитата: | для окна modal (_HMG_InplaceOwnerHandle - new variable) |
| Сделаю, конечно. Только хочу дать этой переменной имя _HMG_OwnerModalHandle
| |
|
Andrey
|
| постоянный участник
|
Пост N: 7447
Зарегистрирован: 12.09.06
|
|
Отправлено: 24.06.23 13:24. Заголовок: SergKis пишет: Сдел..
SergKis пишет: Сделал. Не помогает. Цепочка старта окон WINDOWTYPE STANDARD TOPMOST, затем MODAL 1, затем MODAL 2 и вот на нём виснет. Хотя в других местах программы есть такое же и не виснет... Убрал ВСЕ ресурсы из полного проекта, ехе-ник стал весить 10 Мб, проблема осталась. Видно всё таки что-то в полном проекте - построение модулей типа как в SAMPLES\BASIC\SPLASHDEMO_3 ? Или ограничение по коду в Харборе ?
| |
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|
|