Форум » 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]

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 для каждого бровса , да юзера заклеймят меня )))

SergKis: Dima пишет: не писать же в INI nDelta для каждого бровса у меня один nDelta на всю прогу и менять пришлось только 1 раз (правда и фонт для всех tsb один на всю прогу) есть др. путь написать resize для tsb и использовать его меняя размеры окна таже можно уст. размеры tsb заранее просчитав (константы для элементов header, line, footer) все высоты tsb и получив общую высоту tsb и установить ее (например от количества строк в tsb)

Dima: SergKis пишет: таже можно уст. размеры tsb заранее просчитав (константы для элементов header, line, footer) все высоты tsb и получив общую высоту tsb и установить ее (например от количества строк в tsb) Понял.

SergKis: Dima пишет:не писать же в INI nDelta для каждого бровса с др. стороны в ini сохраняются все размеры (устанавливает\раздвигает клиент) колонок для каждого бровсе, то добавить nDelta пустяковое дело

Dima: SergKis Согласен.

SergKis: Dima Еще про tsb, "дырку" и HScroll. Высота HScroll в расчетах исп. 16, а в реальности при LargeFont 24 (Андрей проверял по моей просьбе), т.е. с HScroll высота tsb может быть изначально посчитана с ошибкой и nDelta - должна подбираться руками. Я отказался от использования HScroll, поставил lNoHScroll := .T. глобально в своей либе

Dima: SergKis пишет: поставил lNoHScroll := .T. Но тут был подводный камень если не ошибаюсь , после такой установки переставала срабатывать растяжка в :nAdjColumn

SergKis: Dima пишет: переставала срабатывать растяжка в :nAdjColumn Так она работает только на 1-м экране (если не ошибаюсь), так что толку от нее, на мой взгляд, не много, тем более пользователь сам уст. ширину колонок. В hwg сделано, на мой взгляд, лучше - последняя колонка растягивается на остаток ширины бровсе

Dima: SergKis пишет: В hwg сделано, на мой взгляд, лучше - последняя колонка растягивается на остаток ширины бровсе Так и тут так же, только не последняя а та что указана в :nAdjColumn

SergKis: это только на первом экране, после происходит искажение последней колонки (header,line,footer), в hwg нет искажения правой последней колонки

Dima: SergKis пишет: это только на первом экране, после происходит искажение последней колонки не замечал такого

Dima: А как поймать имя бровса в форме .. Имя формы так ThisWindow а бровс ? ps я про альтернативный синтаксис

SergKis: Dima пишет:я про альтернативный синтаксис Tsb мимо него проходит. Как объект tsb получать, см. Tsb_seek_2, Tsb_LoadFields

SergKis: Dima пишет:не замечал такого На след. экранах (при прокрутке HScroll) на короткий остаток колонки впихивается широкая колонка, если в ней superheader, то совсем беда с отображением. По мне лучше делать "управляемый" скролинг - удалять часть колонок (группой) и вставлять группу других, благо это не сложно

Dima: Понял. Спасибо

Dima: Имею xy+=getproperty(ThisWindow.name,"Button_1","Width")+11 Как это переписать не используя getproperty ?

SergKis: Dima пишет:Как это переписать не используя getproperty ? FormName.Button_1.Width GetWindowWidth(GetControlHandle("Button_1", _HMG_ThisFormName))

Andrey: Добавлю 5 копеек про растяжку :nAdjColumn Заметил такую странность, если её использовать, то ширина некоторых колонок начинает сбиваться, срезается. В примере \MiniGUI\SAMPLES\Advanced\Tsb_config приходиться запоминать значение: oBrw:bInit := {|| oBrw:SetColSize( 2, nWidthFirstColumn )} А потом в ResizeBrowse() всегда восстанавливать: Eval(oBrw:bInit) Перестал использовать этот параметр, хотя удобный вроде.

Dima: SergKis пишет: FormName.Button_1.Width Такой вариант не компилится совсем

SergKis: Dima пишет:Такой вариант не компилится совсем ты вместо FormName дал реальное имя окна, на котором Button_1 и их DEFINE уже были. см. Minigui.chm -> ControlsCommand->button в самом конце properties:, events:, metods: тыкаешь Width и т.д. Я в основном пользуюсь от handle получать размеры GetWindow...(handle)

