Форум » GUI » Вопросы новичка [MiniGUI] » Ответить

Вопросы новичка [MiniGUI]

Dima: MAIN окно не получило фокус ввода при запуске , почему ? Пример самодостаточный. [pre2] #include "minigui.ch" REQUEST HB_CODEPAGE_RU1251, HB_CODEPAGE_RU866, HB_LANG_RUWIN REQUEST HB_LANG_RUWIN REQUEST HB_LANG_RU866 Func Main() DEFINE WINDOW Form_0 AT 321 , 491 WIDTH 558 HEIGHT 175 TITLE "Почему окно не в фокусе при запуске ?" ; MAIN NOSIZE NOSYSMENU TOPMOST ON INIT {|| MdiMain()} DEFINE BUTTONex Button_1 ROW 32 COL 424 WIDTH 110 HEIGHT 28 CAPTION "Вход" ACTION { || ret:=.t., DoMethod("Form_0","Hide") , DoMethod("Form_1","show") } FONTBOLD .t. END BUTTONex DEFINE BUTTONex Button_2 ROW 71 COL 424 CAPTION "Отмена" ACTION { || DoMethod("Form_0","Release") } WIDTH 110 HEIGHT 28 FONTBOLD .t. END BUTTONex END WINDOW Form_0.Activate Form_0.Setfocus return nil ***************************** Func Mdimain() DEFINE WINDOW Form_1 at 0,0 ; WIDTH 200 HEIGHT 300 TITLE "MDI windows" ; MDI ; NOSHOW END WINDOW Form_1.Center Form_1.Activate Form_0.Release return [/pre2]

Ответов - 289 новых, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All

Andrey: Dima пишет: Form_0.Release А зачем ты это делаешь ?

Dima: Andrey пишет: А зачем ты это делаешь ? Случайно вкралось. Но вопроса это не решило.

Andrey: Dima пишет: NOSHOW Не знаю правильно ли это сделано. Если окно не показывать - то фокус на нём и не будет ! Т.е. это окно скрытое, без показа !


Andrey: Попробуй ON INIT {|| MdiMain(), Form_0.Setfocus }

Haz: Dima пишет: MAIN окно не получило фокус ввода при запуске , почему Потому что в майн окне есть он инит , при выполнении которого выполняется Form_1.Activate. Activate работает так ( упрощенно ) - дает окну ФОКУС ( в нашем случае Form_1 ) и вызывает состояние ожидания пока окно не закроется Для решения вопроса нужно просто закоментить две строки //Form_1.Activate //Form_0.Release Теперь зачем в коде Form_0.Release было - для того что бы после закрытия окна Form_1 автоматом закрывалось и майн окно . Теперь, когда две строки закомментили фокус у майн будет , но после закрытия Form_1 задача не завершится и будет висеть в памяти ( окно то не видно , а в процессах есть ). Для решения этой проблемы в описании Form_1 нужно добавить ON INTERACTIVECLOSE {|| Domethod("Form_0","Release"), .T.}

Haz: Andrey пишет: Попробуй ON INIT {|| MdiMain(), Form_0.Setfocus } не поможет

Dima: Haz Да заработало

Dima: Есть MAIN MENU , хочу в ниспадающее меню (в RUNTIME) добавлять и удалять пункты меню. Пробовал _InsertMenuItem но оно добавляет не туда куда надо. Хотел при открытии окон , "корректировать" эту менюшку ....то есть когда много окошек открыто можно было тупо зайти в главное меню и выбрать нужное окошко с переходом фокуса ввода на него. Окна открываются из MDI окна , окно не MAIN , окошки открываю MDICHILD. Пример нужен или я понятно выразился ? )) PS MRU меню не предлагать так как создает MRU.INI там где прога живет. А прога по идее жить будет на серваке , в папке только для чтения.

gfilatov2002: Dima пишет: MRU меню не предлагать так как создает MRU.INI там где прога живет Просто к сведению. Команда MRU имеет дополнительный класс FILENAME <имя файла> для задания имени и пути для ини-файла, который можно создавать во временной папке, открытой для записи

