Форум » GUI » [?] Простой вопрос » Ответить

[?] Простой вопрос

Dima: Есть главное окно программы , в нем живут несколько CHILD окон (не MDI). В процедуре ON INTERACTIVECLOSE главного окна есть блок кода , если он вернет TRUE тогда закроется главное окно и программа завершится. А вот если блок кода вернул FALSE , то как вернуть фокус ввода на окно на котором был фокус ввода до нажатия крестика главного окна ?

Ответов - 151, стр: 1 2 3 4 5 6 7 8 All

SergKis: Dima пишет: как вернуть фокус ввода на окно на котором был фокус ввода до нажатия крестика главного окна Можно так: DEFINE WINDOW Form_Main ... @ 0, 0 LABEL Buf WIDTH 2 HEIGHT 2 VALUE '' INVISIBLE // Buf.Cargo рабочий контрол для Cargo использования В контрлах др. окон на GOTFOCUS делаем Form_Main.Buf.Cargo := {_HMG_ThisFormName, _HMG_ThisControlName } В процедуре ON INTERACTIVECLOSE главного окна при отказе от выхода If ! empty(Form_Main.Buf.Cargo) DoMethod(Form_Main.Buf.Cargo[1], "SetFocus") или DoMethod(Form_Main.Buf.Cargo[1], Form_Main.Buf.Cargo[2], "SetFocus") EndIf

Dima: Попробую , спасибо !

SergKis: PS Для TBrowse надо делать: Form_Main.Buf.Cargo := { oBrw:cParentWnd, oBrw:cControlName }


Dima: SergKis пишет: Form_Main.Buf.Cargo := {_HMG_ThisFormName, _HMG_ThisControlName } В процедуре ON INTERACTIVECLOSE главного окна при отказе от выхода If ! empty(Form_Main.Buf.Cargo) DoMethod(Form_Main.Buf.Cargo[1], "SetFocus") или DoMethod(Form_Main.Buf.Cargo[1], Form_Main.Buf.Cargo[2], "SetFocus") EndIf Сергей такие конструкции не всегда компилятся к сожалению. Поэтому сделал так. Завел Public Mcargo:="" В ON GOTFOCUS дочерних окно добавил Mcargo:=_HMG_ThisFormName В процедуре ON INTERACTIVECLOSE главного окна при отказе от выхода If !empty(Mcargo) IF IswindowDefined(&mCargo) DoMethod(mCargo, "SetFocus") Endif endif Еще вопрос. Как закрыть все CHILD окна главного окна (не MDI) ? ЗЫ Что то типа _MdiChildCloseAll() но для обычных окон

SergKis: Dima пишет:такие конструкции не всегда компилятся Используй вместо псевдо ООП команды SetProperty(cForm, cControl, "Cargo", uValue) GetProperty(cForm, cControl, "Cargo") DoMethod(cForm,...) Как закрыть все CHILD окна главного окна Смотри оглавление по функциям h_window.prg, там есть ReleaseAllWindows () _ReleaseWindow ( FormName ) ... т.е. можно делать[pre2] For i := 1 To Len(_HMG_aFormNames) If _HMG_aFormType[ i ] != "A" // не main окно If _IsWindowDefined (_HMG_aFormNames[ i ]) _ReleaseWindow ( _HMG_aFormNames[ i ] ) EndIf EndIf Next [/pre2] часто делаю так, при создании окна документа, закрываю (release) все окна справочников с запоминанием состояния где были в rowse\tbrowse\... и при вызове справочника повторно востанавливаю окно как было или с новым подводом в нем на нужную запись

Dima: SergKis пишет: _ReleaseWindow ( FormName ) Спасибо за наводку. Сразу вышел на нужный пример C:\MiniGUI\SAMPLES\BASIC\MULTI_INSTANCE\

SergKis: Dima пишет:Завел Public Mcargo:="" В такой схеме тебе самому надо следить за очисткой переменной, тогда лучше Private под каждое окно, но с Label по мне изящнее, можно использовать и псевдо ооп и ф-ии и следить за освобождением не надо, Release само все сделает Для доступа к карго исп. _SetGetUserData( cForm, cControl [, uValue] )

Dima: SergKis Ты прав , я это не учел. ....подумал и проверил В ON GOTFOCUS дочерних окон живет Mcargo:=_HMG_ThisFormName поэтому получив фокус ввода на таком из окон я имею имя окна в Mcargo поэтому в ON INTERACTIVECLOSE главного при отказе от закрытия я всегда верну фокус ввода на окно на котором был , вот так (ниже). Разве нет ? [pre2] If !empty(Mcargo) IF IswindowDefined(&mCargo) DoMethod(mCargo, "SetFocus") Endif endif endif [/pre2] А если окна нет (закрыли например) то для этого там проверка в виде IF IswindowDefined(&mCargo) SergKis пишет: но с Label по мне изящнее Label не использую и хотел было Cargo к окну прикрутить а у него и нет такой фичи.