Dima: SergKis пишет: ты вместо FormName дал реальное имя окна Понял , не хотел привязываться точно к имени окна , попробовал так xy+=ThisWindow.name.Button_1.Width+11 Не компилится Плюнул и оставил так xy+=getproperty(ThisWindow.name,"Button_1","Width")+11

SergKis: Dima пробни xy+=This.Button_1.Width+11 и глянь i_this.ch

Dima: SergKis пишет: xy+=This.Button_1.Width+11 Пробовал так , не компилится...

SergKis: Dima пишет:Пробовал так , не компилится... Тады ОЙ !

Dima: Как узнать нажата клавиша (юзер на нее чашку кофе поставил ) или уже отпущена ? Интересуют VK_DOWN и VK_UP Через Sendmessage это можно получить ?

SergKis: Dima пишет Интересуют VK_DOWN и VK_UP с VK_DOWN - это bUserKeys, а с VK_UP нету, есть метод KeyUp, но в нем нет то, что надо По идее надо было бы иметь bKeyDown и bKeyUp для таких целей

Dima: Сергей я не много не о том. Есть главный бровс и подчиненный в одном окне. При движении по главному , показываю данные в подчиненном по ключу из базы главного в :BChange Там живет что то типа фильтра (SCOPE) + Obrw:Reset() подчиненного бровса. Так вот если база довольно большая И юзер зажал стрелку ВНИЗ то через какой то момент бровс может коника дать....то есть зависнет. Нужна идея (Игорь в курсе) что бы освежать подчиненный бровс только после того как юзер отпустил в конце концов стрелку вниз (вверх и тд и тп включая колесо мыши)

SergKis: Дима, я о том же. Мне пришлось влезть в KeyDown и сделать (у меня базовая версия 2.07 и изменения [в рамках разумного переношу из тек.]) [pre2] METHOD KeyDown( nKey, nFlags ) CLASS TSBrowse ... Case nKey == VK_UP ::GoUp() If ::nRowPos == 1 If ::nKeyDownOld == nKey ::nKeyDownCnt += 1 EndIf If ::nKeyDownCnt >= ( ::nRowCount() ) PostMessage(::hWnd, WM_KEYUP , VK_UP , 0) PostMessage(::hWnd, WM_KEYDOWN, VK_PRIOR, 0) EndIf EndIf ::nKeyDownOld := nKey Case nKey == VK_DOWN ::GoDown() x If ::nRowPos == ::nRowCount() If ::nKeyDownOld == nKey ::nKeyDownCnt += 1 EndIf If ::nKeyDownCnt >= ( ::nRowCount() ) PostMessage(::hWnd, WM_KEYUP , VK_DOWN, 0) PostMessage(::hWnd, WM_KEYDOWN, VK_NEXT, 0) EndIf EndIf ::nKeyDownOld := nKey Case nKey == VK_LEFT ... [/pre2]

SergKis: PS а подчиненный бровс обновлять по таймеру при смене ключа связки раз в 1 сек. такой механизм работает со времен VO

Dima: Понял , думал есть какие другие идеи. Игорь тоже предлагает по таймеру. Проехали тогда.

Dima: ЗЫ В консоли по ходу ни чего не виснет при обновлении подчиненного бровса и даже ни какой велосипед сочинять не надо. Пусть юзер хоть заснет на клаве :)

SergKis: Dima пишет Через Sendmessage это можно получить ? ... ни какой велосипед сочинять не надо Дима, в чем сомнения ? в подчиненном бровсе переотображать надо (алгоритм делать), а управлять сообщеними (в гуи так принято), например смотри Tsb_Seek2 и on change с postmessage на кл.VK_F20. у тебя похожая ситуация только по таймеру, т.е. подчиненный бровс знает как отображать, а таимер просто посылает сообщение на переотображение через время и все

Dima: SergKis пишет: Дима, в чем сомнения ? Да привык к консоли , вот оно и сказывается. Мысль понял. Спасибо !

Dima: Хотел положить тень на все окно а после .... ее убрать. Есть ли пример ?

SergKis: Dima пишет Хотел положить тень на все окно а после .... ее убрать. "моя твоя не понимай", что хочешь 1. цвет в окне на серый 2. не активное окно 3. контролы disable ???

Dima: SergKis пишет: 1. цвет в окне на серый вот так

Dima: я бы даже сказал затемнение как на скрине http://3.bp.blogspot.com/-rQQn7_ClLss/VMKu_Hu01AI/AAAAAAAAE-o/CBTnCLAo8f0/s1600/ishop_.png