Dima: gfilatov2002 Понял , попробую. А если без MRU , как добавить корректно пункт в выпадающее меню. PS Сразу видно что ответил человек которому и пример не нужен и сразу понял мысль Респект !

SergKis: Dima Можно в statusbar иметь icon, по клику делать окно (можно modal) со списком для выбора и перехода

Dima: Меню с MRU заявлено так [pre2] ......... END POPUP POPUP "Окна" NAME OPENWIND MRU FILENAME System.TempFolder + "\temp.ini" END POPUP END POPUP END MENU [/pre2] В совершенно другом окне при его создании , добавляю пунктик в MRU меню (Главного окна) так: [pre2] Func MyMditool(cforma,ctitle) _InsertMenuItem ( "OPENWIND" , "Form_1" , ctitle , ; {||DoMethod(mymenuhash[cforma],"Restore"),DoMethod(mymenuhash[cforma],"Setfocus")}) .......... [/pre2] И получаю следующий бред. Картинка Нужные пункты добавились и в MRU меню и в горизонтальное между пунктом Настройки и Окна (о чем прогу я не просил собственно). Кроме того добавленный мною Action срабатывает только в этих не заявленных мною пунктах. Если те же пункты в MRU клацать в пункте Окна то ни какой реакции. По картинке (до кучи) хорошо видно что используется SET MENUSTYLE EXTENDED и на добавленных в RunTime пунктах это свойство теряется.

SergKis: Dima SergKis пишет:Можно в statusbar иметь... суть та же, а дизайн свой (отличный от mru). список можно делать горизонтально, вертикально, окно по краю или за пределами Mdi, по on change списка переключать mdichild окна сразу на показ ...

Dima: SergKis В самплесах есть примерчик ? Интересует не только добавление в меню но и удаление из него ( при закрытии нужных окон )

