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

SergKis: Haz пишет вот на всякий последние исходники теста Игорь, можешь забросить на ftp, что менял в TsBrowse и окончательный пример ? Похоже завтра (может и дальше) еще на опытной экспл. сдаваемого проекта, а выглядывать и выкусывать изменения с темы не хочется, скорее вытащу что то не так. Спасибо.

Haz: SergKis пишет: Игорь, можешь забросить на ftp, что менял в TsBrowse и окончательный пример ? у меня сейчас другой комп , учетка ftp затерялась Выложу сюда ссылку на архив со всеми изменениями и описанием

Haz: Haz пишет: Выложу сюда ссылку на архив со всеми изменениями и описанием Сергей все тут, в комплекте Readme.txt https://drive.google.com/file/d/1iniM62TywOa8JagiIquyt9OqmfUsCIMj/view?usp=sharing


SergKis: Haz Спасибо

SergKis: Haz пишет Сергей все тут, в комплекте Readme.txt Сделал правку, убрал только +1 iFree = rct.bottom - rct.top - iSupH - iHead - iFoot - iSpcH; Примеры работают нормально, затыков не выявил, но в них нет динамических изменений высот, у меня их нигде нет. Проверил, сделав правку, версию unicode то же. Пример "TsBrowse hole test " погонял, но не азартно, т.к. считаю этот режим экстремальным использованием тсб и клиенту не предложу, без особой надобности, скорее крайний случай. А с примером тоже все ok! В свою версию тсб 7.0, изменения вносить не буду, т.к. там добавлены свои сопли по борьбе с затыком отображения

gfilatov2002: SergKis пишет: Примеры работают нормально, затыков не выявил, но в них нет динамических изменений высот, у меня их нигде нет. Проверил, сделав правку, версию unicode то же. Благодарю за помощь У меня получились такие же результаты... Эта правка будет включена в 3-й апдейт сборки 21.07, которая выйдет завтра.

Haz: SergKis пишет: Сделал правку, убрал только +1 iFree = rct.bottom - rct.top - iSupH - iHead - iFoot - iSpcH; не принципиально, тк rct.top всегда == 0 Но если кто- то потом полезет в исходник , то в голове будет каша ( не ясно зачем минусуем ) У себя проекты все пересобрал с iFree = rct.bottom - iSupH - iHead - iFoot - iSpcH; полет нормальный

SergKis: Haz пишет Но если кто- то потом полезет в исходник , то в голове будет каша ( не ясно зачем минусуем ) Оставил rct.top т.к. без нее, когда смотрю, кажется чего то не хватает. Выше GetClientRect и понятно становится. Смотрел др. места с GetClientRect, в целом не складывается впечатление, что человек перепутал применение ф-ии, скорее ошибся с +1, т.к. есть места где играется +-1 в высотах, в тех же scroll. Без +1 точнее расчет в этом месте