SergKis: Dima а это пробовал (по chm) ? <WindowName>.BackColor := aBackColor SetProperty(cFrm, "BackColor", aBackColor)

SergKis: Dima пишет я бы даже сказал затемнение как на скрине там не активное основное окно, поверх лежит модал окно NOSIZE NOMINIMIZE NOMAXMIZE

SergKis: PS точнее с MODAL [ NOSIZE ] [ NOSYSMENU ] [ NOCAPTION ] со своим X и астион выхода

Dima: SergKis пишет: SetProperty(cFrm, "BackColor", aBackColor) Счас пробну. Это не то.

Dima: SergKis пишет: там не активное основное окно, поверх лежит модал окно NOSIZE NOMINIMIZE NOMAXMIZE Все верно и оно затемнено (основное) , вот так и мне надо бы. Или как тут http://windowstips.ru/notes/4507 но затемнить нужно конкретное окно

SergKis: Dima для начала клади модал окно поверх, отладив, занимайся сменой цветов в основном

Dima: SergKis пишет: для начала клади модал окно поверх положил , но окно (не главное) из которого его вызвал хотел затемнить , вот и все. могу сделать его прозрачным , но это не то , нужно затемнение.

SergKis: Dima пишет нужно затемнение. таких алгоритмов в минигуи не видел

Dima: SergKis пишет: аких алгоритмов в минигуи не видел есть не что похожее C:\MiniGUI\SAMPLES\Advanced\BosTaurus\Demo5 При запуске сразу идем в меню и давим любой пункт , вылазит MsgInfo а окно за ним становится серым. Попробовал переделать Grayness_effect_start и Grayness_effect_end подавая на вход имя своего окна , не пашет однако.

Haz: Это не то. Пример затемняет только фон окна. все контролы на окне остаются как были. Попробуй пробежаться по свойсьву BackColor окна и ВСЕХ его контролов.

gfilatov2002: Haz пишет: Попробуй пробежаться по свойству BackColor окна и ВСЕХ его контролов. Эти две фукции могут в этом деле помочь [pre]/******************************************************************************/ Procedure ChangeAllBackcolor /******************************************************************************/ LOCAL i, nFormCount := Len( _HMG_aFormNames ) LOCAL nI, cCtrlName, cFormName LOCAL aCtrls FOR i := 1 TO nFormCount cFormName := _HMG_aFormNames [ i ] IF _IsWindowDefined ( cFormName ) SetProperty( cFormName, "BACKCOLOR", GRAY ) aCtrls := _GetArrayOfAllControlsForForm( cFormName ) FOR nI := 1 TO Len( aCtrls ) cCtrlName := aCTrls[ nI ] SetProperty( cFormName, cCtrlName, "BACKCOLOR", GRAY ) SetProperty( cFormName, cCtrlName, "FONTCOLOR", WHITE ) NEXT ENDIF NEXT Return /******************************************************************************/ FUNCTION _GetArrayOfAllControlsForForm ( cFormName ) /******************************************************************************/ LOCAL nFormHandle, i, nControlCount, aRetVal := {}, x nFormHandle := GetFormHandle ( cFormName ) nControlCount := Len ( _HMG_aControlHandles ) FOR i := 1 TO nControlCount IF _HMG_aControlParentHandles[ i ] == nFormHandle IF ValType( _HMG_aControlHandles[ i ] ) == 'N' IF ! Empty( _HMG_aControlNames[ i ] ) IF AScan( aRetVal, _HMG_aControlNames[ i ] ) == 0 AAdd( aRetVal, _HMG_aControlNames[ i ] ) ENDIF ENDIF ELSEIF ValType( _HMG_aControlHandles[i ] ) == 'A' FOR x := 1 TO Len ( _HMG_aControlHandles[ i ] ) IF !Empty( _HMG_aControlNames[ i ] ) IF AScan( aRetVal, _HMG_aControlNames[ i ] ) == 0 AAdd( aRetVal, _HMG_aControlNames[ i ] ) ENDIF ENDIF NEXT x ENDIF ENDIF NEXT i RETURN ASort( aRetVal )[/pre]

SergKis: Haz пишет Попробуй пробежаться по свойсьву BackColor окна и ВСЕХ его контролов. тогда контролам и disable добавить можо

Haz: SergKis пишет: тогда контролам и disable добавить можо да, вполне логично это сделать

