Форум » 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

Haz: Andrey пишет: А завести в TsBrowse специальную функцию а нафиг она там нужна ? с таким же успехом и сам посчитать можешь через dbEval()

Haz: Поясню почему "специальная функция" НЕ НУЖНА и бровс тут не причем. 1. Это НЕ функционал бровса который может и не знать какие условия (ограничения) наложены на базу ( фильтры, скопы, условные индексы , удаленные записи и пр и их комбинации ). Функционал бровса отображать то что ему кормят. Эта задача RDD, который, в данном случае ее не поддерживает ни в каком виде. 2. При смене индекса, фильтра, скопа эта "специальная функция" должна будет пересчитать всю таблицу, а если в таблице несколько миллионов записей ? Все готовы ждать пока посчитает перед прорисовкой ? 3. Всем или не всем это нужно ... Мне например - нет , а если потребуется посчитаю своей функцией прямиком базе. 4. Гораздо полезнее была бы возможность авто суммы в футинги по выбранным колонкам и если кто то заглядывал в сырцы TS - та там это возможность закладывалась, но была брошена в силу п.1 и п.2. 5 Главное от этой "специальной функции" главное назначение бровса - отображать записи, ну никак не улучшается, только растет размер паразитного кода т.к. должен учитывать все особенности возможных RDD ( dbf, ado, array, text те - которые туда сейчас заложены ). Вообщем, рекомендую не путать "теплое" с "мягким" и наращивать функционал TS только полезными дополнениями именно для TS

Andrey: Haz пишет: Поясню почему "специальная функция" НЕ НУЖНА и бровс тут не причем. Спасибо !


Andrey: Tsbrowse открыт, на экране записи есть. Делаю условную индексацию, кол-во записей 0. На экране Tsbrowse пустая "фантомная" запись. Как сделать, чтобы такая запись не отображалась ?

Dima: Andrey пишет: Делаю условную индексацию, кол-во записей 0 Сюда продублируй свой код который ниже индексации. PS Не думаю что там две сотни строк кода

Andrey: Dima пишет: Сюда продублируй свой код который ниже индексации. Спасибо Дима ! Понял где копать. Сделал и заработало ! oBrw:Reset() oBrw:aColumns[1]:cFooting := { || LTrim( Transform( (oBrw:cAlias)->(OrdKeyCount()), "### ###" ) ) } oBrw:DrawFooters() oBrw:Refresh(.T.) Eval( oBrw:bChange ) Form_9.oBrw.Setfocus

