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

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

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

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

Dima: Попробую позже , спасибо. В Tsbrowse поймал непонятку. Есть [pre2] obrw:GetColumn("naim"):bPrevEdit := { |a, b, lLock| If( lLock := (obrw:cAlias)->(RLock()),; (obrw:cAlias)->(dbUnLock()), Msgstop("Запись заблокирована","Внимание")), lLock } [/pre2] Если нажимаю Enter или мышкой дважды и запись блокирована то вываливается сообщение что запись заблочена и далее не пускает. Что нормально. Стоит нажать пробел или любую буквенно-цифровую педаль то месага так же появляется но GET появляется. Что не так делаю ?

SergKis: Dima пишет:но GET появляется срабатывает метод KeyChar, попробуй поставь в блок кода obrw:nUserKey := 255 до lLock у себя я ввел переменную в TsBrowse lNoKeyChar := .T. и отлючил по умолчанию

SergKis: Dima в bPrevEdit передаются Eval( oCol:bPrevEdit, uValue, Self ) лучше использовать их в блоке кода а не public\private перемменную obrw[pre2] obrw:GetColumn("naim"):bPrevEdit := { |a, b, lLock| If( lLock := (b:cAlias)->(RLock()),; (b:cAlias)->(dbUnLock()), Msgstop("Запись заблокирована","Внимание")), lLock } [/pre2]

Dima: SergKis Понял, попробую , отпишу.

SergKis: SergKis пишет:поставь в блок кода obrw:nUserKey := 255 Не поможет, в методе KeyDown стоит ::oWnd:nLastKey := ::nLastKey := ::nUserKey := nKey надо использовать bUsersKey функцию и возвращать .F. [pre2] uReturn := Eval( ::bUserKeys, nKey, nFlags, Self ) If uReturn != Nil .and. ValType( uReturn ) == "N" .and. uReturn < 200 // interpreted as a virtual key code to nKey := uReturn // change the original key pressed ElseIf uReturn != Nil .and. ValType( uReturn ) == "L" .and. ! uReturn ::nUserKey := 255 // want to inhibit the KeyDown and KeyChar Methods for key pressed Return 0 EndIf [/pre2]

Dima: SergKis пишет: надо использовать bUsersKey функцию и возвращать .F. Чудеса )) Как примерно она должна выглядеть ? У меня так (может где и промахнулся) oBrw:bUserKeys := {|nKey,nFlg,oBrw| UserKeys(nKey, nFlg, oBrw) } [pre2] STATIC FUNCTION UserKeys( nKey, nFlag, o ) Local nRec, oCell, cVal, nRow, uRet, cKey nFlag := Nil If nKey == VK_F1 ElseIf nKey == VK_INSERT if msgokCancel("Добавить новую запись ?","Внимание") Addrecs(o,"ID") endif uRet := .F. ElseIf nKey == VK_F3 ElseIf nKey == VK_F5 ElseIf nKey == VK_F6 ElseIf nKey == VK_F7 ElseIf nKey == VK_F8 ElseIf nKey == VK_F9 ElseIf nKey == VK_F11 ElseIf nKey == VK_F12 ElseIf nKey == VK_RETURN uRet := .F. ElseIf nKey == VK_F4 _PushKey(VK_SPACE) uRet := .f. ElseIf nKey >= 32 .and. nKey < 254 uRet := .f. EndIf Return uRet [/pre2]

SergKis: Dima коректировка по VK_RETURN ? пробни ElseIf nKey == VK_RETURN // uRet := .F. ElseIf nKey == VK_F4