Andrey: gfilatov2002 пишет: Эти две фукции могут в этом деле помочь Не совсем понятно.... Имею кнопку на форме, при нажатии должны: затемнить текущая форма + вызов новой формы, после закрытия новой формы нужно разтемнить текущую форму.

SergKis: Andrey пишет Не совсем понятно.... добавь local b, f, aClrOld := {} ... cCtrlName := aCTrls[ nI ] b := GetProperty( cFormName, cCtrlName, "BACKCOLOR" ) f := GetProperty( cFormName, cCtrlName, "FONTCOLOR" ) aAdd(aClrOld, {cFormName, cCtrlName, b, f}) SetProperty( cFormName, cCtrlName, "BACKCOLOR", GRAY ) SetProperty( cFormName, cCtrlName, "FONTCOLOR", WHITE ) ... Return aClrOld на вызове новой формы или на нажатии темнишь и получаешь старые значения на release новой возвращаешь старые значения на форму - разтемняешь

Andrey: У Дмитрия красивое затенение окна. Примерно так хочется - кнопка BUTTONEX Button_Test с обработкой: ACTION {|| aObj := ChangeAllBackcolor(ThisWindow.Name) ,; MsgDebug("Test Change All Backcolor Form") ,; ChangeAllBackRestore(aObj,ThisWindow.Name) } Фон менять нужно у всех объектов, включая TsBrowse .... С картинкой только это не выйдет, я имею ввиду PNG со свойством TRANSPARENT BACKGROUNDCOLOR aBackColor ....

Dima: При нажатии кнопки на форме , каким образом запомнить фон цвета не активного курсора бровса , сменить его и затем снова восстановить. Объясню зачем. Кнопка на форме скипает бровс. У нее такая процедура ACTION {|| tmpbrw:GoDown(),tmpbrw:SetFocus() } При нажатии на нее бровс теряет фокус ввода и затем снова его получает , в результате имеем на бровсе "подмигивание" курсора. Попробовал в кнопке ON GOTFOCUS {|| tmpbrw:setcolor({12},{Rgb( 198, 226, 255 ), Rgb( 159, 207, 255 )})} Но тогда при наведении на кнопку , дергается весь бровс Проехали

Vlad04: У разных языков разные реализации. У Делфи у формы есть свойство AlphaBlend (и параметр) - устанавливает прозрачность. А дальше все просто - надо затенить основную форму - поверх ее (а можно и на весь Экран) открываешь вторую с нужной прозрачность и оттенком. На Основной ничего делать с контролами не надо.Кстати, так и Локеры пишутся

Haz: Влад, идея понятна. Думаю будет работать. Спасибо

Dima: Как узнать что кнопка имеет фокус ввода ? PS Проехали сделал через переменную

SergKis: Dima пишет:Как узнать что кнопка имеет фокус ввода ? [pre2] IF ( nI := ascan(_HMG_aControlHandle, GetFocus()) ) > 0 // фокус на контроле МиниГуи IF _HMG_aControlType [ nI ] == "BUTTON" .and. _HMG_aControlNames [ nI ] == ButtonName // нужный button (или другой контрол) нашли и он в фокусе ... ENDIF ENDIF [/pre2]

Dima: SergKis Спасибо Это я так понял для всех окон а если для конкретного окна , то как ? И еще вопрос: как узнать установлен ли конкретный шрифт в системе ?

SergKis: Dima GetFocus() дает handle контрола в фокусе (окно тоже) [pre2] ParentFormHandle :=_HMG_aControlParenthandles [ nI ] If ( nK := ascan(_HMG_aFormHandles, ParentFormHandle) ) > 0 cFormName := _HMG_aFormNames[ nK ] EndIf [/pre2]

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

SergKis: Dima пишет Это я так понял для всех окон а если для конкретного окна , то как ? не очень понимаю к чему клонишь ?[pre2] If GetControlHandle(cControlName, cForm) == GetFocus() // нужный конрол нужного окна в фокусе EndIf [/pre2]

Dima: SergKis пишет: где то уже было, Андрей выяснял, если не ошибаюсь Да он выяснял , загружен ли фонт в программе . Ответ был таков GetFontHandle( Font_1 ) если вернуло 0 , не загружен. А вопрос был а доступен ли фонт в системе. В семерке скажем есть фонты которых нет в XP а я формирую Excel отчет и там хочу установить нужный фонт с проверкой конечно. Похожую функцию нашел GetFont() , но она и диалоговое окно вешает а оно мне не нужно. Мне бы просто массив имен фонтов Насчет фокуса контрола вроде понял , тяжко дается после консоли все это

