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

Haz: SergKis пишет: Брось, может у кого и вылезет чего. чуть не забыл [pre2] #include "minigui.ch" #include "TSBrowse.ch" static oBrw static lGo := .f. static lUp := .t. PROCEDURE Main local oWnd, hWnd SET OOP ON DEFINE WINDOW Form_0 ; TITLE "TsBrowse hole test " ; MAIN ; NOMAXIMIZE NOSIZE DEFINE STATUSBAR STATUSITEM "Item 1" WIDTH 0 FONTCOLOR BLACK STATUSITEM "Item 2" WIDTH 230 FONTCOLOR BLACK DATE CLOCK KEYBOARD END STATUSBAR oWnd := ThisWindow.Object hWnd := oWnd:Handle() WITH OBJECT This.Object :Event( 1, {|w| NIL } ) :Event( 2, {|w| NIL } ) :Event( 4, {|w| nil } ) :Event( 5, {|w| nil } ) :Event( 6, {|w| nil } ) END WITH END WINDOW oBrw := CreateBrowse( oWnd ) // Специально за END BROWSE oBrw:nHeightCell := 22 oBrw:nHeightHead := 22 DEFINE LABEL Label_1 PARENT Form_0 ROW 5 COL 5 WIDTH 80 HEIGHT 16 FONTNAME 'Arial' FONTSIZE 9 FONTBOLD .F. VALUE "nHeightCell" END LABEL DEFINE SPINNER Spinner_1 PARENT Form_0 ROW 22 COL 2 WIDTH 80 HEIGHT 20 RANGEMIN 10 RANGEMAX 100 VALUE 22 FONTNAME 'Arial' FONTSIZE 9 TOOLTIP '' WRAP .T. ON CHANGE {|| oBrw:nHeightCell := this.value, SecondFunc(oBrw) } END SPINNER DEFINE LABEL Label_2 PARENT Form_0 ROW 5 COL 90 WIDTH 80 HEIGHT 16 FONTNAME 'Arial' FONTSIZE 9 FONTBOLD .F. VALUE "nHeightHead" END LABEL DEFINE SPINNER Spinner_2 PARENT Form_0 ROW 22 COL 90 WIDTH 80 HEIGHT 20 RANGEMIN 10 RANGEMAX 100 VALUE 22 FONTNAME 'Arial' FONTSIZE 9 TOOLTIP '' WRAP .T. ON CHANGE {|| oBrw:nHeightHead := this.value, SecondFunc(oBrw) } END SPINNER DEFINE BUTTONEX Button_Go PARENT Form_0 ROW 12 COL 180 WIDTH 100 HEIGHT 30 ACTION {|| Go() } CAPTION "Старт" PICTURE "" TABSTOP .F. TOOLTIP "" FONTNAME "Arial" FONTSIZE 8 VERTICAL FALSE FLAT TRUE END BUTTONEX DEFINE BUTTONEX Button_Stop PARENT Form_0 ROW 12 COL 290 WIDTH 100 HEIGHT 30 ACTION {|| lGo := .f. } CAPTION "Стоп" PICTURE "" TABSTOP .F. TOOLTIP "" FONTNAME "Arial" FONTSIZE 8 VERTICAL FALSE FLAT TRUE END BUTTONEX Form_0.Activate RETURN FUNCTION SecondFunc(oBrw) oBrw:Refresh(.t.) RETURN NIL FUNCTION Go() lGo := .t. While lGo iF lUp oBrw:GoDown() lUp := !obrw:lHitBottom else oBrw:GoUp() lUp := obrw:lHitTop end doEvents() end 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 45, 2 ; OF Form_0 ; WIDTH oWnd:ClientWidth() - 4 ; HEIGHT oWnd:ClientHeight() - GetProperty( "Form_0", "StatusBar", "Height" ) - 47 ; GRID ; SELECTOR TRUE; FONT "Arial" SIZE 12 oBrw:SetArray( aDatos, .T. ) oBrw:nWheelLines := 1 oBrw:nClrLine := COLOR_GRID oBrw:lNoChangeOrd := TRUE oBrw:lCellBrw := TRUE oBrw:lNoVScroll := TRUE oBrw:hBrush := CreateSolidBrush( 242, 245, 204 ) // prepare for showing of Double cursor AEval( oBrw:aColumns, {| oCol| oCol:lFixLite := oCol:lEdit := TRUE } ) // 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 [/pre2]