SergKis: Сделал в своем проекте следующее h_tsbrowse.prg [pre2] ... Function _EndTBrowse () Local i, oBrw if _HMG_BeginTBrowseActive i := ascan ( _HMG_aControlHandles , _HMG_ActiveTBrowseHandle ) if i > 0 oBrw := _HMG_aControlIds [ i ] oBrw:lRePaint := .t. oBrw:Display() oBrw:SetNoHole() // убрать дырку от oBrw:lNoHole _HMG_ActiveTBrowseName := "" _HMG_ActiveTBrowseHandle := 0 _HMG_BeginTBrowseActive := .F. endif endif Return Nil ... CLASS TSBROWSE ... ... DATA lNoHole AS LOGICAL INIT .T. // убрать дырку при .T. (у себя сразу поставил .T., т.к. пока в основном тесты) ... METHOD SetNoHole( lNoHole ) ... ENDCLASS ... METHOD SetNoHole( lNoHole ) CLASS TSBrowse Local nI, nK, nHeight Local nHole := ::nHeight - ::nHeightHead - ::nHeightSuper - ; ::nHeightFoot - ::nHeightSpecHd - If( ! ::lNoHScroll, 16, 0 ) DEFAULT lNoHole := ::lNoHole nHole -= ( Int( nHole / ::nHeightCell ) * ::nHeightCell ) nHole -= 1 nHeight := nHole If lNoHole // убираем дырку nI := If( ::nHeightSuper > 0, 1, 0 ) + ; If( ::nHeightHead > 0, 1, 0 ) + ; If( ::nHeightSpecHd > 0, 1, 0 ) + ; If( ::nHeightFoot > 0, 1, 0 ) If nI > 0 // есть заголовки nK := int( nHole / nI ) // на nI - заголовки разделим дырку If ::nHeightSuper > 0 ::nHeightSuper += nK nHole -= nK EndIf If ::nHeightHead > 0 ::nHeightHead += nK nHole -= nK EndIf If ::nHeightSpecHd > 0 ::nHeightSpecHd += nK nHole -= nK EndIf If ::nHeightFoot > 0 ::nHeightFoot += nHole EndIf Else // нет заголовков, уменьшаем размер Height SetProperty(::cParentWnd, ::cControlName, "Height", ; GetProperty(::cParentWnd, ::cControlName, "Height") - nHole) EndIf ::Display() EndIf RETURN nHeight пересобрал свои тесты - работает нормально. Потестируйте у себя в проектах, а то может косяк есть. Для теста используйте функцию (после END TBROWSE): FUNCTION SetNoHole( oBrw ) // убрать дырку LOCAL nI, nK, nHeight LOCAL nHole := oBrw:nHeight - oBrw:nHeightHead - oBrw:nHeightSuper - ; oBrw:nHeightFoot - oBrw:nHeightSpecHd - ; If( ! oBrw:lNoHScroll, 16, 0 ) nHole -= ( Int( nHole / oBrw:nHeightCell ) * oBrw:nHeightCell ) nHole -= 1 nHeight := nHole nI := If( oBrw:nHeightSuper > 0, 1, 0 ) + ; If( oBrw:nHeightHead > 0, 1, 0 ) + ; If( oBrw:nHeightSpecHd > 0, 1, 0 ) + ; If( oBrw:nHeightFoot > 0, 1, 0 ) If nI > 0 // есть заголовки nK := int( nHole / nI ) // на nI - заголовки разделим дырку If oBrw:nHeightSuper > 0 oBrw:nHeightSuper += nK nHole -= nK EndIf If oBrw:nHeightHead > 0 oBrw:nHeightHead += nK nHole -= nK EndIf If oBrw:nHeightSpecHd > 0 oBrw:nHeightSpecHd += nK nHole -= nK EndIf If oBrw:nHeightFoot > 0 oBrw:nHeightFoot += nHole EndIf Else // нет заголовков, можно уменьшить размер tsb на размер nHole SetProperty(oBrw:cParentWnd, oBrw:cControlName, "Height", ; GetProperty(oBrw:cParentWnd, oBrw:cControlName, "Height") - nHole) EndIf oBrw:Display() RETURN nHeight [/pre2]

SergKis: SergKis пишет:Сделал в своем проекте следующее h_tsbrowse.prg немного подправил[pre2] в методе If nI > 0 // есть заголовки nK := int( nHole / nI ) // на nI - заголовки разделим дырку If ::nHeightSuper > 0 ::nHeightSuper += nK nHole -= nK EndIf If ::nHeightSpecHd > 0 ::nHeightSpecHd += nK nHole -= nK EndIf If ::nHeightFoot > 0 ::nHeightFoot += nK nHole -= nK EndIf If ::nHeightHead > 0 ::nHeightHead += nHole EndIf Else // нет заголовков, уменьшаем размер Height ... в функции If oBrw:nHeightSuper > 0 oBrw:nHeightSuper += nK nHole -= nK EndIf If oBrw:nHeightSpecHd > 0 oBrw:nHeightSpecHd += nK nHole -= nK EndIf If oBrw:nHeightFoot > 0 oBrw:nHeightFoot += nK nHole -= nK EndIf If oBrw:nHeightHead > 0 oBrw:nHeightHead += nHole EndIf ... [/pre2]

Andrey: Всем привет ! Вот нашел проблему в Tsb с фонтами.... Делаю так: DEFINE WINDOW &cFormName ; ..... FONT cFont SIZE nFontSize ; ..... DEFINE TBROWSE oBrw ; ..... FONT cFont SIZE nTblFSize ; ..... END TBROWSE ..... CreateBrowseTable(cFormName,nTable,cFont,nTblFSize) //////////////////////////////////////////////////////////// STATIC FUNCTION CreateBrowseTable(cForm,nTable,cFont,nFontSize) ..... aTableFont := LoadTbrwFonts(oBrw) // "Фонты таблицы:" DEFINE CONTEXT MENU CONTROL oBrw MENUITEM cMenuFont ACTION { || MsgDebug("Фонты таблицы:",aTableFont) } ..... ..... Использую везде один фонт: cFont := 'Tahoma' , nFontSize := ModeSizeFont() Под ХР фонты грузяться правильно, под 8-кой нет ! Кто с таким сталкивался ?