SergKis: Dima пишет тяжко дается после консоли все это Главное помни, что на событиях окон, контролов (в блоках кода) всегда есть переменные _HMG_ThisFormIndex _HMG_ThisEventType _HMG_ThisType _HMG_ThisIndex _HMG_ThisFormName _HMG_ThisControlName от них плясать надо в блоках кода. _HMG_ThisType := W-window\C-control а GetFocus(), как правило нужно в процедурах типа TIMER если в GetBox использовать ACTION, ACTION2 и при клике на буттоны соответствующие, в вызовах GetFocus() даст handle нажатого button (он отсутствует в регистации контрлов МиниГуи), а _HMG_ThisControlName даст имя GetBox, к которому бутонны относятся. Через _HMG_ThisIndex можно достать из переменных _HMG_... все о контроле, а через _HMG_ThisFormIndex можно достать из переменных _HMG_... все о форме на котором контрол.

Dima: Vlad04 пишет: А дальше все просто - надо затенить основную форму - поверх ее (а можно и на весь Экран) открываешь вторую с нужной прозрачность Сделал , прикольно получилось !

Dima:

Vlad04: Dima пишет: цитата: Как узнать что кнопка имеет фокус ввода ? Можно в некоторых случаях так, к примеру: if This.FocusedControl == "Text_New" ..... endif

Dima: Vlad04 И так сработает ? [pre2] if GetProperty( "Form_0", "FocusedControl" )=="Text_New" .... endif [/pre2]

Vlad04: Dima И так сработает ? И так сработает !

Dima: Vlad04 пишет: И так сработает ! У меня не работает , во всяком случае в GOTFOCUS окна , впрочем как и не пашет установка фокуса на бровс. При чем это не пашет если окно получает фокус ввода извне (не из моей проги). Такое поведение только на семерке и XP , выше уже все в порядке. К примеру из проги сформировал отчет EXCEL и вывел его окно так ShowWindow(oExcel:hWnd, SW_MAXIMIZE) BringWindowToTop(oExcel:hWnd) То после возврата в свою программу все танцы с установкой (проверкой) фокуса не работают в GOTFOCUS окна. Поэтому пришлось делать через свои переменные.

Dima: Как заставить мышку ездить только в пределах указанного окна а после определенных действий вернуть как было ? Вроде был пример , но пока не вижу. ЗЫ Идея вроде ясна , на ON MOUSEMOVE окна вешаем процедуру которая снимает координаты мыши (GETCURSORPOS()) , затем сверяем координаты с координатами окна и если нужно ставим курсор мыши куда нужно с помощью SetcursorPos()

gfilatov2002: Dima пишет: Мне бы просто массив имен фонтов Посмотри функцию rr_GetFontNames() из сырцов библиотеки HbPrinter

Dima: gfilatov2002 То что надо

Vlad04: Dima Не клацайте на форме Excel Желательно, до окончания формирования отчета , Excel не показывать. Для больших отчетов существенное ускорение.

Dima: Vlad04 пишет: Желательно, до окончания формирования отчета , Excel не показывать. Да я знаю , так и делал. Сам отчет не очень большой да и юзеры захотели "мультов"

Dima: Вертикальный скролл вообще отрубается в TS ? Установка obrw:lNoVScroll := TRUE ему до лампочки

Dima: И еще наверное косяк В бровсе 2 колонки Есть установки obrw:nfreeze:=2 obrw:lLockFreeze:=FALSE Так вот если вертикального скрола нет (база не большая) то я могу входит в режим редактирования двойным кликом мышки , если этот скрол есть то не могу , хотя VK_RETURN пускает в обоих случаях в режим редактирования.

Haz: Dima пишет: Установка obrw:lNoVScroll := TRUE ему до лампочки Перед LoadFields() или Перед ::SetArray() те до того как определены данные для бровса oBrw:lNoVScroll := TRUE oBrw:oVScroll := NIL ЗЫ Все в исходниках Это как в поговорке - "Моется тот кому лень чесаться" Тоже с этим замучился. так и мучается тот кому лень читать

Andrey: Dima пишет: Вертикальный скролл вообще отрубается в TS ? Установка obrw:lNoVScroll := TRUE ему до лампочки Ага, подтверждаю ! Тоже с этим замучился.

