Форум » GUI » TsBrowse в Минигуи (продолжение) » Ответить

TsBrowse в Минигуи (продолжение)

Vlad04: TsBrows определяется в виде строки ПАРМЕТРОВ объекта и их значений К примеру [quote] DEFINE TBROWSE oBrw2 ; AT 60,450 ; ALIAS cAlias ; OF Form1 ; WIDTH 330 ; HEIGHT 340 ; FONT "Verdana" ; SIZE 9 ; ON DBLCLICK CopyRec(); ON GOTFOCUS fModelo_Hab(2) ; AUTOFILTER ; CELLED EDIT; VALUE nRec; GRID [/quote] Здесь я собрал параметры из разных tBrows Можно или нет и какие парметры заменить выражением ( и каким) ? oBrw2:.... oBrw2:....

Ответов - 231, стр: 1 2 3 4 5 6 7 8 9 10 11 12 All

Andrey: Vlad04 пишет: Выбор правой мышкой из контекстного меню ? НЕТ ! Vlad04 пишет: Все работает ! Виснет - там где выбор флагов производиться... Один раз выбрать можно, на втором - программа НАГЛУХО ВИСНЕТ !!! Там даже второй выбор не нужно производить. Первый раз выбираем меню с флагами, потом мышкой кликаем на другой колонке (или стрелкой вверх/вниз) и тоже программа НАГЛУХО виснет !!

Andrey: Привет всем ! Забыл как сделать чтобы после выбора из tsbrowse оставалась серая линия на выбранной строке таблицы. Подскажите пожалуйста ?

SergKis: Andrey пишет Забыл как сделать чтобы после выбора из tsbrowse оставалась серая линия на выбранной строке таблицы. См. Tsb_addrecord_3 Del_Rec(...) :lNoGrayBar

SergKis: Надоело везде писать (как бы лишнее, по мне) :bUserKeys := {|nKy,nFl,oBr| OnKeyDown(nKy, nFl, oBr) } и STATIC FUNC OnKeyDown( nKey, nFlg, oBrw ) // обработка KeyDown ... IF nKey == VK_RETURN ... ELSEIF nKey == VK_F2 ... ENDIF RETURN uRet Немного добавил в TsBrowse [pre2] CLASS TSBrowse FROM TControl ... DATA aUserKeys INIT hb_Hash() DATA lUserKeys INIT .F. ... METHOD UserKeys( nKey, bKey, lCtrl, lShift ) ... ENDCLASS METHOD UserKeys( nKey, bKey, lCtrl, lShift ) CLASS TSBrowse Local cKey := 'other', uVal If HB_ISBLOCK(bKey) // установить блок на ключ в hash If ! empty(nKey) If HB_ISNUMERIC(nKey) cKey := hb_ntos(nKey) cKey += iif( empty(lCtrl ), '', '#' ) cKey += iif( empty(lShift), '', '^' ) ElseIf HB_ISCHAR(nKey) cKey := nKey EndIf EndIf hb_HSet( ::aUserKeys, cKey, bKey ) ::lUserKeys := len(::aUserKeys) > 0 Else // выполнить блок по ключу из hash If HB_ISNUMERIC(nKey) cKey := hb_ntos(nKey) ElseIf HB_ISCHAR(nKey) cKey := nKey EndIf If ::lUserKeys // есть уст. блоки кода uVal := hb_HGetDef( ::aUserKeys, cKey, NIL ) If HB_ISBLOCK(uVal) cKey := Eval( uVal, Self, nKey, cKey, bKey, lCtrl, lChift ) EndIf EndIf EndIf RETURN cKey METHOD KeyDown( nKey, nFlags ) CLASS TSBrowse ... ::lNoPaint := .F. ::oWnd:nLastKey := ::nLastKey := ::nUserKey := nKey If ::lUserKeys uTemp := hb_ntos(nKey) uTemp += iif( _GetKeyState( VK_CONTROL ), "#", "" ) uTemp += iif( _GetKeyState( VK_SHIFT ), "^", "" ) uVal := hb_HGetDef( ::aUserKeys, uTemp, NIL ) If ! HB_ISBLOCK(uVal) uTemp := 'other' uVal := hb_HGetDef( ::aUserKeys, uTemp, NIL ) Endif If HB_ISBLOCK(uVal) uReturn := Eval( uVal, Self, nKey, uTemp ) If uTemp == 'other' .and. ! HB_ISLOGICAL(uReturn) uReturn := .T. EndIf If uReturn == Nil .or. ( HB_ISLOGICAL(uReturn) .and. ! uReturn ) ::nLastKey := 255 Return 0 EndIf uReturn := NIL EndIf uTemp := uVal := NIL EndIf If ::bUserKeys != Nil ... теперь в проге можно писать так :nFireKey := VK_F4 // default Edit If lRec_Select // режим выбор записи :bLDblClick := {|uP1,uP2,nFl,oBr| Get_Rec(oBr, uP1, uP2, nFl) } :UserKeys(VK_RETURN, {|oBr | Get_Rec(oBr) }) Else // режим Edit записи :bLDblClick := {|uP1,uP2,nFl,oBr| uP1 := uP2 := nFl := Nil, ; oBr:PostMsg( WM_KEYDOWN, oBr:nFireKey, 0 ) } :UserKeys(VK_RETURN, {|oBr | oBr:PostMsg( WM_KEYDOWN, oBr:nFireKey, 0 ) }) EndIf :UserKeys(VK_F2 , {|oBr,nKy,cKy| Add_Rec(oBr, nKy, cKy) }) :UserKeys(VK_F3 , {|oBr,nKy,cKy| Del_Rec(oBr, nKy, cKy) }) :UserKeys(VK_F3 , {|oBr,nKy,cKy| MsgBox(cKy, 'Ctrl + F3') }, .T.) :UserKeys(VK_F3 , {|oBr,nKy,cKy| MsgBox(cKy, 'Shift + F3') }, , .T.) :UserKeys(VK_F3 , {|oBr,nKy,cKy| MsgBox(cKy, 'C + S + F3') }, .T., .T.) // :UserKeys( , {|oBr,nKy,cKy| _LogFile(.T.,cKy, 'other', nKy ) }) // это обработка др. нажатий, уст. на ключ 'other' default Если уст. блок кода возвращает Nil или .F. Method KeyDown завершается (все выполнено), при возврате .T. Method KeyDown работает дальше. Может будет полезно, a c :bUserKeys осталось, как раньше [/pre2]

