Автор | Сообщение |
Vlad04
|
| постоянный участник
|
Пост N: 420
Зарегистрирован: 13.10.05
|
|
Отправлено: 19.12.13 18:16. Заголовок: TsBrowse в Минигуи (продолжение)
TsBrows определяется в виде строки ПАРМЕТРОВ объекта и их значений К примеру цитата: | 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 |
| Здесь я собрал параметры из разных tBrows Можно или нет и какие парметры заменить выражением ( и каким) ? oBrw2:.... oBrw2:....
|
|
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|
Haz
|
| |
Пост N: 1719
Зарегистрирован: 20.02.11
|
|
Отправлено: 20.08.21 14:38. Заголовок: SergKis пишет: Брос..
SergKis пишет: цитата: | Брось, может у кого и вылезет чего. |
| чуть не забыл #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
|
|
|
Haz
|
| |
Пост N: 1720
Зарегистрирован: 20.02.11
|
|
Отправлено: 20.08.21 14:40. Заголовок: Dima пишет: Тоже че..
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 7016
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.08.21 16:26. Заголовок: Haz пишет: чуть не ..
Haz пишет: А внизу ТСБ при старте дырка должна быть или нет ? И вопрос ещё такой - можно ли в колонку последнюю "виртуальную" что то записать ?
|
|
|
Dima
|
| |
Пост N: 7432
Зарегистрирован: 17.05.05
|
|
Отправлено: 20.08.21 16:49. Заголовок: Поймал вот :) https:..
Поймал вот :) Смотрим что имеем в нижней строке Колесиком мышки так получилось Andrey пишет: цитата: | А внизу ТСБ при старте дырка должна быть или нет ? |
| У мну есть
|
|
|
Haz
|
| |
Пост N: 1721
Зарегистрирован: 20.02.11
|
|
Отправлено: 20.08.21 17:27. Заголовок: Andrey пишет: А вни..
Andrey пишет: цитата: | А внизу ТСБ при старте дырка должна быть или нет |
| как повезет , никаких противодырочых мер в коде не прописано Можно использовать SetNoHoles для получения дыры, и изменять какую либо из высот. Но вопрос был не в дырке , а поймать залипшую строку. как не пытался , не смог. Дима везунчик )) Andrey пишет: цитата: | И вопрос ещё такой - можно ли в колонку последнюю "виртуальную" что то записать ? |
| нет, это не виртуальная колонка а продолжение фона бровса. Можно конечно подумать чтоб линии сетки там не рисовались
|
|
|
Haz
|
| |
Пост N: 1722
Зарегистрирован: 20.02.11
|
|
Отправлено: 20.08.21 17:33. Заголовок: Dima пишет: Поймал ..
|
|
|
Dima
|
| |
Пост N: 7433
Зарегистрирован: 17.05.05
|
|
Отправлено: 20.08.21 17:48. Заголовок: Haz пишет: а тут по..
Haz пишет: Да поймал ,на похожей ситуации
|
|
|
Dima
|
| |
Пост N: 7434
Зарегистрирован: 17.05.05
|
|
Отправлено: 20.08.21 17:51. Заголовок: А еще вот так вот по..
А еще вот так вот поймал
|
|
|
Haz
|
| |
Пост N: 1723
Зарегистрирован: 20.02.11
|
|
Отправлено: 20.08.21 17:58. Заголовок: Dima пишет: А еще в..
Dima пишет: как ты то делаешь ?
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 3821
Зарегистрирован: 17.02.12
|
|
Отправлено: 20.08.21 19:14. Заголовок: Dima пишет: Затем ме..
Dima пишет: цитата: | Затем меняю высоту заголовка (произвольно) и тыкаю мышкой посередине бровса и начинаю скролить колесом мышки. |
| Для тсб это заведомо аварийная ситуация. По мне, нельзя менять на лету высоты строк и заголовков, т.к. нарушается расчет всей сетки, что рано или поздно приведет к сбою. Высоты надо определять до END TBROWSE и во время работы не трогать, можно поправить за счет дырки, не вылезая за пределы размеров клиентской обл. тсб. В примере после смены высот, надо разрушать и создавать новый тсб. или на main задавать высоты, на след. окне строить тсб
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 7017
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.08.21 19:18. Заголовок: Haz пишет: как пове..
Haz пишет: цитата: | как повезет , никаких противодырочых мер в коде не прописано Можно использовать SetNoHoles для получения дыры, и изменять какую либо из высот |
| У меня при старте стразу дырка внизу.
|
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 3822
Зарегистрирован: 17.02.12
|
|
Отправлено: 20.08.21 19:28. Заголовок: Andrey пишет У меня ..
Andrey пишет цитата: | У меня при старте стразу дырка внизу. |
| Haz пишет: цитата: | никаких противодырочых мер в коде не прописано |
| сделай 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 ... в тсб поставь в спинер высоту строки 20 и дырки, наверно, не будет (или подбери число). Но если будет сетка не в размер клиентской области, скорее всего, будет затык отображения
|
|
|
Haz
|
| |
Пост N: 1724
Зарегистрирован: 20.02.11
|
|
Отправлено: 21.08.21 12:24. Заголовок: SergKis пишет: в тс..
SergKis пишет: цитата: | в тсб поставь в спинер высоту строки 20 и дырки, наверно, не будет (или подбери число). Но если будет сетка не в размер клиентской области, скорее всего, будет затык отображения |
| Задолбался гонять , конечно при определенных значениях высот есть дырка , но мне она не важна. Меняя высоты эта дырка меняет размеры от 0 до nHeightCell , но все корректно отображается. Из того, что показал Дима ну никак не получить. Тестирую на свежей Win10 за 3 дня так и не поймал артефакты на экране. Затеял все это как раз с целью отказаться в одном из проектов от использования :SetNoHoles() по причине требования соблюдения строгости высот в нескольких таблицах на одном экране. Если , как ты предлагал, использовать SetNoHoles в первом бровсе, а в остальных брать рассчитанные параметры высот, то первый будет без дыры, остальные дырявые ( смысл использования теряется ). Если использовать во всех, то все таблицы будут с разными высотами. вот пример одного не очень нагруженного экрана https://i.postimg.cc/PxW7ZHm5/Image-1.png все суперхидеры должны быть одинаковой высоты, все строки, заголовки , подвалы тоже PS поймал )))) на ситуации когда nHole == nHeightCell -1 теперь есть где искать лекарство
|
|
|
Haz
|
| |
Пост N: 1725
Зарегистрирован: 20.02.11
|
|
Отправлено: 21.08.21 12:49. Заголовок: Haz пишет: PS пойма..
Haz пишет: цитата: | PS поймал )))) на ситуации когда nHole == nHeightCell -1 у меня это nHeightCell == 20 , nHeightHead == 13 => nHole = 19 и при вниз-вверх залипуха теперь есть где искать лекарство |
| в общем все оказалось просто COUNTROWS() не учитывает что после прорисовки нижней строки нужно место для GridLine. простое добавление пикселя под эту линию проблему залипухи решило. 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 ); } Дима , поймаешь ?? https://drive.google.com/file/d/11tJqfBppxkPjJwsKvVEcGige6PYExkxR/view?usp=sharing PS проверил. -1 работает правильно при любых заченияз oBrw:nLineStyle
|
|
|
Haz
|
| |
Пост N: 1726
Зарегистрирован: 20.02.11
|
|
Отправлено: 21.08.21 13:46. Заголовок: SergKis пишет: Для ..
SergKis пишет: цитата: | Для тсб это заведомо аварийная ситуация. По мне, нельзя менять на лету высоты строк и заголовков, т.к. нарушается расчет всей сетки, что рано или поздно приведет к сбою. Высоты надо определять до END |
| Сергей, все корректно меняется на лету, даже во время включённого автотеста. в примере поставил FUNCTION SecondFunc(oBrw) oBrw:lRePaint := .T.; oBrw:Display(); oBrw:ResetVScroll() oBrw:Refresh(.t.) RETURN NIL
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 3823
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.08.21 14:59. Заголовок: Haz пишет в примере ..
Haz пишет цитата: | в примере поставил FUNCTION SecondFunc(oBrw) oBrw:lRePaint := .T.; oBrw:Display(); oBrw:ResetVScroll() oBrw:Refresh(.t.) RETURN NIL |
| Про эти команды я уже говорил, ты сбросил расчет прорисовки и сделал новый, повторил по сути команду END TBROWSE. т.е. делать oBrw := CreateBrowse( oWnd ) // Специально за END BROWSE oBrw:nHeightCell := 22 oBrw:nHeightHead := 22 ... oBrw:lRePaint := .T.; oBrw:Display(); oBrw:ResetVScroll(); oBrw:Refresh(.t.) несколько бессмысленно, т.к. повторили END TBROWSE, почему не сделать это до нее. В этом примере да, а в реальных тсб такой необходимости не испытывал, хватало размеры ставить до END цитата: | Если , как ты предлагал, использовать SetNoHoles в первом бровсе, а в остальных брать рассчитанные параметры высот, то первый будет без дыры, остальные дырявые ( смысл использования теряется ). |
| Ты не понял. :SetNoHoles(, .F.) ничего не меняет, дырку не убирает, а возвращает значение этой дырки и ты сам, если надо, раскидываешь ее по заголовкам, получая конкретные значения высот (с дыркой или нет без разницы). Потом, задавая данные высот в др. тсб (одинаковых по высоте) с первого тсб, ты получишь на тсб, например, расположенных вряд горизонтально ровные границы заголовков и строк. Даже если в первом тсб сделать :SetNoHoles(, .T.), убрать дырку и разнести данные высот в др. тсб без выполнения :SetNoHoles() в них, будет тот же результат - высоты заголовков и строк будут одинаковы, т.е. как ты и хотел изначально. цитата: | в общем все оказалось просто COUNTROWS() не учитывает что после прорисовки нижней строки нужно место для GridLine. простое добавление пикселя под эту линию проблему залипухи решило. |
| Это хорошая новость, буду смотреть в своей 7.0 версии. Знаю только, что у меня 1-го пикселя не хватало, т.е. дырка-резерв в 1 пиксел не спасала от залипух, а два пикселя помогли от них избавиться
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 3824
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.08.21 17:42. Заголовок: Haz пишет лучше так ..
Haz пишет Игорь, спасибо, но как говорит один герой, "Торопиться не будем" Надо подумать, как все организовать, что бы не сломать что есть. У меня практически все тсб с Footer и колонкой # и наличие 2 пиксела дырки, визуально дает неплохой вид границы между строками и подвалом, есть смысл подумать, а надо ли Это скорее в тсб 9.0 надо довести до ума, что бы было
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 3825
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.08.21 19:21. Заголовок: Haz пишет по моему о..
Haz пишет цитата: | по моему она лишняя при вычислении области скрола |
| Не могу сказать, что это строка лишняя, она - это наша дырка, я так понимаю, т.к. скролл делается по строкам, без учета дырки. Т.е. если nHeightCell := 20, то имеем значение от 0-19, которые не участвуют в скролле УПС, куда пост делсяааааааа
|
|
|
Haz
|
| |
Пост N: 1729
Зарегистрирован: 20.02.11
|
|
Отправлено: 21.08.21 20:29. Заголовок: РАЗОБРАЛСЯ
Вобщем разобрался, число строк считается некорректно смотрим исходник CountRows() 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 ); } Начнем с того что 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
|
| |
Пост N: 1730
Зарегистрирован: 20.02.11
|
|
Отправлено: 21.08.21 20:41. Заголовок: SergKis пишет: УПС,..
SergKis пишет: цитата: | УПС, куда пост делсяааааааа |
| Серега, прости. Просто начал разбираться и эти посты стали лишними здесь
|
|
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|