Haz: Dima пишет: Так вот если вертикального скрола нет (база не большая) то я могу входит в режим редактирования двойным кликом мышки , если этот скрол есть то не могу , хотя VK_RETURN пускает в обоих случаях в режим редактирования. с этим не сталкивался , в сырцах вроде нет зависимости редакции от скрола

Dima: Haz пишет: Перед LoadFields() или Перед ::SetArray() те до того как определены данные для бровса oBrw:lNoVScroll := TRUE oBrw:oVScroll := NIL Не работает однако. Скрол по прежнему рисуется , но при движении по бровсу у него реакции нет (стоит на месте) Нажимаем мышкой но скроле которого не должно быть и получаем ошибку Called from GETPOS(0) Called from TSBROWSE:VSCROLL(12209) Called from TSBROWSE:HANDLEEVENT(7340) Called from EVENTS(0) Вообще я смотрел по началу примеры , прежде чем спросить и один из них твой Tsb_cursor и там была тщетная попытка выключить вертикальный скрол , не до :SetArray а после. И еще непонятка (думал решили) , каким образом горизонтальный скролл влияет на nAdjColumn , если этот скролл есть nAdjColumn работает правильно , если скрола нет то он не работает. Не должно быть между ними ни какой связи , но получается что nAdjColumn зависим от г. скрола.

Haz: Dima пишет: Не работает однако работает с работы скину рабочий пример

Dima: Haz пишет: с работы скину рабочий пример OK Тут дело такое или его отключить что не вышло или его починить что бы не глючил с базой ADS Глюк выглядит так (если потаскать за верт. скролл)

Haz: Haz пишет: работает с работы скину рабочий пример Найди вертикальный скрол Записей в бровсе 1000 http://shot.qip.ru/00Qz9C-610KPoqqQy/ кусок кода из Tsb_Cursor [pre2] DEFINE TBROWSE oBrw AT 17, 0 ; OF Form_0 ; WIDTH Form_0.WIDTH - 2 * GetBorderWidth() ; HEIGHT Form_0.HEIGHT - GetTitleHeight() - GetTitleHeight() - ; GetProperty( "Form_0", "StatusBar", "Height" ) - 2 * GetBorderHeight() ; GRID ; SELECTOR TRUE; FONT "Arial" SIZE 12 oBrw:lNoVScroll := TRUE oBrw:oVScroll := NIL oBrw:SetArray( aDatos, .T. ) [/pre2]

Dima: Haz пишет: Найди вертикальный скрол Попробуй его не найти если бровс по базе На массиве он да убивается.

Haz: Dima пишет: Попробуй его не найти если бровс по базе попробовал oBrw:bChange := {|| oBrw:oVScroll:SetRange( 0, 0 ) } не нашел

Dima: Haz пишет: oBrw:bChange := {|| oBrw:oVScroll:SetRange( 0, 0 ) } Точно , ты писал в феврале про это тут http://clipper.borda.ru/?1-1-0-00000457-000-10001-0-1467579659 Странно что Андрей мучался

Dima: TS бровс , футер имеет 5 строк. Хотелось бы его раскрасить нежным цветом по условию , но он ловит только то что ему покормили в :cFooting. К базе он не привязан , пока не представляю как это сделать. Есть у кого идеи как это сделать в Setcolor ({ 9 ,10}.....)?

Haz: Dima пишет: Есть у кого идеи как это сделать в Setcolor ({ 9 ,10}.....)? как и ячейки не катит ? т.е. вместо массива цветов - блок кода который по условию дает нужный массив

SergKis: Dima пишет: Есть у кого идеи как это сделать в Setcolor ({ 9 ,10}.....)? [pre2] For i := 1 To len(oBrw:aColumns) oCol := oBrw:aColumns[ i ] oCol::nClrFootBack := {|nCol,oBr| MyFootBack(nCol, oBr) } oCol::nClrFootFore := {|nCol,oBr| MyFootFore(nCol, oBr) } Next ... Static Function MyFootBack( nCol, oBrw ) Local oCol := oBrw:nCol, nClr := CLR_YELLOW // или RGB( 255, 255, 0 ) If oCol:cName == "ID" nClr := CLR_RED ElseIf oCol:cName == "NAME" nClr := CLR_HMAGENTA ... EndIf Return nClr Static Function MyFootFore( nCol, oBrw ) Local oCol := oBrw:nCol, nClr := CLR_YELLOW // или RGB( 255, 255, 0 ) If oCol:cName == "ID" nClr := CLR_HBLUE ElseIf oCol:cName == "NAME" nClr := CLR_BLACK ... EndIf Return nClr [/pre2] как то так

