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


krutoff





Пост N: 203
Зарегистрирован: 17.10.05
ссылка на сообщение  Отправлено: 14.06.21 14:23. Заголовок: ComboBox


Понадобилось в TBrowse открыть в символьном поле ComboBox и наткнулся на ограничение по длине бокса.
Для сивольного поля открывается бокс только по длине поля, а для цифрового поля - подсчитывает длину мах строки:
строка 5522 h_tbrowse.prg:
IF ValType( ::bDataEval( oCol ) ) == "N"
nWidth := 0
AEval( aGet, {| x | nWidth := Max( Len( x ), nWidth ) } )
nWidth := Max( GetTextWidth( 0, Replicate( 'B', nWidth ), hFont ), oCol:nWidth )
ENDIF

ВОПРОС: Можно ли снять это ограничение (IF) ?
(Тип поля менять не могу - такая постановка).

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




Пост N: 3762
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 14.06.21 15:55. Заголовок: krutoff пишет Можно ..


krutoff пишет
 цитата:
Можно ли снять это ограничение (IF) ?


Чуть выше aGet := oCol:aItems
т.е. форматируйте одну строку в массиве нужной длинны и все
или чуть ниже
 
IF oCol:nEditWidth > 0
nWidth := oCol:nEditWidth
ENDIF

т.е. задайте нужное значение для колонки oCol:nEditWidth := ...

Спасибо: 0 
Профиль
krutoff





Пост N: 204
Зарегистрирован: 17.10.05
ссылка на сообщение  Отправлено: 14.06.21 16:19. Заголовок: SergKis Спасибо! П..


SergKis
Спасибо! Подошел только вариант 2: nWidth := oCol:nEditWidth

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




Пост N: 1711
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 12.08.21 12:01. Заголовок: METHOD TSBrowse:SetNoHoles()


Может пригодиться кому )))
Уже давно этот метод появился благодаря Сергею как лекарство от залипшей нижней строки в бровсе. Ситуацию метод исправляет через выравнивание высот заголовков и подвалов и я его использовал во всех проектах.
Но вот в последнем нужен строгий интерфейс и разные высоты заголовков и подвалов на одном экране при задании изначально одинаковых параметров начали раздражать.
Еще раз пересмотрел примеры и исходники и выяснилось следующее:
1 Если объект создается через obrw := CreateBrowse() , а потом описание всех установок. То будет залипание нижней строки при определенном соотношении высот строк и высоты бровса
2 Если все установки делать внутри конструкции DEFINE TSBROWSE .... END TSBROWSE, то этой залипухи нет

Переделал проект
1 Убрал все :SetNoHoles()
2 всех описаний свойств объекта вместо :SetNoHoles() поставил oBrw:lRePaint := .T.; oBrw:Display(); oBrw:ResetVScroll() и все стало нормально
oBrw := CreateBrowse()
... // тут определения установок бровса и колонок

oBrw:lRePaint := .T.; oBrw:Display(); oBrw:ResetVScroll() // и в самом конце это

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




Пост N: 3813
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.08.21 22:12. Заголовок: Haz пишет 2 Если все..


Haz пишет
 цитата:
2 Если все установки делать внутри конструкции DEFINE TSBROWSE .... END TSBROWSE, то этой залипухи нет


На мой взгляд, это правильное использование формирование тсб, т.к. по END TSBROWSE происходят все расчеты размеров и прорисовки по ним всех строк и линий, если настройки делать после END ... то без принудительных установок и :Display() трудно заставить тсб отрисовывать все правильно, возможны при этом и "залипания". Во всех своих примерах, использовал методику формирования тсб ТОЛЬКО между DEFINE TBROWSE и END TBROWSE

 цитата:
Убрал все :SetNoHoles()


