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

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

Andrey: SergKis пишет: проще сделать GetBox вместе с tsb Это действительно проще. В примере который я дал выше - есть такой метод....

SergKis: Andrey пишет:есть такой метод.... Я такой имел ввиду: [pre2] /* * MINIGUI - Harbour Win32 GUI library Demo * */ #include "minigui.ch" #include "tsbrowse.ch" Memvar oBrw Static Ledit:=.F.,nOrd :=0,sSeek:='' *----------------------------------- PROCEDURE Main *----------------------------------- LOCAL i,nArea SET SOFTSEEK ON SET DELETED ON REQUEST DBFCDX , DBFFPT Use STREET Via "DBFCDX" ALIAS BASE shared New if !File('STREET.cdx') INDEX ON Upper(NAME) Tag NAME endif dbSetOrder(1) nArea:=Select() DEFINE WINDOW win_1 AT 0, 0 WIDTH 1200 HEIGHT 700 ; MAIN TITLE "TSBrowse Add Record Demo" NOMAXIMIZE NOSIZE @ 5,10 BUTTON ttop PICTURE "First" TOOLTIP "Первая " ACTION TbMove(1,obrw,nArea) WIDTH 20 HEIGHT 18 // (EkspeD->(DbGoTop()),EkspeDitor.Brw_1.Value := EkspeD->(RecNo())) @ 5,10+20 BUTTON prev PICTURE "prior" TOOLTIP "Предыдущая" ACTION TbMove(3,obrw,nArea) WIDTH 20 HEIGHT 18 @ 5,10+40 BUTTON nnext PICTURE "next" TOOLTIP "Следующая " ACTION TbMove(4,obrw,nArea) WIDTH 20 HEIGHT 18 @ 5,10+60 BUTTON bott PICTURE "Last" TOOLTIP "Последняя " ACTION TbMove(6,obrw,nArea) WIDTH 20 HEIGHT 18 @ 5,10+100 BUTTON delRec PICTURE "Delete" TOOLTIP "Удалить !" ACTION {||DeleteRecall(obrw,nArea), oBrw:Refresh(.t.) } WIDTH 20 HEIGHT 18 @ 5,10+120 BUTTON readRec PICTURE "editNo" TOOLTIP "Редактированиe " ACTION Edit(1,'win_1',obrw,nArea) WIDTH 20 HEIGHT 18 // (EkspeDitor.Brw_1.ALLOWEDIT:=.T.) @ 5,10+120 BUTTON readRecN PICTURE "edit" TOOLTIP "Изменить " ACTION Edit(2,'win_1',obrw,nArea) WIDTH 20 HEIGHT 18 // (EkspeDitor.Brw_1.ALLOWEDIT:=.T.) @2,10+180 BUTTON BRUN CAPTION "Add Record" ACTION AddRecord( obrw,nArea ) DEFAULT DEFINE STATUSBAR STATUSITEM '' WIDTH 20 END STATUSBAR OpenBrows( "oBrw", 'win_1', 30, 2, win_1.Width-20, win_1.Height-95,nArea ) // 'BASE' // oBrw:bKeyDown := { | nKey | MyKeyAction(nKey,oBrw,'win_1'), lOk := nKey != VK_ESCAPE } oBrw:bKeyDown := { | nKey | MyKeyAction(nKey,'win_1',oBrw,'win_1'), lOk := nKey != VK_ESCAPE } @ 0, 0 GETBOX MyFind HEIGHT 10 WIDTH 10 VALUE "" ; ON LOSTFOCUS ( win_1.MyFind.Hide, win_1.oBrw.SetFocus ) ; ON CHANGE ( MyFind(oBrw) ) oBrw:SetFocus() END WINDOW CENTER WINDOW win_1 ACTIVATE WINDOW win_1 RETURN *-------------------------------- FUNCTION OpenBrows( cBrw, cParent, nRow, nCol, nWidth, nHeight, cAlias ) Public &cBrw DEFINE TBROWSE &cBrw ; AT nRow, nCol ; ALIAS cAlias ; OF &cParent ; WIDTH nWidth ; HEIGHT nHeight ; COLORS { CLR_BLACK, CLR_BLUE } ; FONT "MS Sans Serif" ; SIZE 8 :SetAppendMode( .F. ) :SetDeleteMode( .F. ) :lNoHScroll := .T. :lCellBrw := .F. ADD COLUMN TO obrw HEADER "Name" FOOTER "" ; SIZE 600 ; DATA FieldWBlock( "name", Select( "base" ) ) EDITABLE ADD COLUMN TO obrw HEADER "SOCR" FOOTER "" ; SIZE 350 ; DATA FieldWBlock( "SOCR", Select( "base" ) ) EDITABLE ADD COLUMN TO obrw HEADER "CODE" FOOTER "" ; SIZE 400 ; DATA FieldWBlock( "CODE", Select( "base" ) ) EDITABLE &cBrw:nHeightCell += 6 &cBrw:nHeightHead += 14 &cBrw:nHeightFoot := &cBrw:nHeightHead &cBrw:nWheelLines := 1 &cBrw:lDrawFooters := .T. &cBrw:lNoHScroll := .T. // LoadFields( cBrw, cParent ) END TBROWSE // !!! RETURN Static Function MyFind( oBrw ) Local cVal := win_1.MyFind.Value If ! empty(cVal) (oBrw:cAlias)->( dbSeek(upper(trim(cVal))) ) oBrw:GotoRec((oBrw:cAlias)->( RecNo()) ) EndIf Return nil *----------------------------------- PROCEDURE AddRecord( obrw ,cAlias) *----------------------------------- Local nRec:=Recno() Local nArea := Select() Select(cAlias) /* DbAppend() nRec:=Recno() obrw:GoToRec( nRec ) oBrw:Refresh(.t.) */ (obrw:cAlias)->( DbAppend() ) (obrw:cAlias)->( FieldPut( 1, Procname()+": "+strzero(RecNo(),7 )+str(procline(), 7) ) ) (obrw:cAlias)->( FieldPut( 3, Str(RecNo(),5) ) ) obrw:GoToRec( RecNo() ) obrw:SetFocus() Select(nArea) RETURN /*-------------------------------- */ FUNCTION TbMove(met,oBrw,cAlias) Local nArea := Select() Select(cAlias) DO CASE CASE met == 1 oBrw:GoTop() CASE met == 2 oBrw:PageUp() CASE met == 3 oBrw:GoUp() CASE met == 4 oBrw:GoDown() CASE met == 5 oBrw:PageDown() CASE met == 6 oBrw:GoBottom() ENDCASE oBrw:Refresh(.t.) Select(nArea) RETURN NIL *---------------------------------- Static Procedure DeleteRecall(obrw,cAlias) Local nArea := Select() Select(cAlias) if MsgOkCancel('Запись будет удалена! Удалить?','Удаление записи!') = .T. if ( Rlock() ) ( DbDelete()) ( dbUnlock() ) oBrw:Refresh(.t.) endif end Select(nArea) Return Static Procedure Edit(met,cForm,oBrw,cAlias) ******************** Local nArea := Select() Select(cAlias) if met = 1 // oBrw:lCellBrw := .t. // выделена строка или ячейка // Ledit := .t. // &(cForm).readRec.Visible:=.t. // &(cForm).readRecN.Visible:=.f. else // oBrw:lCellBrw := .f. // выделена строка или ячейка // Ledit := .f. // &(cForm).readRec.Visible:=.t. // &(cForm).readRecN.Visible:=.f. endif // &(cForm).Brw_1.SetFocus oBrw:Refresh(.t.) Select(nArea) Return //------------------------------------------------------------------------------ Function KeyToChar( nVirtKey ) //------------------------------------------------------------------------------ LOCAL i, cRetChar := "" LOCAL nKeyboardMode := GetKeyboardMode() LOCAL lShift := CheckBit( GetKeyState( 16 ), 32768 ) LOCAL aKeysNumPad := { 96,97,98,99,100,101,102,103,104,105,106,107,109,110,111 } LOCAL cKeysNumPad := "0123456789*+-./" LOCAL aKeys1 := { 192,189,187,219,221,220,186,222,188,190,191 } LOCAL cKeys1US := "`-=[]\;',./" LOCAL cKeys1ShiftUS := '~_+{}|:"<>?' LOCAL cKeys1RU := "Ё-=ХЪ\ЖЭБЮ." LOCAL cKeys1ShiftRU := "Ё_+ХЪ/ЖЭБЮ," LOCAL cKeys2US := "1234567890QWERTYUIOPASDFGHJKLZXCVBNM " LOCAL cKeys2ShiftUS := "!@#$%^&*()QWERTYUIOPASDFGHJKLZXCVBNM " LOCAL cKeys2RU := "1234567890ЙЦУКЕНГШЩЗФЫВАПРОЛДЯЧСМИТЬ " LOCAL cKeys2ShiftRU := '!"№;%:?*()ЙЦУКЕНГШЩЗФЫВАПРОЛДЯЧСМИТЬ ' i := ascan( aKeysNumPad, nVirtKey ) if i > 0 RETURN substr( cKeysNumPad, i, 1 ) endif i := ascan( aKeys1, nVirtKey ) if i > 0 if nKeyboardMode == 1033 // US if lShift cRetChar := substr( cKeys1ShiftUS, i, 1 ) else cRetChar := substr( cKeys1US, i, 1 ) endif elseif nKeyboardMode == 1049 // RU if lShift cRetChar := substr( cKeys1ShiftRU, i, 1 ) else cRetChar := substr( cKeys1RU, i, 1 ) endif endif RETURN cRetChar endif i := at( chr( nVirtKey ), cKeys2US ) if i > 0 if nKeyboardMode == 1033 // US if lShift cRetChar := substr( cKeys2ShiftUS, i, 1 ) else cRetChar := substr( cKeys2US, i, 1 ) endif elseif nKeyboardMode == 1049 // RU if lShift cRetChar := substr( cKeys2ShiftRU, i, 1 ) else cRetChar := substr( cKeys2RU, i, 1 ) endif endif endif RETURN cRetChar ************************** STATIC FUNCTION MyKeyAction(l_Key,cForm,oBrw, cParent) Local sL_key:='',nRec:=0 Local oCell, hBrw, nRow, oGet, uRet //MsgInfo('l_key='+Str(l_key)) Select(oBrw:cAlias) If Indexord() =0 Return endif DO CASE // CASE l_key==8 //VK_BACK //.or.l_key>31.and.l_key<242 // if l_key==VK_BACK // if Len(sSeek) > 0 // sSeek:=left(sSeek,Len(sSeek)-1) // &(cForm).STATUSBAR.Item(1):=sSeek // endif // else CASE l_key>32.and.l_key<254 // sl_key := KeyToChar(l_key ) // моя функция обработки клавиш / my processing function keys oCell := oBrw:GetCellInfo() hBrw := oBrw:hWnd nRow := GetWindowHeight(hBrw) + win_1.oBrw.Row - oBrw:nHeightFoot win_1.MyFind.Row := nRow win_1.MyFind.Col := oCell:nCol win_1.MyFind.Width := oCell:nWidth win_1.MyFind.Height := oBrw:nHeightFoot win_1.MyFind.Show() win_1.MyFind.SetFocus() win_1.MyFind.Value := space(10) _PushKey(l_key) uRet := .F. // обработка завершена (nil - продолжит tsb) ENDCASE Return uRet #pragma begindump #include <windows.h> #include "hbapi.h" HB_BOOL flag_hhk = FALSE; HB_BOOL PAUSE_hhk = FALSE; HHOOK hhk = NULL; HB_LONG VK_PRESIONADO = 0; HB_LONG VK_lParam = 0; HB_FUNC( GETKEYBOARDMODE ) { HKL kbl; HWND CurApp; DWORD idthd; int newmode; CurApp=GetForegroundWindow(); idthd=GetWindowThreadProcessId(CurApp,NULL); kbl=GetKeyboardLayout(idthd); newmode=(int)LOWORD(kbl); hb_retnl(newmode); } #pragma enddump [/pre2]