Haz: Dima пишет: Тоже чекну когда время будет. Желательно +собранный EXE https://drive.google.com/file/d/11tJqfBppxkPjJwsKvVEcGige6PYExkxR/view?usp=sharing

Andrey: Haz пишет: чуть не забыл А внизу ТСБ при старте дырка должна быть или нет ? И вопрос ещё такой - можно ли в колонку последнюю "виртуальную" что то записать ?


Dima: Поймал вот :) Смотрим что имеем в нижней строке Колесиком мышки так получилось Andrey пишет: А внизу ТСБ при старте дырка должна быть или нет ? У мну есть

Haz: Andrey пишет: А внизу ТСБ при старте дырка должна быть или нет как повезет , никаких противодырочых мер в коде не прописано Можно использовать SetNoHoles для получения дыры, и изменять какую либо из высот. Но вопрос был не в дырке , а поймать залипшую строку. как не пытался , не смог. Дима везунчик )) Andrey пишет: И вопрос ещё такой - можно ли в колонку последнюю "виртуальную" что то записать ? нет, это не виртуальная колонка а продолжение фона бровса. Можно конечно подумать чтоб линии сетки там не рисовались

Haz: Dima пишет: Поймал вот :) а тут поймаешь ? https://drive.google.com/file/d/1n5wpp640ryVmHUc3JdQ30Eu1bnrf_keY/view?usp=sharing

Dima: Haz пишет: а тут поймаешь ? Да поймал ,на похожей ситуации

Dima: А еще вот так вот поймал

Haz: Dima пишет: А еще вот так вот поймал как ты то делаешь ?

SergKis: Dima пишет: Затем меняю высоту заголовка (произвольно) и тыкаю мышкой посередине бровса и начинаю скролить колесом мышки. Для тсб это заведомо аварийная ситуация. По мне, нельзя менять на лету высоты строк и заголовков, т.к. нарушается расчет всей сетки, что рано или поздно приведет к сбою. Высоты надо определять до END TBROWSE и во время работы не трогать, можно поправить за счет дырки, не вылезая за пределы размеров клиентской обл. тсб. В примере после смены высот, надо разрушать и создавать новый тсб. или на main задавать высоты, на след. окне строить тсб

Andrey: Haz пишет: как повезет , никаких противодырочых мер в коде не прописано Можно использовать SetNoHoles для получения дыры, и изменять какую либо из высот У меня при старте стразу дырка внизу.

SergKis: Andrey пишет У меня при старте стразу дырка внизу. Haz пишет: никаких противодырочых мер в коде не прописано сделай[pre2] oBrw := CreateBrowse( oWnd ) // Специально за END BROWSE // oBrw:nHeightCell := 22 // oBrw:nHeightHead := 22 ... oBrw:lNoVScroll := TRUE oBrw:hBrush := CreateSolidBrush( 242, 245, 204 ) oBrw:lNoHScroll := TRUE oBrw:nHeightCell := 22 oBrw:nHeightHead := 22 ... [/pre2] в тсб поставь в спинер высоту строки 20 и дырки, наверно, не будет (или подбери число). Но если будет сетка не в размер клиентской области, скорее всего, будет затык отображения