SergKis: PS вместо Local oCol := oBrw:nCol надо Local oCol := oBrw:aColumns[nCol]

SergKis: PS 2 для градиентной заливки возвращать можно nClr := { CLR_..., CLR_...} или блоки кода nClr := { {|nCol,oBr| RGB(...)}, {|nCol,oBr| RGB(...)} } для хранения цветов и др. инф. для работы с блоками колонок хорошо исп. oCol:Cargo oBrw:GetColumn("ID"):Cargo := { CLR_YELOW, CLR_BLUE, CLR_GREEN,...} и в функциях значения брать из oCol:Cargo

Dima: SergKis Haz Я наверное не корректно поставил вопрос Говорю о раскраске псевдо строк футера , ведь по определению он однострочный. Но добавив нужное кол-во CRLF можно сделать вид что он многострочный. То что можно столбцы по условию покрасить это понятно. Вот такой футер к примеру

SergKis: Dima Раскрасить можно ВСЕ строки футера в один цвет. для разноцветных строк можно пробнуть другой Tsb без header, footer, связав его с размерами и событиями изм. размеров. Если правильно прнял твою хотелку

Dima: SergKis Понял.

SergKis: Dima Возможно проще сделать по клику на футер (с сокращенным кол-вом строк) на раскрытие др. Tsb расшифровки этих данных, т.к. упр. футером на Tsb с 2мя HScroll-ами и изм. рамеров может оказаться затрудненным

Dima: SergKis Кстати да вариант , по клику или наведению на него мыши , хотя с наведением наверное не получится , TS не умеет такого.

SergKis: Dima Можно еще пробнуть Label-на футоре, с цветами и при oBrw:DrawFooter() перепоказывать их, но ... это пробовать (как бы label под футером tsb не оказался)

SergKis: Dima пишет хотя с наведением наверное не получится , TS не умеет такого. см. блок кода на ToolTip (мышой на футер) - может что получится

Dima: SergKis пишет: см. блок кода на ToolTip Ты наверное про cToolTip Он ведь долго не живет , показался на время и пропал

SergKis: Dima Да. Но проверить, что нет контрола\окна можно и при отсутсвии послать сообщение, к примеру, на FK_F25 вполне можно

SergKis: Dima пишет Он ведь долго не живет , показался на время и пропал Если расшифровку делать через сам cToolTip, то надо сообщение сделать много строчным и установить (вроде должно ставиться) время сообщения больше, потом вернуть

Dima: а при наведении могу показать какое то свое окно вместо Tooltip ? например окно а в нем бровс , если мышка скажем уезжает за пределы этого окна то окно закрывается.

SergKis: Dima пишет а при наведении могу показать какое то свое окно вместо Tooltip ? например окно а в нем бровс делай окно без заголовка, кнопочек, сисменю (без всего) с Tsb, ставь на него фокус, при потере фокуса окном, убиваешь его, передавая фокус где был

Dima: что бы окно фокус потеряло нужно где то мышкой клацнуть а надо что бы окно закрывалось если курсор мышки выехал за координаты этого временного окна. наверное это можно сделать в MOUSEMOVE() TS или в ON MOUSEMOVE окна

SergKis: Это все можно, вопрос случайного выезда мыши за окно (задели мышу, задели случайно поверхность мышинную) - это может раздражать

Dima: ну не знаю , меня не раздражает к примеру как это сделано в C:\MiniGUI\SAMPLES\BASIC\Mouse_Coords\demo4.exe

SergKis: Dima тогда вперед меня раздражает без клацанья (скачет что не попадя, а я не просил)

Dima: gfilatov2002 пишет: Посмотри функцию rr_GetFontNames() из сырцов библиотеки HbPrinter А еще есть WIN_ENUMFONTFAMILIES()