SergKis: PS пропустил после @ 0, 0 GETBOX MyFind ... win_1.MyFind.Hide


Vlad04: SergKis Поиск и фунукцию обработки клавиатуры прикрутил из другого примера ( Окно и бровс в одной функции), там все нормально работает. В этом примере ругается на &(cForm), так как надо чтобы форма реагирвала на события.

Vlad04: SergKis ок! Нормальный поиск

SergKis: Vlad04 Совет. используйте блоки код (параметры), как прописаны их вызовы в tsb, проще будет и проблем меньше, например [pre2] METHOD KeyDown( nKey, nFlags ) CLASS TSBrowse ... If ::bUserKeys != Nil 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 EndIf ... [/pre2] т.е. вместо oBrw:bKeyDown := { | nKey | MyKeyAction(nKey,'win_1',oBrw,'win_1'), lOk := nKey != VK_ESCAPE } делать oBrw:bKeyDown := { | nKey,nFlags,oBrw| MyKeyAction(nKey,nFlag,oBrw) } где Funct MyAction(l_key, nFlags, oBrw ) Local cForm := oBrw:cParentWnd Local cBrw := oBrw:cControlName Local hBrw := oBrw:hWnd ... см. свойства tsb

SergKis: PS по инерции копипастил не oBrw:bKeyDown, на мой взгляд, а oBrw:bUserKeys := ...

