Автор | Сообщение |
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
[только новые]
|
|
SergKis
|
| постоянный участник
|
Пост N: 3826
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.08.21 21:26. Заголовок: Haz пишет правильно ..
Haz пишет цитата: | правильно будет так iFree = rct.bottom - iSupH - iHead - iFoot - iSpcH ( без + 1 и rct.top ) |
| В записи исходной iFree = rct.bottom - rct.top + 1 - iSupH - iHead - iFoot - iSpcH у меня вопросов не особо возникает, т.к. rct.top всегда 0, rct.bottom - высота в пикселях кл. части рабочей - iSupH - iHead - iFoot - iSpcH тоже понятно, вычли все высоты заголовков и в iFree получили остаток на все строки, т.е iRows = iFree / iCell дает кол-во строк. Что такое +1 пиксел, может подразумевалось место под нижнюю линию, но тогда скорее надо было отнять 1 пиксел. Может +1 это учет того, что высоты строк не с 0, а с 1 начинаются ? Не знаю что сказать ?!
|
|
|
Haz
|
| |
Пост N: 1731
Зарегистрирован: 20.02.11
|
|
Отправлено: 21.08.21 21:51. Заголовок: SergKis пишет: Что ..
SergKis пишет: цитата: | Что такое +1 пиксел, может подразумевалось место под нижнюю линию, но тогда скорее надо было отнять 1 пиксел. Может +1 это учет того, что высоты строк не с 0, а с 1 начинаются ? Не знаю что сказать ?! |
| +1 нужно если использовать GetWindowRect() - тогда вернуться координаты 1 nTop и 6 nBottom тогда всего строк считается nBotton - nTop + 1 или 6 - 1 + 1 = 6 там тупо пиксели окна высчитываются и имеет место быть опечатка или ошибка, автор спутал Client/Window Rect попутно проверил на дыре, на базе CountRows() написал HoleSize() HB_FUNC( HOLESIZE ) // ( 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 - iSupH - iHead - iFoot - iSpcH ; iRows = iFree / iCell; iRows = iFree - iRows * iCell; hb_retni( iRows ); } сравни с тем что я написал выше : цитата: | правильно будет так iFree = rct.bottom - iSupH - iHead - iFoot - iSpcH ( без + 1 и rct.top ) |
| в таком варианте HoleSize() возвращает тоже самое что и :SetNoholes(,.F.) а если в HoleSize() поставить как в исходной Countrows() цитата: | iFree = rct.bottom - rct.top + 1 - iSupH - iHead - iFoot - iSpcH |
| то вернет на 1 меньше ( это тот пиксель который ты искал )
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 3827
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.08.21 22:10. Заголовок: Haz пишет имеет мест..
Haz пишет цитата: | имеет место быть опечатка или ошибка |
| Как идет вывод строки и линий в TSDrawCell ? Линия прорисовывается с одной стороны строки или с обоих (по горизонтали) или работает обводка ячейки ? Ты уже вник в тему, а я подзабыл уже.
|
|
|
Haz
|
| |
Пост N: 1732
Зарегистрирован: 20.02.11
|
|
Отправлено: 21.08.21 22:12. Заголовок: SergKis пишет: Как ..
SergKis пишет: цитата: | Как идет вывод строки и линий в TSDrawCell ? |
|
внутрь ячейки то есть высота nHeightCell уже с линиями
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 3828
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.08.21 22:22. Заголовок: Haz пишет внутрь яче..
Haz пишет цитата: | внутрь ячейки то есть высота nHeightCell уже с линиями |
| Тогда твоя трактовка и правка кода правильная Но она может привести к искажениям, в текущих, набранных тсб. Т.к. появится лишний пиксел. Не врубаюсь хорошо это или не очень
|
|
|
Haz
|
| |
Пост N: 1733
Зарегистрирован: 20.02.11
|
|
Отправлено: 21.08.21 22:27. Заголовок: SergKis пишет: Но о..
SergKis пишет: цитата: | Но она может привести к искажениям, в текущих, набранных тсб. |
|
не приведёт если есть setnoholes() тк он правильно считает
|
|
|
Haz
|
| |
Пост N: 1734
Зарегистрирован: 20.02.11
|
|
Отправлено: 21.08.21 22:32. Заголовок: Haz пишет: Но она м..
Haz пишет: цитата: | Но она может привести к искажениям, в текущих, набранных тсб. Т.к. появится лишний пиксел. Не врубаюсь хорошо это или не очень |
|
Тут разница в том что в текущем алгоритме при определенном размере дыры добавлялась лишняя строка при nHole = nHeightCell -1 отсюда и залипон , тк при скроллировании окна про эту строку не знали
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 3829
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.08.21 23:08. Заголовок: Haz пишет Тут разниц..
Haz пишет цитата: | Тут разница в том что в текущем алгоритме при определенном размере дыры добавлялась лишняя строка при nHole = nHeightCell -1 отсюда и залипон , тк при скроллировании окна про эту строку не знали |
| Игорь, все очень похоже на правду и нашелся прыгающий пиксель, приводящий к лишней скрытой строке и залипону в конечном результате, но у меня на сегодня отрубилась башка, я как тот Колобок из мультика "Ничего не понимаю" Завтра и в понедельник надо закрыть тему, только потом могу вернуться к тек. версии hmg. В своей, наверно, C код трогать не буду. Потом в тек. внесу твои правки и погоняю примеры и варианты, что есть.
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 3830
Зарегистрирован: 17.02.12
|
|
Отправлено: 22.08.21 06:42. Заголовок: SergKis пишет В запи..
SergKis пишет цитата: | В записи исходной iFree = rct.bottom - rct.top + 1 - iSupH - iHead - iFoot - iSpcH у меня вопросов не особо возникает, ... |
| Возник вопрос с утра пораньше, где тут учитывается наличие или отсутствие HScroll ?
|
|
|
Haz
|
| |
Пост N: 1735
Зарегистрирован: 20.02.11
|
|
Отправлено: 22.08.21 10:17. Заголовок: SergKis пишет: Возн..
SergKis пишет: цитата: | Возник вопрос с утра пораньше, где тут учитывается наличие или отсутствие HScroll ? |
| скрол это дочернее окно в oBrw:hWnd ( свойство oBrw:hWnd ) и следовательно GetClientRect() его учитывает автоматически.
|
|
|
Haz
|
| |
Пост N: 1737
Зарегистрирован: 20.02.11
|
|
Отправлено: 22.08.21 11:27. Заголовок: Haz пишет: отсюда и..
Haz пишет: цитата: | отсюда и залипон , тк при скроллировании окна про эту строку не знали |
| Это следствие разных алгоритмов расчёта одного и того же. Обе функции Countrows() и TSBScroll() считают размеры, но по разному. В идеале их подружить нужно TSBScroll() должна зависеть от Countrows() Или делать отдельную функцию, которая вернет структуру с размерами - количество строк, размер дыры.
|
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 3833
Зарегистрирован: 17.02.12
|
|
Отправлено: 22.08.21 13:14. Заголовок: Haz пишет Или делат..
Haz пишет цитата: | Или делать отдельную функцию, которая вернет структуру с размерами - количество строк, размер дыры |
| Или оставить все как есть, т.к. "знаем где собака порылась" и как выправлять
|
|
|
Dima
|
| |
Пост N: 7436
Зарегистрирован: 17.05.05
|
|
Отправлено: 22.08.21 14:48. Заголовок: Haz пишет: цитата:..
Haz пишет: цитата: как ты то делаешь ? Примерно так. Ставим курсор на самую последнюю видимую строку. У меня при старте помещается 33 , вот на нее и ставил. Затем меняю высоту заголовка (произвольно) и тыкаю мышкой посередине бровса и начинаю скролить колесом мышки. Иногда высоту достаточно менять до тех пор , пока бах и не пропал неактивный курсор бровса. Тогда снова тыкаем в середину бровса и скролим колесом ЗЫ Попробуй отключить горизонтальный скрол ЗЫ2 Я срочно уезжал под Киев клиника Lisod , но вернулись обратно так как там цирк и клоуны , поэтому раньше не ответил
|
|
|
Haz
|
| |
Пост N: 1738
Зарегистрирован: 20.02.11
|
|
Отправлено: 22.08.21 21:55. Заголовок: Dima пишет: Примерн..
|
|
|
Dima
|
| |
Пост N: 7438
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.08.21 10:01. Заголовок: Haz пишет: Проблем..
|
|
|
Dima
|
| |
Пост N: 7439
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.08.21 10:04. Заголовок: Тестить долго не при..
Тестить долго не пришлось , обкатал по той же схеме. Все равно есть какой то косяк
|
|
|
Haz
|
| |
Пост N: 1739
Зарегистрирован: 20.02.11
|
|
Отправлено: 23.08.21 10:15. Заголовок: Dima пишет: Тестить..
Dima пишет: цитата: | Тестить долго не пришлось , обкатал по той же схеме. Все равно есть какой то косяк |
| Уточню схему , нужно подобрать nHole == 0 и выделив последнюю строку изменить размер заголовка на +1 Это несколько другой глюк, хотя визуально такой же. RowCount считает 32 правильно, а залипла 33 . То что пропадал неактивный курсор говорит о том , что он вне зоны видимости бровса Возникает ситуация когда nRowPos > nRowCount() то есть при изменении высоты заголовка, меняется nRowCount() и текущая строка оказывается за зоной видимости. Потом Refresh ее прорисовывает в старом значении nRowPos. Это как раз та ситуация о которой писал Сергей ( губительна для бровса ), это следствие не полной проработки смены высот в SecundFunc() этого примера FUNCTION SecondFunc(oBrw) oBrw:lRePaint := .T.; oBrw:Display(); oBrw:ResetVScroll() oBrw:Refresh(.t.) if lReady SetProperty("Form_0", "Label_3", "Value", "nHole = " + hb_ntoc( GetHole(oBrw:hWnd, oBrw:nHeightCell, oBrw:nHeightHead, oBrw:nHeightFoot, oBrw:nHeightSuper, 0)) + " RowCount = " + hb_ntoc(oBrw:nRowCount()) ) end RETURN NIL Видно что такие установки как :nAt , :nRowPos не меняются. Можно по простому в SecondFunc() делать сброс позиции или при придумать визуально красивый вариант сегодня сделаю вот на всякий последние исходники теста Скрытый текст #include "minigui.ch" #include "TSBrowse.ch" static oBrw static lGo := .f. static lUp := .t. static lReady := .F. 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 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 DEFINE LABEL Label_3 PARENT Form_0 ROW 25 COL 400 WIDTH 300 HEIGHT 16 FONTNAME 'Arial' FONTSIZE 9 FONTBOLD .F. VALUE "" END LABEL lReady := .T. Form_0.Activate RETURN FUNCTION SecondFunc(oBrw) oBrw:lRePaint := .T.; oBrw:Display(); oBrw:ResetVScroll() oBrw:Refresh(.t.) if lReady SetProperty("Form_0", "Label_3", "Value", "nHole = " + hb_ntoc( GetHole(oBrw:hWnd, oBrw:nHeightCell, oBrw:nHeightHead, oBrw:nHeightFoot, oBrw:nHeightSuper, 0)) + " RowCount = " + hb_ntoc(oBrw:nRowCount()) ) end 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:hBrush := CreateSolidBrush( 242, 245, 204 ) oBrw:lNoVScroll := TRUE oBrw:nHeightCell := 20 oBrw:nHeightHead := 13 oBrw:nLineStyle := 6 // 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: 1740
Зарегистрирован: 20.02.11
|
|
Отправлено: 23.08.21 10:46. Заголовок: Именно так и оказалось
переписал SecondFunc() и проблема ушла FUNCTION SecondFunc(oBrw) static nRowCount := 0 if oBrw:nRowCount() < nRowCount oBrw:GoUp() oBrw:GoDown() end nRowCount := oBrw:nRowCount() oBrw:lRePaint := .T.; oBrw:Display(); oBrw:ResetVScroll() oBrw:Refresh(.t.) if lReady SetProperty("Form_0", "Label_3", "Value", "nHole = " + hb_ntoc( GetHole(oBrw:hWnd, oBrw:nHeightCell, oBrw:nHeightHead, oBrw:nHeightFoot, oBrw:nHeightSuper, 0)) + " RowCount = " + hb_ntoc(oBrw:nRowCount()) ) end RETURN NIL ЗЫ переписал по быстрому , возможно не учел чего то, но это показывает что эта проблема в алгоритме кодера ( моем), а не внутри бровса https://drive.google.com/file/d/1c2iG97MQooyICzXe8BZfERzhzCfLNn6G/view?usp=sharing
|
|
|
Dima
|
| |
Пост N: 7440
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.08.21 10:53. Заголовок: Haz пишет: переписа..
Haz пишет: цитата: | переписал SecondFunc() и проблема ушла |
| Да теперь все хорошо
|
|
|
Haz
|
| |
Пост N: 1741
Зарегистрирован: 20.02.11
|
|
Отправлено: 23.08.21 11:20. Заголовок: Dima пишет: Да тепе..
Dima пишет: Спасибо за помощь
|
|
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|