Dima: Andrey пишет: Кто с таким сталкивался ? gfilatov2002 пишет: С учетом этого обсуждения изменил определение размера шрифта на цитата: _HMG_DefaultFontSize := Max( 9, GetDefaultFontSize () ) Не оно ?

SergKis: Dima пишет:Не оно ? С фонтами есть не увязочки. см. h_windows.prg line 181 [pre2] _HMG_ActiveFontName := hb_defaultValue( FontName, "" ) // вместо "" надо _HMG_DefaultFontName _HMG_ActiveFontSize := hb_defaultValue( FontSize, 0 ) // вместо 0 надо _HMG_DefaultFontSize см. h_tbrowse.prg Function _DefineTBrowse (...) ... if ( FontHandle := GetFontHandle( FontName ) ) != 0 aFont := GetFontParam(FontHandle) FontName := aFont[1] FontSize := aFont[2] bold := aFont[3] italic := aFont[4] underline := aFont[5] strikeout := aFont[6] endif ... т.е. если фонт не задали, то FontName NIL и FontSize NIL, попадаем с такими значениями на line 244 oBrw := TSBrowse():New( ControlName, nRow, nCol, nWidth, nHeight,; см. метод New(...) line 1006 Default nRow := 0, ; ... cFont := _HMG_ActiveFontName,; nFontSize := _HMG_ActiveFontSize,; ... и далее ::cFont := cFont ::nFontSize := nFontSize т.е. если не задали фонт на окне и TSB получим пустые значения в ::cFont, ::nFontSize вернемся в Function _DefineTBrowse (...) line 303 if valtype(fontname) == "U" FontName := _HMG_DefaultFontName endif if valtype(fontsize) == "U" FontSize := _HMG_DefaultFontSize endif oBrw:hFont := _SetFont (ControlHandle,FontName,FontSize,bold,italic,underline,strikeout) эти строки (без oBrw:hFont), наверно надо перенести, чтобы было if ( FontHandle := GetFontHandle( FontName ) ) != 0 aFont := GetFontParam(FontHandle) FontName := aFont[1] FontSize := aFont[2] bold := aFont[3] italic := aFont[4] underline := aFont[5] strikeout := aFont[6] else if valtype(fontname) == "U" FontName := _HMG_DefaultFontName endif if valtype(fontsize) == "U" FontSize := _HMG_DefaultFontSize endif endif тогда в создание TSB попадут не NIL значения, правда ::cFont используется только в METHOD Excel2(...), везде работа ::hFont, но для порядка ... [/pre2] Andrey пишет:Использую везде один фонт: Почему установка oBrw:hFont := _SetFont (ControlHandle,FontName,FontSize,bold,italic,underline,strikeout) ADD COLUMN TO TBROWSE oBrw // добавить новую колонку в TBROWSE и получение hFont := oBrw:aColumns[ 1 ]:hFont // 1-cells font If hFont != Nil aFontTmp := GetFontParam(hFont) AADD( aFonts, aFontTmp ) ENDIF вместо Tahoma 18 дал, что видим - не понял. попробуй сделать вариант DEFINE FONT Font_Tsb FONTNAME "Tahoma" SIZE 18 что бы сработали строки if ( FontHandle := GetFontHandle( FontName ) ) != 0 aFont := GetFontParam(FontHandle) ...

SergKis: gfilatov2002 Предлагаю для фонтов в class TsBrowse добавить [pre2] DATA hFontEdit AS NUMERIC // edition font DATA hFontHead AS NUMERIC // header font DATA hFontFoot AS NUMERIC // footer font DATA hFontSpcHd AS NUMERIC // special header font в метод METHOD TSColumn:New(...) line 290 было ::hFontHead := oBrw:hFont ::hFontFoot := oBrw:hFont ::hFontEdit := oBrw:hFont ::hFontSpcHd := oBrw:hFont сделать ::hFontHead := If( empty(oBrw:hFontHead ), oBrw:hFont, oBrw:hFontHead ) ::hFontFoot := If( empty(oBrw:hFontFoot ), oBrw:hFont, oBrw:hFontFoot ) ::hFontEdit := If( empty(oBrw:hFontEdit ), oBrw:hFont, oBrw:hFontEdit ) ::hFontSpcHd := If( empty(oBrw:hFontSpcHd), oBrw:hFont, oBrw:hFontSpcHd ) что бы после DEFINE TSBROWSE уст. handle фонтов на все колонки [/pre2]

gfilatov2002: SergKis пишет: Предлагаю для фонтов в class TsBrowse добавить Благодарю за дельное предложение Уже добавил эти CLASSDATA ...