Как формируешь одинаковые высоты строки и всех типов заголовков ?
От высоты клиентской области тсб ? Или берешь фикс. высоту клиентской области окна и от нее строишь, берешь высоту строки тсб и как то встраиваешь (округленно) размер тсб в окно ? Или жестко строишь окно (клиентскую область) от конкретных, определенных заранее высот всех строк, заголовков и высот доп. контролов окна ? Что делаешь в случае изменения окна по высоте с контролами и тсб, имею ввиду высоту строк ?
Метод :SetNoHoles() позволяет сгладить эти вопросы, раскидав "лишние" пикселы между заголовками (SuperHeader, Header, Footer). Методика "oBrw:lRePaint := .T.; oBrw:Display(); oBrw:ResetVScroll()" требует очень жесткого подхода к расчетам всех контролов окна по высоте и учета изменения фонта и разрешения монитора и высот строк тсб, что бы окно смотрелось (по дизайну и пропорциям) более или менее прилично. По мне, это довольно трудоемко, т.е. вопрос куда деть "лишние" пикселы, между тсб и клиентской высотой окна при исп. разных фонтов остается и алгоритм их использования должен быть. Я, к примеру, использовал промежутки GapsHeight между контролами, увеличивая или уменьшая это значение, т.е. вычислял разницу высот всех контролов и клиентской высотой окна и из нее получал GapsHaight, не меняя высот контролов, но возможны и др. варианты

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




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


SergKis пишет:

 цитата:
Как формируешь одинаковые высоты строки и всех типов заголовков ?


Сергей, очень плотный интерфейс. На экране 6 TSB один напротив другого ( раздели экран на пополам по вертикали и на 3 части по горизонтали и представь что везде высота заголовка разная🧐), выверял высоты по пиксельно. В этом конкретном случае разница в заголовках и подвалах по всем TSB даёт эффект очень неаккуратной прорисовки и выглядит ... не профессионально. Согласен мириться с дырой под бровсом ( но в рамках окна бровса), но зато пиксель напротив пикселя и залипшей строки нет. Суть поста была в этом

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




Пост N: 3814
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.08.21 23:16. Заголовок: Haz пишет Согласен м..


Haz пишет
 цитата:
Согласен мириться с дырой под бровсом, но зато пиксель напротив пикселя и залипшей строки нет. Суть поста была в этом


Я не придираюсь к методике, я уточняю, что другая требует более тщательного расчета и куда деть "лишние" пикселы.
В твоем случае, я бы применил nHole := :SetNoHoles( nDelta, .F. ), т.е. получить "дырку" в пикселах и самому разделить ее между Header, Footer и др. заголовками в каких пропорциях так, что бы на всех тсб заголовки и подвалы были одинаковыми.
END TBROWSE уже содержит :Display(), т.е. если до нее определиться со скролами, то как правило, прорисовка идет как надо, но на некоторых PC требуется дополнительный :Display(). Это выяснил Андрей, исп. Tsb_DemoMdi, как аналог dbEdit, на машинах клиента. В примере, можно глянуть, стоит в блоке кода на END TBROWSE доп. :Display()

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




Пост N: 1713
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 12.08.21 23:48. Заголовок: SergKis пишет: т.е..


SergKis пишет:

 цитата:
т.е. получить "дырку" в пикселах и самому разделить ее между Header, Footer и др. заголовками в каких пропорциях так, что бы на всех тсб заголовки и подвалы были одинаковыми.

пробовал, строгость общей картинки хромает. Не так важна дыра, как строгое соответствие между бровсами по высотам.
Тут целью было избавиться от залипания последней строки. SetNoHoles() шикарно работает на окне с одним бровсом. Но если их много, то возникают вопросы.
И все они в том, что :
ВСЕ ВЫСОТЫ БРОВСОВ В ОКНЕ ДОЛЖНЫ БЫТЬ ОДИНАКОВЫ.
А SetNoHoles() это метод конкретного бровса , а не группы бровсов.
Отсюда возникает вопрос, нужны ли признаки группы ? То есть группируем бровсы в одну группу и у всех одни интерфейсные характеристики. Этого сейчас нет, и необходимость под вопросом.

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




Пост N: 3815
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.08.21 00:35. Заголовок: Haz пишет То есть г..


Haz пишет
 цитата:
То есть группируем бровсы в одну группу и у всех одни интерфейсные характеристики. Этого сейчас нет, и необходимость под вопросом.


