Форум » GUI » Примеры из Минигуи -ошибки, вопросы..... (продолжение) » Ответить

Примеры из Минигуи -ошибки, вопросы..... (продолжение)

Andrey: Всем привет. Взялся смотреть примеры из МиниГуи, так не все работают. Может кто подскажет что там "допилить" нужно ? А заодно может и исправить и добавить новые.... Очень красочный пример: \MiniGUI\SAMPLES\Advanced\AVI_Animation - не работает под Win7 (наверно AVI-шки нет в ресурсах) Предложение Григорию: Можно ли добавить еще один пример с отдельным AVI-файлом в ресурсах проекта и показом такого же бегунка ? Пример: \MiniGUI\SAMPLES\Advanced\DisplayMode - не работает под ХР и далее.... Пример: \MiniGUI\SAMPLES\Advanced\Tsb_filter - вылетает на ХР -------------------------------------------------------------------------------- Harbour MiniGUI Errorlog File Harbour MiniGUI Extended Edition 2.0.1 - 2011.09.21 -------------------------------------------------------------------------------- Date: 11/15/2011 Time: 22:13:24 Error BASE/1124 Argument error: LEFT Called from LEFT(0) Called from SCANSOFT(195) Called from MAIN(84) Пример: \MiniGUI\SAMPLES\BASIC\MsgEdit - не собирается... Z:\MiniGUI\SAMPLES\BASIC\MsgEdit>call ..\..\..\batch\compile.bat demo /L shell32 Harbour 3.1.0dev (Rev. 17042) Copyright (c) 1999-2011, http://harbour-project.org/ Compiling 'demo.prg'... Lines 20133, Functions/Procedures 30 Generating C source output to 'demo.c'... Done. Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland demo.c: Error E2141 demo.prg 993: Declaration syntax error *** 1 errors in Compile *** C compile error.

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