SergKis: Поясню назначение кода Else // выполнить блок по ключу из hash ... Установив на тсб :UserKeys(1.1, {|o|...}) :UserKeys(1.2, {|o|...}) :UserKeys('rpt1', {|o|...}) :UserKeys('rpt2', {|o|...}) ... на кнопках, пунктах, меню и т.д. ( для этого тсб) можно вызывать oBrw1:UserKeys(1.1, Param1, Param2, Param3) oBrw1:UserKeys('rpt2', Param1, Param2, Param3) ... если несколько тсб на окне, то для каждого делаем такие манипуляции

gfilatov2002: SergKis пишет: Может будет полезно, a c :bUserKeys осталось, как раньше Благодарю за Ваше предложение и примеры использования этого расширения! Очень интересное дополнение, которое будет доступно, если в коде библиотеки будет определена константа // #define __EXT_USERKEYS__

SergKis: gfilatov2002 пишет будет доступно, если в коде библиотеки будет определена константа // #define __EXT_USERKEYS__ А смысл пересобирать либу ? Изменения минимальны, старые алгоритмы не затронуты. Я забыл, когда последний раз пересобирал либу, пользуюсь (для примеров и проб) родной сборкой. Думается так многие делают.

gfilatov2002: SergKis пишет: Изменения минимальны, старые алгоритмы не затронуты. Все правильно, но, вероятно, потребуется определить #ifndef __XHARBOUR__ #define __EXT_USERKEYS__ #endif поскольку, например, функция hb_HGetDef() недоступна в xHarbour

SergKis: gfilatov2002 Пример для Harbour (на моей lib): и надо подправить (ошибочка) [pre2] METHOD UserKeys( nKey, bKey, lCtrl, lShift ) CLASS TSBrowse ... If ::lUserKeys // есть уст. блоки кода uVal := hb_HGetDef( ::aUserKeys, cKey, NIL ) If HB_ISBLOCK(uVal) cKey := Eval( uVal, Self, nKey, cKey, bKey, lCtrl, lShift ) EndIf EndIf [/pre2]

SergKis: PS Забыл в примере вывести в StatusBar сообщение о наличии меню на правую кнопку мыши (на тсб)

SergKis: PS в моей lib не работает (надо исп. вариант без DEFINE ...) DEFINE SPLITBOX HANDLE hSplit поэтому в примере StatusBar закрыт (на родной MiniGui.lib должно быть Ok!)

gfilatov2002: SergKis пишет: Пример для Harbour Благодарю за наглядный пример! SergKis пишет: Забыл в примере вывести в StatusBar сообщение о наличии меню на правую кнопку мыши Поправил - пример работает нормально

Петр: Конечно - это полезное дополнение. Только мне кажется, что UserKeys не совсем подходящее название метода и того, что этот метод делает. Не помешало бы и добавить что-то вроде SetUserKeys/GetUserKeys

SergKis: Петр пишет Не помешало бы и добавить что-то вроде SetUserKeys/GetUserKeys Тогда + DoUserKeys (выполнение), т.е. еще несколько доп. методов. Но в МиниГуи уклон к функциям с параметрами и пляской от них, потому пошел таким путем ("что бы не выделяться" (с))

Петр: SergKis пишет: Но в МиниГуи уклон к функциям с параметрами и пляской от них, потому пошел таким путем ("что бы не выделяться" (с)) Понятно, но название неподходящее: bUserKeys/UserKeys - клавиша/ключ, дезориентировать будет.

SergKis: Петр пишет но название неподходящее: bUserKeys/UserKeys - клавиша/ключ, дезориентировать будет. Т.к. действия bUserKeys с новым методом схожи, то не должно дезориентировать. Что там обработка пользовательских клавиш\ключей, что тут, от этого и брал название. Но если есть подходящее название - нет возражений.

SergKis: gfilatov2002 В примере надо заменить _HMG_ThisControlName на This.Name - это будет правильнее.

Петр: SergKis пишет: Что там обработка пользовательских клавиш\ключей, что тут Там обработка клавиш, тут - клавиши\ключа Причем у вас обработка события по ключу может быть и не связанной с нажатием какой-либо клавиши. Название должно отображать суть того, что происходит. А что здесь происходит я лично определиться не могу

SergKis: Петр пишет я лично определиться не могу Тогда, отдадим на откуп Григорию ( типа, наша хата с краю )

SergKis: Петр пишет Причем у вас обработка события по ключу может быть и не связанной с нажатием какой-либо клавиши. В связи с отсутствием на окне механизма работы через очередь (городить свой обработчик не хочется к каждому окну), к примеру WM_USER + 55 и через Post\SendMessage(hWnd, WM_USER + 55, nIndex\hControl, 0) и на окно вешать подобный механизм UserKeys, приходится вешать клавиши в :UserKeys VK_F21, VK_F22, ... и делать oBrw:PostMsg(...) + oBrw:Cargo с данными. Нажатия клавиш существуют всегда, причем клиент ТРЕБУЕТ дублирование кнопок клавишами КАТЕГОРИЧЕСКИ



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