Игорь, думаю, все несколько проще, у тсб одинаковая высота и высота строки, у 1-го тсб получаешь, например,
:nHeightCell := 28
:nHeightHead := 32
:nHeightFooter := 32
nHoles := :SetNoHoles(2, .F.) // в низу планируем дырку в 2-а пиксела между строками и Footer (это сглаживание на разных мониторах), помогает избежать "залипания"
nH1 := int(nHoles)/2) ; nH2 := nHoles - nH1
nHeaderAll := :nHeightHead+nH1
nFooterAll := :nHeightFoot+nH2
и эти данные исп. для всех тсб, без применения :SetNoHoles(...), т.е.
:nHeightHead := nHeaderAll
:nHeightFoot := nFooterAll
Можно сразу в др. тсб брать данные с первого в группе, т.е.
:nHeightCell := oBrw1:nHeightCell
:nHeightHead := oBrw1:nHeightHead
:nHeightFoot := oBrw1:nHeightFoot
... и т.д.
Если есть SuperHeader и SpecHeader, то вкл. и их в расчет, если надо (они тоже должны иметь одинаковую высоту на всех тсб)
Делаем все это перед END TBROWSE

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




Пост N: 1714
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 13.08.21 08:43. Заголовок: SergKis пишет: Дела..


SergKis пишет:

 цитата:
Делаем все это перед END TBROWSE

Так и делаю. Только приходится все же с фиксированной высотой . как уже говорил бровсов много на экране. И все должны быть одинаковы. В каждом есть хидер и суперхидер, все по 22 пикселя. Строки тоже 22. Есть в самом низу бровс на оду строку. Если автоматом выравнивать высоты хидеров и футеров , то невозможно соблюсти строгую эдентичность всего. Чтобы на разных разрешениях был почти одинаковый вид, играю высотой верхних (самых толстых) бровсов.
Суперхидер нужен как визуальное разделение таблиц, это как титлебар у окна. В общем как не пробовал setnoholes тут только мешает, т.к. если идти от нижнего однострочного то там все предельно просто. Высота 66 ( 22 супер + 22 хидер + 22 строка ) . Значит и у остальных все по 22 и подбирать высоту нечем. Единственное что напрягало так это залипание на определенных совпадениях размеров и разрешения. Пока не решил вопрос с помощью display().

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




Пост N: 3816
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.08.21 09:05. Заголовок: Haz пишет Единственн..


Haz пишет
 цитата:
Единственное что напрягало так это залипание на определенных совпадениях размеров и разрешения. Пока не решил вопрос с помощью display()


:Display() сбросил и пересчитал все размеры прорисовки сначала. "Залипание" может остаться и где то проявиться, обратил внимание, что при повторных прорисовках, координаты могут "поплыть" на 1 пиксел (возможно это в моей версии тсб, которая 7.0-9.0). Для всех тсб оставляю в низу по 2 пиксела. Вариант расчета нескольких тсб
 
DEFINE FONT "FontNorm" ...
DEFINE FONT "FontBold" ...

nLineCell := 1
nLineHead := 2
nLineFoot := 1

nHeightCell := GetFontHeight("FontNorm")*nLineCell+4
nHeightHead := GetFontHeight("FontBold")*nLineHead+4
nHeightFoot := GetFontHeight("FontBold")*nLineFoot+4
...
DEFINE TBROWSE oBrw1 AT y,x WIDTH w HEIGHT h CELL ;
...
:nHeightCell := nHeightCell
:nHeightHead := nHeightHead
:nHeightFoot := nHeightFoot

nHole := :SetNoHoles(0, .F.)

IF nHole <= 2 // плановая "дырка"
:nHeightHead -= 1
:nHeightFoot -= 1
ENDIF

nHole := :SetNoHoles(2, .F.)

nH2 := int(nHole/2)
nH1 := nHole - nH2

:nHeightHead += nH1
:nHeightFoot += nH2
...
END TBROWSE ON END {|ob| ob:Refresh() }
...
DEFINE TBROWSE oBrw2 AT y,x WIDTH w HEIGHT h CELL ;
...
:nHeightCell := oBrw1:nHeightCell
:nHeightHead := oBrw1:nHeightHead
:nHeightFoot := oBrw1:nHeightFoot
...
END TBROWSE ON END {|ob| ob:Refresh() }
...
DEFINE TBROWSE oBrw3 AT y,x WIDTH w HEIGHT h CELL ;
...
:nHeightCell := oBrw1:nHeightCell
:nHeightHead := oBrw1:nHeightHead
:nHeightFoot := oBrw1:nHeightFoot
...
END TBROWSE ON END {|ob| ob:Refresh() }
...