kkg: SergKis пишет: В моей сборки вправо и влево зажатый скролл работает по всей линейке и не виснет (hmg 19.09.2 сборка) Если виснет у вас, то можно пробовать обработку сообщения WM_HSCROLL (цветом выделено) у меня сборка Harbour MiniGUI Extended Edition 19.10 (Update 2), на ней не работает. заработало только так. #include "minigui.ch" #include "TSBrowse.ch" PROCEDURE MAIN LOCAL oBrw, aDatos, aArray, aHead, aSize, aFoot, aPict, aAlign, aName, aFontHF LOCAL aFont := {} // Local hFontHead, hFontFoot LOCAL cFontName := _HMG_DefaultFontName LOCAL nFontSize := 11 SET DECIMALS TO 4 SET DATE TO GERMAN SET EPOCH TO 2000 SET CENTURY ON SET EXACT ON DEFINE FONT Font_1 FONTNAME cFontName SIZE nFontSize DEFINE FONT Font_2 FONTNAME cFontName SIZE nFontSize BOLD AAdd( aFont, GetFontHandle( "Font_1" ) ) AAdd( aFont, GetFontHandle( "Font_2" ) ) DEFINE WINDOW test ; TITLE "SetArray For Report Demo" ; MAIN ; NOMAXIMIZE NOSIZE DEFINE STATUSBAR FONT cFontName SIZE nFontSize STATUSITEM "0" // WIDTH 0 FONTCOLOR BLACK STATUSITEM "Item 1" WIDTH 230 // FONTCOLOR BLACK STATUSITEM "Item 2" WIDTH 230 // FONTCOLOR BLACK STATUSITEM "Item 3" WIDTH 230 // FONTCOLOR BLACK END STATUSBAR DEFINE TBROWSE oBrw ; AT 1 + iif( IsVistaOrLater(), GetBorderWidth()/2, 0 ), ; 1 + iif( IsVistaOrLater(), GetBorderHeight()/2, 0 ) ; WIDTH test.WIDTH - 2 * GetBorderWidth() ; HEIGHT test.HEIGHT - GetTitleHeight() - ; GetProperty( "test", "StatusBar", "Height" ) - ; 2 * GetBorderHeight() ; ENUMERATOR ; FONT cFontName SIZE nFontSize ; GRID EDIT aDatos := CreateDatos() aArray := aDatos[ 1 ] aHead := aDatos[ 2 ] aSize := aDatos[ 3 ] aFoot := aDatos[ 4 ] aPict := aDatos[ 5 ] aAlign := aDatos[ 6 ] aName := aDatos[ 7 ] // hFontHead := aFont[1] // normal Header // hFontFoot := aFont[2] // bold Footer // aFontHF := { hFontHead, hFontFoot } // aFontHF := aFont[1] // normal Header, Footer aFontHF := aFont[2] // bold Header, Footer oBrw := SetArrayTo( "oBrw", "test", aArray, aFontHF, aHead, aSize, aFoot, aPict, aAlign, aName ) oBrw:nWheelLines := 1 oBrw:nClrLine := COLOR_GRID oBrw:nHeightCell += 5 oBrw:nHeightHead += 5 IF ! Empty( aFoot ) oBrw:nHeightFoot += 5 ENDIF IF oBrw:lEnum oBrw:nHeightSpecHd := oBrw:nHeightCell ENDIF oBrw:nFreeze := 4 oBrw:lLockFreeze := .F. oBrw:bEvents := {|ob,nm,np,nl| tsb_events(ob,nm,np,nl) } oBrw:nCell := oBrw:nFreeze + 1 END TBROWSE oBrw:SetNoHoles() oBrw:SetFocus() END WINDOW DoMethod( "test", "Activate" ) RETURN * ====================================================================== STATIC FUNCTION CreateDatos() LOCAL a, b, i, j, k := 1000, n LOCAL aDatos, aHead, aSize, aFoot, aPict, aAlign, aName aDatos := Array( k ) FOR i := 1 TO k a := { " ", ; // 1 i, ; // 2 ntoc( i ) + "_123", ; // 3 Date() + i, ; // 4 PadR( "Test line - " + ntoc( i ), 20 ), ; // 5 Round( ( 10000 -i ) * i / 3, 2 ), ; // 6 100.00 * i, ; // 7 0.12, ; // 8 Round( 100.00 * i * 0.12, 2 ), ; // 9 Round( 1234567.00 / i, 3 ), ; // 10 PadR( "Line " + StrZero( i, 5 ), 20 ), ; // 11 Date(), ; // 12 Time(), ; // 13 i % 2 == 0 } // 14 n := Len(a) FOR b := 1 TO 10 FOR j := 1 TO n ; AAdd(a, a[ j ]) NEXT NEXT aDatos[ i ] := a NEXT aHead := AClone( aDatos[ 1 ] ) // AEval(aHead, {|x,n| aHead[ n ] := "Head_" + hb_ntos(n) }) AEval( aHead, {| x, n| aHead[ n ] := "H_" + hb_ntos( n ) + ; iif( n % 2 == 0, CRLF + "S_" + hb_ntos( n ), "" ) } ) aFoot := Array( Len( aDatos[ 1 ] ) ) AEval( aFoot, {| x, n| aFoot[ n ] := n } ) // aFoot := .T. // подножие есть с пустыми значениями aPict := Array( Len( aDatos[ 1 ] ) ) // можно не задавать, формируются aPict[ 10 ] := "99999999999.999" // автоматом для C,N по мах значению aSize := Array( Len( aDatos[ 1 ] ) ) // можно не задавать, формируются aSize[ 10 ] := aPict[ 10 ] // автоматом по мах значению в колонке aAlign := Array( Len( aDatos[ 1 ] ) ) // тип поля C - DT_LEFT aAlign[ 2 ] := DT_CENTER // D,L - DT_CENTER // N - DT_RIGHT aName := Array( Len( aDatos[ 1 ] ) ) AEval( aName, {| x, n| aName[ n ] := "MyName_" + hb_ntos( n ) } ) RETURN { aDatos, aHead, aSize, aFoot, aPict, aAlign, aName } function tsb_events( oBrw, nMsg, nWParam, nLParam ) Local nRet := 0, anW:={}, nKey, nFlag, nCol, nFrez := 0, nObrW := 0, nFW := 0, nC := 0, nW:=0, i, j Local lCtrl := _GetKeyState( VK_CONTROL ) Local lShift := _GetKeyState( VK_SHIFT ) Local lAlt := _GetKeyState( VK_MENU ) Static n_CntLeft := 0, n_CntRight := 0, n_LeftRight := 3 nCol := oBrw:nCell nRow := oBrw:nAt nFrez := oBrw:nFreeze + 1 nKey := nWParam nFlag := nLParam If lCtrl .or. lShift .or. lAlt ElseIf nMsg == WM_KEYDOWN If nKey == VK_LEFT .and. nCol > nFrez n_CntLeft ++ If n_CntLeft >= n_LeftRight nRet := 1 // InkeyGui(100) n_CntLeft := 0 EndIf // DoEvents() ElseIf nKey == VK_RIGHT .and. nCol <= oBrw:nColCount() n_CntRight ++ If n_CntRight >= n_LeftRight nRet := 1 // InkeyGui(100) n_CntRight := 0 EndIf // DoEvents() EndIf Elseif nMsg == WM_HSCROLL If ! oBrw:lDontchange nObrW := GetProperty(if(Empty(oBrw:cParentWnd),ThisWindow.Name,oBrw:cParentWnd),oBrw:cControlName,"Width") aEval( oBrw:aColumns,{|x| aadd(anW,x:nWidth) } ) if oBrw:nFreeze > 0; aEval(anW,{|y| nFW += y}, 1, oBrw:nFreeze); Endif if Loword( nKey ) = 5 nW := nFW; i:=.f. for j=oBrw:nColCount to oBrw:nColPos step -1 nW += anW[j] if nW <= nObrW .and. j <= nFW i:=.t.; exit endif if nW > nObrW exit endif next if i oBrw:GoPos( nRow, oBrw:nColCount ) oBrw:GoPos( nRow, HiWord( nKey )) return 1 endif return 0 endif do case case nKey == SB_LINELEFT case nKey == SB_LINERIGHT i:=0; aEval(anW,{|y| if(nW+y<nObrW,{i++,nW += y, nC:=i},nil) }, oBrw:nColPos, oBrw:nColCount ) if nC = nCol .and. nCol+1 <= oBrw:nColCount oBrw:GoPos( nRow, oBrw:nColCount) oBrw:GoPos( nRow, nCol+1) return 1 Endif case nKey == SB_THUMBPOSITION ;Return 1 case nKey == SB_THUMBTRACK ;Return 1 case nKey == SB_PAGELEFT ;Return 1 case nKey == SB_PAGERIGHT ;Return 1 endcase n_CntRight ++ If n_CntRight >= n_LeftRight nRet := 1 // InkeyGui(100) n_CntRight := 0 EndIf EndIf ElseIf nMsg == WM_KEYUP n_CntLeft := n_CntRight := 0 EndIf return nRet

