Автор | Сообщение |
|
| |
Пост N: 5760
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.06.16 21:20. Заголовок: [?] Простой вопрос
Есть главное окно программы , в нем живут несколько CHILD окон (не MDI). В процедуре ON INTERACTIVECLOSE главного окна есть блок кода , если он вернет TRUE тогда закроется главное окно и программа завершится. А вот если блок кода вернул FALSE , то как вернуть фокус ввода на окно на котором был фокус ввода до нажатия крестика главного окна ?
|
|
|
Ответов - 151
, стр:
1
2
3
4
5
6
7
8
All
[только новые]
|
|
|
| постоянный участник
|
Пост N: 1008
Зарегистрирован: 17.02.12
|
|
Отправлено: 23.06.16 22:04. Заголовок: Dima пишет: как верн..
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
|
|
|
|
| |
Пост N: 5761
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.06.16 22:18. Заголовок: Попробую , спасибо !..
Попробую , спасибо !
|
|
|
|
| постоянный участник
|
Пост N: 1009
Зарегистрирован: 17.02.12
|
|
Отправлено: 23.06.16 22:38. Заголовок: PS Для TBrowse надо ..
PS Для TBrowse надо делать: Form_Main.Buf.Cargo := { oBrw:cParentWnd, oBrw:cControlName }
|
|
|
|
| |
Пост N: 5762
Зарегистрирован: 17.05.05
|
|
Отправлено: 24.06.16 09:29. Заголовок: SergKis пишет: Form..
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() но для обычных окон
|
|
|
|
| постоянный участник
|
Пост N: 1010
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.06.16 10:14. Заголовок: Dima пишет:такие кон..
Dima пишет: цитата: | такие конструкции не всегда компилятся |
| Используй вместо псевдо ООП команды SetProperty(cForm, cControl, "Cargo", uValue) GetProperty(cForm, cControl, "Cargo") DoMethod(cForm,...) цитата: | Как закрыть все CHILD окна главного окна |
| Смотри оглавление по функциям h_window.prg, там есть ReleaseAllWindows () _ReleaseWindow ( FormName ) ... т.е. можно делать 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 часто делаю так, при создании окна документа, закрываю (release) все окна справочников с запоминанием состояния где были в rowse\tbrowse\... и при вызове справочника повторно востанавливаю окно как было или с новым подводом в нем на нужную запись
|
|
|
|
| |
Пост N: 5763
Зарегистрирован: 17.05.05
|
|
Отправлено: 24.06.16 10:24. Заголовок: SergKis пишет: _Rel..
SergKis пишет: цитата: | _ReleaseWindow ( FormName ) |
| Спасибо за наводку. Сразу вышел на нужный пример C:\MiniGUI\SAMPLES\BASIC\MULTI_INSTANCE\
|
|
|
|
| постоянный участник
|
Пост N: 1011
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.06.16 11:30. Заголовок: Dima пишет:Завел Pub..
Dima пишет: В такой схеме тебе самому надо следить за очисткой переменной, тогда лучше Private под каждое окно, но с Label по мне изящнее, можно использовать и псевдо ооп и ф-ии и следить за освобождением не надо, Release само все сделает Для доступа к карго исп. _SetGetUserData( cForm, cControl [, uValue] )
|
|
|
|
| |
Пост N: 5764
Зарегистрирован: 17.05.05
|
|
Отправлено: 24.06.16 12:28. Заголовок: SergKis Ты прав , я..
SergKis Ты прав , я это не учел. ....подумал и проверил В ON GOTFOCUS дочерних окон живет Mcargo:=_HMG_ThisFormName поэтому получив фокус ввода на таком из окон я имею имя окна в Mcargo поэтому в ON INTERACTIVECLOSE главного при отказе от закрытия я всегда верну фокус ввода на окно на котором был , вот так (ниже). Разве нет ? If !empty(Mcargo) IF IswindowDefined(&mCargo) DoMethod(mCargo, "SetFocus") Endif endif endif А если окна нет (закрыли например) то для этого там проверка в виде IF IswindowDefined(&mCargo) SergKis пишет: цитата: | но с Label по мне изящнее |
| Label не использую и хотел было Cargo к окну прикрутить а у него и нет такой фичи.
|
|
|
|
| постоянный участник
|
Пост N: 1012
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.06.16 13:11. Заголовок: Dima пишет:хотел был..
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) можно записывать цвета, используемые этой колонкой при отображении от разных условий в колонке и добывать их в блоках кода цветов на колонку
|
|
|
|
| |
Пост N: 5765
Зарегистрирован: 17.05.05
|
|
Отправлено: 24.06.16 13:46. Заголовок: SergKis пишет: В св..
SergKis пишет: цитата: | В своей версии мы сделали в ch #xtranslate _HMG_aFormMiscData1 => _HMG_SYSDATA\[_HMG_SYSDATA_SIZE+1\] #xtranslate _HMG_aFormMiscData2 => _HMG_SYSDATA\[_HMG_SYSDATA_SIZE+2\] в h_init.prg |
| Странно что Григорий не сделал этого , штука то нужная.
|
|
|
|
| |
Пост N: 5766
Зарегистрирован: 17.05.05
|
|
Отправлено: 24.06.16 15:12. Заголовок: Сергей еще вопрос . ..
Сергей еще вопрос . В принципе я его решил по своему , но вдруг что подскажешь. Есть ряд справочников с одинаковой структурой. Все выводил в окна у которых левый верхний угол одинаков , поэтому при открытии следующего справочника визуально было не понятно сколько же справочников в данный момент открыто. Поэтому перед вызовом справочника проверяю открытые окна и найдя первое подходящее дергаю от туда координаты левого верхнего угла. В программе перед тем как создать окно делаю так: 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 .............. Фунция GetRowColExceptMain() 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
|
|
|
|
|
| |
Пост N: 5767
Зарегистрирован: 17.05.05
|
|
Отправлено: 24.06.16 15:47. Заголовок: Dima пишет: Фунция ..
Dima пишет: цитата: | Фунция GetRowColExceptMain() |
| Переделал ее 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
|
|
|
|
| постоянный участник
|
Пост N: 1013
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.06.16 15:48. Заголовок: Dima Окна у себя на..
Dima Окна у себя называю так; wDok_... - документы wSpr_... - справочники wOtb_... - отбор\выборка\справка wSet_... - установки\настройки wPrn_... - для печатей ... по 4 байтам орентируюсь, чтобы убить справочники при вызове документов (что бы не мешали) тебе можно как в в Mdi сделать расположеие лесенкой справочников (смещая на высоту Title окна), организовав стек(и) для окон (можно справочники отдельно, док. тоже ...) и перебирать стеки и т.д.
|
|
|
|
| |
Пост N: 5768
Зарегистрирован: 17.05.05
|
|
Отправлено: 24.06.16 15:54. Заголовок: SergKis пишет: тебе..
SergKis пишет: цитата: | тебе можно как в в Mdi сделать расположеие лесенкой справочников (смещая на высоту Title окна) |
| Так и сделал , пока без стеков (красоту позже наводить буду ) SergKis пишет: Спасибо за идею.
|
|
|
|
| |
Пост N: 5769
Зарегистрирован: 17.05.05
|
|
Отправлено: 24.06.16 16:12. Заголовок: Как организовать ред..
Как организовать редактирование ячейки что бы (пока не знаю как контрол называется ) можно было вводить (выбирать) только (например): Кг , Граммы , Метры , Литры из некоего списка ?
|
|
|
|
| постоянный участник
|
Пост N: 1014
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.06.16 16:17. Заголовок: Если разговор о ячей..
Если разговор о ячейке Tsb, то см. пример Tsb_config, колонка Operator, если др. контрол, то COMBOBOX смотри в примерах
|
|
|
|
| |
Пост N: 5770
Зарегистрирован: 17.05.05
|
|
Отправлено: 24.06.16 16:31. Заголовок: SergKis пишет: Есл..
SergKis пишет: цитата: | Если разговор о ячейке Tsb, то см. пример Tsb_config, колонка Operator |
| Да оно
|
|
|
|
| |
Пост N: 5771
Зарегистрирован: 17.05.05
|
|
Отправлено: 24.06.16 17:44. Заголовок: Идею понял , не поня..
Идею понял , не понятно как мышкой завершить ввод , выбрав нужное. Пока ясно что нужно нажать Enter. А если клавы нет ?
|
|
|
|
| постоянный участник
|
Пост N: 1015
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.06.16 18:49. Заголовок: Dima пишет: не понят..
Dima пишет: цитата: | не понятно как мышкой завершить ввод , выбрав нужное |
| Как то не задумывался над этим. В классе TComboBox есть блок кода bCloseUp при закрытии списка срабатывает, но в Metod Edit(...) TsBrowse есть только такое 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 выделенное нужно, но как поставить такой блок кода на oCol:oEdit:bCloseUp не понятно
|
|
|
|
| постоянный участник
|
Пост N: 1016
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.06.16 19:41. Заголовок: SergKis пишет:как по..
SergKis пишет: цитата: | как поставить такой блок кода на oCol:oEdit:bCloseUp |
| может так подойдет (использовать в TsColumn при lComboBox := .T. переменную bAction - она для TBtnBox): 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 ...
|
|
|
Ответов - 151
, стр:
1
2
3
4
5
6
7
8
All
[только новые]
|
|