Форум » GUI » Новая версия Расширенного релиза библиотеки MiniGUI (часть VI ) (продолжение) » Ответить

Новая версия Расширенного релиза библиотеки MiniGUI (часть VI ) (продолжение)

gfilatov: Начало темы находится здесь, а теперь АНОНС * АНОНС * АНОНС * АНОНС * АНОНС Готовится к опубликованию новая сборка №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: SergKis пишет: Почему убрано ? Ваш ответ в посте №3211 от 19.05.20 10:57 Выяснил, наверно, почему не было Footers в METHOD LDblClick( nRowPix, nColPix, nKeyFlags ) CLASS TSBrowse Если одновременно использовать с :LDblClick() :LButtonClick() или :RButtonClick(), то при нажатии LDblClick делая левый или правый клик "ложно" срабатывает после них LDblClick Это надо отметить для себя, что можно использовать или :LDblClick() или :LButtonClick(), :RButtonClick().

SergKis: gfilatov2002 Спасибо Не использовал для Footer LDblClick, но просят, если не отпадет, то решу след. образом [pre2] ... 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 ... [/pre2] Это тест, что в oBrw:bLDblClick - не важно, отключен можно использовать или :LDblClick() или :LButtonClick(), :RButtonClick(). Для Footers :LDblClick() не работает, отключена #if 0 ... :LButtonClick(), :RButtonClick() не назначены (:lCellBrw := .T.)