SergKis: kkg пишет заработало только так hmg 19.09.2 сборка вашего примера скролл работает аналогично моего варианта, после двойных кликов по крайним кнопкам скролла (сообщения автоматом), при достижении крайних значений колонок, надо кликами на тсб активировать тсб работу. Разваливается - :nFreeze установленный (влево уходит на 1ю колонку) :nFreeze := 4 - Shift+End и Shift+Home (переход в конец\начало строки) - врет с нумерацией SpecHeader, меняя нумерацию у :nFreeze колонок и соответсвенно у остальных

SergKis: PS Надо отметить, что и в моем примере SpecHeader врет одинаково и Shift+Home уст. на 1ю колонку, но по -> правильно перепрыгивает на колонку с учетом :nFreeze. Это, наверно, общая неточность в тсб.


kkg: Ещё, после отпускания кнопки на скролбаре не сбрасывается сброс счётчика. Допиливать нужно, но пока хоть не сваливается. Уже приемлемо.

SergKis: kkg пишет Допиливать нужно, но пока хоть не сваливается Что то допиливать надо, но у меня сборка hmg 19.10.2 на bcc 5.8 работает? не виснет по скроллу и клавишам. Вот пример этой сборки https://TransFiles.ru/8n29c Гонял туда-сюда работает и не виснет, так же как сборка bcc 5.5 hmg 19.09.2

SergKis: Повторю ссылку https://TransFiles.ru/bwhwh

kkg: SergKis пишет: Что то допиливать надо, но у меня сборка hmg 19.10.2 на bcc 5.8 работает? не виснет по скроллу и клавишам. с oBrw:lLockFreeze := .F. на сборке 19.10.2 виснет + бегунок не дотягивает до последнего столбца

SergKis: kkg пишет с oBrw:lLockFreeze := .F. на сборке 19.10.2 виснет При :nFreeze := 4 задан, надо :lLockFreeze := .T., избегать прорисовки замороженных колонок По примеру с :lLockFreeze := .F. видно, что при работе левой кнопки скроллбар курсор добегает до 1ой колнки, а должен остановиться на 4ой, что и происходит при :lLockFreeze := .T.. Уже видно рассогласование в прорисовке.

kkg: SergKis пишет: При :nFreeze := 4 задан, надо :lLockFreeze := .F., избегать прорисовки замороженных колонок На тяжёлых многоуровневых формах (много колонок) nFreeze нужен для замораживания ключевой информации, а lLockFreeze := .F. нужен чтобы передать на следующий уровень строку с данными и номер (имя) кликнутой колонки, но зачастую необходимая колонка находится в замороженной зоне поэтому и нужно чтобы курсор в неё заходил. Для наглядности можно переставить местами oBrw:lLockFreeze:=.f. oBrw:nFreeze:=4 Ещё бывает необходимость редактировать данные в замороженной области

SergKis: kkg пишет На тяжёлых многоуровневых формах (много колонок) nFreeze нужен для замораживания ключевой информации, а lLockFreeze := .F. нужен чтобы передать на следующий уровень строку с данными и номер (имя) кликнутой колонки, но зачастую необходимая колонка находится в замороженной зоне поэтому и нужно чтобы курсор в неё заходил. OK! Попробуйте добавить в h_tbrowse.prg [pre2] METHOD DrawLine( xRow ) CLASS TSBrowse ... Next DoEvents() EndIf Return Self ... METHOD DrawSelect( xRow, lDrawCell ) CLASS TSBrowse ... If lDraw AAdd( ::aDrawCols, nJ ) EndIf Next DoEvents() EndIf If ::bOnDraw != Nil ... [/pre2] и пересобрать либу MakeLib.bat Пример с :lLockFreeze := .F. мой вариант, вроде не виснет, покрутил туда-сюда какое то время.

SergKis: SergKis пишет вроде не виснет, покрутил туда-сюда какое то время Стало обвисать перемещение клавишами, к сожалению, а скроллбар нет.