Vlad04: SergKis Не сочтите за наглость, не могли бы вы подправить ПРИМЕР в Вашей редакции. Думаю, многим было бы полезно. Спасибо.

SergKis: Vlad04 пишет: подправить ПРИМЕР в Вашей редакции. тут [pre2] /* * MINIGUI - Harbour Win32 GUI library Demo * */ #include "minigui.ch" #include "tsbrowse.ch" *----------------------------------- PROCEDURE Main *----------------------------------- LOCAL i,nArea LOCAL nY := 5, nX := 10 LOCAL nW := 24, nH := 24 SET SOFTSEEK ON SET DELETED ON REQUEST DBFCDX , DBFFPT Use STREET Via "DBFCDX" ALIAS BASE shared New if !File('STREET.cdx') INDEX ON Upper(NAME) Tag NAME endif dbSetOrder(1) DEFINE WINDOW win_1 AT 0, 0 WIDTH 1200 HEIGHT 700 ; MAIN TITLE "TSBrowse Add Record Demo" NOMAXIMIZE NOSIZE @ nY, nX BUTTON ttop PICTURE "First" TOOLTIP "Первая " ; ACTION ( oBrw:Gotop() , oBrw:SetFocus() ) WIDTH nW HEIGHT nH ; NOTABSTOP nX += nW @ nY, nX BUTTON prev PICTURE "prior" TOOLTIP "Предыдущая" ; ACTION ( oBrw:GoUp() , oBrw:SetFocus() ) WIDTH nH HEIGHT nH ; NOTABSTOP nX += nW @ nY, nX BUTTON nnext PICTURE "next" TOOLTIP "Следующая " ; ACTION ( oBrw:GoDown() , oBrw:SetFocus() ) WIDTH nW HEIGHT nH ; NOTABSTOP nX += nW @ nY, nX BUTTON bott PICTURE "Last" TOOLTIP "Последняя " ; ACTION ( oBrw:GoBottom() , oBrw:SetFocus() ) WIDTH nW HEIGHT nH ; NOTABSTOP nX += nW + 40 @ nY, nX BUTTON delRec PICTURE "Delete" TOOLTIP "Удалить !" ; ACTION ( oBrw:DeleteRow(), oBrw:SetFocus() ) WIDTH nW HEIGHT nH ; NOTABSTOP nX += nW @ nY, nX BUTTON readRec PICTURE "editNo" TOOLTIP "Редактированиe " ; ACTION ( MsgBox(_HMG_ThisControlName, _HMG_ThisFormName), oBrw:SetFocus() ) WIDTH nW HEIGHT nH ; NOTABSTOP nX += nW @ nY, nX BUTTON readRecN PICTURE "edit" TOOLTIP "Изменить " ; ACTION ( MsgBox(_HMG_ThisControlName, _HMG_ThisFormName), oBrw:SetFocus() ) WIDTH nW HEIGHT nH ; NOTABSTOP nX += nW @ nY, nX BUTTON BRUN PICTURE "AddRec" TOOLTIP "Добавить " ; ACTION ( AddRecord( oBrw ) ) WIDTH nW HEIGHT nH ; NOTABSTOP nX += nW DEFINE STATUSBAR STATUSITEM " " END STATUSBAR OpenBrows( "oBrw", 'win_1', 30, 2, win_1.Width-20, win_1.Height-95,nArea ) // 'BASE' oBrw:bUserKeys := {|nKy,nFlg,oBr| MyKeyAction(nKy,nFlg,oBr) } @ 0, 0 GETBOX MyFind HEIGHT 10 WIDTH 10 VALUE "" ; ON LOSTFOCUS ( win_1.MyFind.Hide, win_1.oBrw.SetFocus ) ; ON CHANGE ( MyFind(oBrw) ) ; INVISIBLE oBrw:SetFocus() END WINDOW CENTER WINDOW win_1 ACTIVATE WINDOW win_1 RETURN *-------------------------------- FUNCTION OpenBrows( cBrw, cParent, nRow, nCol, nWidth, nHeight, cAlias ) Public &cBrw DEFINE TBROWSE &cBrw ; AT nRow, nCol ; ALIAS cAlias ; OF &cParent ; WIDTH nWidth ; HEIGHT nHeight ; COLORS { CLR_BLACK, CLR_BLUE } ; FONT "MS Sans Serif" ; SIZE 8 oBrw:SetAppendMode( .F. ) oBrw:SetDeleteMode( .T., .T. ) oBrw:lNoHScroll := .T. oBrw:lCellBrw := .F. ADD COLUMN TO obrw HEADER "Name" FOOTER "" SIZE 600 ; DATA FieldWBlock( "name", Select( "base" ) ) EDITABLE ADD COLUMN TO obrw HEADER "SOCR" FOOTER "" SIZE 350 ; DATA FieldWBlock( "SOCR", Select( "base" ) ) EDITABLE ADD COLUMN TO obrw HEADER "CODE" FOOTER "" SIZE 200 ; DATA FieldWBlock( "CODE", Select( "base" ) ) EDITABLE &cBrw:nHeightCell += 6 &cBrw:nHeightHead += 14 &cBrw:nHeightFoot := &cBrw:nHeightHead &cBrw:nWheelLines := 1 &cBrw:lDrawFooters := .T. &cBrw:lNoHScroll := .T. // LoadFields( cBrw, cParent ) END TBROWSE // !!! RETURN Static Function MyFind( oBrw ) Local cVal := win_1.MyFind.Value If ! empty(cVal) (oBrw:cAlias)->( dbSeek(upper(trim(cVal))) ) oBrw:GotoRec((oBrw:cAlias)->( RecNo()) ) EndIf Return nil *----------------------------------- PROCEDURE AddRecord( oBrw ) *----------------------------------- Local nRec (obrw:cAlias)->( DbAppend() ) nRec := (obrw:cAlias)->( RecNo() ) (obrw:cAlias)->( FieldPut( 1, Procname()+": "+strzero(nRec,7 )+str(procline(), 7) ) ) (obrw:cAlias)->( FieldPut( 3, Str(nRec,5) ) ) obrw:GoToRec( nRec ) obrw:SetFocus() RETURN STATIC FUNCTION MyKeyAction( nKey, nFlag, oBrw ) Local oCell, hBrw, nRow, uRet If nKey > 32 .and. nKey < 254 If (oBrw:cAlias)->( Indexord() ) == 0 Return endif oCell := oBrw:GetCellInfo(1, 1) hBrw := oBrw:hWnd nRow := GetWindowHeight(hBrw) + win_1.oBrw.Row - oBrw:nHeightFoot win_1.MyFind.Row := nRow win_1.MyFind.Col := oCell:nCol win_1.MyFind.Width := oCell:nWidth win_1.MyFind.Height := oBrw:nHeightFoot win_1.MyFind.Show() win_1.MyFind.SetFocus() win_1.MyFind.Value := space(10) _PushKey(nKey) uRet := .F. // обработка завершена (nil - продолжит tsb) EndIf Return uRet [/pre2]