Andrey: Григорий, а почему при ошибке в программе - заново срабатывает MYINITWIN$() ? Он же не должен 2 раза вызываться. Вот лог из моей программы: [pre2] [_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[/pre2]


gfilatov2002: Andrey пишет: почему при ошибке в программе - заново срабатывает MYINITWIN$() ? Точно не могу сказать, но, возможно, эта функция определена как INIT процедура.

SergKis: Andrey [pre2] Сделай STATIC lStaticMyInitWin := .F. INIT PROCEDURE MyInitWin() IF lStaticMyInitWin ; RETURN ENDIF lStaticMyInitWin := .T. ... [/pre2] может поможет

Andrey: gfilatov2002 пишет: Точно не могу сказать, но, возможно, эта функция определена как INIT процедура. Да, у меня в программе эта функция определена, как было вами сделано ещё в 2013 году ! Пример \SAMPLES\BASIC\SPLASHDEMO_3 А она разве должна при ошибке ещё раз вызываться ? Я считал что инициализация переменных прошла и всё, больше это функция не вызывается. У меня в этой функции стоит удаление лог-файла. И получается, что при ошибке лог стирается. SergKis пишет: Сделай STATIC lStaticMyInitWin := .F. Спасибо !

Andrey: Григорий, что делать с MODAL окнами ? У меня пропала очередность возврата этих окон. Я писал об этом в другой теме. И ещё обнаружил проблемы с этими окнами в другом месте программы. На экране открыто MODAL окно (1), открываю по кнопке другое MODAL окно (2), видно построение этого окна, а потом бац и оно пропадает с экрана. Закрываешь все окна программы, а оно (2) обнаруживается под всеми окнами. Причём фокус на окна совсем пропадает, окно приходиться закрывать по Alt+F4, ну и будет сразу вылет, типа нет такого окна. Как такое может быть и как исправить ? До этого года всё отлично работало и юзера не жаловались !!! Тестировал на BCC 5.5 и MiniGUI 22.12.2

SergKis: 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: Откатился до версии MiniGUI 21.11.1 - пропали эти проблемы !!! Т.е. ошибка пошла с версии 21.12

Andrey: SergKis пишет: Есть выделенное цветом ? Сделал ! Помогло ! Спасибо ! Но это всё равно что окна прибить гвоздями... Оно же по умолчанию MODAL

SergKis: Andrey пишет Но это всё равно что окна прибить гвоздями... Оно же по умолчанию MODAL — Мы не будем полагаться на случай. Мы пойдем простым логическим путем. — Пойдем вместе. Так что, "Если не мы, то кто же ..."

Andrey: У меня в проге было: [pre2] 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[/pre2] Функция WaitThreadCreateIcon( 'Поиск оплат абонента',) создаёт окно MODAL и назначает This.Topmost := .T. В версии MiniGUI 21.11.1 - работало отлично, окно не пропадало и возврат вызова чепочки MODAL окон срабатывало как надо. Ошибка пошла с версии 21.12, я в эти модули не лазил, юзера начали жаловаться... Я перепроверил, собираешь с новой версии 21.12 и выше - ошибка, окно убегает, т.е. теряет Topmost := .T. И что делать ? Приколачивать каждое окно, это не выход ?

Andrey: Собираю с новой версии BCC 7.30 вообще фигня получается... [pre] .... WaitThreadCloseIcon() // kill the window waiting DO EVENTS DbSelectArea(nSel) Form_YACIMP.Topmost := .T. // добавил так !!! RETURN aRetDim[/pre] Окно на переднем плане, но НЕТ возможности нажать на кнопки на форме !!! Прога висит ! Нажатие Alt+F4 тоже не помогает... Потыкаешь и прога сваливается с ошибкой... Повторюсь - при сборке MiniGUI 21.11.1 - работает отлично ! P.S. убрал WaitThreadCreateIcon() - тогда всё заработало !!! Функцию WaitThreadCreateIcon() вместе писали...

SergKis: Andrey Смотрю в Tsb_DemoMdi WaitThreadCreateIcon( cTitle, cIndicator ), если у тебя такой же, то неточности есть: - нет _HMG_InplaceParentHandle - на передний план ставил бы сразу после [pre2] DEFINE WINDOW &cFormName ; CLIENTAREA nMaxWidth, 104 ; MODAL NOCAPTION ; ... This.Topmost := .T. ... - в ON INIT можно делать This.Topmost := .F. (что бы можно было на excel окно, или другое не твое, переключиться)[/pre2] Так как нет _HMG_InplaceParentHandle, то после Release фокус идет на MAIN окно, а на передний план ты переводишь Form_YACIMP В целом все объяснимо

SergKis: Andrey пишет Функцию WaitThreadCreateIcon() вместе писали... Тогда я говорил, что ЭТО плохая затея с потоками, т.к. надо использовать нормальное окно modal и внутри его исполнять, например, блок кода, для длит. операций и было бы значительно проще [pre2] 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 ) ... [/pre2]

Andrey: Что-то в МиниГуи пошло не так. У меня 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 - то в полном проекте, ТОЖЕ СРАЗУ ВЕШАЕТ окно... Вот такой простой код: [pre2]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[/pre2]

SergKis: Andrey Сделай так[pre2] ... 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) } ) [/pre2] Используемая AlertInfo() -> HMG_Alert() - MODAL окно и нет заданого _HMG_InplaceParentHandle

SergKis: gfilatov2002 Может добавить что такое для окна modal (_HMG_InplaceOwnerHandle - new variable) [pre2] #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 ) [/pre2]

gfilatov2002: SergKis пишет: для окна modal (_HMG_InplaceOwnerHandle - new variable) Сделаю, конечно. Только хочу дать этой переменной имя _HMG_OwnerModalHandle

Andrey: SergKis пишет: Сделай так Сделал. Не помогает. Цепочка старта окон WINDOWTYPE STANDARD TOPMOST, затем MODAL 1, затем MODAL 2 и вот на нём виснет. Хотя в других местах программы есть такое же и не виснет... Убрал ВСЕ ресурсы из полного проекта, ехе-ник стал весить 10 Мб, проблема осталась. Видно всё таки что-то в полном проекте - построение модулей типа как в SAMPLES\BASIC\SPLASHDEMO_3 ? Или ограничение по коду в Харборе ?



полная версия страницы