SergKis: kkg Попробуйте вариант, вроде работаеат, не обвисает у меня [pre2] #include "minigui.ch" #include "TSBrowse.ch" PROCEDURE MAIN LOCAL oBrw, aDatos, aArray, aHead, aSize, aFoot, aPict, aAlign, aName, aFontHF LOCAL aFont := {} // Local hFontHead, hFontFoot LOCAL cFontName := _HMG_DefaultFontName LOCAL nFontSize := 11 SET DECIMALS TO 4 SET DATE TO GERMAN SET EPOCH TO 2000 SET CENTURY ON SET EXACT ON DEFINE FONT Font_1 FONTNAME cFontName SIZE nFontSize DEFINE FONT Font_2 FONTNAME cFontName SIZE nFontSize BOLD AAdd( aFont, GetFontHandle( "Font_1" ) ) AAdd( aFont, GetFontHandle( "Font_2" ) ) DEFINE WINDOW test ; TITLE "SetArray For Report Demo" ; MAIN ; NOMAXIMIZE NOSIZE DEFINE STATUSBAR FONT cFontName SIZE nFontSize STATUSITEM "0" // WIDTH 0 FONTCOLOR BLACK STATUSITEM "Item 1" WIDTH 230 // FONTCOLOR BLACK STATUSITEM "Item 2" WIDTH 230 // FONTCOLOR BLACK STATUSITEM "Item 3" WIDTH 230 // FONTCOLOR BLACK END STATUSBAR DEFINE TBROWSE oBrw ; AT 1 + iif( IsVistaOrLater(), GetBorderWidth()/2, 0 ), ; 1 + iif( IsVistaOrLater(), GetBorderHeight()/2, 0 ) ; WIDTH test.WIDTH - 2 * GetBorderWidth() ; HEIGHT test.HEIGHT - GetTitleHeight() - ; GetProperty( "test", "StatusBar", "Height" ) - ; 2 * GetBorderHeight() ; ENUMERATOR ; FONT cFontName SIZE nFontSize ; GRID EDIT aDatos := CreateDatos() aArray := aDatos[ 1 ] aHead := aDatos[ 2 ] aSize := aDatos[ 3 ] aFoot := aDatos[ 4 ] aPict := aDatos[ 5 ] aAlign := aDatos[ 6 ] aName := aDatos[ 7 ] // hFontHead := aFont[1] // normal Header // hFontFoot := aFont[2] // bold Footer // aFontHF := { hFontHead, hFontFoot } // aFontHF := aFont[1] // normal Header, Footer aFontHF := aFont[2] // bold Header, Footer oBrw := SetArrayTo( "oBrw", "test", aArray, aFontHF, aHead, aSize, aFoot, aPict, aAlign, aName ) oBrw:nWheelLines := 1 oBrw:nClrLine := COLOR_GRID oBrw:nHeightCell += 5 oBrw:nHeightHead += 5 IF ! Empty( aFoot ) oBrw:nHeightFoot += 5 ENDIF IF oBrw:lEnum oBrw:nHeightSpecHd := oBrw:nHeightCell ENDIF oBrw:nFreeze := 4 oBrw:lLockFreeze := .F. oBrw:bEvents := {|ob,nm,np,nl| tsb_events(ob,nm,np,nl) } oBrw:nCell := oBrw:nFreeze + 1 oBrw:lAdjColumn := .T. END TBROWSE oBrw:SetNoHoles() oBrw:SetFocus() END WINDOW DoMethod( "test", "Activate" ) RETURN * ====================================================================== STATIC FUNCTION CreateDatos() LOCAL a, b, i, j, k := 1000, n LOCAL aDatos, aHead, aSize, aFoot, aPict, aAlign, aName aDatos := Array( k ) FOR i := 1 TO k a := { " ", ; // 1 i, ; // 2 ntoc( i ) + "_123", ; // 3 Date() + i, ; // 4 PadR( "Test line - " + ntoc( i ), 20 ), ; // 5 Round( ( 10000 -i ) * i / 3, 2 ), ; // 6 100.00 * i, ; // 7 0.12, ; // 8 Round( 100.00 * i * 0.12, 2 ), ; // 9 Round( 1234567.00 / i, 3 ), ; // 10 PadR( "Line " + StrZero( i, 5 ), 20 ), ; // 11 Date(), ; // 12 Time(), ; // 13 i % 2 == 0 } // 14 n := Len(a) FOR b := 1 TO 21 FOR j := 1 TO n ; AAdd(a, a[ j ]) NEXT NEXT aDatos[ i ] := a NEXT aHead := AClone( aDatos[ 1 ] ) // AEval(aHead, {|x,n| aHead[ n ] := "Head_" + hb_ntos(n) }) AEval( aHead, {| x, n| aHead[ n ] := "H_" + hb_ntos( n ) + ; iif( n % 2 == 0, CRLF + "S_" + hb_ntos( n ), "" ) } ) aFoot := Array( Len( aDatos[ 1 ] ) ) AEval( aFoot, {| x, n| aFoot[ n ] := n } ) // aFoot := .T. // яюфэюцшх хёЄ№ ё яєёЄ√ьш чэрўхэш ьш aPict := Array( Len( aDatos[ 1 ] ) ) // ьюцэю эх чрфртрЄ№, ЇюЁьшЁє■Єё  aPict[ 10 ] := "99999999999.999" // ртЄюьрЄюь фы  C,N яю ьрї чэрўхэш■ aSize := Array( Len( aDatos[ 1 ] ) ) // ьюцэю эх чрфртрЄ№, ЇюЁьшЁє■Єё  aSize[ 10 ] := aPict[ 10 ] // ртЄюьрЄюь яю ьрї чэрўхэш■ т ъюыюэъх aAlign := Array( Len( aDatos[ 1 ] ) ) // Єшя яюы  C - DT_LEFT aAlign[ 2 ] := DT_CENTER // D,L - DT_CENTER // N - DT_RIGHT aName := Array( Len( aDatos[ 1 ] ) ) AEval( aName, {| x, n| aName[ n ] := "MyName_" + hb_ntos( n ) } ) RETURN { aDatos, aHead, aSize, aFoot, aPict, aAlign, aName } FUNCTION Tsb_Events( oBrw, nMsg, nWParam, nLParam ) Local nRet := 0, nKey, nFlag, nCol, nFrez Local lCtrl := _GetKeyState( VK_CONTROL ) Local lShift := _GetKeyState( VK_SHIFT ) Local lAlt := _GetKeyState( VK_MENU ) Static n_CntKeysLR := 0, n_MaxKeysLR := 3 Static n_CntScroll := 0, n_MaxScroll := 3 nCol := oBrw:nCell nFrez := oBrw:nFreeze + 1 nKey := Loword( nWParam ) nFlag := HiWord( nWParam ) If lCtrl .or. lShift .or. lAlt ElseIf nMsg == WM_KEYDOWN If nKey == VK_LEFT .and. nCol > nFrez n_CntKeysLR ++ If n_CntKeysLR >= n_MaxKeysLR nRet := 1 n_CntKeysLR := 0 EndIf DoEvents() ElseIf nKey == VK_RIGHT .and. nCol < oBrw:nColCount() n_CntKeysLR ++ If n_CntKeysLR >= n_MaxKeysLR nRet := 1 n_CntKeysLR := 0 EndIf DoEvents() EndIf ElseIf nMsg == WM_KEYUP n_CntKeysLR := 0 Elseif nMsg == WM_HSCROLL If ! oBrw:lDontchange .and. oBrw:lEnabled IF nKey == SB_LINEUP ; n_CntScroll ++ ELSEIF nKey == SB_LINEDOWN ; n_CntScroll ++ ELSE ; n_CntScroll := 0 ENDIF IF n_CntScroll >= n_MaxScroll nRet := 1 n_CntScroll := 0 ENDIF EndIf EndIf RETURN nRet [/pre2]