Haz: SergKis пишет: что человек перепутал применение ф-ии, скорее ошибся с +1, Ну мы можем только гадать выискивая тут умысел этой +1 Возможно сначала было GetWindowRect() и тогда +1 оправдана, в бровсе 5 строк , начинается с 10 строки экрана и заканчивается на 14 ( 1=10, 2=11, 3=12,4=13, 5=14 ) , как узнать высоту всего бровса ? правильно, nBottom - nTop + 1 или 14 - 10 + 1 = 5 потом автор наткнулся на Hscroll и изменил на GetClientRect(). Я бы тоже не обратил внимание в таком случае на +1 , тк возвращаемая структура путает названиями nTop и nBottom, хотя в них уже совсем другие сущности. при GetClientRect() высоту считать не надо, она уже есть в nBottom, поэтому nBottom - nTop + 1 нужно заменить на nBottom есть места где играется +-1 в высотах но это не то место. Как посчитать сколько строк поместиться в окно бровса целиком ? Надо взять общую высоту и отнять все высоты занятые НЕ строками , результат поделить на высоту строки и выделить целое. все значения достоверно известны, играть тут нечем отдельно про Scroll. В окне бровса он реализуется вызовом ScrollWindowEx() , который меняет стиль окна и создает скролл в клиентской области ( уменьшая ее ) https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-scrollwindowex [pre2]HB_FUNC( TSBRWSCROLL ) { HWND hWnd = ( HWND ) HB_PARNL( 1 ); int iRows = hb_parni( 2 ); HFONT hFont = ( HFONT ) HB_PARNL( 3 ); int nHeightCell = hb_parni( 4 ); int nHeightHead = hb_parni( 5 ); int nHeightFoot = hb_parni( 6 ); int nHeightSuper = hb_parni( 7 ); int nHeightSpecHd = hb_parni( 8 ); HFONT hOldFont = NULL; HDC hDC = GetDC( hWnd ); RECT rct; if( hFont ) hOldFont = ( HFONT ) SelectObject( hDC, hFont ); GetClientRect( hWnd, &rct ); rct.top += ( nHeightHead + nHeightSuper - ( nHeightSuper ? 1 : 0 ) + nHeightSpecHd - ( nHeightSpecHd ? 1 : 0 ) ); // exclude heading from scrolling rct.bottom -= nHeightFoot; // exclude footing from scrolling rct.bottom -= ( ( rct.bottom - rct.top ) % nHeightCell ); // exclude unused portion at bottom if( iRows > 0 ) rct.bottom -= nHeightCell; else rct.top += nHeightCell; ScrollWindowEx( hWnd, 0, ( int ) -( nHeightCell * iRows ), 0, &rct, 0, 0, 0 ); if( hFont ) SelectObject( hDC, hOldFont ); ReleaseDC( hWnd, hDC ); } [/pre2] и кстати автор тут +1 не использует хотя видно что тексты копипастились скорее всего именно миграция c GetWindowRect() на GetClientRect() и была т.к. rct.top остался рудиментом

SergKis: Haz пишет Ну мы можем только гадать выискивая тут умысел этой +1 Согласен. кстати автор тут +1 не использует хотя видно что тексты копипастились но правка на -1 есть, хотя линии прорисовываются внутри, как выясняли rct.top += ( nHeightHead + nHeightSuper - ( nHeightSuper ? 1 : 0 ) + nHeightSpecHd - ( nHeightSpecHd ? 1 : 0 ) ); // exclude heading from scrolling для вычисления rct.bottom -= ( ( rct.bottom - rct.top ) % nHeightCell ); // exclude unused portion at bottom В COUNTROWS сейчас все по делу PS. Использовать в расчете rct.top скорее привычка, т.е. y := 0 ; h := This.ClientHeight - y * 2 // т.е. y := This.ClientRow ; x := This.ClientCol h -= GetWindowHeight(hSplit) ...

Andrey: Haz пишет: отдельно про Scroll. В окне бровса он реализуется вызовом ScrollWindowEx() А можно как то цвет этого поменять на свой ? А то серый не очень красиво смотрится....

Haz: Andrey пишет: А можно как то цвет этого поменять на свой ? Скорее всего можно [pre2] CLASS TSBScrlBar FROM TControl DATA lVertical, lReDraw, lIsChild, nMin, nMax, nPgStep DATA bGoUp, bGoDown, bGoTop, bGoBottom, bPageUp, bPageDown, bPos DATA bTrack DATA l32Bit DATA lShowDisabled, hWnd, oWnd DATA lUpdate AS LOGICAL // TControl DATA bWhen // TWindow DATA bValid // TWindow CLASSDATA aProperties INIT { "cVarName", "nMin", "nMax",; "nPgStep", "nTop", "nLeft", "Cargo" } METHOD New( nRow, nCol, nMin, nMax, nPgStep, lVertical, oWnd, nWidth, nHeight,; bUpAct, bDownAct, bPgUp, bPgDown, bPos, lPixel, nClrText,; nClrBack, cMsg, lUpdate, bWhen, bValid, lDesign ) CONSTRUCTOR METHOD WinNew( nMin, nMax, nPgStep, lVertical, oWnd, bUpAction,; bDownAction, bPgUp, bPgDown, bPos, nClrText, nClrBack,; lUpdate, bWhen, bValid ) CONSTRUCTOR [/pre2] и далее [pre2] nClrText := GetSysColor( COLOR_WINDOW ),; nClrBack := GetSysColor( COLOR_SCROLLBAR ),; [/pre2] но эти переменные нигде не используются ....

Haz: SergKis пишет: но правка на -1 есть Ты про это rct.top += ( nHeightHead + nHeightSuper - ( nHeightSuper ? 1 : 0 ) ... мож кто то объяснит тут синтаксис .... мне кажется это тоже самое hb_default(@nHeightSuper , 0) но будем считать разобрались, понаблюдаем за результатами, может кто сюда отпишет

SergKis: Haz пишет мож кто то объяснит тут синтаксис .... Это если есть nHeightSuper, т.е > 0, то будет -1, иначе 0, так же и с наличием SupHd, Для чего это, не понимаю. Т.к. Если для красоты (WScroll красиво вписывался в клиентскую область), то -1 сверху и с низу можно делать не зависимо от наличия SuperHd и SuperHeader, а та к как написано .. , я не понимаю почему

Haz: SergKis пишет: я не понимаю почему В такой постановке тоже не понимаю

Haz: Сергей Возник вопрос о координатe oCell:nRow из ::GetCellInfo() никак не пойму что не так в примере , почему не совпадает с ячейкой. Может не правильно метод использую ? Пример простой в бровсе по bPrevEdit стоит показ окна в координатах ячейки и потом отказ в редактировании. Окно открывается ниже чем нужно на величину ::nTop вот пример [pre2] #include "minigui.ch" #include "tsbrowse.ch" #include "common.ch" #include "hmg.ch" #include "i_winuser.ch" static oMain static hMain Func Main() SET OOP ON DEFINE WINDOW Form_0 ; AT 0,0 ; WIDTH GetDeskTopWidth() ; HEIGHT GetDesktopHeight() - GetTaskBarHeight() ; TITLE "Test ::CellInfo" ; MAIN ; ON INIT {|| nil } ; NOTIFYICON "CRANE" ; NOTIFYTOOLTIP "TestCell" ; oMain :=This.Object hMain := ThisWindow.Handle DEFINE STATUSBAR Font "ARIAL" SIZE 9 BOLD STATUSITEM '' WIDTH 100 ACTION Nil STATUSITEM '' WIDTH 150 ACTION Nil STATUSITEM '' ACTION Nil STATUSITEM '' WIDTH 80 ACTION Nil STATUSITEM '' WIDTH 400 ACTION Nil DATE CLOCK END STATUSBAR DEFINE SPLITBOX HANDLE hSpl DEFINE TOOLBAR ToolBar_1 CAPTION "" BUTTONSIZE 60,32 FLAT BUTTON 01 ; CAPTION 'Справочники' ; PICTURE 'NEWSUPLOAD16' ; BUTTON 02 ; CAPTION 'Портфель' ; PICTURE 'n2' ; WHOLEDROPDOWN SEPARATOR DEFINE DROPDOWN MENU BUTTON 02 ITEM "Моделирование" IMAGE 'factory16' ACTION _wPost(11) NAME 100 END MENU END TOOLBAR DEFINE TOOLBAR ToolBar_2 CAPTION "" BUTTONSIZE 42,32 FLAT BUTTON 99 CAPTION 'Выход' PICTURE 'exit' ACTION {|| oMain:Release()} END TOOLBAR END SPLITBOX This.Height := GetDeskTopHeight() - This.StatusBar.Height - GetBorderHeight() END WINDOW DoMethod("Form_0", "maximize") oBrw := CreateBrowse( oMain ) Form_0.Activate CUSTOMER->(dbClosearea()) Return nil FUNCTION CreateBrowse( oWnd ) LOCAL i LOCAL aDatos := {} FOR i := 1 TO 1000 AAdd( aDatos, { i, RandStr( 30 ), Date() - i, if( i % 2 == 0, TRUE, FALSE ) } ) NEXT if isControlDefined( "oBrw", "Form_0" ) doMethod( "Form_0" , "oBrw", "Release") end DEFINE TBROWSE oBrw AT 50, 2 ; OF Form_0 ; WIDTH oWnd:ClientWidth() - 4 ; HEIGHT oWnd:ClientHeight() - GetProperty( "Form_0", "StatusBar", "Height" ) - 52 ; GRID ; FONT "Arial" SIZE 12 oBrw:SetArray( aDatos, .T. ) oBrw:nWheelLines := 1 oBrw:nClrLine := COLOR_GRID oBrw:lNoChangeOrd := TRUE oBrw:lCellBrw := TRUE oBrw:hBrush := CreateSolidBrush( 242, 245, 204 ) oBrw:lNoVScroll := TRUE oBrw:nHeightCell := 22 oBrw:nHeightHead := 22 oBrw:nLineStyle := 6 // prepare for showing of Double cursor AEval( oBrw:aColumns, {| oCol| oCol:lFixLite := oCol:lEdit := TRUE , oCol:bPrevEdit := {|xVal, oBrw| PrevEdit(xVal, oBrw) }} ) // assignment of column's names oBrw:aColumns[ 1 ]:cName := "NUMBER" oBrw:aColumns[ 2 ]:cName := "TEXT" oBrw:aColumns[ 3 ]:cName := "DATE" oBrw:aColumns[ 4 ]:cName := "LOGIC" // the reference to columns by names oBrw:SetColSize( "NUMBER", 100 ) oBrw:SetColSize( "TEXT", 500 ) oBrw:SetColSize( "DATE", 200 ) // Checking the method nColumn() oBrw:SetColSize( oBrw:nColumn( "LOGIC" ), 300 ) oBrw:GetColumn( 'NUMBER' ):nAlign := DT_CENTER oBrw:GetColumn( 'TEXT' ):nAlign := DT_LEFT oBrw:GetColumn( 'DATE' ):nAlign := DT_CENTER oBrw:GetColumn( 'LOGIC' ):nAlign := DT_CENTER oBrw:SetColor( { 1 }, { RGB( 0, 12, 120 ) } ) oBrw:SetColor( { 2 }, { RGB( 242, 245, 204 ) } ) oBrw:SetColor( { 5 }, { RGB( 0, 0, 0 ) } ) oBrw:SetColor( { 6 }, { {|a, b, c| IF( c:nCell == b, { RGB( 66, 255, 236 ), RGB( 111, 183, 155 ) }, ; { RGB( 255, 255, 255 ), RGB( 200, 200, 200 ) } ) } } ) // cursor backcolor END TBROWSE RETURN oBrw FUNCTION RandStr( nLen ) LOCAL cSet := "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM" LOCAL cPass := "" LOCAL i := 0 FOR i := 1 TO nLen cPass += SubStr( cSet, Random( 52 ), 1 ) NEXT RETURN cPass Func PrevEdit(xVal, oBrw) LOCAL oCell LOCAL oWnd, hWnd LOCAL aRect := {0,0,0,0} GetWindowRect( oBrw:hWnd, aRect ) SET OOP ON oCell := oBrw:GetCellInfo(oBrw:nRowPos) DEFINE WINDOW Cell ; AT oCell:nRow + aRect[2] + 1 , oCell:nCol + aRect[1] +1 ; // aRect добавлено чтоб перейти в физические координаты , иначе при перемещении окна координаты не меняются WIDTH oCell:nWidth - 2 ; HEIGHT oCell:nHeight -2 ; NOCAPTION ; MODAL ; oWnd := ThisWindow.Object hWnd := oWnd:Handle() END WINDOW SetWindowLong(hWnd, GWL_STYLE, WS_BORDER) _DefineHotKey ( "CELL" , 0 , VK_ESCAPE , {|| oWnd:Release() } ) _DefineHotKey ( "CELL" , 0 , VK_RETURN , {|| oWnd:Release() } ) Cell.Activate oBrw:DrawSeLect() return .F. [/pre2] это смещение получается из ::GetcellInfo() [pre2] ix := GetControlIndex( cBrw, cForm ) IF _HMG_aControlContainerRow[ ix ] == -1 nRow += ::nTop - 1 nCol += ::nLeft ELSE nRow += _HMG_aControlRow[ ix ] - 1 nCol += _HMG_aControlCol[ ix ] ENDIF [/pre2]

SergKis: Haz пишет Может не правильно метод использую ? Так и есть. Твой пример, немного поправил (как я делаю) [pre2] #include "minigui.ch" #include "tsbrowse.ch" #include "common.ch" #include "hmg.ch" #include "i_winuser.ch" static oMain static hMain FUNCTION Main() LOCAL nBtnW, nBtnH, nEndW, oBrw SET DATE GERMAN SET OOP ON SET FONT TO "Arial", 12 // кнопки toolbar от размера фонта nBtnW := App.Object:W(1.5) nBtnH := App.Object:H1 + 16 + 2 // 16 - это размер по высоте bmp nEndW := App.Object:W(0.7) DEFINE WINDOW Form_0 AT 0,0 WIDTH Sys.ClientWidth HEIGHT Sys.ClientHeight ; TITLE "Test ::CellInfo" ; MAIN ; ON INIT NIL ; ON RELEASE dbCloseAll() ; NOTIFYICON "CRANE" ; NOTIFYTOOLTIP "TestCell" ; oMain := This.Object hMain := ThisWindow.Handle //DEFINE STATUSBAR /*Font "ARIAL" SIZE 9*/ BOLD DEFINE STATUSBAR FONT App.FontName SIZE iif( App.FontSize > 11, 11, App.FontSize ) BOLD STATUSITEM '' WIDTH 100 ACTION Nil STATUSITEM '' WIDTH 150 ACTION Nil STATUSITEM '' ACTION Nil STATUSITEM '' WIDTH 80 ACTION Nil STATUSITEM '' WIDTH 400 ACTION Nil DATE CLOCK END STATUSBAR DEFINE SPLITBOX HANDLE hSpl DEFINE TOOLBAR ToolBar_1 CAPTION "" BUTTONSIZE nBtnW, nBtnH FLAT BUTTON 01 CAPTION 'Справочники' PICTURE 'NEWSUPLOAD16' SEPARATOR BUTTON 02 CAPTION 'Портфель' PICTURE 'n2' WHOLEDROPDOWN SEPARATOR DEFINE DROPDOWN MENU BUTTON 02 ITEM "Моделирование" IMAGE 'factory16' ACTION _wPost(11) NAME 100 END MENU END TOOLBAR DEFINE TOOLBAR ToolBar_2 CAPTION "" BUTTONSIZE nEndW, nBtnH FLAT BUTTON 99 CAPTION 'Выход' PICTURE 'exit' ACTION {|| oMain:Release()} END TOOLBAR END SPLITBOX END WINDOW DoMethod(oMain:Name, "maximize") oBrw := CreateBrowse( oMain, GetWindowHeight(hSpl) + 2, 2 ) ACTIVATE WINDOW &(oMain:Name) //Form_0.Activate Return nil FUNCTION CreateBrowse( oWnd, nY, nX ) LOCAL i, oBrw LOCAL aDatos := {} FOR i := 1 TO 1000 AAdd( aDatos, { i, RandStr( 30 ), Date() - i, if( i % 2 == 0, TRUE, FALSE ) } ) NEXT if isControlDefined( "oBrw", oWnd:Name ) doMethod( oWnd:Name , "oBrw", "Release") end DEFINE TBROWSE oBrw AT nY, nX OF &(oWnd:Name) ; WIDTH oWnd:ClientWidth() - nX * 2 ; HEIGHT oWnd:ClientHeight() - oWnd:StatusBar:Height - nY ; GRID //FONT "Arial" SIZE 12 :SetArray( aDatos, .T. ) :nWheelLines := 1 :nClrLine := COLOR_GRID :lNoChangeOrd := TRUE :lCellBrw := TRUE :hBrush := CreateSolidBrush( 242, 245, 204 ) :lNoVScroll := TRUE :nHeightCell := 22 :nHeightHead := 22 :nLineStyle := 6 // prepare for showing of Double cursor AEval( :aColumns, {| oCol| oCol:lFixLite := oCol:lEdit := TRUE , oCol:bPrevEdit := {|xVal, oBrw| PrevEdit(xVal, oBrw) }} ) // assignment of column's names :aColumns[ 1 ]:cName := "NUMBER" :aColumns[ 2 ]:cName := "TEXT" :aColumns[ 3 ]:cName := "DATE" :aColumns[ 4 ]:cName := "LOGIC" // the reference to columns by names :SetColSize( "NUMBER", 100 ) :SetColSize( "TEXT", 500 ) :SetColSize( "DATE", 200 ) // Checking the method nColumn() :SetColSize( oBrw:nColumn( "LOGIC" ), 300 ) :GetColumn( 'NUMBER' ):nAlign := DT_CENTER :GetColumn( 'TEXT' ):nAlign := DT_LEFT :GetColumn( 'DATE' ):nAlign := DT_CENTER :GetColumn( 'LOGIC' ):nAlign := DT_CENTER :SetColor( { 1 }, { RGB( 0, 12, 120 ) } ) :SetColor( { 2 }, { RGB( 242, 245, 204 ) } ) :SetColor( { 5 }, { RGB( 0, 0, 0 ) } ) :SetColor( { 6 }, { {|a, b, c| IF( c:nCell == b, { RGB( 66, 255, 236 ), RGB( 111, 183, 155 ) }, ; { RGB( 255, 255, 255 ), RGB( 200, 200, 200 ) } ) } } ) // cursor backcolor END TBROWSE RETURN oBrw FUNCTION RandStr( nLen ) LOCAL cSet := "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM" LOCAL cPass := "" LOCAL i := 0 FOR i := 1 TO nLen cPass += SubStr( cSet, Random( 52 ), 1 ) NEXT RETURN cPass FUNCTION PrevEdit(xVal, oBrw) LOCAL oCell := oBrw:GetCellInfo(oBrw:nRowPos) LOCAL nY := oCell:nRow + oBrw:nHeightHead + 4 LOCAL nX := oCell:nCol LOCAL nW := oCell:nWidth LOCAL nH := oCell:nHeight LOCAL oWnd, hWnd DEFINE WINDOW Cell AT nY,nX WIDTH nW - 2 HEIGHT nH - 2 MODAL NOCAPTION ; ON LOSTFOCUS oWnd:Release() oWnd := ThisWindow.Object hWnd := oWnd:Handle END WINDOW SetWindowLong(hWnd, GWL_STYLE, WS_BORDER) _DefineHotKey ( "CELL" , 0 , VK_ESCAPE , {|| oWnd:Release() } ) _DefineHotKey ( "CELL" , 0 , VK_RETURN , {|| oWnd:Release() } ) Cell.Activate oBrw:DrawSeLect() return .F. [/pre2] Поправки координаты nY тоже делаю

SergKis: PS Добавляю в modal окно Cell еще такое (выделил цветом) PS2 не забываем делать[pre2] FUNCTION PrevEdit(xVal, oBrw) ... LOCAL oWnd, hWnd LOCAL hOld := _HMG_InplaceParentHandle LOCAL oParent := _WindowObj(oBrw:cParentWnd) _HMG_InplaceParentHandle := oParent:Handle DEFINE WINDOW Cell AT nY,nX WIDTH nW - 2 HEIGHT nH - 2 MODAL NOCAPTION ; ... oBrw:DrawSeLect() ; DO EVENTS _HMG_InplaceParentHandle := hOld ... [/pre2] PS3 Создание контролов и тсб делаю до END WINDOW, т.е. [pre2] END SPLITBOX This.Maximize oBrw := CreateBrowse( This.Object, GetWindowHeight(hSpl) + 2, 2 ) END WINDOW //DoMethod(oMain:Name, "maximize") //oBrw := CreateBrowse( oMain, GetWindowHeight(hSpl) + 2, 2 ) ACTIVATE WINDOW &(oMain:Name) [/pre2] Тогда не надо писать для контролов окна OF &(oWnd:Name), т.е. имеем куски кода с привязкой к тек. окну. Их можно комбинировать на разных окнах PS4 Не стал править в исходнике, думаю и так знаешь. Просто вариант [pre2] DEFINE SPLITBOX HANDLE hSpl DEFINE TOOLBAR ToolBar_1 CAPTION "" BUTTONSIZE nBtnW, nBtnH FLAT BUTTON 01 CAPTION 'Справочники' PICTURE 'NEWSUPLOAD16' ACTION _wPost(01) SEPARATOR BUTTON 02 CAPTION 'Портфель' PICTURE 'n2' WHOLEDROPDOWN SEPARATOR DEFINE DROPDOWN MENU BUTTON 02 ITEM "Моделирование 1" IMAGE 'factory16' ACTION _wPost(02,, This.Name) NAME 201 ITEM "Моделирование 2" IMAGE 'factory16' ACTION _wPost(02,, This.Name) NAME 202 ITEM "Моделирование 3" IMAGE 'factory16' ACTION _wPost(02,, This.Name) NAME 203 END MENU END TOOLBAR DEFINE TOOLBAR ToolBar_2 CAPTION "" BUTTONSIZE nEndW, nBtnH FLAT BUTTON 99 CAPTION 'Выход' PICTURE 'exit' ACTION _wPost(99) END TOOLBAR END SPLITBOX This.Maximize oBrw := CreateBrowse( This.Object, GetWindowHeight(hSpl) + 2, 2 ) WITH OBJECT This.Object :Event(01, {| | Nil }) :Event(02, {|ow,ky,cItm| Local cBtn := StrZero(ky, 2), nItm, oBrw This.&(cBtn).Enabled := .F. oBrw := This.oBrw.Object nItm := Val(cItm) - ky * 100 IF nItm == 1 // ... ELSEIF nItm == 2 // ... ELSEIF nItm == 3 // ... ENDIF SetProperty(ow:Name, cBtn, "Enabled", .T.) Return Nil }) :Event(99, {|ow| ow:Release() }) END WITH END WINDOW [/pre2] PS5 убрал в CreateBrowse() лишнее oBrw между DEFINE TBROWSE и END TBROWSE, т.е.[pre2] oBrw:SetArray( aDatos, .T. ) oBrw:nWheelLines := 1 ... на :SetArray( aDatos, .T. ) :nWheelLines := 1 ... [/pre2]

Haz: SergKis пишет: Твой пример, немного поправи спасибо, посмотрю завтра. Сегодня целый день был посвящён совещаниям ни о чем. Только приехал, голова пустая совершенно

Andrey: Haz пишет: А можно как то цвет Scroll поменять на свой ? Скорее всего можно и далее nClrText := GetSysColor( COLOR_WINDOW ),; nClrBack := GetSysColor( COLOR_SCROLLBAR ),; но эти переменные нигде не используются .... А как его поменять можно ? Т.е. допустим в последнем примере который дал Сергей - Пост N: 3859 можешь показать ? А то я не знаю как это сделать, давно очень хотел поменять.



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