Haz: SergKis пишет: в тсб поставь в спинер высоту строки 20 и дырки, наверно, не будет (или подбери число). Но если будет сетка не в размер клиентской области, скорее всего, будет затык отображения Задолбался гонять , конечно при определенных значениях высот есть дырка , но мне она не важна. Меняя высоты эта дырка меняет размеры от 0 до nHeightCell , но все корректно отображается. Из того, что показал Дима ну никак не получить. Тестирую на свежей Win10 за 3 дня так и не поймал артефакты на экране. Затеял все это как раз с целью отказаться в одном из проектов от использования :SetNoHoles() по причине требования соблюдения строгости высот в нескольких таблицах на одном экране. Если , как ты предлагал, использовать SetNoHoles в первом бровсе, а в остальных брать рассчитанные параметры высот, то первый будет без дыры, остальные дырявые ( смысл использования теряется ). Если использовать во всех, то все таблицы будут с разными высотами. вот пример одного не очень нагруженного экрана https://i.postimg.cc/PxW7ZHm5/Image-1.png все суперхидеры должны быть одинаковой высоты, все строки, заголовки , подвалы тоже PS поймал )))) на ситуации когда nHole == nHeightCell -1 теперь есть где искать лекарство

Haz: Haz пишет: PS поймал )))) на ситуации когда nHole == nHeightCell -1 у меня это nHeightCell == 20 , nHeightHead == 13 => nHole = 19 и при вниз-вверх залипуха теперь есть где искать лекарство в общем все оказалось просто COUNTROWS() не учитывает что после прорисовки нижней строки нужно место для GridLine. простое добавление пикселя под эту линию проблему залипухи решило. [pre2] HB_FUNC( COUNTROWS ) // ( hWnd, nHeightCell, nHeightHead, nHeightFoot, nHeightSuper, nHeightSpec ) -> nRows { HWND hWnd = ( HWND ) HB_PARNL( 1 ); int iCell = hb_parni( 2 ); int iHead = hb_parni( 3 ); int iFoot = hb_parni( 4 ); int iSupH = hb_parni( 5 ); int iSpcH = hb_parni( 6 ); RECT rct; int iRows, iFree; GetClientRect( hWnd, &rct ); iFree = rct.bottom - rct.top + 1 - iSupH - iHead - iFoot - iSpcH - 1; iRows = iFree / iCell; hb_retni( iRows ); } [/pre2] Дима , поймаешь ?? https://drive.google.com/file/d/11tJqfBppxkPjJwsKvVEcGige6PYExkxR/view?usp=sharing PS проверил. -1 работает правильно при любых заченияз oBrw:nLineStyle

Haz: SergKis пишет: Для тсб это заведомо аварийная ситуация. По мне, нельзя менять на лету высоты строк и заголовков, т.к. нарушается расчет всей сетки, что рано или поздно приведет к сбою. Высоты надо определять до END Сергей, все корректно меняется на лету, даже во время включённого автотеста. в примере поставил [pre2] FUNCTION SecondFunc(oBrw) oBrw:lRePaint := .T.; oBrw:Display(); oBrw:ResetVScroll() oBrw:Refresh(.t.) RETURN NIL [/pre2]

SergKis: Haz пишет в примере поставил FUNCTION SecondFunc(oBrw) oBrw:lRePaint := .T.; oBrw:Display(); oBrw:ResetVScroll() oBrw:Refresh(.t.) RETURN NIL Про эти команды я уже говорил, ты сбросил расчет прорисовки и сделал новый, повторил по сути команду END TBROWSE. т.е. делать[pre2] oBrw := CreateBrowse( oWnd ) // Специально за END BROWSE oBrw:nHeightCell := 22 oBrw:nHeightHead := 22 ... oBrw:lRePaint := .T.; oBrw:Display(); oBrw:ResetVScroll(); oBrw:Refresh(.t.) [/pre2] несколько бессмысленно, т.к. повторили END TBROWSE, почему не сделать это до нее. В этом примере да, а в реальных тсб такой необходимости не испытывал, хватало размеры ставить до END Если , как ты предлагал, использовать SetNoHoles в первом бровсе, а в остальных брать рассчитанные параметры высот, то первый будет без дыры, остальные дырявые ( смысл использования теряется ). Ты не понял. :SetNoHoles(, .F.) ничего не меняет, дырку не убирает, а возвращает значение этой дырки и ты сам, если надо, раскидываешь ее по заголовкам, получая конкретные значения высот (с дыркой или нет без разницы). Потом, задавая данные высот в др. тсб (одинаковых по высоте) с первого тсб, ты получишь на тсб, например, расположенных вряд горизонтально ровные границы заголовков и строк. Даже если в первом тсб сделать :SetNoHoles(, .T.), убрать дырку и разнести данные высот в др. тсб без выполнения :SetNoHoles() в них, будет тот же результат - высоты заголовков и строк будут одинаковы, т.е. как ты и хотел изначально. в общем все оказалось просто COUNTROWS() не учитывает что после прорисовки нижней строки нужно место для GridLine. простое добавление пикселя под эту линию проблему залипухи решило. Это хорошая новость, буду смотреть в своей 7.0 версии. Знаю только, что у меня 1-го пикселя не хватало, т.е. дырка-резерв в 1 пиксел не спасала от залипух, а два пикселя помогли от них избавиться