Если их у тебя 6, по 3 в ряд, то на 4-м тсб можно повторить расчет, как на тсб1 и уже след. тсб делать от него
PS
Помнится, на форуме, кто то говорил, что 2 пиксела дырки не исправило "залипание" и исп. 3 пиксела или 4.
У меня хватает 2-х

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




Пост N: 1715
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 13.08.21 09:17. Заголовок: SergKis пишет: "..


SergKis пишет:

 цитата:
"Залипание" может остаться и где то проявиться, обратил внимание, что при повторных прорисовках, координаты могут "поплыть"


Твой алгоритм понятен, спасибо. Сегодня прогоню тест ( в цикле буду менять размер окна по высоте на котором все живет ) если словлю залипуху придётся колдовать с этой дырой.

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




Пост N: 3817
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.08.21 09:25. Заголовок: Haz пишет если словл..


Haz пишет
 цитата:
если словлю залипуху придётся колдовать с этой дырой.


На твоем PC все может быть ok!
У клиента может вылезти залипание, у него могут быть др. характеристики монитора

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




Пост N: 3818
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 18.08.21 16:01. Заголовок: Haz пишет Сегодня пр..


Haz пишет
 цитата:
Сегодня прогоню тест ( в цикле буду менять размер окна по высоте на котором все живет ) если словлю залипуху придётся колдовать с этой дырой.


Игорь, чем закончилось тестирование ?
С дырой или без ?

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




Пост N: 1716
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 18.08.21 20:31. Заголовок: SergKis пишет: чем ..


SergKis пишет:

 цитата:
чем закончилось тестирование ?
С дырой или без ?

Сергей привет, при прогоне теста, что с дырой, что без залипух не выявил.
В цикле менял размеры окна по 3 пикселя в плюс и в минус. После чего рисовал бровс, так же менял по 1 пикселю высоту строки бровса в обе стороны. И с дырой и без залипух не было. Погонял через RDP тоже оба работают. Два дня назад без дыры поставил пользователям один активный проект т (человек 50 там одновременно сидят ) пока все молчат. Короче наблюдаю. Мнение такое , на простых интерфейсах с дырой однозначно, на строгих, где на экране таблиц много то без дыры.

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




Пост N: 3819
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 18.08.21 23:11. Заголовок: Haz пишет И с дырой ..


Haz пишет
 цитата:
И с дырой и без залипух не было.


Если ты делал длинный скроллинг вверх, вниз при этом на разных тсб окна, то результат радует, версия 9.0 стабильно рисует

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




Пост N: 1717
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 19.08.21 12:59. Заголовок: SergKis пишет: Если..


SergKis пишет:

 цитата:
Если ты делал длинный скроллинг вверх, вниз при этом на разных тсб окна, то результат радует, версия 9.0 стабильно рисует

сегодня еще раз погоняю и отпишусь

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




Пост N: 1718
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 19.08.21 21:54. Заголовок: Haz пишет: сегодня ..


Haz пишет:

 цитата:
сегодня еще раз погоняю и отпишусь


Устал гонять , никак специально не удаётся выйти на залипуху, если только все поменять и refresh (f) сделать. Но так и понятно, что мусор остается .
Могу сюда тестовый пример сбросить.

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




Пост N: 3820
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.08.21 22:07. Заголовок: Haz пишет: Устал гон..


Haz пишет:
 цитата:
Устал гонять , никак специально не удаётся выйти на залипуху


Так это хорошо, обычно залип проявлялся на скроллах при длительном удержании стрелки вверх или вниз, а так же Pgdn, Pgup, т.е. постоянная прорисовка области тсб.

 цитата:
Могу сюда тестовый пример сбросить


Брось, может у кого и вылезет чего.

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




Пост N: 7431
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 19.08.21 22:30. Заголовок: SergKis пишет: Брос..


SergKis пишет:

 цитата:
Брось, может у кого и вылезет чего.


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

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