kkg: SergKis пишет: Попробуйте вариант, вроде работаеат я уже два дня на юзерах проверяю, вот такой вариант [pre2] #include "minigui.ch" #include "TSBrowse.ch" Static nbCtrlKeys,nbCtrlCount:=0, nbUserKeys PROCEDURE MAIN LOCAL oBrw, aDatos, aArray, aHead, aSize, aFoot, aPict, aAlign, aName, aFontHF LOCAL aFont := {} // Local hFontHead, hFontFoot LOCAL cFontName := _HMG_DefaultFontName LOCAL nFontSize := 11 SET DECIMALS TO 4 SET DATE TO GERMAN SET EPOCH TO 2000 SET CENTURY ON SET EXACT ON DEFINE FONT Font_1 FONTNAME cFontName SIZE nFontSize DEFINE FONT Font_2 FONTNAME cFontName SIZE nFontSize BOLD AAdd( aFont, GetFontHandle( "Font_1" ) ) AAdd( aFont, GetFontHandle( "Font_2" ) ) DEFINE WINDOW test ; TITLE "SetArray For Report Demo" ; MAIN ; NOMAXIMIZE NOSIZE DEFINE STATUSBAR FONT cFontName SIZE nFontSize STATUSITEM "0" // WIDTH 0 FONTCOLOR BLACK STATUSITEM "Item 1" WIDTH 230 // FONTCOLOR BLACK STATUSITEM "Item 2" WIDTH 230 // FONTCOLOR BLACK STATUSITEM "Item 3" WIDTH 230 // FONTCOLOR BLACK END STATUSBAR DEFINE TBROWSE oBrw ; AT 1 + iif( IsVistaOrLater(), GetBorderWidth()/2, 0 ), ; 1 + iif( IsVistaOrLater(), GetBorderHeight()/2, 0 ) ; WIDTH test.WIDTH - 2 * GetBorderWidth() ; HEIGHT test.HEIGHT - GetTitleHeight() - ; GetProperty( "test", "StatusBar", "Height" ) - ; 2 * GetBorderHeight() ; ENUMERATOR ; FONT cFontName SIZE nFontSize ; GRID EDIT aDatos := CreateDatos() aArray := aDatos[ 1 ] aHead := aDatos[ 2 ] aSize := aDatos[ 3 ] aFoot := aDatos[ 4 ] aPict := aDatos[ 5 ] aAlign := aDatos[ 6 ] aName := aDatos[ 7 ] // hFontHead := aFont[1] // normal Header // hFontFoot := aFont[2] // bold Footer // aFontHF := { hFontHead, hFontFoot } // aFontHF := aFont[1] // normal Header, Footer aFontHF := aFont[2] // bold Header, Footer oBrw := SetArrayTo( "oBrw", "test", aArray, aFontHF, aHead, aSize, aFoot, aPict, aAlign, aName ) oBrw:nWheelLines := 1 oBrw:nClrLine := COLOR_GRID oBrw:nHeightCell += 5 oBrw:nHeightHead += 5 IF ! Empty( aFoot ) oBrw:nHeightFoot += 5 ENDIF IF oBrw:lEnum oBrw:nHeightSpecHd := oBrw:nHeightCell ENDIF oBrw:lLockFreeze := .F. oBrw:nFreeze := 4 oBrw:bUserKeys := {|nKy,nFl,oBr| my_bUserKeys(oBr,@nKy,@nFl ) } oBrw:bEvents := {|ob,nm,np,nl| tsb_events(ob,@nm,@np,@nl) } oBrw:nCell := 1 END TBROWSE oBrw:SetNoHoles() oBrw:SetFocus() END WINDOW DoMethod( "test", "Activate" ) RETURN * ====================================================================== STATIC FUNCTION CreateDatos() LOCAL a, b, i, j, k := 6000, n LOCAL aDatos, aHead, aSize, aFoot, aPict, aAlign, aName aDatos := Array( k ) FOR i := 1 TO k a := { " ", ; // 1 i, ; // 2 ntoc( i ) + "_123", ; // 3 Date() + i, ; // 4 PadR( "Test line - " + ntoc( i ), 20 ), ; // 5 Round( ( 10000 -i ) * i / 3, 2 ), ; // 6 100.00 * i, ; // 7 0.12, ; // 8 Round( 100.00 * i * 0.12, 2 ), ; // 9 Round( 1234567.00 / i, 3 ), ; // 10 PadR( "Line " + StrZero( i, 5 ), 20 ), ; // 11 Date(), ; // 12 Time(), ; // 13 i % 2 == 0 } // 14 n := Len(a) FOR b := 1 TO 10 FOR j := 1 TO n ; AAdd(a, a[ j ]) NEXT NEXT aDatos[ i ] := a NEXT aHead := AClone( aDatos[ 1 ] ) // AEval(aHead, {|x,n| aHead[ n ] := "Head_" + hb_ntos(n) }) AEval( aHead, {| x, n| aHead[ n ] := "H_" + hb_ntos( n ) + ; iif( n % 2 == 0, CRLF + "S_" + hb_ntos( n ), "" ) } ) aFoot := Array( Len( aDatos[ 1 ] ) ) AEval( aFoot, {| x, n| aFoot[ n ] := n } ) // aFoot := .T. // подножие есть с пустыми значениями aPict := Array( Len( aDatos[ 1 ] ) ) // можно не задавать, формируются aPict[ 10 ] := "99999999999.999" // автоматом для C,N по мах значению aSize := Array( Len( aDatos[ 1 ] ) ) // можно не задавать, формируются aSize[ 10 ] := aPict[ 10 ] // автоматом по мах значению в колонке aAlign := Array( Len( aDatos[ 1 ] ) ) // тип поля C - DT_LEFT aAlign[ 2 ] := DT_CENTER // D,L - DT_CENTER // N - DT_RIGHT aName := Array( Len( aDatos[ 1 ] ) ) AEval( aName, {| x, n| aName[ n ] := "MyName_" + hb_ntos( n ) } ) RETURN { aDatos, aHead, aSize, aFoot, aPict, aAlign, aName } function tsb_events( oBrw, nMsg, nWParam, nLParam ) Local lCtrl := _GetKeyState( VK_CONTROL ) Local lShift := _GetKeyState( VK_SHIFT ) Local lAlt := _GetKeyState( VK_MENU ) Local i If lCtrl .or. lShift .or. lAlt; Return 0; EndIf do case case nMsg == WM_KEYDOWN do case case nWParam == VK_RIGHT; Return tsb_events_Right( oBrw ) case nWParam == VK_LEFT ; Return tsb_events_Left ( oBrw ) endcase case nMsg == WM_KEYUP Do while InkeyGui(1)!=0 Enddo case nMsg == WM_HSCROLL .and. lCtrl; nMsg := nil; Return 1 case nMsg == WM_HSCROLL .and. !lCtrl If ! oBrw:lDontchange if Loword( nWParam ) = 5; i := HiWord( nWParam ) if oBrw:nCell=i ; nMsg := nil; Return 1; EndIf if i <= oBrw:nFreeze; oBrw:GoPos( oBrw:nAt, oBrw:nFreeze + 1 ); oBrw:GoPos( oBrw:nAt, i ) ; nMsg := nil; Return 1; EndIf oBrw:GoPos( oBrw:nAt, i ) nMsg := nil Return 1 Endif do case case nWParam == SB_LINELEFT ;Return tsb_events_Left ( oBrw ) case nWParam == SB_LINERIGHT ;Return tsb_events_Right( oBrw ) case nWParam == SB_PAGELEFT ;nMsg := nil; Return 1 case nWParam == SB_PAGERIGHT ;nMsg := nil; Return 1 endcase EndIf case nMsg == WM_VSCROLL If ! oBrw:lDontchange do case case nWParam == SB_PAGELEFT ;nMsg := nil; Return 1 case nWParam == SB_PAGERIGHT ;nMsg := nil; Return 1 endcase EndIf endcase return 0 function tsb_events_Left ( oBrw ) Local anW:={}, nObrW := 0, nFW := 0, nC := 0, nW:=0, j:=0, nG:=0 Local nCol := oBrw:nCell, nRow := oBrw:nAt IF nCol=1; nMsg := nil; Return 1; EndIf nObrW := GetProperty(if(Empty(oBrw:cParentWnd),ThisWindow.Name,oBrw:cParentWnd),oBrw:cControlName,"Width") aEval( oBrw:aColumns,{|x| aadd(anW,x:nWidth) } ) if oBrw:nFreeze > 0; aEval(anW,{|y| nFW += y}, 1, oBrw:nFreeze); Endif if nCol <= oBrw:nFreeze+1; Return 0; Endif if oBrw:nColPos = nCol nW := nFW for j=nCol to 1 step -1 nW += anW[j] if nW > nObrW; exit; endif next if j-1 < nCol oBrw:GoPos( nRow, 1) if j-1>oBrw:nFreeze; oBrw:GoPos( nRow, j-1); Endif oBrw:GoPos( nRow, max(nCol-1,1)) nMsg := nil; Return 1 Endif EndIf return 0 function tsb_events_Right( oBrw, nColFors, lRes ) Local anW:={}, nObrW := 0, nFW := 0, nC := 0, nW:=0, j:=0 Local nCol := oBrw:nCell, nRow := oBrw:nAt Local nNewCol := if( Empty(nColFors), nCol+1, nColFors) IF nCol=oBrw:nColCount.and.Empty(nColFors); nMsg := nil; Return 1; EndIf if Empty(nbUserKeys); nbUserKeys:=seconds(); Endif if Seconds() < nbUserKeys Do while (i:=InkeyGui(1))=VK_RIGHT.or.i!=0 Enddo nMsg := nil; Return 1 endif nObrW := GetProperty(if(Empty(oBrw:cParentWnd),ThisWindow.Name,oBrw:cParentWnd),oBrw:cControlName,"Width") aEval( oBrw:aColumns,{|x| aadd(anW,x:nWidth) } ) if oBrw:nFreeze > 0; aEval(anW,{|y| nFW += y}, 1, oBrw:nFreeze); Endif nW := nFW for j=oBrw:nColCount to oBrw:nColPos step -1 nW += anW[j] if nW > nObrW; exit; endif next if nCol > j oBrw:GoRight(.f.) return 1 endif if nCol >= j - 1 oBrw:GoPos( nRow, oBrw:nColCount ) oBrw:GoPos( nRow, nNewCol) nbUserKeys := Seconds()+0.15 Return 1 endif nW := nFW for j=oBrw:nColPos to oBrw:nColCount nW += anW[j] if nW > nObrW; exit; endif next if ! nCol < j-1 .and. Empty(nColFors) oBrw:GoPos( nRow, oBrw:nColCount ) oBrw:GoPos( nRow, j-1) oBrw:GoPos( nRow, nNewCol) nbUserKeys := Seconds()+0.15 Return 1 Endif If Empty(nColFors) oBrw:GoRight(.f.) return 1 EndIF return 0 func my_bUserKeys(oBrw, nKey, nFlags) Local lRet := .t., anW:={}, nColPosEnd:=0, nW:=0, nFreezeWidth:=0, nCW:=0,i,j//,c,w Local lCtrl := _GetKeyState( VK_CONTROL ) Local lShift := _GetKeyState( VK_SHIFT ) Local lAlt := _GetKeyState( VK_MENU ) if valtype(nKey) != 'N' return lRet endif if nKey = 36 // home oBrw:GoPos( oBrw:nAT, 1) lRet := .F.; nKey := nil; nFlags := nil return lRet endif if nKey = 35 //end oBrw:GoPos( oBrw:nAT, len(oBrw:aColumns), 1) lRet := .F.; nKey := nil; nFlags := nil return lRet endif if ! (nKey >= 37 .and. nKey <= 40 ) Return .t. Endif if Empty(nbUserKeys); nbUserKeys:=seconds(); Endif // сдвиг не нужен if ; ( nKey = 39 .and. oBrw:nColCount = oBrw:nCell ) .or.; ( nKey = 37 .and. oBrw:nCell = 1 ) .or.; ( nKey = 38 .and. oBrw:nAt = 1 ) .or.; ( nKey = 40 .and. oBrw:nAt = oBrw:nLen ) Do while InkeyGui(1)!=0 Enddo lRet := .F.; nKey := nil; nFlags := nil return lRet endif if lCtrl .and. (nKey >= 37 .and. nKey <= 40) if nKey = 38 .or. nKey = 40 i := Loword( nFlags ) if i != 1; nKey = nil; nFlags := nil; Return .F.; endif Endif nW := GetProperty(oBrw:cParentWnd,oBrw:cControlName,"Width") //- oBrw:oHScroll:nWidth aEval( oBrw:aColumns,{|x| aadd(anW,x:nWidth) } ) if oBrw:nFreeze > 0 aEval(anW,{|y| nFreezeWidth += y}, 1, oBrw:nFreeze) Endif nCW := nFreezeWidth; i := oBrw:nColPos; nColPosEnd:=oBrw:nCell aEval(anW,{|y| if(nCW+y<nW,{nCW += y, nColPosEnd:=i, i++},nil) }, i, oBrw:nColCount ) if nKey = 39 // право IF oBrw:nCell <= oBrw:nFreeze oBrw:GoPos( oBrw:nAT, oBrw:nFreeze + 1) Return .F. Endif if oBrw:nCell = oBrw:nColPos .or. nColPosEnd = oBrw:nCell oBrw:GoPos( oBrw:nAT, oBrw:nColCount) oBrw:GoPos( oBrw:nAT, nColPosEnd) Return .F. Endif if oBrw:nCell < nColPosEnd oBrw:GoPos( oBrw:nAT, nColPosEnd) Return .F. Endif endif if nKey = 37 // лево if oBrw:nCell > oBrw:nColPos oBrw:GoPos( oBrw:nAT, oBrw:nColPos) Return .F. Endif if oBrw:nCell <= oBrw:nFreeze oBrw:GoPos( oBrw:nAT, 1) Return .F. // lRet Endif if oBrw:nCell = oBrw:nColPos .and. oBrw:nColPos > oBrw:nFreeze nCW := nFreezeWidth i:=.f. for j=oBrw:nColPos to oBrw:nFreeze step -1 nCW += anW[j] if nCW >= nW .and. j > oBrw:nFreeze i:=.t.; exit endif if nCW > nW exit endif next if i j++ i := oBrw:nColPos oBrw:GoPos( oBrw:nAT, 1) oBrw:GoPos( oBrw:nAT, i) oBrw:GoPos( oBrw:nAT, j) Return .F. Endif Endif if oBrw:nCell = oBrw:nFreeze + 1 oBrw:GoPos( oBrw:nAT, if(oBrw:lLockFreeze,oBrw:nFreeze + 1,1)) Return .F. endif if oBrw:nColPos = oBrw:nCell oBrw:GoPos( oBrw:nAT, oBrw:nFreeze + 1) Return .F. endif oBrw:GoPos( oBrw:nAT, oBrw:nColPos) Return .F. endif if nKey = 38 // вниз if (i:=oBrw:nAT - oBrw:nRowPos + 1) != oBrw:nAT // i := if(i<1,1,i) oBrw:GoPos( i, oBrw:nCell) Return .F. Else // i := oBrw:nAT - oBrw:nRowCount + 1 i := if(i<1,1,i) oBrw:GoPos( i, oBrw:nCell) Return .F. endif endif if nKey = 40 // вниз i := oBrw:nAT - oBrw:nRowPos + 1 i := if(i<1,1,i) + oBrw:nRowCount - 1 i := min(i,oBrw:nLen) if i != oBrw:nAT oBrw:GoPos( i, oBrw:nCell) lRet := .F.; nKey := nil; nFlags := nil Return .F. Else i := if(i<1,1,i) + oBrw:nRowCount - 1 i := if(i>oBrw:nLen,oBrw:nLen,i) oBrw:GoPos( i, oBrw:nCell) lRet := .F.; nKey := nil; nFlags := nil Return .F. endif endif nbUserKeys:=seconds()+0.15 endif return lRet [/pre2] но чтоб избежать лишнего Refresh пришлось поправить, h_tbrowse.prg METHOD GoRight( lRefresh ) CLASS TSBrowse Local nTxtWid, nWidth, nCell, nSkip //, default lRefresh := ( ::lCanAppend .or. ::lIsArr ) . . . if !Empty(lRefresh) // lRefresh := ( ::lCanAppend .or. ::lIsArr ) While ! ::IsColVisible( ::nCell ) .and. ::nColPos < ::nCell ::nColPos ++ lRefresh := .T. EndDo endif пока полёт нормальный, не учёл только не отображаемые колонки, но я их не использую