SergKis: Dima пишет:хотел было Cargo к окну прикрутить а у него и нет такой фичи В своей версии мы сделали в ch #xtranslate _HMG_aFormMiscData1 => _HMG_SYSDATA\[_HMG_SYSDATA_SIZE+1\] #xtranslate _HMG_aFormMiscData2 => _HMG_SYSDATA\[_HMG_SYSDATA_SIZE+2\] в h_init.prg PUBLIC _HMG_SYSDATA [ _HMG_SYSDATA_SIZE + 2 ] во все prg создание окон добавили (по аналогии с контролом) _HMG_aFormMiscData1 [ i ] := { NIL, NIL, NIL } // для своих целей по окну _HMG_aFormMiscData2 [ i ] := "" // для Cargo в h_evente.prg на WM_DESTROY добавили _HMG_aFormMiscData1 [ i ] := { NIL, NIL, NIL } _HMG_aFormMiscData2 [ i ] := "" для окон _HMG_aFormMiscData2 [ i ] исп. как Cargo окна Если не менять lib, то Label с одинаковым именем на всех окнах - тоже решает все вопросы, для прилепливания к окну различных данных общего назначения. Не забываем, что все контролы имеют cargo - туда тоже можно совать инфу для спец. использования, например в колонку TsBrowse (cargo) можно записывать цвета, используемые этой колонкой при отображении от разных условий в колонке и добывать их в блоках кода цветов на колонку

Dima: SergKis пишет: В своей версии мы сделали в ch #xtranslate _HMG_aFormMiscData1 => _HMG_SYSDATA\[_HMG_SYSDATA_SIZE+1\] #xtranslate _HMG_aFormMiscData2 => _HMG_SYSDATA\[_HMG_SYSDATA_SIZE+2\] в h_init.prg Странно что Григорий не сделал этого , штука то нужная.

Dima: Сергей еще вопрос . В принципе я его решил по своему , но вдруг что подскажешь. Есть ряд справочников с одинаковой структурой. Все выводил в окна у которых левый верхний угол одинаков , поэтому при открытии следующего справочника визуально было не понятно сколько же справочников в данный момент открыто. Поэтому перед вызовом справочника проверяю открытые окна и найдя первое подходящее дергаю от туда координаты левого верхнего угла. В программе перед тем как создать окно делаю так: [pre2] a:=GetProperty("Form_0", "Row")+GetBorderHeight()+GetTitleHeight()+GetMenubarHeight()+5 b:=(GetProperty("Form_0", "Width")/2) -(WidthWindow_MyApl/4) arw:=GetRowColExceptMain() if !empty(arw) a:=arw[1]+GetTitleHeight() b:=arw[2]+GetTitleHeight() endif DEFINE WINDOW SPEC AT a , b WIDTH .............. [/pre2] Фунция GetRowColExceptMain() [pre2] Func GetRowColExceptMain() LOCAL i, nFormCount := LEN (_HMG_aFormHandles) local amas:={} FOR i := 1 TO nFormCount IF _HMG_aFormType [ i ] <> "A" IF _IsWindowDefined ( _HMG_aFormNames [ i ] ) if ! isiconic(GetFormHandle( _HMG_aFormNames [ i ] )) aadd(amas,GetProperty(_HMG_aFormNames [ i ], "row")) aadd(amas,GetProperty(_HMG_aFormNames [ i ], "col")) Return amas endif ENDIF ENDIF NEXT Return amas [/pre2]

Dima: Dima пишет: Фунция GetRowColExceptMain() Переделал ее [pre2] Func GetRowColExceptMain() LOCAL i, nFormCount := LEN (_HMG_aFormHandles) local amas:={} local ret:={} FOR i := 1 TO nFormCount IF _HMG_aFormType [ i ] <> "A" // не main окно IF _IsWindowDefined ( _HMG_aFormNames [ i ] ) if !isiconic(GetFormHandle( _HMG_aFormNames [ i ] )) aadd(amas,{GetProperty(_HMG_aFormNames [ i ], "row"),GetProperty(_HMG_aFormNames [ i ], "col")}) endif ENDIF ENDIF NEXT if len(amas)#0 aadd(ret,amas[len(amas)][1]) aadd(ret,amas[len(amas)][2]) endif Return ret [/pre2]