SergKis: PS подправить OpenBrows( "oBrw", 'win_1', 30, 2, win_1.Width-20, win_1.Height-95, Alias() )

Vlad04: оК Спасибо, но вопросы остались. Как обратится к элементам, объектам формы из функций ? &(cForm) вместо win_1 не работает ?

Andrey: SetProperty( ThisWindow.Name, "объект", "Enabled", .F. ) или SetProperty( cForm, "MyFind", "Value", "проба" ) // записать в объект cVal := GetProperty( cForm, "MyFind", "Value" ) // считать из объекта

SergKis: Vlad04 тот же пример без Public переменной click here

Vlad04: SergKis Ок. Все четко работает, но что ж так сложно. Все сложности должны быть в библиотеке (может у вас так и сделано). А если на форме несколько Бровзов и другие компоненты ?

SergKis: Vlad04 В чем сложность ? По моему очень похоже, как было в clipper tbrowse (координаты, алиас и UserFunc). Ф-ии TBrw_... надергал из своего класса TBrw (служит надстройкой над tsb) и лежит вместе с TBrowse в либе. Убрав этот код, что останется от примера ?

Vlad04: По моему очень похоже ,, как было в clipper tbrowse Так понятно Ф-ии TBrw_... надергал из своего класса TBrw Буду разбираться..