kkg: SergKis пишет: Попробуйте вариант, вроде работаеат спасибо, у меня не подвисает

SergKis: kkg Используйте в редакторе для сохранения отступов моноширинный шрифт - левая, первая кнопка с 123. т.е. [ more ][ pre2 ] тут текст [ /pre2 ][ /more ] очень трудно смотреть выложенный текст без выравнивания

kkg: SergKis пишет: Используйте в редакторе для сохранения отступов моноширинный шрифт ок

Andrey: SergKis пишет: Попробуйте вариант, вроде работаеат, не обвисает у меня Тоже столкнулся с таким же повисанием. У меня таблица из 46 столбцов, вешает прогу наглухо. Я так понял что достаточно добавить oBrw:bEvents := {|ob,nm,np,nl| tsb_events(ob,nm,np,nl) } и саму функцию обработки ? У меня нет клавиш :bUserKeys PS Попробовал, не собирается, выдаёт ошибку: Harbour 3.2.0dev (r1909261630) Copyright (c) 1999-2019, https://harbour.github.io/ tsb_prnExp.prg(462) Warning W0003 Variable 'NLPARAM' declared but not used in function 'TSB_EVENTS(399)' hbmk2[5Tbrw_table]: Error: Running Harbour compiler (built-in). 1

SergKis: Andrey Попробовал, не собирается, выдаёт ошибку: Посмотреть и исправить (или сменить режим компилятора на не строгий), наверно, ни как ? [pre2] nCol := oBrw:nCell nFrez := oBrw:nFreeze + 1 nKey := Loword( nWParam ) nFlag := HiWord( nWParamnLParam ) If lCtrl .or. lShift .or. lAlt [/pre2]

