On-line: гостей 1. Всего: 1 [подробнее..]
АвторСообщение
постоянный участник


Пост 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 
ПрофильЦитата Ответить
Ответов - 289 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All [только новые]


постоянный участник




Пост 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 
ПрофильЦитата Ответить
администратор




Пост 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 
ПрофильЦитата Ответить
постоянный участник




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


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


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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




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


SergKis пишет:

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

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

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




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


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


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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




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


SergKis пишет:

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

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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




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


Haz пишет:

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

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

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




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


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


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

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




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


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


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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




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


SergKis пишет:

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



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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




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


Haz пишет:

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


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

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




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


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


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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




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


Haz пишет:

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


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

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


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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




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


Dima пишет:

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


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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




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


Haz пишет:

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


Счас заценю

Спасибо: 0 
ПрофильЦитата Ответить
администратор




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


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


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост 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 
ПрофильЦитата Ответить
администратор




Пост 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 
ПрофильЦитата Ответить
администратор




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


Haz пишет:

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


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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




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


Dima пишет:

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


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

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

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 248
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет