On-line: PSP, гостей 0. Всего: 1 [подробнее..]
АвторСообщение
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:....



Спасибо: 0 
Профиль
Ответов - 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





Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1720
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 20.08.21 14:40. Заголовок: Dima пишет: Тоже че..


Dima пишет:

 цитата:
Тоже чекну когда время будет.
Желательно +собранный EXE

https://drive.google.com/file/d/11tJqfBppxkPjJwsKvVEcGige6PYExkxR/view?usp=sharing

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7016
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 20.08.21 16:26. Заголовок: Haz пишет: чуть не ..


Haz пишет:

 цитата:
чуть не забыл


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

Спасибо: 0 
Профиль
Dima
администратор




Пост N: 7432
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 20.08.21 16:49. Заголовок: Поймал вот :) https:..


Поймал вот :)

Смотрим что имеем в нижней строке
Колесиком мышки так получилось

Andrey пишет:

 цитата:
А внизу ТСБ при старте дырка должна быть или нет ?


У мну есть

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1721
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 20.08.21 17:27. Заголовок: Andrey пишет: А вни..


Andrey пишет:

 цитата:
А внизу ТСБ при старте дырка должна быть или нет


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

 цитата:
И вопрос ещё такой - можно ли в колонку последнюю "виртуальную" что то записать ?


нет, это не виртуальная колонка а продолжение фона бровса. Можно конечно подумать чтоб линии сетки там не рисовались

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1722
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 20.08.21 17:33. Заголовок: Dima пишет: Поймал ..


Dima пишет:

 цитата:
Поймал вот :)

а тут поймаешь ?
https://drive.google.com/file/d/1n5wpp640ryVmHUc3JdQ30Eu1bnrf_keY/view?usp=sharing

Спасибо: 0 
Профиль
Dima
администратор




Пост N: 7433
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 20.08.21 17:48. Заголовок: Haz пишет: а тут по..


Haz пишет:

 цитата:
а тут поймаешь ?


Да поймал ,на похожей ситуации

Спасибо: 0 
Профиль
Dima
администратор




Пост N: 7434
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 20.08.21 17:51. Заголовок: А еще вот так вот по..


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


Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1723
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 20.08.21 17:58. Заголовок: Dima пишет: А еще в..


Dima пишет:

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

как ты то делаешь ?

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 3821
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.08.21 19:14. Заголовок: Dima пишет: Затем ме..


Dima пишет:
 цитата:
Затем меняю высоту заголовка (произвольно) и тыкаю мышкой посередине бровса
и начинаю скролить колесом мышки.


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

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7017
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 20.08.21 19:18. Заголовок: Haz пишет: как пове..


Haz пишет:

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


У меня при старте стразу дырка внизу.

Спасибо: 0 
Профиль
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 и дырки, наверно, не будет (или подбери число). Но если будет сетка не в размер клиентской области, скорее всего, будет затык отображения

Спасибо: 0 
Профиль
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
теперь есть где искать лекарство

Спасибо: 0 
Профиль
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

Спасибо: 0 
Профиль
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



Спасибо: 0 
Профиль
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 пиксел не спасала от залипух, а два пикселя помогли от них избавиться

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 3824
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 21.08.21 17:42. Заголовок: Haz пишет лучше так ..


Haz пишет
 цитата:
лучше так проверь


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

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 3825
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 21.08.21 19:21. Заголовок: Haz пишет по моему о..


Haz пишет
 цитата:
по моему она лишняя при вычислении области скрола


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

Спасибо: 0 
Профиль
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 )

а мы тут всей толпой дырки ищем

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1730
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 21.08.21 20:41. Заголовок: SergKis пишет: УПС,..


SergKis пишет:

 цитата:
УПС, куда пост делсяааааааа


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

Спасибо: 0 
Профиль
Ответов - 300 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All [только новые]
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 68
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет