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 [только новые]


Haz
администратор




Пост N: 651
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 02.09.15 18:51. Заголовок: Andrey пишет: А зав..


Andrey пишет:

 цитата:
А завести в TsBrowse специальную функцию


а нафиг она там нужна ?
с таким же успехом и сам посчитать можешь через dbEval()

Спасибо: 0 
Профиль
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








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




Пост N: 4502
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 03.09.15 11:57. Заголовок: Haz пишет: Поясню п..


Haz пишет:

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


Спасибо !

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




Пост N: 4506
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 03.09.15 16:12. Заголовок: Tsbrowse открыт, на ..


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

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




Пост N: 5269
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.09.15 21:21. Заголовок: Andrey пишет: Делаю..


Andrey пишет:

 цитата:
Делаю условную индексацию, кол-во записей 0


Сюда продублируй свой код который ниже индексации.

PS
Не думаю что там две сотни строк кода

Спасибо: 0 
Профиль
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


Спасибо: 0 
Профиль
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



Спасибо: 0 
Профиль
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

...


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




Пост N: 4523
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 23.09.15 20:56. Заголовок: Всем привет ! Вот на..


Всем привет !
Вот нашел проблему в Tsb с фонтами....
Делаю так:
Скрытый текст

Использую везде один фонт:
cFont := 'Tahoma' , nFontSize := ModeSizeFont()

Под ХР фонты грузяться правильно, под 8-кой нет !



Кто с таким сталкивался ?


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




Пост N: 5288
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 23.09.15 21:32. Заголовок: Andrey пишет: Кто с..


Andrey пишет:

 цитата:
Кто с таким сталкивался ?



gfilatov2002 пишет:

 цитата:
С учетом этого обсуждения изменил определение размера шрифта на

цитата:
_HMG_DefaultFontSize := Max( 9, GetDefaultFontSize () )



Не оно ?

Спасибо: 0 
Профиль
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)
...


Спасибо: 0 
Профиль
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 фонтов на все колонки


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




Пост N: 838
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 24.09.15 10:34. Заголовок: SergKis пишет: Пред..


SergKis пишет:

 цитата:
Предлагаю для фонтов в class TsBrowse добавить


Благодарю за дельное предложение
Уже добавил эти CLASSDATA ...

Спасибо: 0 
Профиль
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 задавать фонты нужно ?

Спасибо: 0 
Профиль
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


Спасибо: 0 
Профиль
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 тыс. - начинаются тормоза...
Если убрать подсчёт, то тормозов нет.


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




Пост N: 5289
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 25.09.15 21:27. Заголовок: Andrey Ты снова о т..


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




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




Пост N: 4526
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 25.09.15 23:22. Заголовок: Dima пишет: Не муча..


Dima пишет:

 цитата:
Не мучай бровс такими вещами иначе позже тебя будут мучать кошмары юзеры твоей программы


Нет, ты не прав !
Нашёл решение, не надо совать кодовый блок туда !
Нужно просто текст (расчёт) засовывать...
Вот так:
cVal := EVAL(&(cFooting))
oBrw:aColumns[nCol]:cFooting := cVal

И тормоза пропали !

А в терминалке, когда ввод записей идёт, внизу всегда итого стоит, чтобы сразу сравнивать, сколько накладных ввели и какая сумма ввода.
Да и по поиску: (за день, за месяц и т.д.) расчёт нужен.

Вообще мне скорость работы в Tsbrowse - нравится !
450 тыс.записей считает быстро, 3 сек. и итого по колонке уже есть. Юзер не будет напрягаться.
По сетке пока не знаю. Но там уже по другому делать надо - на Лето !!!

Спасибо: 0 
Профиль
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 тормозит навигация

Спасибо: 0 
Профиль
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)



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