Автор | Сообщение |
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
[только новые]
|
|
Haz
|
| |
Пост N: 651
Зарегистрирован: 20.02.11
|
|
Отправлено: 02.09.15 18:51. Заголовок: Andrey пишет: А зав..
Andrey пишет: цитата: | А завести в TsBrowse специальную функцию |
| а нафиг она там нужна ? с таким же успехом и сам посчитать можешь через dbEval()
|
|
|
Haz
|
| |
Пост N: 652
Зарегистрирован: 20.02.11
|
|
Отправлено: 03.09.15 11:54. Заголовок: Поясню почему "с..
Поясню почему "специальная функция" НЕ НУЖНА и бровс тут не причем. 1. Это НЕ функционал бровса который может и не знать какие условия (ограничения) наложены на базу ( фильтры, скопы, условные индексы , удаленные записи и пр и их комбинации ). Функционал бровса отображать то что ему кормят. Эта задача RDD, который, в данном случае ее не поддерживает ни в каком виде. 2. При смене индекса, фильтра, скопа эта "специальная функция" должна будет пересчитать всю таблицу, а если в таблице несколько миллионов записей ? Все готовы ждать пока посчитает перед прорисовкой ? 3. Всем или не всем это нужно ... Мне например - нет , а если потребуется посчитаю своей функцией прямиком базе. 4. Гораздо полезнее была бы возможность авто суммы в футинги по выбранным колонкам и если кто то заглядывал в сырцы TS - та там это возможность закладывалась, но была брошена в силу п.1 и п.2. 5 Главное от этой "специальной функции" главное назначение бровса - отображать записи, ну никак не улучшается, только растет размер паразитного кода т.к. должен учитывать все особенности возможных RDD ( dbf, ado, array, text те - которые туда сейчас заложены ). Вообщем, рекомендую не путать "теплое" с "мягким" и наращивать функционал TS только полезными дополнениями именно для TS
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4502
Зарегистрирован: 12.09.06
|
|
Отправлено: 03.09.15 11:57. Заголовок: Haz пишет: Поясню п..
Haz пишет: цитата: | Поясню почему "специальная функция" НЕ НУЖНА и бровс тут не причем. |
| Спасибо !
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4506
Зарегистрирован: 12.09.06
|
|
Отправлено: 03.09.15 16:12. Заголовок: Tsbrowse открыт, на ..
Tsbrowse открыт, на экране записи есть. Делаю условную индексацию, кол-во записей 0. На экране Tsbrowse пустая "фантомная" запись. Как сделать, чтобы такая запись не отображалась ?
|
|
|
Dima
|
| |
Пост N: 5269
Зарегистрирован: 17.05.05
|
|
Отправлено: 03.09.15 21:21. Заголовок: Andrey пишет: Делаю..
Andrey пишет: цитата: | Делаю условную индексацию, кол-во записей 0 |
| Сюда продублируй свой код который ниже индексации. PS Не думаю что там две сотни строк кода
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4507
Зарегистрирован: 12.09.06
|
|
Отправлено: 03.09.15 22:43. Заголовок: Dima пишет: Сюда пр..
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
|
| постоянный участник
|
Пост N: 822
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.09.15 13:27. Заголовок: Сделал в своем проек..
Сделал в своем проекте следующее h_tsbrowse.prg ... 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
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 823
Зарегистрирован: 17.02.12
|
|
Отправлено: 13.09.15 11:27. Заголовок: SergKis пишет:Сделал..
SergKis пишет: цитата: | Сделал в своем проекте следующее h_tsbrowse.prg |
| немного подправил в методе 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 ...
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4523
Зарегистрирован: 12.09.06
|
|
Отправлено: 23.09.15 20:56. Заголовок: Всем привет ! Вот на..
Всем привет ! Вот нашел проблему в 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
|
| |
Пост N: 5288
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.09.15 21:32. Заголовок: Andrey пишет: Кто с..
Andrey пишет: цитата: | Кто с таким сталкивался ? |
| gfilatov2002 пишет: цитата: | С учетом этого обсуждения изменил определение размера шрифта на цитата: _HMG_DefaultFontSize := Max( 9, GetDefaultFontSize () ) |
| Не оно ?
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 827
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.09.15 08:25. Заголовок: Dima пишет:Не оно ? ..
Dima пишет: С фонтами есть не увязочки. см. h_windows.prg line 181 _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, но для порядка ... 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
|
| постоянный участник
|
Пост N: 828
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.09.15 09:15. Заголовок: gfilatov2002 Предлаг..
gfilatov2002 Предлагаю для фонтов в class TsBrowse добавить 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 фонтов на все колонки
|
|
|
gfilatov2002
|
| moderator
|
Пост N: 838
Зарегистрирован: 11.02.10
|
|
Отправлено: 24.09.15 10:34. Заголовок: SergKis пишет: Пред..
SergKis пишет: цитата: | Предлагаю для фонтов в class TsBrowse добавить |
| Благодарю за дельное предложение Уже добавил эти CLASSDATA ...
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4524
Зарегистрирован: 12.09.06
|
|
Отправлено: 24.09.15 14:54. Заголовок: SergKis пишет: т.е...
SergKis пишет: цитата: | т.е. если фонт не задали, то FontName NIL и FontSize NIL, |
| Да я же задаю: DEFINE TBROWSE oBrw ; ..... FONT cFont SIZE nTblFSize ; ..... END TBROWSE В доке так написано ! Или не верить что в доке написано ? Или не так для Tsb задавать фонты нужно ?
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 829
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.09.15 15:31. Заголовок: Andrey А вот это: п..
Andrey А вот это: попробуй сделать вариант DEFINE FONT Font_Tsb FONTNAME "Tahoma" SIZE 18 что бы сработали строки if ( FontHandle := GetFontHandle( FontName ) ) != 0 aFont := GetFontParam(FontHandle) ... т.е. работа по handle фонтов в tsb
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4525
Зарегистрирован: 12.09.06
|
|
Отправлено: 25.09.15 18:22. Заголовок: Вопрос по подвалам T..
Вопрос по подвалам 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
|
| |
Пост N: 5289
Зарегистрирован: 17.05.05
|
|
Отправлено: 25.09.15 21:27. Заголовок: Andrey Ты снова о т..
Andrey Ты снова о том о чем спрашивал. Ну скажи зачем в журнале или что там у тебя , считать сумму по полю , если заведомо знаешь что записей там может быть достаточно много ? Примени похожий подход к терминалке и тоже будет тормоз. Нужна цифирка нужная , сделай отчет или выведи цифирку в окно по какой то педали. Не мучай бровс такими вещами иначе позже тебя будут мучать кошмары юзеры твоей программы
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4526
Зарегистрирован: 12.09.06
|
|
Отправлено: 25.09.15 23:22. Заголовок: Dima пишет: Не муча..
Dima пишет: цитата: | Не мучай бровс такими вещами иначе позже тебя будут мучать кошмары юзеры твоей программы |
| Нет, ты не прав ! Нашёл решение, не надо совать кодовый блок туда ! Нужно просто текст (расчёт) засовывать... Вот так: cVal := EVAL(&(cFooting)) oBrw:aColumns[nCol]:cFooting := cVal И тормоза пропали ! А в терминалке, когда ввод записей идёт, внизу всегда итого стоит, чтобы сразу сравнивать, сколько накладных ввели и какая сумма ввода. Да и по поиску: (за день, за месяц и т.д.) расчёт нужен. Вообще мне скорость работы в Tsbrowse - нравится ! 450 тыс.записей считает быстро, 3 сек. и итого по колонке уже есть. Юзер не будет напрягаться. По сетке пока не знаю. Но там уже по другому делать надо - на Лето !!!
|
|
|
Haz
|
| |
Пост N: 666
Зарегистрирован: 20.02.11
|
|
Отправлено: 26.09.15 10:37. Заголовок: Andrey пишет: 450 т..
Andrey пишет: цитата: | 450 тыс.записей считает быстро, 3 сек. |
| Андрей, сам TS ничего не считает, он показывает то что ему кормят. Если перед показом нужно оценить блок кода, то разумеется, на это уйдет время. Но TS то тут при чем ? Это тормозит алгоритм , по которому TS должен показывать значения. PS Кстати 3 сек на 450 тыс записей - это тоже очень долго к примеру SQL запрос в ADS сумма по одному полю выполнится примерно за 100 - 200 мс. Это зависит от RDD от быстродействия компа и алгоритма, .... и, при чем тут TS Это равносильно тому , если в :bChange присвоить { || Millisec(1000) } и утверждать что в TS тормозит навигация
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4527
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.09.15 23:22. Заголовок: Пробую показ Tsb на ..
Пробую показ 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)
|
|
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|