Форум » GUI » TsBrowse в Минигуи (продолжение) » Ответить

TsBrowse в Минигуи (продолжение)

Vlad04: TsBrows определяется в виде строки ПАРМЕТРОВ объекта и их значений К примеру [quote] 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 [/quote] Здесь я собрал параметры из разных tBrows Можно или нет и какие парметры заменить выражением ( и каким) ? oBrw2:.... oBrw2:....

Ответов - 300, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All

krutoff: Понадобилось в 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: krutoff пишет Можно ли снять это ограничение (IF) ? Чуть выше aGet := oCol:aItems т.е. форматируйте одну строку в массиве нужной длинны и все или чуть ниже[pre2] IF oCol:nEditWidth > 0 nWidth := oCol:nEditWidth ENDIF[/pre2] т.е. задайте нужное значение для колонки oCol:nEditWidth := ...

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


Haz: Может пригодиться кому ))) Уже давно этот метод появился благодаря Сергею как лекарство от залипшей нижней строки в бровсе. Ситуацию метод исправляет через выравнивание высот заголовков и подвалов и я его использовал во всех проектах. Но вот в последнем нужен строгий интерфейс и разные высоты заголовков и подвалов на одном экране при задании изначально одинаковых параметров начали раздражать. Еще раз пересмотрел примеры и исходники и выяснилось следующее: 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: 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, не меняя высот контролов, но возможны и др. варианты

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

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

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

SergKis: 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: SergKis пишет: Делаем все это перед END TBROWSE Так и делаю. Только приходится все же с фиксированной высотой . как уже говорил бровсов много на экране. И все должны быть одинаковы. В каждом есть хидер и суперхидер, все по 22 пикселя. Строки тоже 22. Есть в самом низу бровс на оду строку. Если автоматом выравнивать высоты хидеров и футеров , то невозможно соблюсти строгую эдентичность всего. Чтобы на разных разрешениях был почти одинаковый вид, играю высотой верхних (самых толстых) бровсов. Суперхидер нужен как визуальное разделение таблиц, это как титлебар у окна. В общем как не пробовал setnoholes тут только мешает, т.к. если идти от нижнего однострочного то там все предельно просто. Высота 66 ( 22 супер + 22 хидер + 22 строка ) . Значит и у остальных все по 22 и подбирать высоту нечем. Единственное что напрягало так это залипание на определенных совпадениях размеров и разрешения. Пока не решил вопрос с помощью display().

SergKis: Haz пишет Единственное что напрягало так это залипание на определенных совпадениях размеров и разрешения. Пока не решил вопрос с помощью display() :Display() сбросил и пересчитал все размеры прорисовки сначала. "Залипание" может остаться и где то проявиться, обратил внимание, что при повторных прорисовках, координаты могут "поплыть" на 1 пиксел (возможно это в моей версии тсб, которая 7.0-9.0). Для всех тсб оставляю в низу по 2 пиксела. Вариант расчета нескольких тсб[pre2] 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() } ... [/pre2] Если их у тебя 6, по 3 в ряд, то на 4-м тсб можно повторить расчет, как на тсб1 и уже след. тсб делать от него PS Помнится, на форуме, кто то говорил, что 2 пиксела дырки не исправило "залипание" и исп. 3 пиксела или 4. У меня хватает 2-х

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

SergKis: Haz пишет если словлю залипуху придётся колдовать с этой дырой. На твоем PC все может быть ok! У клиента может вылезти залипание, у него могут быть др. характеристики монитора

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

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

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

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

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

SergKis: Haz пишет: Устал гонять , никак специально не удаётся выйти на залипуху Так это хорошо, обычно залип проявлялся на скроллах при длительном удержании стрелки вверх или вниз, а так же Pgdn, Pgup, т.е. постоянная прорисовка области тсб. Могу сюда тестовый пример сбросить Брось, может у кого и вылезет чего.

Dima: SergKis пишет: Брось, может у кого и вылезет чего. +1 Тоже чекну когда время будет. Желательно +собранный EXE



полная версия страницы