SergKis: Dima в качестве списка может быть array TsBrowse, Grid (с картинками), примеры есть при формировании окна modal надо отключить режим mdi по завершении работы окна включить снова за базу можно взять и пример basic\msgmenu\*.*. Вот обрывки у меня из mdi надергал по быстрому: [pre2] ... DEFINE WINDOW wMain ; AT 0, 0 ; WIDTH GetClientWidth () * nKfcW ; HEIGHT GetClientHeight() * nKfcH ; TITLE gTxt(Title) ; ICON cIcon ; MAIN MDI ; CURSOR cCursor ; ON INIT MainExecute() ; ON RELEASE MainExecute() ; ON MOUSECLICK MainExecute() ; ON INTERACTIVECLOSE MainExecute() ; BACKCOLOR aBColor _wCargoSet('') // Wnd.Cargo для окна MainMenu(cPref) // меню от префикса MainStatusBar() // StatusBar hWnd := FormHandle(wMain) AppSet(MainName , GetFormName()) AppSet(MainIndex , FormIndex(wMain)) AppSet(MainHandle, hWnd) AppSet(MainVhod1 , empty(g_Cfg(AppGet(MainName) + cCursor, '', [Window]))) // первый вход AppSet(SBarHeight, GetWindowHeight(ControlHandle(StatusBar, wMain))) AppSet(TBarHeight, 0) AppSet(MainClientWidth , GetClientWidth (hWnd)) AppSet(MainClientHeight, GetClientHeight(hWnd) - AppGet(SBarHeight)) END WINDOW ... STATIC FUNCTION MainStatusBar( cFont, nSize, lBold ) // MDI Main StatusBar LOCAL oS := Application.Sets LOCAL nW3 := oS:W(20) + 16 LOCAL nW4 := oS:W(30) + 16 LOCAL nW5 := oS:W(,4) + 16 LOCAL nW2 := int(( GetClientWidth( _HMG_MainHandle ) - nW3 - nW4 - nW5 ) * 0.4 ) DEFAULT cFont := oS:cFontName, ; nSize := oS:nDefFontSize, ; lBold := .T. IF lBold DEFINE STATUSBAR FONT cFont SIZE nSize BOLD ELSE DEFINE STATUSBAR FONT cFont SIZE nSize ENDIF STATUSITEM "" ACTION MainExecute('stb.1') STATUSITEM "" WIDTH nW2 ACTION MainExecute('stb.2') STATUSITEM "" WIDTH nW3 ACTION MainExecute('stb.3') ICON 'D_DAT' STATUSITEM "" WIDTH nW4 ACTION MainExecute('stb.4') ICON 'D_ORG' STATUSITEM "" WIDTH nW5 ACTION MainExecute('stb.5') ICON 'D_SET' END STATUSBAR RETURN FUNCTION MainExecute( cKey, cTxt ) // выполнение в главном окне LOCAL a,i,j,k LOCAL cThis := '', lRet := .T., o := AppGet(Leto) LOCAL cMain_menu := 'Main_menu_' /* msglog( CRLF ) msglog( procname(), o:IsErrConnect(), o:cPathBase, o:cPathLocal ) msglog( '_HMG_ThisEventType ', _HMG_ThisEventType ) msglog( '_HMG_ThisFormIndex ', _HMG_ThisFormIndex ) msglog( '_HMG_ThisType ', _HMG_ThisType ) msglog( '_HMG_ThisIndex ', _HMG_ThisIndex ) msglog( '_HMG_ThisFormName ', _HMG_ThisFormName ) msglog( '_HMG_ThisControlName', _HMG_ThisControlName) */ IF _HMG_ThisEventType == 'WINDOW_INIT' // ON INIT IF o:IsErrConnect() o:ErrorMsg() ELSE ENDIF ELSEIF _HMG_ThisEventType == 'WINDOW_ONINTERACTIVECLOSE' // ON RELEASE lRet := YesNoMainClose() ELSEIF _HMG_ThisEventType == 'WINDOW_RELEASE' // ON INTERACTIVECLOSE CLOSE ALL IF ! o:ErrorMsg(); o:DisConnect() ENDIF ELSEIF ! empty(_HMG_ThisControlName) .and. ! empty(cKey) // Menu item execute cThis := _HMG_ThisControlName // меню name IF left(cThis, len(cMain_menu)) == cMain_menu i := RAt('_', cThis) j := left(cThis, i-1)+'.'+subs(cThis, i+1) j := subs(j, RAt('_', j)+1) IF j == '1.9'; cKey := j // Exit item из пункта меню с префиксом ENDIF ENDIF IF cKey == '1.9' // Exit item RETURN YesNoMainClose() ELSEIF cKey == '2.1' Wnd_SetKassa() ELSEIF cKey == '2.2' Wnd_SetPVN() ELSEIF cKey == '2.3' Wnd_SetProv() ELSEIF cKey == '2.4' Wnd_Test() ELSEIF cKey == '7.1' Imp_OldBase() ELSEIF 'stb.' $ cKey a := { ; {"1.", "Item line 1", "Execute 1"}, ; {"2.", "Item line 2", "Execute 2"}, ; {"3.", "Item line 3", "Execute 3"}, ; {"4.", "Item line 4", "Execute 4"}, ; {"5.", "Item line 5", "Execute 5"}, ; {"6.", "Item line 6", "Execute 6"}, ; {"7.", "Item line 7", "Execute 7"}, ; {"8.", "Item line 8", "Execute 8"}, ; {"9.", "Item line 9", "Execute 9"} ; } i := 0 IF cKey == 'stb.1' ELSEIF cKey == 'stb.2' ELSEIF cKey == 'stb.3' i := mAchoice(a, 1, 8, 'Setting') ELSEIF cKey == 'stb.4' i := mAchoice(a, 1, 9, 'Setting') ELSEIF cKey == 'stb.5' i := mAchoice(a, 1, 10, 'Setting') ENDIF MsgBox('StatusBar press '+hb_valtoexp(i), 'Achoice') ENDIF ENDIF RETURN lRet FUNCTION mAchoice( aAchoice, nValue, nLayOut, cTitle, nSize, nLines, nRow, nCol ) // меню Achoice LOCAL a, i, j, k LOCAL aItems := {}, aRezult := {} LOCAL aJustify, aHeaders, aWidths, nW, nH LOCAL nAchoice := 0, lNoLines := .T., lHeaders := .F. LOCAL nKols, nWidth := 4, nHeight := 100, lCell := .F. LOCAL cIcon := AppGet(MainIcon) LOCAL aBackColor := AppGet(BackColor) LOCAL cFontName := AppGet(FontNameDef) LOCAL nFontSize := AppGet(FontSizeDef) LOCAL lFontBold := .F., aFontColor, lSysMenu LOCAL lSelected := .T., nMaxRow := 21, uParent, cParent, hParent LOCAL nParentWidth, nParentHeight, nFormWidth, nFormHeight LOCAL nAppRow := Application.Row + GetBorderHeight() + GetTitleHeight() + GetMenuBarHeight() LOCAL nAppCol := Application.Col + GetBorderWidth() LOCAL aHmg := Save_Rest_HMG() DEFAULT nValue := 1, ; nRow := 0, ; nCol := 0, ; cTitle := '', ; nSize := nFontSize, ; nLines := nMaxRow, ; nLayOut := 0 IF hb_IsChar(nSize); nSize := nFontSize + val(nSize) // increment для FontSize ENDIF lSysMenu := ! empty(cTitle) IF empty(aAchoice) RETURN nAchoice ELSEIF hb_IsArray(aAchoice) aItems := aAchoice lHeaders := .F. ELSEIF hb_IsHash(aAchoice) nRow := hb_HGetDef(aAchoice, "ROW" , nRow ) nCol := hb_HGetDef(aAchoice, "COL" , nCol ) aItems := hb_HGetDef(aAchoice, "ITEMS" , NIL) aHeaders := hb_HGetDef(aAchoice, "HEADERS" , NIL) aJustify := hb_HGetDef(aAchoice, "JUSTIFY" , NIL) aRezult := hb_HGetDef(aAchoice, "RETURN" , {} ) cTitle := hb_HGetDef(aAchoice, "TITLE" , cTitle) cFontName := hb_HGetDef(aAchoice, "FONT" , cFontName) nFontSize := hb_HGetDef(aAchoice, "SIZE" , nFontSize) lFontBold := hb_HGetDef(aAchoice, "BOLD" , lFontBold) aFontColor := hb_HGetDef(aAchoice, "FCOLOR" , NIL) aBackColor := hb_HGetDef(aAchoice, "BCOLOR" , NIL) uParent := hb_HGetDef(aAchoice, "PARENT" , NIL) cIcon := hb_HGetDef(aAchoice, "ICON" , cIcon) lNoLines := hb_HGetDef(aAchoice, "NOLINES" , lNoLines) lSysMenu := hb_HGetDef(aAchoice, "SYSMENU" , lSysMenu) lSelected := hb_HGetDef(aAchoice, "SELECTED", lSysMenu) nLines := hb_HGetDef(aAchoice, "MAXROW" , nMaxRow ) nLayOut := hb_HGetDef(aAchoice, "LAYOUT" , nLayOut ) lHeaders := ! empty(aHeaders) ENDIF IF empty(aItems); RETURN nAchoice ENDIF nMaxRow := nLines nKols := len(aItems) IF nMaxRow > nKols; nMaxRow := nKols ENDIF IF ! empty(nSize) ; nFontSize := nSize ENDIF IF nValue > nKols ; nValue := nKols ENDIF IF empty(aRezult) ; aRezult := array(nKols) ENDIF IF empty(aJustify); aJustify := array(nKols) ENDIF IF ! lHeaders aHeaders := array(nKols) aEval(aHeaders, {|x,n| aHeaders[ n ] := hb_ntos(n) }) ENDIF IF empty(uParent) IF ! empty(_HMG_MainClientMDIName) uParent := _HMG_MainClientMDIName ELSEIF ! empty(_HMG_ActiveFormName) uParent := _HMG_ActiveFormName ELSE uParent := Application.FormName ENDIF ENDIF hParent := iif(hb_IsChar(uParent), GetFormHandle(uParent), uParent) IF ! empty(hParent) IF ( i := AScan( _HMG_aFormHandles, hParent) ) > 0 cParent := _HMG_aFormNames[ i ] ENDIF ENDIF nParentWidth := GetClientWidth (hParent) nParentHeight := GetClientHeight (hParent) nAppRow += GetToolBarHeight(hParent) k := len(aItems[1]) aWidths := array(k) a := array(k); aFill(a, 0) FOR i := 1 TO len(aItems) FOR j := 1 TO k a[ j ] := Max(a[j], GetTxtWidth(aItems[ i ][j] + repl('W', 2), nFontSize, cFontName)) NEXT NEXT aEval(aWidths , {|x,n| aWidths [ n ] := a[ n ] }) aEval(aWidths , {|x,n| nWidth += (x + 1) }) IF nKols > nMaxRow; nWidth += GetVScrollBarWidth() // items больше строк в показе ENDIF DEFINE WINDOW wAchoice AT 0,0 WIDTH 100 HEIGHT 100 ICON cIcon MODAL _SetThisFormInfo(FormIndex(wAchoice)) ThisWindow.Sizable := .F. ThisWindow.MaxButton := .F. ThisWindow.MinButton := .F. ThisWindow.Title := cTitle ThisWindow.TitleBar := ! empty(cTitle) ThisWindow.SysMenu := lSysMenu DEFINE GRID Achoice ROW 0 COL 0 WIDTH nWidth HEIGHT nHeight HEADERS aHeaders WIDTHS aWidths ITEMS aItems VALUE nValue NOLINES lNoLines CELLNAVIGATION lCell SHOWHEADERS lHeaders FONTNAME cFontName FONTSIZE nFontSize FONTBOLD lFontBold FONTCOLOR aFontColor BACKCOLOR aBackColor JUSTIFY aJustify IF lSelected ON DBLCLICK ( nAchoice := wAchoice.Achoice.Value, ThisWindow.Release ) ENDIF END GRID wAchoice.Achoice.Height := GetHeghtBrowse( ControlHandle(Achoice, wAchoice), nMaxRow ) wAchoice.Height := GetTitleHeight() + wAchoice.Achoice.Height + GetBorderHeight() + 2 wAchoice.Width := GetBorderWidth() + wAchoice.Achoice.Width + 2 nFormHeight := wAchoice.Height nFormWidth := wAchoice.Width IF empty(nRow + nCol) .and. nParentWidth > nFormWidth .and. nParentHeight > nFormHeight nH := nParentHeight - nFormHeight - GetBorderHeight() - GetStatusBarHeight() nW := nParentWidth - nFormWidth IF ! ThisWindow.TitleBar; nH += GetTitleHeight() ENDIF IF nLayOut == 0 // центровать в Desktop ELSEIF nLayOut == 1 // левый ВЕРХНИЙ угол в parent окне nRow := 1 nCol := 1 ELSEIF nLayOut == 2 // ( 0.3 ) ВЕРХНИЙ угол в parent окне nRow := 1 nCol := int(nW * 0.33) ELSEIF nLayOut == 3 // центр. ВЕРХНИЙ угол в parent окне nRow := 1 nCol := int(nW / 2) ELSEIF nLayOut == 4 // ( 0.6 ) ВЕРХНИЙ угол в parent окне nRow := 1 nCol := int(nW * 0.67) ELSEIF nLayOut == 5 // правый ВЕРХНИЙ угол в parent окне nRow := 1 nCol := nW ELSEIF nLayOut == 6 // левый НИЖНИЙ угол в parent окне nRow := nH nCol := 1 ELSEIF nLayOut == 7 // ( 0.3 ) НИЖНИЙ угол в parent окне nRow := nH nCol := int(nW * 0.33) ELSEIF nLayOut == 8 // центр. НИЖНИЙ угол в parent окне nRow := nH nCol := int(nW / 2) ELSEIF nLayOut == 9 // ( 0.6 ) НИЖНИЙ угол в parent окне nRow := nH nCol := int(nW * 0.67) ELSEIF nLayOut == 10 // правый НИЖНИЙ угол в parent окне nRow := nH nCol := nW ELSEIF nLayOut == 11 // центровать в parent окне nRow := int(nH / 2) nCol := int(nW / 2) ENDIF ENDIF IF nRow > 0 .and. nCol > 0 wAchoice.Row := nAppRow + nRow wAchoice.Col := nAppCol + nCol ENDIF END WINDOW _SetThisFormInfo() IF empty(nRow) .and. empty(nCol); CENTER WINDOW wAchoice ENDIF ACTIVATE WINDOW wAchoice Save_Rest_HMG(aHmg) IF nAchoice > 0 .and. ! empty(aRezult[ nAchoice ]); nAchoice := aRezult[ nAchoice ] ENDIF RETURN nAchoice FUNCTION Save_Rest_HMG( uHMG ) // save\restore _HMG_... переменные пере MODAL LOCAL aHMG IF hb_IsArray(uHMG) aHMG := uHMG _HMG_BeginWindowMDIActive := aHMG[ 1] _HMG_ActiveStatusHandle := aHMG[ 2] _HMG_UserWindowHandle := aHMG[ 3] _HMG_SetFocusExecuted := aHMG[ 4] _HMG_ThisFormName := aHMG[ 5] _HMG_ThisControlName := aHMG[ 6] _HMG_ActiveFontName := aHMG[ 7] _HMG_ActiveFontSize := aHMG[ 8] _HMG_ExtendedNavigation := aHMG[ 9] _HMG_InplaceParentHandle := aHMG[10] ELSE aHMG := array(10) aHMG[ 1] := _HMG_BeginWindowMDIActive aHMG[ 2] := _HMG_ActiveStatusHandle aHMG[ 3] := _hmg_UserWindowHandle aHMG[ 4] := _HMG_SetFocusExecuted aHMG[ 5] := _HMG_ThisFormName aHMG[ 6] := _HMG_ThisControlName aHMG[ 7] := _HMG_ActiveFontName aHMG[ 8] := _HMG_ActiveFontSize aHMG[ 9] := _HMG_ExtendedNavigation aHMG[10] := _HMG_InplaceParentHandle _HMG_BeginWindowMDIActive := .F. _HMG_ExtendedNavigation := .T. ENDIF RETURN aHMG [/pre2]

