On-line: гостей 2. Всего: 2 [подробнее..]
АвторСообщение
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 [только новые]


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 начинаются ?
Не знаю что сказать ?!

Спасибо: 0 
Профиль
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 меньше ( это тот пиксель который ты искал )

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




Пост N: 3827
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 21.08.21 22:10. Заголовок: Haz пишет имеет мест..


Haz пишет
 цитата:
имеет место быть опечатка или ошибка


Как идет вывод строки и линий в TSDrawCell ?
Линия прорисовывается с одной стороны строки или с обоих (по горизонтали) или работает обводка ячейки ?
Ты уже вник в тему, а я подзабыл уже.

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




Пост N: 1732
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 21.08.21 22:12. Заголовок: SergKis пишет: Как ..


SergKis пишет:

 цитата:
Как идет вывод строки и линий в TSDrawCell ?

внутрь ячейки то есть высота nHeightCell уже с линиями

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




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


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


Тогда твоя трактовка и правка кода правильная
Но она может привести к искажениям, в текущих, набранных тсб.
Т.к. появится лишний пиксел. Не врубаюсь хорошо это или не очень

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




Пост N: 1733
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 21.08.21 22:27. Заголовок: SergKis пишет: Но о..


SergKis пишет:

 цитата:
Но она может привести к искажениям, в текущих, набранных тсб.

не приведёт если есть setnoholes() тк он правильно считает

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




Пост N: 1734
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 21.08.21 22:32. Заголовок: Haz пишет: Но она м..


Haz пишет:

 цитата:
Но она может привести к искажениям, в текущих, набранных тсб.
Т.к. появится лишний пиксел. Не врубаюсь хорошо это или не очень

Тут разница в том что в текущем алгоритме при определенном размере дыры добавлялась лишняя строка при nHole = nHeightCell -1 отсюда и залипон , тк при скроллировании окна про эту строку не знали

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




Пост N: 3829
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 21.08.21 23:08. Заголовок: Haz пишет Тут разниц..


Haz пишет
 цитата:
Тут разница в том что в текущем алгоритме при определенном размере дыры добавлялась лишняя строка при nHole = nHeightCell -1 отсюда и залипон , тк при скроллировании окна про эту строку не знали


Игорь, все очень похоже на правду и нашелся прыгающий пиксель, приводящий к лишней скрытой строке и залипону в конечном результате, но у меня на сегодня отрубилась башка, я как тот Колобок из мультика "Ничего не понимаю"
Завтра и в понедельник надо закрыть тему, только потом могу вернуться к тек. версии hmg. В своей, наверно, C код трогать не буду. Потом в тек. внесу твои правки и погоняю примеры и варианты, что есть.

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




Пост N: 3830
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.08.21 06:42. Заголовок: SergKis пишет В запи..


SergKis пишет
 цитата:
В записи исходной
iFree = rct.bottom - rct.top + 1 - iSupH - iHead - iFoot - iSpcH
у меня вопросов не особо возникает, ...


Возник вопрос с утра пораньше, где тут учитывается наличие или отсутствие HScroll ?

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




Пост N: 1735
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 22.08.21 10:17. Заголовок: SergKis пишет: Возн..


SergKis пишет:

 цитата:
Возник вопрос с утра пораньше, где тут учитывается наличие или отсутствие HScroll ?



скрол это дочернее окно в oBrw:hWnd ( свойство oBrw:hWnd ) и следовательно GetClientRect() его учитывает автоматически.

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




Пост N: 1737
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 22.08.21 11:27. Заголовок: Haz пишет: отсюда и..


Haz пишет:

 цитата:
отсюда и залипон , тк при скроллировании окна про эту строку не знали


Это следствие разных алгоритмов расчёта одного и того же. Обе функции Countrows() и TSBScroll() считают размеры, но по разному. В идеале их подружить нужно TSBScroll() должна зависеть от Countrows() Или делать отдельную функцию, которая вернет структуру с размерами - количество строк, размер дыры.

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




Пост N: 3833
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.08.21 13:14. Заголовок: Haz пишет Или делат..


Haz пишет
 цитата:
Или делать отдельную функцию, которая вернет структуру с размерами - количество строк, размер дыры


Или оставить все как есть, т.к. "знаем где собака порылась" и как выправлять

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




Пост N: 7436
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 22.08.21 14:48. Заголовок: Haz пишет: цитата:..


Haz пишет:

цитата:
как ты то делаешь ?


Примерно так. Ставим курсор на самую последнюю видимую строку.
У меня при старте помещается 33 , вот на нее и ставил.
Затем меняю высоту заголовка (произвольно) и тыкаю мышкой посередине бровса
и начинаю скролить колесом мышки.
Иногда высоту достаточно менять до тех пор , пока бах и не пропал неактивный курсор
бровса. Тогда снова тыкаем в середину бровса и скролим колесом

ЗЫ
Попробуй отключить горизонтальный скрол


ЗЫ2
Я срочно уезжал под Киев клиника Lisod , но вернулись обратно так как там цирк и клоуны , поэтому раньше не ответил

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




Пост N: 1738
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 22.08.21 21:55. Заголовок: Dima пишет: Примерн..


Dima пишет:

 цитата:
Примерно так. Ставим курсор на самую последнюю видимую строку.


Дим , спасибо за подсказку. Проблема найдена, расчёт количества строк в текущей редакции tsb некорректен. если есть желание, могу ехе скинуть.
https://drive.google.com/file/d/1iaeKkHhhUiwnADoHQvbRJldnQQMeyNQd/view?usp=sharing

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




Пост N: 7438
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 23.08.21 10:01. Заголовок: Haz пишет: Проблем..


Haz пишет:

 цитата:
Проблема найдена


Счас заценю

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




Пост N: 7439
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 23.08.21 10:04. Заголовок: Тестить долго не при..


Тестить долго не пришлось , обкатал по той же схеме.
Все равно есть какой то косяк


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

вот на всякий последние исходники теста
Скрытый текст



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

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




Пост N: 7440
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 23.08.21 10:53. Заголовок: Haz пишет: переписа..


Haz пишет:

 цитата:
переписал SecondFunc() и проблема ушла


Да теперь все хорошо

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




Пост N: 1741
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 23.08.21 11:20. Заголовок: Dima пишет: Да тепе..


Dima пишет:

 цитата:
Да теперь все хорошо


Спасибо за помощь

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