Andrey: SergKis пишет: Посмотреть и исправить (или сменить режим компилятора на не строгий), наверно, ни как ? Не могу. Контроль нужен. Спасибо ! Заработало !

SergKis: Andrey пишет Заработало ! В своей версии сделал[pre2] CLASS TSBrowse FROM TControl ... DATA lMoreFields AS LOGICAL INIT .F. DATA nCntKeysLR AS NUMERIC INIT 0 DATA nMaxKeysLR AS NUMERIC INIT 3 DATA nCntScroll AS NUMERIC INIT 0 DATA nMaxScroll AS NUMERIC INIT 3 ... METHOD MoreFields( nMsg, nWParam, nLParam ) CLASS TSBrowse Local nRet := 0, nCol, nFrez, nKey, nPos Local lCtrl := _GetKeyState( VK_CONTROL ) Local lShift := _GetKeyState( VK_SHIFT ) Local lAlt := _GetKeyState( VK_MENU ) If lCtrl .or. lShift .or. lAlt ; RETURN nRet EndIf nCol := ::nCell nFrez := ::nFreeze + 1 nKey := Loword( nWParam ) nPos := HiWord( nLParam ) If nMsg == WM_KEYDOWN If nKey == VK_LEFT .and. nCol > nFrez ::nCntKeysLR ++ If ::nCntKeysLR >= ::nMaxKeysLR nRet := 1 ::nCntKeysLR := 0 EndIf DO EVENTS ElseIf nKey == VK_RIGHT .and. nCol < ::nColCount() ::nCntKeysLR ++ If ::nCntKeysLR >= ::nMaxKeysLR nRet := 1 ::nCntKeysLR := 0 EndIf DO EVENTS EndIf ElseIf nMsg == WM_KEYUP ::nCntKeysLR := 0 Elseif nMsg == WM_HSCROLL If ! ::lDontchange .and. ::lEnabled IF nKey == SB_LINEUP ; ::nCntScroll ++ ELSEIF nKey == SB_LINEDOWN ; ::nCntScroll ++ ELSE ; ::nCntScroll := 0 ENDIF IF ::nCntScroll >= ::nMaxScroll nRet := 1 ::nCntScroll := 0 ENDIF EndIf EndIf RETURN nRet ... METHOD HandleEvent( nMsg, nWParam, nLParam ) CLASS TSBrowse ... IF ::lMoreFields IF ! Empty( ::MoreFields( nMsg, nWParam, nLParam ) ) RETURN 1 ENDIF ENDIF If hb_IsBlock( ::bEvents ) If ! Empty( ar := EVal( ::bEvents, Self, nMsg, nWParam, nLParam ) ) Return 1 EndIf EndIf ... тогда в примере oBrw:nFreeze := 4 oBrw:lLockFreeze := .F. oBrw:lMoreFields := .T. // oBrw:bEvents := {|ob,nm,np,nl| tsb_events(ob,nm,np,nl) } oBrw:nCell := oBrw:nFreeze + 1 oBrw:lAdjColumn := .T. ... [/pre2]



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