SergKis: Dima Окна у себя называю так; wDok_... - документы wSpr_... - справочники wOtb_... - отбор\выборка\справка wSet_... - установки\настройки wPrn_... - для печатей ... по 4 байтам орентируюсь, чтобы убить справочники при вызове документов (что бы не мешали) тебе можно как в в Mdi сделать расположеие лесенкой справочников (смещая на высоту Title окна), организовав стек(и) для окон (можно справочники отдельно, док. тоже ...) и перебирать стеки и т.д.

Dima: SergKis пишет: тебе можно как в в Mdi сделать расположеие лесенкой справочников (смещая на высоту Title окна) Так и сделал , пока без стеков (красоту позже наводить буду ) SergKis пишет: Окна у себя называю так Спасибо за идею.

Dima: Как организовать редактирование ячейки что бы (пока не знаю как контрол называется ) можно было вводить (выбирать) только (например): Кг , Граммы , Метры , Литры из некоего списка ?

SergKis: Если разговор о ячейке Tsb, то см. пример Tsb_config, колонка Operator, если др. контрол, то COMBOBOX смотри в примерах

Dima: SergKis пишет: Если разговор о ячейке Tsb, то см. пример Tsb_config, колонка Operator Да оно

Dima: Идею понял , не понятно как мышкой завершить ввод , выбрав нужное. Пока ясно что нужно нажать Enter. А если клавы нет ?

SergKis: Dima пишет: не понятно как мышкой завершить ввод , выбрав нужное Как то не задумывался над этим. В классе TComboBox есть блок кода bCloseUp при закрытии списка срабатывает, но в Metod Edit(...) TsBrowse есть только такое [pre2] oCol:oEdit := TComboBox():New( nRow+::aEditCellAdjust[1], nCol+::aEditCellAdjust[2], ; bSETGET( uValue ), aGet, nWidth+::aEditCellAdjust[3], nHeight+::aEditCellAdjust[4], ; Self, bChange, nClrFore, nClrBack, hFont, cMsg, ::cChildControl, cWnd ) // oCol:oEdit:bCloseUp := {|o| o:PostMsg( WM_KEYDOWN, VK_RETURN, 0 )} //1.54 oCol:oEdit:lAppend := ::lAppendMode [/pre2] выделенное нужно, но как поставить такой блок кода на oCol:oEdit:bCloseUp не понятно

SergKis: SergKis пишет:как поставить такой блок кода на oCol:oEdit:bCloseUp может так подойдет (использовать в TsColumn при lComboBox := .T. переменную bAction - она для TBtnBox):[pre2] METHOD SetData( nColumn, bData, aList, bCloseUp ) CLASS TSBrowse If Valtype( nColumn ) == "C" nColumn := ::nColumn( nColumn ) // 21.07.2015 EndIf If Valtype( nColumn ) != "N" .or. nColumn <= 0 Return Nil EndIf If aList != Nil If ValType( aList[ 1 ] ) == "A" ::aColumns[ nColumn ]:aItems := aList[ 1 ] ::aColumns[ nColumn ]:aData := aList[ 2 ] ::aColumns[ nColumn ]:cDataType := ValType( aList[ 2, 1 ] ) Else ::aColumns[ nColumn ]:aItems := aList EndIf ::aColumns[ nColumn ]:lComboBox := .T. ::aColumns[ nColumn ]:bAction := bCloseUp EndIf If bData != Nil If Valtype( bData ) == "B" ::aColumns[ nColumn ]:bData := bData Else ::aColumns[ nColumn ]:bData := { || (bData) } EndIf EndIf Return Self METHOD Edit( uVar, nCell, nKey, nKeyFlags, cPicture, bValid, nClrFore, ; nClrBack ) CLASS TSBrowse ... ::cChildControl := GetUniqueName( "ComboBox" ) oCol:oEdit := TComboBox():New( nRow+::aEditCellAdjust[1], nCol+::aEditCellAdjust[2], ; bSETGET( uValue ), aGet, nWidth+::aEditCellAdjust[3], nHeight+::aEditCellAdjust[4], ; Self, bChange, nClrFore, nClrBack, hFont, cMsg, ::cChildControl, cWnd ) If oCol:lComboBox .and. ValType(oCol:bAction) == "B" oCol:oEdit:bCloseUp := oCol:bAction EndIf // oCol:oEdit:bCloseUp := {|o| o:PostMsg( WM_KEYDOWN, VK_RETURN, 0 )} //1.54 oCol:oEdit:lAppend := ::lAppendMode ... [/pre2]



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