Dima: SergKis Что то я потерялся. Значит у меня так [pre2] obrw:GetColumn("naim"):bPrevEdit := { |a, b, lLock| If( lLock := (b:cAlias)->(RLock()), ; (b:cAlias)->(dbUnLock()), Msgstop("Запись заблокирована","Внимание")), lLock } ..... obrw:nFireKey := VK_SPACE oBrw:bUserKeys := {|nKey,nFlg,oBr| UserKeys(nKey, nFlg, oBr) } [/pre2] [pre2] STATIC FUNCTION UserKeys( nKey, nFlag, o ) *----------------------------------- Local uRet If nKey == VK_F1 ElseIf nKey == VK_INSERT if msgokCancel("Добавить новую запись ?","Внимание") Addrecs(o,"ID") endif uRet := .F. ElseIf nKey == VK_F3 ElseIf nKey == VK_F5 ElseIf nKey == VK_F6 ElseIf nKey == VK_F7 ElseIf nKey == VK_F8 ElseIf nKey == VK_F9 ElseIf nKey == VK_F11 ElseIf nKey == VK_F12 ElseIf nKey == VK_RETURN ElseIf nKey == VK_F4 _PushKey(VK_SPACE) uRet := .f. ElseIf nKey >= 32 .and. nKey < 254 EndIf Return uRet [/pre2] Если запись заблочена и я нажал ENTER , тогда вылезет Msgstop("Запись заблокирована","Внимание") и дальше в GET не пустит. Но если нажать пробел или буквенно цифровую педаль тогда тоже вылезает Msgstop("Запись заблокирована","Внимание") но в GET пускает и не пойму как это предотвратить.

Dima: Разобрался.

Andrey: Dima пишет: Разобрался. Поделись !

Dima: Andrey пишет: Поделись ! Чем ?

Dima: Каким образом в TSB в bUserKeys заблочить нажатие ENTER но что бы двойной клик мышки остался для входа в редактирование. Если блочу ENTER тогда блочится и двойной клик мыши , вероятно код у них одинаков. Хотел редактирование повесить только на VK_F4 и двойной клик мыши. С VK_F4 все понятно , делаю :nFireKey := VK_F4 и в bUserKeys при нажатии VK_F4 верну TRUE

Dima: SergKis Дошли руки потестить твою функцию SetNoHole , вызываю ее после END TBROWSE [pre2] FUNCTION SetNoHole( obr ) // убрать дырку LOCAL nI, nK, nHeight LOCAL nHole := obr:nHeight - obr:nHeightHead - obr:nHeightSuper - ; obr:nHeightFoot - obr:nHeightSpecHd - ; If( ! obr:lNoHScroll, 16, 0 ) nHole -= ( Int( nHole / obr:nHeightCell ) * obr:nHeightCell ) nHole -= 1 nHeight := nHole nI := If( obr:nHeightSuper > 0, 1, 0 ) + ; If( obr:nHeightHead > 0, 1, 0 ) + ; If( obr:nHeightSpecHd > 0, 1, 0 ) + ; If( obr:nHeightFoot > 0, 1, 0 ) If nI > 0 // есть заголовки If obr:nHeightSuper > 0 obr:nHeightSuper += nK nHole -= nK EndIf If obr:nHeightSpecHd > 0 obr:nHeightSpecHd += nK nHole -= nK EndIf If obr:nHeightFoot > 0 obr:nHeightFoot += nK nHole -= nK EndIf If obr:nHeightHead > 0 obr:nHeightHead += nHole EndIf Else // нет заголовков, можно уменьшить размер tsb на размер nHole SetProperty(obr:cParentWnd, obr:cControlName, "Height", ; GetProperty(obr:cParentWnd, obr:cControlName, "Height") - nHole) EndIf obr:Display() RETURN nHeight [/pre2] Там какой то косяк однако. Дырки да нет. Но стоит курсором доехать до нижней границы бровса и продолжать двигаться вниз то записи над курсором ломаются и в них дублируется одна и та же строка. При движении вверх , внизу бровса имеет место фантомная строка. Скрин когда едем вниз Когда едем вверх (яйцо постоянно живет в самом низу)

