Автор | Сообщение |
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
[только новые]
|
|
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) ? (Тип поля менять не могу - такая постановка).
|
|
|
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 := ...
|
|
|
krutoff
|
| |
Пост N: 204
Зарегистрирован: 17.10.05
|
|
Отправлено: 14.06.21 16:19. Заголовок: SergKis Спасибо! П..
SergKis Спасибо! Подошел только вариант 2: nWidth := oCol:nEditWidth
|
|
|
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() // и в самом конце это
|
|
|
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() позволяет сгладить эти вопросы, раскидав "лишние" пикселы между заголовками (SuperHeader, Header, Footer). Методика "oBrw:lRePaint := .T.; oBrw:Display(); oBrw:ResetVScroll()" требует очень жесткого подхода к расчетам всех контролов окна по высоте и учета изменения фонта и разрешения монитора и высот строк тсб, что бы окно смотрелось (по дизайну и пропорциям) более или менее прилично. По мне, это довольно трудоемко, т.е. вопрос куда деть "лишние" пикселы, между тсб и клиентской высотой окна при исп. разных фонтов остается и алгоритм их использования должен быть. Я, к примеру, использовал промежутки GapsHeight между контролами, увеличивая или уменьшая это значение, т.е. вычислял разницу высот всех контролов и клиентской высотой окна и из нее получал GapsHaight, не меняя высот контролов, но возможны и др. варианты
|
|
|
Haz
|
| |
Пост N: 1712
Зарегистрирован: 20.02.11
|
|
Отправлено: 12.08.21 22:47. Заголовок: SergKis пишет: Как ..
SergKis пишет: цитата: | Как формируешь одинаковые высоты строки и всех типов заголовков ? |
| Сергей, очень плотный интерфейс. На экране 6 TSB один напротив другого ( раздели экран на пополам по вертикали и на 3 части по горизонтали и представь что везде высота заголовка разная🧐), выверял высоты по пиксельно. В этом конкретном случае разница в заголовках и подвалах по всем TSB даёт эффект очень неаккуратной прорисовки и выглядит ... не профессионально. Согласен мириться с дырой под бровсом ( но в рамках окна бровса), но зато пиксель напротив пикселя и залипшей строки нет. Суть поста была в этом
|
|
|
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()
|
|
|
Haz
|
| |
Пост N: 1713
Зарегистрирован: 20.02.11
|
|
Отправлено: 12.08.21 23:48. Заголовок: SergKis пишет: т.е..
SergKis пишет: цитата: | т.е. получить "дырку" в пикселах и самому разделить ее между Header, Footer и др. заголовками в каких пропорциях так, что бы на всех тсб заголовки и подвалы были одинаковыми. |
|
пробовал, строгость общей картинки хромает. Не так важна дыра, как строгое соответствие между бровсами по высотам. Тут целью было избавиться от залипания последней строки. SetNoHoles() шикарно работает на окне с одним бровсом. Но если их много, то возникают вопросы. И все они в том, что : ВСЕ ВЫСОТЫ БРОВСОВ В ОКНЕ ДОЛЖНЫ БЫТЬ ОДИНАКОВЫ. А SetNoHoles() это метод конкретного бровса , а не группы бровсов. Отсюда возникает вопрос, нужны ли признаки группы ? То есть группируем бровсы в одну группу и у всех одни интерфейсные характеристики. Этого сейчас нет, и необходимость под вопросом.
|
|
|
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
|
|
|
Haz
|
| |
Пост N: 1714
Зарегистрирован: 20.02.11
|
|
Отправлено: 13.08.21 08:43. Заголовок: SergKis пишет: Дела..
SergKis пишет: цитата: | Делаем все это перед END TBROWSE |
|
Так и делаю. Только приходится все же с фиксированной высотой . как уже говорил бровсов много на экране. И все должны быть одинаковы. В каждом есть хидер и суперхидер, все по 22 пикселя. Строки тоже 22. Есть в самом низу бровс на оду строку. Если автоматом выравнивать высоты хидеров и футеров , то невозможно соблюсти строгую эдентичность всего. Чтобы на разных разрешениях был почти одинаковый вид, играю высотой верхних (самых толстых) бровсов. Суперхидер нужен как визуальное разделение таблиц, это как титлебар у окна. В общем как не пробовал setnoholes тут только мешает, т.к. если идти от нижнего однострочного то там все предельно просто. Высота 66 ( 22 супер + 22 хидер + 22 строка ) . Значит и у остальных все по 22 и подбирать высоту нечем. Единственное что напрягало так это залипание на определенных совпадениях размеров и разрешения. Пока не решил вопрос с помощью display().
|
|
|
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-х
|
|
|
|
Haz
|
| |
Пост N: 1715
Зарегистрирован: 20.02.11
|
|
Отправлено: 13.08.21 09:17. Заголовок: SergKis пишет: "..
SergKis пишет: цитата: | "Залипание" может остаться и где то проявиться, обратил внимание, что при повторных прорисовках, координаты могут "поплыть" |
| Твой алгоритм понятен, спасибо. Сегодня прогоню тест ( в цикле буду менять размер окна по высоте на котором все живет ) если словлю залипуху придётся колдовать с этой дырой.
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 3817
Зарегистрирован: 17.02.12
|
|
Отправлено: 13.08.21 09:25. Заголовок: Haz пишет если словл..
Haz пишет цитата: | если словлю залипуху придётся колдовать с этой дырой. |
| На твоем PC все может быть ok! У клиента может вылезти залипание, у него могут быть др. характеристики монитора
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 3818
Зарегистрирован: 17.02.12
|
|
Отправлено: 18.08.21 16:01. Заголовок: Haz пишет Сегодня пр..
Haz пишет цитата: | Сегодня прогоню тест ( в цикле буду менять размер окна по высоте на котором все живет ) если словлю залипуху придётся колдовать с этой дырой. |
| Игорь, чем закончилось тестирование ? С дырой или без ?
|
|
|
Haz
|
| |
Пост N: 1716
Зарегистрирован: 20.02.11
|
|
Отправлено: 18.08.21 20:31. Заголовок: SergKis пишет: чем ..
SergKis пишет: цитата: | чем закончилось тестирование ? С дырой или без ? |
|
Сергей привет, при прогоне теста, что с дырой, что без залипух не выявил. В цикле менял размеры окна по 3 пикселя в плюс и в минус. После чего рисовал бровс, так же менял по 1 пикселю высоту строки бровса в обе стороны. И с дырой и без залипух не было. Погонял через RDP тоже оба работают. Два дня назад без дыры поставил пользователям один активный проект т (человек 50 там одновременно сидят ) пока все молчат. Короче наблюдаю. Мнение такое , на простых интерфейсах с дырой однозначно, на строгих, где на экране таблиц много то без дыры.
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 3819
Зарегистрирован: 17.02.12
|
|
Отправлено: 18.08.21 23:11. Заголовок: Haz пишет И с дырой ..
Haz пишет цитата: | И с дырой и без залипух не было. |
| Если ты делал длинный скроллинг вверх, вниз при этом на разных тсб окна, то результат радует, версия 9.0 стабильно рисует
|
|
|
Haz
|
| |
Пост N: 1717
Зарегистрирован: 20.02.11
|
|
Отправлено: 19.08.21 12:59. Заголовок: SergKis пишет: Если..
SergKis пишет: цитата: | Если ты делал длинный скроллинг вверх, вниз при этом на разных тсб окна, то результат радует, версия 9.0 стабильно рисует |
|
сегодня еще раз погоняю и отпишусь
|
|
|
Haz
|
| |
Пост N: 1718
Зарегистрирован: 20.02.11
|
|
Отправлено: 19.08.21 21:54. Заголовок: Haz пишет: сегодня ..
Haz пишет: цитата: | сегодня еще раз погоняю и отпишусь |
| Устал гонять , никак специально не удаётся выйти на залипуху, если только все поменять и refresh (f) сделать. Но так и понятно, что мусор остается . Могу сюда тестовый пример сбросить.
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 3820
Зарегистрирован: 17.02.12
|
|
Отправлено: 19.08.21 22:07. Заголовок: Haz пишет: Устал гон..
Haz пишет: цитата: | Устал гонять , никак специально не удаётся выйти на залипуху |
| Так это хорошо, обычно залип проявлялся на скроллах при длительном удержании стрелки вверх или вниз, а так же Pgdn, Pgup, т.е. постоянная прорисовка области тсб. цитата: | Могу сюда тестовый пример сбросить |
| Брось, может у кого и вылезет чего.
|
|
|
Dima
|
| |
Пост N: 7431
Зарегистрирован: 17.05.05
|
|
Отправлено: 19.08.21 22:30. Заголовок: SergKis пишет: Брос..
SergKis пишет: цитата: | Брось, может у кого и вылезет чего. |
| +1 Тоже чекну когда время будет. Желательно +собранный EXE
|
|
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|