Alex_Cher: При выполнение простой функции - DEFINE TAB Tab_3 PARENT Form_6 ... PAGE ' СВРА ' @ 130,500 CHECKBOX CheckBox_4 PARENT Form_6 ..... ..... Form_6.CheckBox_4.Enable := .f. вылетает ошибка в сырцах ... как это можно обойти ...? Application: C:\MiniGUI\SAMPLES\MY_BASIC\NAMOTKA\rekl_nam.exe Date: 11.12.2017 Time: 11:16:19 Time from start: 0 days 0 hours 0 mins 6 secs Error BASE/1132 Переполнение массива: Неверное количество аргументов Called from EVENTS(266) in module: h_events.prg Called from DISABLEWINDOW(0) Called from _DISABLECONTROL(1223) in module: h_controlmisc.prg Called from SETPROPERTY(3740) in module: h_controlmisc.prg Called from VIBOR_4(123) in module: rekl_nam.prg Called from (b)VIBOR(45) in module: rekl_nam.prg Called from _DOCONTROLEVENTPROCEDURE(1794) in module: h_windows.prg Called from EVENTS(1733) in module: h_events.prg Called from DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(1448) in module: h_windows.prg Called from VIBOR(54) in module: rekl_nam.prg Called from (b)MAIN(270) in module: rekl_nam.prg Called from _DOCONTROLEVENTPROCEDURE(1794) in module: h_windows.prg Called from EVENTS(1733) in module: h_events.prg Called from DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(1448) in module: h_windows.prg Called from MAIN(319) in module: rekl_nam.prg

Vlad04: Сложно сказать. Проверь - объявлена ли форма 6 в модуле. Попробуй отдельный микропример, который повторяет условия и т.п

gfilatov2002: Alex_Cher пишет: вылетает ошибка в сырцах Ищите ошибку у себя в коде либо подготовьте небольшой пример, который демонстрирует проблему. Мой тестовый пример отработал нормально [pre2]#include "minigui.ch" Function Main DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 640 HEIGHT 480 ; TITLE 'Harbour MiniGUI Demo' ; MAIN ; ON SIZE SizeTest() /* DEFINE MAIN MENU DEFINE POPUP 'Test' MENUITEM 'Disable Page 1' ACTION DisableTab( 'Tab_1', 'Form_1', 1 ) MENUITEM 'Enable Page 1' ACTION EnableTab( 'Tab_1', 'Form_1', 1 ) SEPARATOR MENUITEM 'Disable Page 2' ACTION DisableTab( 'Tab_1', 'Form_1', 2 ) MENUITEM 'Enable Page 2' ACTION EnableTab( 'Tab_1', 'Form_1', 2 ) SEPARATOR MENUITEM 'Disable Page 3' ACTION DisableTab( 'Tab_1', 'Form_1', 3 ) MENUITEM 'Enable Page 3' ACTION EnableTab( 'Tab_1', 'Form_1', 3 ) SEPARATOR MENUITEM "E&xit" ACTION Form_1.Release() END POPUP END MENU */ DEFINE TAB Tab_1 ; AT 10,10 ; WIDTH 600 ; HEIGHT 400 ; VALUE 1 ; TOOLTIP 'Tab Control' PAGE 'Page &1' @ 60,20 textbox txt_1 value '1-Uno' @ 90,20 textbox txt_2 value '2-Dos' @ 120,20 textbox txt_3 value '3-Tres' END PAGE PAGE 'Page &2' @ 60,60 textbox txt_a value 'A-Uno' @ 90,60 textbox txt_b value 'B-Dos' @ 120,60 COMBOBOX combo_1 ITEMS {'1-Uno','2-Dos','3-Tres'} VALUE 1 END PAGE PAGE 'Page &3' @ 60,100 textbox txt_c value 'C-Uno' @ 90,100 textbox txt_d value 'D-Dos' // @ 120,100 SPINNER spinner_1 RANGE 0,10 VALUE 5 Define CheckBox CheckBox_4 Row 120 Col 100 Value .F. Caption 'Simple CheckBox' Width 120 PARENT Form_1 End CheckBox @ 150,100 FRAME Frame_2 WIDTH 120 HEIGHT 110 CAPTION "Page 3" DEFINE RADIOGROUP R1 ROW 170 COL 120 OPTIONS { 'Uno','Dos','Tres' } VALUE 1 WIDTH 80 END RADIOGROUP END PAGE END TAB END WINDOW Form_1.CheckBox_4.Enabled := .f. // DisableTab( 'Tab_1', 'Form_1', 2 ) Form_1.Center Form_1.Activate Return Nil Procedure SizeTest() Form_1.Tab_1.Width := Form_1.Width - 40 Form_1.Tab_1.Height := Form_1.Height - 80 Return [/pre2]



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