Andrey: SergKis пишет: т.е. если фонт не задали, то FontName NIL и FontSize NIL, Да я же задаю: DEFINE TBROWSE oBrw ; ..... FONT cFont SIZE nTblFSize ; ..... END TBROWSE В доке так написано ! Или не верить что в доке написано ? Или не так для Tsb задавать фонты нужно ?

SergKis: Andrey А вот это: попробуй сделать вариант DEFINE FONT Font_Tsb FONTNAME "Tahoma" SIZE 18 что бы сработали строки if ( FontHandle := GetFontHandle( FontName ) ) != 0 aFont := GetFontParam(FontHandle) ... т.е. работа по handle фонтов в tsb

Andrey: Вопрос по подвалам Tsb. Как идёт подсчёт итого по подвалам (один раз или несколько) ? Вот такой код. aFieldItog := { 4, "{ || ALLTRIM( Transform( GetCountFieldFilter('Prixod'), '999 999 999.99' ) ) }" } // для примера IF nRecAll > 5000 // создаём окно ожидания с потоком WaitThreadCreate( 'Подсчёт ИТОГО ...' ) ENDIF FOR nI := 1 TO LEN(aFieldItog) nCol := aFieldItog[nI,1] cFooting := aFieldItog[nI,2] oBrw:aColumns[nCol]:cFooting := &(cFooting) NEXT IF nRecAll > 5000 WaitThreadClose() // закрыть окно "ожидания" ENDIF oBrw:DrawFooters() // выполнить прорисовку подвала GetCountFieldFilter() из Tsb_config На маленьких базах всё летает, если больше 100 тыс. - начинаются тормоза... Если убрать подсчёт, то тормозов нет.

Dima: Andrey Ты снова о том о чем спрашивал. Ну скажи зачем в журнале или что там у тебя , считать сумму по полю , если заведомо знаешь что записей там может быть достаточно много ? Примени похожий подход к терминалке и тоже будет тормоз. Нужна цифирка нужная , сделай отчет или выведи цифирку в окно по какой то педали. Не мучай бровс такими вещами иначе позже тебя будут мучать кошмары юзеры твоей программы

Andrey: Dima пишет: Не мучай бровс такими вещами иначе позже тебя будут мучать кошмары юзеры твоей программы Нет, ты не прав ! Нашёл решение, не надо совать кодовый блок туда ! Нужно просто текст (расчёт) засовывать... Вот так: cVal := EVAL(&(cFooting)) oBrw:aColumns[nCol]:cFooting := cVal И тормоза пропали ! А в терминалке, когда ввод записей идёт, внизу всегда итого стоит, чтобы сразу сравнивать, сколько накладных ввели и какая сумма ввода. Да и по поиску: (за день, за месяц и т.д.) расчёт нужен. Вообще мне скорость работы в Tsbrowse - нравится ! 450 тыс.записей считает быстро, 3 сек. и итого по колонке уже есть. Юзер не будет напрягаться. По сетке пока не знаю. Но там уже по другому делать надо - на Лето !!!

Haz: Andrey пишет: 450 тыс.записей считает быстро, 3 сек. Андрей, сам TS ничего не считает, он показывает то что ему кормят. Если перед показом нужно оценить блок кода, то разумеется, на это уйдет время. Но TS то тут при чем ? Это тормозит алгоритм , по которому TS должен показывать значения. PS Кстати 3 сек на 450 тыс записей - это тоже очень долго к примеру SQL запрос в ADS сумма по одному полю выполнится примерно за 100 - 200 мс. Это зависит от RDD от быстродействия компа и алгоритма, .... и, при чем тут TS Это равносильно тому , если в :bChange присвоить { || Millisec(1000) } и утверждать что в TS тормозит навигация

Andrey: Пробую показ Tsb на разных разрешениях экрана. Нашёл такую бяку при включённых больших фонтах в системе: Как считать размеры при включённом LargeFonts() ? //////////////////////////////////////////////////////////// // высота дырки внизу таблицы перед подвалом Function GetHoleBrowse(cBrw) Local nWorkHeight := cBrw:nHeight-cBrw:nHeightHead-cBrw:nHeightSuper-; cBrw:nHeightFoot-cBrw:nHeightSpecHd-if(!cBrw:lNoHScroll,16,0) RETURN (nWorkHeight-Int(nWorkHeight/cBrw:nHeightCell)* cBrw:nHeightCell)



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