Andrey: Можно ли определить нажатие мышки в подвале таблицы ? Т.е. на какой колонке подвала была нажата мышка, ну и вызвать функцию какую либо...

SergKis: Andrey пишет:Можно ли определить нажатие мышки в подвале таблицы ? см. TSCOLUMN.PRG а то будет снова твоя цитата Спасибо ! Не сообразил сразу там посмотреть !

Andrey: Можно ли определить нажатие мышки в подвале таблицы ? Можно сделать так: For nI := 1 To oBrw1:nColCount() oBrw1:aColumns[ nI ]:bFLClicked := &("{|| MyFunctionSelect("+HB_NtoS(nI)+") }") Next

SergKis: Andrey Если поищешь в h_tbrowse.prg bFLClicked (всего одно место), то увидишь [pre2] If ::aColumns[ nAtCol ]:bFLClicked != Nil Eval( ::aColumns[ nAtCol ]:bFLClicked, uPar1, uPar2, ::nAt, Self ) ... выше увидишь uPar1 := nRowPix, ; uPar2 := nColPix, ; и твой блок кода будет таким {|nRowPix,nColPix,nAt,oBrw| MyFunctionSelect(nRowPix,nColPix,nAt,oBrw) } и номер колонки в ф-ии будет oBrw:nCell, а oBrw:nRowPos тек. строка и т.д. [/pre2]



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