SergKis: Haz пишет лучше так проверь Игорь, спасибо, но как говорит один герой, "Торопиться не будем" Надо подумать, как все организовать, что бы не сломать что есть. У меня практически все тсб с Footer и колонкой # и наличие 2 пиксела дырки, визуально дает неплохой вид границы между строками и подвалом, есть смысл подумать, а надо ли Это скорее в тсб 9.0 надо довести до ума, что бы было

SergKis: Haz пишет по моему она лишняя при вычислении области скрола Не могу сказать, что это строка лишняя, она - это наша дырка, я так понимаю, т.к. скролл делается по строкам, без учета дырки. Т.е. если nHeightCell := 20, то имеем значение от 0-19, которые не участвуют в скролле УПС, куда пост делсяааааааа

Haz: Вобщем разобрался, число строк считается некорректно смотрим исходник CountRows() [pre2] HB_FUNC( COUNTROWS ) // ( hWnd, nHeightCell, nHeightHead, nHeightFoot, nHeightSuper, nHeightSpec ) -> nRows { HWND hWnd = ( HWND ) HB_PARNL( 1 ); int iCell = hb_parni( 2 ); int iHead = hb_parni( 3 ); int iFoot = hb_parni( 4 ); int iSupH = hb_parni( 5 ); int iSpcH = hb_parni( 6 ); RECT rct; int iRows, iFree; GetClientRect( hWnd, &rct ); iFree = rct.bottom - rct.top + 1 - iSupH - iHead - iFoot - iSpcH ; iRows = iFree / iCell; hb_retni( iRows ); } [/pre2] Начнем с того что GetClientRect( hWnd, &rct ) возвращает структуру где nTop и nLeft равны нулю и соонветственно nRight и nBottom содержат ШИРИНУ и ВЫСОТУ ( а не координаты Right и Bottom ) ВОТ ТУТ И ЕСТЬ ОШИБКА теперь пройдемся по алгоритму с исходными данными oBrw:nHeightCell == 1 oBrw:nHeightHead == 1 oBrw:nHeightFoot == 1 oBrw:nHeightSuper == 1 oBrw:nHeightSpec == 1 oBrw:nTop == 1 oBrw:nBottom == 6 то есть бровс занимает на экране строки с 1 по 6 ( всего 6 ) и из них 1) заголовки == 3 2) подвал == 1 3) данные == 2 идем по алгоритму GetClientRect( hWnd, &rct ) заполнит структуру значениями rct.top == 0 rct.left == 0 rct.right == ширина бровсв ( тут ширина бровса а не координата oBrw:nRight не интересна здесь ) !!!!!! rct.bottom == 6 ( тут высота бровса , а не координата oBrw:nBottom ) !!!!!!! далее iFree = rct.bottom - rct.top + 1 - iSupH - iHead - iFoot - iSpcH iFree = 6 - 0 +1 - 1 -1 -1 -1 iFree = 3 ЭТО НЕПРАВИЛЬНО должно быть 2 Автор забыл, что GetClientRect() возвращает размеры а не координаты и начал эти размеры высчитывать думая что в структуре rct вернулись координаты правильно будет так iFree = rct.bottom - iSupH - iHead - iFoot - iSpcH ( без + 1 и rct.top ) а мы тут всей толпой дырки ищем

Haz: SergKis пишет: УПС, куда пост делсяааааааа Серега, прости. Просто начал разбираться и эти посты стали лишними здесь



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