SergKis: Dima пишет:Если блочу ENTER тогда блочится и двойной клик мыши , вероятно код у них одинаков без правки не обойтись:[pre2] METHOD LDblClick( nRowPix, nColPix, nKeyFlags ) CLASS TSBrowse ... If ( nClickRow == ::nRowPos .and. nClickRow > 0 ) .or. ( nClickRow == ::nRowPos .and. ! ::lDrawHeaders ) If ::lCellBrw .and. ::IsEditable( nCol ) ::nColSpecHd := 0 If ValType( Eval( ::aColumns[ nCol ]:bData ) ) == "L" .and. ; ::aColumns[ nCol ]:lCheckBox // virtual checkbox ::PostMsg( WM_CHAR, VK_SPACE, 0 ) ElseIf ::bLDblClick != Nil Eval( ::bLDblClick, uPar1, uPar2, nKeyFlags, Self ) Else ::PostMsg( WM_KEYDOWN, VK_RETURN, 0 ) EndIf Return 0 [/pre2]

SergKis: Dima пишет:Дошли руки потестить твою функцию SetNoHole текст надо взять из примера Tsb_Seek_2 (если происходит искажение отображения, играться надо параметром nDelta) :[pre2] *----------------------------------- Function TBrw_NoHoles( oBrw, nDelta, lSet ) *----------------------------------- Local nI, nK, nHeight, nHole DEFAULT nDelta := 1, lSet := .T. nHole := oBrw:nHeight - oBrw:nHeightHead - oBrw:nHeightSuper - ; oBrw:nHeightFoot - oBrw:nHeightSpecHd - ; If( oBrw:lNoHScroll, 0, GetHScrollBarHeight() ) nHole -= ( Int( nHole / oBrw:nHeightCell ) * oBrw:nHeightCell ) nHole -= nDelta nHeight := nHole If lSet nI := If( oBrw:nHeightSuper > 0, 1, 0 ) + ; If( oBrw:nHeightHead > 0, 1, 0 ) + ; If( oBrw:nHeightSpecHd > 0, 1, 0 ) + ; If( oBrw:nHeightFoot > 0, 1, 0 ) If nI > 0 // есть заголовки nK := int( nHole / nI ) // на nI - заголовки разделим дырку If oBrw:nHeightFoot > 0 oBrw:nHeightFoot += nK nHole -= nK EndIf If oBrw:nHeightSuper > 0 oBrw:nHeightSuper += nK nHole -= nK EndIf If oBrw:nHeightSpecHd > 0 oBrw:nHeightSpecHd += nK nHole -= nK EndIf If oBrw:nHeightHead > 0 oBrw:nHeightHead += nHole EndIf Else // нет заголовков, можно уменьшить размер tsb на размер nHole SetProperty(oBrw:cParentWnd, oBrw:cControlName, "Height", ; GetProperty(oBrw:cParentWnd, oBrw:cControlName, "Height") - nHole) EndIf oBrw:Display() EndIf Return nHeight [/pre2] использовать для окна с NOSIZE, если resize tsb возможен, ф-ю не применять

Dima: SergKis пишет: текст надо взять из примера Tsb_Seek_2 (если происходит искажение отображения, играться надо параметром nDelta) Взял , проверил с таким вызовом TBrw_NoHoles( oBrw, , .t. ) и получил все те же проблемы. Вызвав так TBrw_NoHoles( oBrw, 0 , .t. ) , проблем нет , но есть дырка. Что то в ней не так....

Dima: Проверил пример Tsb_Seek_2 , имею те же проблемы

SergKis: Dima поставь nDelta := 2 \ 3 к сожалению tsb очень чувствителен к изменению размеров высот его элементов, зависит от разрешения монтора, фонта у себя вынес значение nDelta в ini и бывает оставляю дырку в 1\2\3 пикселя

SergKis: Dima пишет:Проверил пример Tsb_Seek_2 , имею те же проблемы у меня на двух компах с 15' и 11' экраном все хорошо с примером, взят как есть

Dima: SergKis пишет: поставь nDelta := 2 \ 3 Это не выход , так как ты верно пишешь что разрешение может быть разное , фонты да и размеры самого бровса , не писать же в INI nDelta для каждого бровса , да юзера заклеймят меня )))



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