SergKis: может еще это:[pre2] FUNCTION GetWndMDIChildAll() // Получить массивом все имена доступных дочерних окон LOCAL i, k, aNames:={} k := Len( _HMG_aFormNames ) FOR i := 1 TO k IF _HMG_aFormType=='Y' AAdd(aNames, _HMG_aFormNames ) ENDIF NEXT RETURN aNames [/pre2]

Dima: SergKis Спасибо , буду разбираться !

Dima: DEFINE CONTEXT MENU OF FORM_1 его можно убить через RELEASE CONTEXT MENU OF Form_1 А как убить DEFINE CONTEXT MENU CONTROL StatusBar OF FORM_1 способ RELEASE CONTEXT MENU OF Form_1 не катит

Dima: Есть MDI окно , в ACTION статусбара висит функция , которая создает MODAL окно и в котором живет GRID. Это работает. Стоит вместо GRID сунуть туда TSBROWSE , при вызове функция падает и пишет нет парента ;) Едем дальше. Из MDI окна создаем MDICHILD окно. Снова топчем мышей по статус бару и если в функции живет GRID , то все работает. Если там живет TSBROWSE , тогда он начинает жить не в окне MODAL как ему и предписано а в MDICHILD. Григорий писал что MDI это темная история ;) Не думал я что до такой степени ;)

Andrey: Да не используй MDICHILD и всех делов. Я тоже от них отказался...



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