Автор | Сообщение |
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
[только новые]
|
|
Dima
|
| |
Пост N: 4956
Зарегистрирован: 17.05.05
|
|
Отправлено: 25.06.15 13:46. Заголовок: Andrey пишет: Народ..
Andrey пишет: цитата: | Народ, подскажите как убрать белизну |
| Решил вопрос ? Тоже попал на это
|
|
|
Dima
|
| |
Пост N: 4957
Зарегистрирован: 17.05.05
|
|
Отправлено: 25.06.15 21:23. Заголовок: Подсказали добрые лю..
Подсказали добрые люди oBrw:hBrush := CreateSolidBrush( 210, 210, 210 ) // заливаем чем надо
|
|
|
Dima
|
| |
Пост N: 5010
Зарегистрирован: 17.05.05
|
|
Отправлено: 02.07.15 14:48. Заголовок: Понадобилось сделать..
Понадобилось сделать полноэкранный курсор. Сделал oBrw:lCellBrw :=.F. Пашет , но пропал курсорчик который на CELL , то есть нужен курсор внутри полноэкранного курсора , что бы видеть в какой колонке стоим. В консоли без проблем а тут как ? Сделал авторастяжение колонки 6 oBrw:nAdjColumn := 6 Это не работает если oBrw:lNoHScroll := TRUE , какая связь nAdjColumn с гор. скролом не пойму.
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 684
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.07.15 14:53. Заголовок: Dima пишет: нужен ку..
Dima пишет: цитата: | нужен курсор внутри полноэкранного |
| надо работать в режиме CELL и красить нужным цвеьом тек. строку row
|
|
|
Dima
|
| |
Пост N: 5011
Зарегистрирован: 17.05.05
|
|
Отправлено: 02.07.15 15:01. Заголовок: SergKis красить чер..
SergKis красить через Method TSBrowse: SetColor() ? Вот это в каком положении должно быть oBrw:lCellBrw ?
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 685
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.07.15 15:16. Заголовок: Dima oBrw:lCellBrw ..
Dima oBrw:lCellBrw := .T. SetColor() см. надо для 1,2,5,6,11,12 сам только думал попробовать - реально не делал
|
|
|
Dima
|
| |
Пост N: 5012
Зарегистрирован: 17.05.05
|
|
Отправлено: 02.07.15 15:55. Заголовок: SergKis Что то пока..
SergKis Что то пока понять не могу как это правильно сделать. В примерах (все пересмотрел) ни чего подобного нет а оно надо.
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 686
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.07.15 16:11. Заголовок: Dima Farом поищи в ..
Dima Farом поищи в samples\advanced :SetColor( будет список применения на разные ситуации - надо смотреть эти примеры
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 687
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.07.15 16:15. Заголовок: Dima oBrw:SetColor(..
Dima oBrw:SetColor( { 1 }, { { || CLR_BLACK } } ) // 1 , текста в ячейках таблицы oBrw:SetColor( { 2 }, { { || MyRGB(aBack2) } } ) // 2 , фона в ячейках таблицы oBrw:SetColor( { 5 }, { { || CLR_BLACK } } ) // 5 , текста курсора, текст в ячейках с фокусом oBrw:SetColor( { 6 }, { { || { 4915199,255} } } ) // 6 , фона курсора oBrw:SetColor( { 11 }, { { || CLR_GRAY } } ) // 11, текста неактивного курсора (selected cell no focused) oBrw:SetColor( { 12 }, { { || { RGB(255,255,74), RGB(240,240,0)}} } ) // 12, фона неактивного курсора (selected cell no focused) у Andrey в примере есть такое
|
|
|
Dima
|
| |
Пост N: 5014
Зарегистрирован: 17.05.05
|
|
Отправлено: 02.07.15 16:37. Заголовок: SergKis пишет: oBrw..
SergKis пишет: цитата: | oBrw:SetColor( { 11 }, { { || CLR_GRAY } } ) // 11, текста неактивного курсора (selected cell no focused) oBrw:SetColor( { 12 }, { { || { RGB(255,255,74), RGB(240,240,0)}} } ) // 12, фона неактивного курсора (selected cell no focused) |
| Вот эти фичи как раз и не срабатывают......
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4353
Зарегистрирован: 12.09.06
|
|
Отправлено: 02.07.15 17:56. Заголовок: Dima пишет: Вот эти..
Dima пишет: цитата: | Вот эти фичи как раз и не срабатывают...... |
| Я тоже наткнулся на не срабатывания этого кода. Нужно ставить эти цвета ПОСЛЕ всех обработок до выхода из процедуры. Типа: oBrw3:bKeyDown := { | nKey | MyKeyAction3(nKey,oBrw9, ThisWindow.Name, 0), lOk := nKey != VK_ESCAPE } oBrw3:bLDblClick:= { || MyAction3(oBrw9, ThisWindow.Name, 0) } // Двойной клик мышки на МАРКЕРЕ oBrw3:SetColor( { 16 }, { { || { RGB(0,54,94) , RGB(aBack2[1],aBack2[2],aBack2[3]) } } } ) oBrw3:SetColor( { 17 }, { { || CLR_WHITE } } ) // 17, текста спецхидер oBrw3:Refresh(.T.) //oBrw3:nAt := 5 // передвинуть МАРКЕР на 5 строку oBrw3:nCell := 4 // передвинуть МАРКЕР на 3 колонку //oBrw3:GoPos( 5,3 ) // передвинуть МАРКЕР на 5 строку и 3 колонку SetProperty(ThisWindow.Name, "oBrw3", "Setfocus" ) RETURN NIL Смотри пример с многострочным браузером - https://cloud.mail.ru/public/DkoH/nSzvMbeCh
|
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 688
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.07.15 18:55. Заголовок: Dima наверно тут, у..
Dima наверно тут, усложнив, выражение надо копать (раскраска четных\нечетных строк) oBrw5:SetColor( { 2 }, { { || iif( oBrw5:nAt % 2 == 0, RGB(255,255,255), RGB(230, 230, 230) ) }})
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 689
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.07.15 18:57. Заголовок: PS. и ON CHANGE ..
PS. и ON CHANGE
|
|
|
Dima
|
| |
Пост N: 5016
Зарегистрирован: 17.05.05
|
|
Отправлено: 02.07.15 19:12. Заголовок: SergKis пишет: наве..
SergKis пишет: цитата: | наверно тут, усложнив, выражение надо копать (раскраска четных\нечетных строк) oBrw5:SetColor( { 2 }, { { || iif( oBrw5:nAt % 2 == 0, RGB(255,255,255), RGB(230, 230, 230) ) }}) |
| Видимо да , только условие там правильное надо задать. Типа бровс в фокусе и NROW == не понятно с чем сравнить ЗЫ Has предлагает все делать в скипере.......это просто идея.
|
|
|
Dima
|
| |
Пост N: 5020
Зарегистрирован: 17.05.05
|
|
Отправлено: 02.07.15 22:00. Заголовок: Вот так красит строк..
Вот так красит строку oBrw:SetColor( { 2 }, { { || iif( obrw:nat == obrw:nRowPos, RGB(255, 255, 159),RGB(255,255,255) ) }}) Но курсор вниз (вверх) и окраска остается..........на строках где ранее полежал курсор...
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 693
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.07.15 22:26. Заголовок: Dima добавь к этому..
Dima добавь к этому oBrw:bChange := {|| oBrw:Refresh(.F.) }
|
|
|
Dima
|
| |
Пост N: 5021
Зарегистрирован: 17.05.05
|
|
Отправлено: 02.07.15 23:11. Заголовок: SergKis пишет: oBrw..
SergKis пишет: цитата: | oBrw:bChange := {|| oBrw:Refresh(.F.) } |
| Спасибо ! Работает . Но фон курсора на ячейке синий и белые буковки........я это не назначал. Где крутить гайки ?
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 694
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.07.15 23:17. Заголовок: Dima пишет:Где крути..
Dima пишет: тут oBrw:SetColor( { 5 }, { { || CLR_BLACK } } ) // 5 , текста курсора, текст в ячейках с фокусом oBrw:SetColor( { 6 }, { { || { 4915199,255} } } ) // 6 , фона курсора назначены по умолчанию в oBrw:New(...) aTmpColor[ 5 ] := GetSysColor( COLOR_CAPTIONTEXT ), ; // nClrForeFocu aTmpColor[ 6 ] := GetSysColor( COLOR_ACTIVECAPTION ) // nClrFocuBack
|
|
|
Dima
|
| |
Пост N: 5023
Зарегистрирован: 17.05.05
|
|
Отправлено: 03.07.15 09:36. Заголовок: SergKis С этим разо..
SergKis С этим разобрался. Сенкс. А как быть с oBrw:nAdjColumn , вроде ж должно автоматом выравнивать ширину колонки под ширину бровса и все колонки должны вписаться в ширину бровса. Колонок не много 10 штук с суперхеадером. Но нормально не вписывается да и часть колонок уходит за пределы видимости и нужно скролить вправо что бы их увидеть. Задача простая , вписать все колонки четко в ширину бровса. На ум приходит следующая идея. Задать фиксированную ширину 9-и колонкам а затем присвоить ширину 10-ой колонке которая будет равна Ширина бровса - ширины 9-и колонок. Правильный подход или можно как то проще реализовать ?
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 695
Зарегистрирован: 17.02.12
|
|
Отправлено: 03.07.15 10:14. Заголовок: Dima пишет:Правильны..
Dima пишет: цитата: | Правильный подход или можно как то проще реализовать ? |
| Я TsBrowse, как ты Mdi отложил в ящик, использую Browse без горизонтального скролинга колонок (но на mdi окнах). oBrw:nAdjColumn не пробовал (руки не дошли), но она на одну колонку (может и не так), т.е. на первом экране, а следующие - уже твои проблеммы. Можно ли подключать блоки кода на горизонт. скролинг (клавиши\мыша, для пересчета размеров видимых\невидимых колонок) не знаю. В Browse (модиф. своя версия) делаем так: - определяем колонки для скролинга (размер колонки для "нормального" показа всех прокручиваемых данных) - width размер browse от колонок по окну (всегда, когда нет других контролов справа от browse) или считаем %-том от размера поля ширину в пиксклях, или просто задать от балды - поправят как надо мышой. - клиент мышой может менять ширину любой колонки - это сохраняется в cfg под именем окна+browse и при след. входе в окно размеры колонок беруться от cfg (с mdi main окном и modal окнами, также размеры можно менять, сохраняются в cfg под именем окна) - и при горизонт. скролинге (от номера скролинга) меняется выражение показа всей строки
|
|
|
Dima
|
| |
Пост N: 5025
Зарегистрирован: 17.05.05
|
|
Отправлено: 03.07.15 10:29. Заголовок: SergKis Понял !..
SergKis Понял !
|
|
|
|
Dima
|
| |
Пост N: 5047
Зарегистрирован: 17.05.05
|
|
Отправлено: 04.07.15 21:38. Заголовок: Не очень понял как ц..
Не очень понял как цеплять к ячейке BMP[ICO] из ресурса по условию. Может кто покажет простой пример или намек ?
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4359
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.07.15 22:02. Заголовок: Допустим в базе есть..
Допустим в базе есть поле Field->NEVENT (1,2,3,4,...) и по условию нужно показывать разные иконки. Можно так: Скрытый текст ////////////////////////////////////////////////////////////// // Выбор отображаемой иконки FUNCTION SetNumIcons() LOCAL RetBmp, mNEVENT := Field->NEVENT, ii ,RetIcon STATIC arrBmp:={},arrNameBmp:={} DO CASE CASE NEVENT = 0 RetIcon:="bEVENT0" CASE NEVENT = 1 RetIcon:="bEVENT1" CASE NEVENT = 2 RetIcon:="bEVENT2" CASE NEVENT = 3 RetIcon:="bEVENT3" OTHERWISE RetIcon:="bEVENT0" ENDCASE ii:=ascan(arrNameBmp,Reticon) if ii>0 RetBmp:=arrBmp[ii] else RetBmp:= LOADIMAGE(RetIcon) if !empty(RetBmp) aadd(arrBmp,RetBmp) aadd(arrNameBmp,RetIcon) endif endif RETURN RetBmp
| Тогда в бровсе назначай поле показа на 4 поле: // "Массив иконок bmp" aBmp := {,,,"SetNumIcons()"} IF LEN(aBmp) > 0 For ii:=1 to Len(aBmp) if !Empty(aBmp[ii]) &cBrw:aColumns[ii]:uBmpCell := &("{||"+aBmp[ii]+"}") &cBrw:aColumns[ii]:nAlign := nMakeLong( DT_CENTER, DT_CENTER ) endif Next ENDIF Но у меня пример уж очень мудрённый, через ини-файл считывание полей, обработки и т.д. Посмотри сам - https://cloud.mail.ru/public/Qimr/KjE9KUhcN
|
|
|
Dima
|
| |
Пост N: 5048
Зарегистрирован: 17.05.05
|
|
Отправлено: 05.07.15 08:52. Заголовок: Andrey Сенкс. Надо ..
Andrey Сенкс. Надо было сразу суть объяснить (это 3 строки ) , ну да ладно сам понял.
|
|
|
Dima
|
| |
Пост N: 5049
Зарегистрирован: 17.05.05
|
|
Отправлено: 05.07.15 08:58. Заголовок: Подсунул прозрачный ..
Подсунул прозрачный BMP и вывел в колонке , упс а у него есть свой фон. Если ту же BMP вывести на кнопке , все нормально. Как избавится от фона в бровсе для BMP ?
|
|
|
Haz
|
| |
Пост N: 586
Зарегистрирован: 20.02.11
|
|
Отправлено: 05.07.15 09:11. Заголовок: Andrey пишет: Но у ..
Andrey пишет: цитата: | Но у меня пример уж очень мудрённый, |
| и более того , в процедуре по ON CHANGE есть вызов Refresh() , что 100% приводит к зависаниюбровса стоит его прогнать стрелками вниз/вверх
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 714
Зарегистрирован: 17.02.12
|
|
Отправлено: 05.07.15 10:02. Заголовок: Dima Haz пишет: по ..
Dima Haz пишет: цитата: | по ON CHANGE есть вызов Refresh() , что 100% приводит к зависаниюбровса стоит его прогнать стрелками вниз/вверх |
| Мой (твой) пример Refresh(.F.) к зависанию не приводит, но по pgup или up ниже последней и назад - ломается веделенная закраска всей строки с фокусно ячейкой. Как то похитрее надо делать, может быть мтодом DrawLine(xRow) с цветами на пред.стоку и тек., без бутылки сразу не разберешься
|
|
|
Dima
|
| |
Пост N: 5050
Зарегистрирован: 17.05.05
|
|
Отправлено: 05.07.15 10:15. Заголовок: Помогите с BMP разоб..
Помогите с BMP разобраться
|
|
|
Haz
|
| |
Пост N: 587
Зарегистрирован: 20.02.11
|
|
Отправлено: 05.07.15 10:33. Заголовок: SergKis пишет: Мой ..
SergKis пишет: цитата: | Мой (твой) пример Refresh(.F.) к зависанию не приводит |
| Сергей, это пример с двойным курсором ? Сделайте в нем строк поболее ( я тупо нагенерил 1000 ) и нажав стрелку вниз НЕ отпуская до конца , потом так же вверх и глюк как на блюдечке Если отпускать стрелку вовремя - не проявляется. Двойной курсор как оказалось - очень просто делается , у меня на работе пример , в понедельник кину Или лучше Дима может сейчас кинуть. Dima пишет: цитата: | О первой колонке с галей говорю. |
| если разговор только про галю , то тут БМП не нужна т.к есть стандартная галя по логическому полю oBrw:aColumns[x]:lCheckBox := .T. ЗЫ. с фоном БМП уже пытался разобраться - не вышло , бросил (((
|
|
|
Dima
|
| |
Пост N: 5051
Зарегистрирован: 17.05.05
|
|
Отправлено: 05.07.15 11:00. Заголовок: Haz Не , галя не по..
Haz Не , галя не подходит. Нужна BMP. Подумал было что вот это ,что то изменит , но нет. oBrw:lTransparent:=TRUE Понятно что можно фон сделать который надо , но гиморно больно. Для каждого фона для одного и того же BMP , держать кучку клонов Оно как бы можно сырец ковырнуть и посмотреть что там происходит , но сходу правильное место не нашел. Похоже все рисуется в Сишнике в процедуре TSDrawCell Haz пишет: цитата: | Двойной курсор как оказалось - очень просто делается , у меня на работе пример , в понедельник кину Или лучше Дима может сейчас кинуть. |
| Да если надо выложу.
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 715
Зарегистрирован: 17.02.12
|
|
Отправлено: 05.07.15 11:18. Заголовок: Dima пишет:Да если н..
Dima пишет: Выложи. Пока TsBrowse отложил, но VO прогу переделывать придется, так что лучше сразу, потом сложнее будет.
|
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 716
Зарегистрирован: 17.02.12
|
|
Отправлено: 05.07.15 11:19. Заголовок: Haz пишет:Сделайте в..
Haz пишет: цитата: | Сделайте в нем строк поболее |
| так сделал и увидел
|
|
|
Dima
|
| |
Пост N: 5052
Зарегистрирован: 17.05.05
|
|
Отправлено: 05.07.15 11:24. Заголовок: SergKis пишет: Выло..
SergKis пишет: Колонкам делаем экзекуцию for i := 1 To oBrw:nColCount() oBrw:aColumns[ i ]:lFixLite := TRUE next Красим так примерно (на вкус и цвет товарищей нет ) oBrw:SetColor( { 6 }, { { |a,b,c| IF( c:nCell == b,{ RGB(198, 226, 255), RGB(0,196,196) },; { Rgb( 198, 226, 255 ), Rgb( 159, 207, 255 ) }) } } )
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 717
Зарегистрирован: 17.02.12
|
|
Отправлено: 05.07.15 11:50. Заголовок: Да, работает. Спасиб..
Да, работает. Спасибо. Видел в TSBrowse.chm цитата: | DBLCURSOR DOUBLE CURSOR FIXED Activates the double cursor feature on the freezed columns. |
| Но догадаться, для чего это цитата: | Активизирует функцию двойного курсора на отмороженных колонок |
| Google translit(c)
|
|
|
Dima
|
| |
Пост N: 5053
Зарегистрирован: 17.05.05
|
|
Отправлено: 05.07.15 13:34. Заголовок: В общем нашел я мест..
В общем нашел я место где происходит вывод картинок Это c_TBrowse.c Функция void DrawBitmap ( HDC hDC, HBITMAP hBitmap, int wRow, int wCol, int wWidth, int wHeight, DWORD dwRaster ) Есть там переменная dwRaster = SRCCOPY; Заменил ее на , с фоном порядочек , но цвет изображения инвертированный получился , по жизни он зеленый (галя на скрине выше) а вышла фиолетовая У кого есть мысли ?
|
|
|
Haz
|
| |
Пост N: 588
Зарегистрирован: 20.02.11
|
|
Отправлено: 05.07.15 13:51. Заголовок: Dima пишет: У кого ..
Dima пишет: а с этим пробовал SRCAND ?
|
|
|
Dima
|
| |
Пост N: 5054
Зарегистрирован: 17.05.05
|
|
Отправлено: 05.07.15 13:57. Заголовок: Haz пишет: а с этим..
Haz пишет: цитата: | а с этим пробовал SRCAND ? |
| конечно , результат черный фон. пробовал даже комбинации ........
|
|
|
Dima
|
| |
Пост N: 5055
Зарегистрирован: 17.05.05
|
|
Отправлено: 05.07.15 14:06. Заголовок: Игорь это у меня так..
Игорь это у меня такой кривой Axialis IconWorkshop оказывается. Пишет что прозрачный фон у картинки а на самом деле нет. Взял чужую картинку с прозрачным фоном , все отлично. Посему сделать в сырце нужно вот так dwRaster = SRCAND;
|
|
|
Haz
|
| |
Пост N: 589
Зарегистрирован: 20.02.11
|
|
Отправлено: 05.07.15 14:08. Заголовок: Dima пишет: Посему ..
Dima пишет: цитата: | Посему сделать в сырце нужно вот так dwRaster = SRCAND; |
| Погоняю завтра на работе ...
|
|
|
Dima
|
| |
Пост N: 5056
Зарегистрирован: 17.05.05
|
|
Отправлено: 05.07.15 14:53. Заголовок: я уже погонял. короч..
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 718
Зарегистрирован: 17.02.12
|
|
Отправлено: 05.07.15 20:31. Заголовок: Dima пишет: фон BMP ..
Dima пишет: цитата: | фон BMP надо делать белый |
| Попробовал из VO bmp с белым фоном - полет нормальный.
|
|
|
|
Dima
|
| |
Пост N: 5057
Зарегистрирован: 17.05.05
|
|
Отправлено: 05.07.15 21:25. Заголовок: Снова о Double Curso..
SergKis пишет: цитата: | Попробовал из VO bmp с белым фоном - полет нормальный. |
| OK Снова о Double Cursor. Вот так выглядит , без особого тюнинга. Но не трудно заметить что фон в 4 ячейке красится по условию и когда курсор там лежит , то этой окраске труба Еще вопрос: Full oBrw:nLineStyle := 1 Only vertical lines oBrw:nLineStyle := 2 Only horizontal lines oBrw:nLineStyle := 4 No lines oBrw:nLineStyle := 0 Пока стоит у меня 1 , вроде ни чего так. В консоли если сравнивать была бы 2. В общем пробнул все варианты включая 5 и 3 И так и не понял как лучше и как быстрее будет для самого бровса. Быстрее будет конечно с nLineStyle := 0 , но выглядит как то вяло все Кто как юзает ? PS Смотрел таблички в задачах на DELPHI , там летает все и ни чего не "подмаргивает" , просто хотелось улучшить Tsbrowse в плане прорисовки и скорости.
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4360
Зарегистрирован: 12.09.06
|
|
Отправлено: 06.07.15 00:17. Заголовок: Dima пишет: Смотрел..
Dima пишет: цитата: | Смотрел таблички в задачах на DELPHI , там летает все и ни чего не "подмаргивает" |
| Там двойная буферизация при выводе на экран. Кто нам сделает такое же в МиниГуи - вопрос открыт ! Dima пишет: цитата: | просто хотелось улучшить Tsbrowse в плане прорисовки и скорости. |
| Аналогично. Мне бы тоже хотелось иметь готовые примеры как нужно делать то или иное в Tsbrowse.
|
|
|
Dima
|
| |
Пост N: 5058
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.07.15 08:52. Заголовок: Andrey пишет: Там д..
Andrey пишет: Ну по идее (хотя в си я валенок) надо в сырцах TsBrowse где идут вызовы SendMessage(...) 4-ым параметром передавать LVS_EX_DOUBLEBUFFER Только надо знать в каком из них (SendMessage) это сделать. Хотя, нет....... В Tsbrowse есть InitDialogBrowse , вот надо как то перед его вызовом поиграть с doublebuffer := _HMG_aControlMiscData1 [i,19] Возможно в Function _DefineTBrowse в _HMG_aControlMiscData1 [k] := 0 , вместо этого сделать так _HMG_aControlMiscData1 [k] := { , , , , , , , , , , , , , , , , , , TRUE }
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 719
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.07.15 09:12. Заголовок: Dima если меняем ис..
Dima если меняем исходники TsBrowse, вопросик А ты делел, по совету Haz, добавление cName (своего имени колонки) в TSColumn ? CLASS TSColumn DATA cName INIT "" ... Я да, и еще тронул METHOD GetColumn( nCol ) CLASS TSBrowse Default nCol := 1 IF hb_IsString( nCol ) nCol := Max( AScan( ::aColumns, {|oCol| Upper(oCol:cName)==Upper(nCol) } ), 1) RETURN ::aColumns[ nCol ] // returns a Column object ENDIF If nCol < 1 nCol := 1 ElseIf nCol > Len( ::aColumns ) nCol := Len( ::aColumns ) EndIf Return ::aColumns[ nCol ] // returns a Column object может и еще надо было бы пройтись, но пока этим обхожусь
|
|
|
Dima
|
| |
Пост N: 5059
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.07.15 09:15. Заголовок: SergKis Нет этого н..
SergKis Нет этого не делал. О DoubleBuffer читал , мыслю верно ? Я о _HMG_aControlMiscData1 [k] := 0 функции _DefineTBrowse
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 720
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.07.15 09:23. Заголовок: Dima так глубоко ещ..
Dima так глубоко еще не лазил (как устроено не копал), по простым методам не прошел даже. Получается, как ты говорил "зашел на 5 минут", а вышел через неделю и не заметил. В Browse и вернулся по этим причинам.
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 721
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.07.15 09:33. Заголовок: Dima пишет:Я о _HMG_..
Dima пишет: цитата: | Я о _HMG_aControlMiscData1 [k] := 0 функции _DefineTBrowse |
| В др.контролах это контейнер внутренних данных, в TsBrowse нашел только это METHOD EditExit line 3950 If ValType( oCol:oEdit ) == "O" DO CASE CASE "TGETBOX" $ Upper( oCol:oEdit:ClassName() ) ix := GetControlIndex ( ::cChildControl, ::cParentWnd ) nKey := _HMG_aControlMiscData1 [ix][3] SetFocus( ::hWnd ) // JP 1.59 CASE "TBTNBOX" $ Upper( oCol:oEdit:ClassName() ) .and. lSpinner не считая функции _DefineTBrowse
|
|
|
Dima
|
| |
Пост N: 5060
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.07.15 09:57. Заголовок: Тогда не понятно как..
Тогда не понятно как корректно в 19 элемент сложить TRUE
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 722
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.07.15 10:33. Заголовок: Dima LVS_EX_DOUBLEB..
Dima LVS_EX_DOUBLEBUFFER - это для ListView, т.е. дл Browse, Grid
|
|
|
Haz
|
| |
Пост N: 590
Зарегистрирован: 20.02.11
|
|
Отправлено: 06.07.15 10:39. Заголовок: SergKis пишет: може..
SergKis пишет: цитата: | может и еще надо было бы пройтись, но пока этим обхожусь |
| Сергей, я еще это менял ( номера строк примерные т.к. дома не актуальные исходники ) добавил код чтобы по ENTER и SPACE вызывался код дабл клика мышкой в широком курсоре 6396 Case !::lCellbrw .And. (nKey == 13 .Or. nKey == 32 ) If ::bLDblClick != Nil Eval( ::bLDblClick ) EndIf Otherwise Выход из редактирования при потере фокуса ячейкой с СОХРАНЕНИЕМ редакции ( как Excel ) // if nKey == 0 3915 // lLostFocus := .T. Закоментировал и изменил условие ниже с nKey > 0 на nKey >= 0 // endif 3919 If ! lLostFocus .and. nKey >= 0 .and. (nKey != VK_ESCAPE .or. ::nColSpecHd != 0) .and. ;
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 723
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.07.15 10:40. Заголовок: Haz Спасибо. :sm36..
Haz Спасибо.
|
|
|
Dima
|
| |
Пост N: 5061
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.07.15 10:41. Заголовок: SergKis пишет: LVS_..
SergKis пишет: цитата: | LVS_EX_DOUBLEBUFFER - это для ListView, т.е. дл Browse, Grid |
| То есть не для TSBROWSE......??? , который в свою очередь юзает InitDialogBrowse из h_browse.prg в котором и считывается doublebuffer := _HMG_aControlMiscData1 [i,19] и затем скармливается SendMessage. Можно тупо закоментить doublebuffer := _HMG_aControlMiscData1 [i,19] и написать doublebuffer := TRUE
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 724
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.07.15 10:56. Заголовок: Dima это где ? не в..
Dima это где ? не вижу, ткни цитата: | который в свою очередь юзает InitDialogBrowse из h_browse.prg в котором и считывается doublebuffer := _HMG_aControlMiscData1 [i,19] и затем скармливается SendMessage. |
|
|
|
|
Dima
|
| |
Пост N: 5062
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.07.15 11:06. Заголовок: Вызов InitDialogBrow..
Вызов InitDialogBrowse есть в SOURCE\TsBrowse\h_tbrowse.prg Сам InitDialogBrowse живет в сырцах Минигуи в h_browse.prg , строка примерно 296 Там чуть ниже и считывается doublebuffer из массива _HMG_aControlMiscData1
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 725
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.07.15 11:18. Заголовок: туда попадаем при i..
туда попадаем при if _HMG_BeginDialogActive а унас ситуация else и oBrw := TSBrowse():New( ControlName, nRow, nCol, nWidth, nHeight,;
|
|
|
Dima
|
| |
Пост N: 5063
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.07.15 13:29. Заголовок: SergKis Попробовал ..
SergKis Попробовал сделать по аналогии с обычным бровсом в Function _DefineTBrowse в самом конце перед Return if .Not. _HMG_DialogInMemory SendMessage( ControlHandle, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_DOUBLEBUFFER) endif Пересобрал , видимого эффекта не обнаружил , все по старому............ Наверное там не все так просто если Григорий этого не сделал после того как в Grid и бровсе был введен DOUBLEBUFFER. Фсё , у меня мысли кончились в плане DOUBLEBUFFER
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 726
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.07.15 14:09. Заголовок: Dima LVS_EX_DOUBLEB..
Dima LVS_EX_DOUBLEBUFFER это ListView контрол от Мвйкрософта и появилось то ли с Висты, то ли с 7ки, раньше вроде не было. а TsBrowse типа самописный, так что ...
|
|
|
Dima
|
| |
Пост N: 5064
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.07.15 14:11. Заголовок: SergKis Понял. Посл..
SergKis Понял. Последняя попытка ;) Пробнул вот так еще в своем сырце после END WINDOW ListView_ChangeExtendedStyle ( GetControlHandle('oBrwm','MAGAZIN'), LVS_EX_DOUBLEBUFFER, NIL ) Эффекта не увидел. Тут не катит такое ? PS Похоже не катит........
|
|
|
Dima
|
| |
Пост N: 5065
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.07.15 14:45. Заголовок: SergKis А в обычном..
SergKis А в обычном бровсе не TS , супер хидер возможен ? Сделать двойной курсор можно ?
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 727
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.07.15 14:48. Заголовок: Dima пишет:Похоже не..
Dima пишет: Можно пробовать через WM_SETREDRAW, но это копать надо (и прокатит ли): // BAA HB_FUNC( LOCKREDRAW ) { HWND hWnd = ( HWND ) hb_parnl( 1 ); if( hb_parl(2) ) SendMessage( hWnd, WM_SETREDRAW, 0, 0); // .T. - блокировать else SendMessage( hWnd, WM_SETREDRAW, 1, 0); // .F. - разблокировать }
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 728
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.07.15 14:53. Заголовок: Dima пишет:А в обычн..
Dima пишет: цитата: | А в обычном бровсе не TS , супер хидер возможен ? Сделать двойной курсор можно ? |
| Нет и многострочную строку тоже нельзя. Я горожу (1,2 места) простенький суперхидер от размеров колонок на базе ButtonEx, но сам понимаешь ...
|
|
|
Dima
|
| |
Пост N: 5066
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.07.15 14:55. Заголовок: Прокатило LOCKREDRAW..
Прокатило LOCKREDRAW(GetControlHandle('oBrwm','MAGAZIN'),.T.) только после этого бровс не рисуется совсем. куда ее правильно пристроить ?
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 729
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.07.15 14:59. Заголовок: Dima пишет:куда ее п..
Dima пишет: цитата: | куда ее правильно пристроить ? |
| Вот тут и копать начинать надо Я не очень влез в тексты TsBrowse, что бы ответить
|
|
|
Dima
|
| |
Пост N: 5067
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.07.15 15:04. Заголовок: Ладно пробну пихнуть..
Ладно пробну пихнуть ее METHOD Display() CLASS TSBrowse ::BeginPaint() ::Paint() ::EndPaint() Перед ::Paint() включу а после выключу
|
|
|
Dima
|
| |
Пост N: 5068
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.07.15 15:09. Заголовок: Сделал , шустрее бро..
Сделал , шустрее бровс не стал ))))
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 730
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.07.15 15:20. Заголовок: Dima пишет:Сделал , ..
Dima пишет: цитата: | Сделал , шустрее бровс не стал |
| И не должен. Этим можно убрать мелькание.
|
|
|
Dima
|
| |
Пост N: 5069
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.07.15 15:22. Заголовок: SergKis пишет: Эти..
SergKis пишет: цитата: | Этим можно убрать мелькание. |
| Оно осталось ;) Таблица не мерцает а вот курсор да.
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 731
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.07.15 15:28. Заголовок: Dima Pasha писал Ещ..
Dima Pasha писал цитата: | Еще tbrowse любит все время опрашивать RecCount(), на каждой записи... |
| может еще в эту сторону смотреть для увеличения быстроты А по поводу мерцания ничего не скажу - нет мыслей
|
|
|
Dima
|
| |
Пост N: 5070
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.07.15 15:32. Заголовок: SergKis пишет: Еще ..
SergKis пишет: цитата: | Еще tbrowse любит все время опрашивать RecCount(), |
| я пока на массиве юграю , поэтому RecCount() не при делах. Всё мысли и у меня кончились......с утра думал минут 5 поиграть а уже скоро 16-00 ))
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 732
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.07.15 15:42. Заголовок: Dima пишет:с утра ду..
Dima пишет: цитата: | с утра думал минут 5 поиграть а уже скоро 16-00 |
| Вот и я волевым усилием отложил TsBrowse, а то сядешь играть ..., а неделя прошла. Работа стоит, а время идет (c)
|
|
|
Dima
|
| |
Пост N: 5071
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.07.15 15:47. Заголовок: SergKis пишет: сяде..
SergKis пишет: цитата: | сядешь играть ..., а неделя прошла. |
| Это точно Смотрю там всем рисованием занимается сишная функция HB_FUNC( TSDRAWCELL ) возможно надо там копать , но в сях я не силен.
|
|
|
Dima
|
| |
Пост N: 5072
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.07.15 16:32. Заголовок: Еще вопрос по TS :s..
Еще вопрос по TS Если зажать и держать PGDN , то листается не весь бровс целиком как ожидалось а только в пределах строки курсора. Этот эффект как то отключается ? Смотрел oBrw:lPageMode , это не то. PS Глянул , не отключается. Только лишь переделкой лечится.
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4373
Зарегистрирован: 12.09.06
|
|
Отправлено: 07.07.15 22:49. Заголовок: Стрес-тест для TBROW..
Стрес-тест для TBROWSA. Открываю базу через инет (Leto) - 5 миллионов записей, при создании окна и TBROWSA тормозит немного 5-7 сек., но ничего открывает по выбору 97 тыс. записей... маркер немного вальяжно ходит... Но этоже всётаки 97 тыс. записей в бровсе.... Единственно глюк - на скролинге не отображается положение в базе и если за него подвигать вверх/вниз - ВИСНЕТ НАГЛУХО ! Что там можно исправить ? Исходники здесь - https://cloud.mail.ru/public/6Tw4/JGGSA941Q
|
|
|
Dima
|
| |
Пост N: 5080
Зарегистрирован: 17.05.05
|
|
Отправлено: 07.07.15 23:11. Заголовок: Andrey пишет: Откры..
Andrey пишет: цитата: | Открываю базу через инет (Leto) |
| Лето не у всех установлен , так что давай тест под CDX PS Копирайт рано вешать )))
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4374
Зарегистрирован: 12.09.06
|
|
Отправлено: 08.07.15 07:04. Заголовок: Dima пишет: Лето не..
Dima пишет: цитата: | Лето не у всех установлен , так что давай тест под CDX |
| Там переключатель есть на DBFCDX, будет работать стандартный драйвер. Только при первом запуске надо кнопку "колёсико" выбрать и указать кол-во записей для создания базы ! Если заново нужно создать базу, то нужно удалить уже созданную базу. Копирайт потом общий повешу, без вашей общей помощи - не создал бы такой тест !
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 733
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.07.15 08:25. Заголовок: Andrey пишет:Что там..
Andrey пишет: цитата: | Что там можно исправить ? |
| -установить цитата: | RddInfo( RDDI_BUFKEYCOUNT, <lSet>,, [nConnection] ) По умолчаниюю флаг RDDI_BUFKEYCOUNT не установлен. Если он не установлен, функция ordKeyCount() запращивает значение количества ключей с сервера, если установлен - использует последнее значение, полученное с сервера. RddInfo( RDDI_BUFKEYNO, <lSet>,, [nConnection] ) По умолчаниюю флаг RDDI_BUFKEYNO не установлен. Если он не установлен, функция ordKeyNo() запращивает значение сервера, если установлен - использует последнее значение, полученное с сервера. |
| -убрать OdKeyCount из on change -не знаю как skip буффер заполняется данными из fpt, но я бы мах избавился от memo полей, с инф. типа адрес, телефон, ...
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4375
Зарегистрирован: 12.09.06
|
|
Отправлено: 08.07.15 08:30. Заголовок: SergKis пишет: -не ..
SergKis пишет: цитата: | -не знаю как skip буффер заполняется данными из fpt, но я бы мах избавился от memo полей, с инф. типа адрес, телефон, ... |
| Ну это сложно. Юзера вечно хотят свои примечания писать. Адрес, телефон в этом тесте просто выступают как образец. А так конечно согласен, чем меньше мемо, тем лучше. SergKis пишет: цитата: | RddInfo( RDDI_BUFKEYCOUNT, <lSet>,, [nConnection] ) |
| А в каком месте программы ? Там где Leto коннектится или в другом месте ?
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 734
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.07.15 08:42. Заголовок: Andrey пишет:Ну это ..
Andrey пишет: цитата: | Ну это сложно. Юзера вечно хотят свои примечания писать |
| У нас "хвост управляет собакой" или наоборот ? Я делаю поле через разделитель ~0.5k-3k как для aTokens цитата: | Там где Leto коннектится или в другом месте ? |
| RddInfo - инф. для rdd, вот и ставь соответственно
|
|
|
Dima
|
| |
Пост N: 5082
Зарегистрирован: 17.05.05
|
|
Отправлено: 08.07.15 11:30. Заголовок: Сергей а ништяки тип..
Сергей а ништяки типа RDDI_BUFKEYNO , RDDI_BUFKEYCOUNT это для Leto только ? Посмотрел DBINFO.CH там нет такого.
|
|
|
Haz
|
| |
Пост N: 599
Зарегистрирован: 20.02.11
|
|
Отправлено: 08.07.15 11:32. Заголовок: Andrey пишет: Стрес..
Andrey пишет: Тест конечно стресс но не для бровса,, а для автора т.к. надо немного менять код 1. Переписать так чтобы не было везде понатыкано MyFocusBrw() , как минимум в ON CHANGE - это место крайне чувствительно ко всяким лишним действиям 2. Когда ставиться Scope - бровс об это ничего не знает , ему не сказали что логическая длина базы съехала. Отсюда и косяк на скролере ( пример как сказать есть в TSBFilter , что фильтр что скоп итог один - бровсу кормят не то количество на которое он инициализировался ) - нужен :Reset() 3. Нагенерил 100 000 на локальном компе тормозов нет PS. Сергей верно сказал - мемо поля это помойка в которой тяжело искать , и уменьшай объем передаваемых данных в буфер записи при Skip. Узкое место скорость передачи PPS Вспомнил позднее - по поводу мемо полей мы уже говорили и ты что то делал подобное - мемо показывать не в бровсе а в отдельной области окна , и только для текущей записи . Читать мемо можно c задержкой , чтоб не тормозил бровс при навигации . Я у себя тупо через таймер и массив комманд реализовал , по ON CHANGE в массив комманд пишется N записи по которой перечитать мемо и обнуляется счетчик задержки примерно 500 мс. При контроле этого счетчика , если он достиг 500 читаем последнее значение из массива и по нему мемо, при этом обнуляя массив. Т.е мемо подчитывается через пол секунды после того как пользователь перестал давить на кнопки управления
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 735
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.07.15 14:27. Заголовок: Dima пишет: ништяки ..
Dima пишет: цитата: | ништяки типа RDDI_BUFKEYNO , RDDI_BUFKEYCOUNT это для Leto только ? |
| Ты совершенно прав, цитата и ништяки из letodb, а cdx и без них тянет.
|
|
|
Dima
|
| |
Пост N: 5083
Зарегистрирован: 17.05.05
|
|
Отправлено: 08.07.15 14:33. Заголовок: SergKis пишет: а cd..
SergKis пишет: Да меня больше ADSCDX интересовал.
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 736
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.07.15 14:34. Заголовок: Haz пишет:и уменьшай..
Haz пишет: цитата: | и уменьшай объем передаваемых данных в буфер записи при Skip. Узкое место скорость передачи |
| Для browse лучше skip буфер делать в кол-во строк browse, иначе идет набор рывками (особенно видно в модемном соединении), для TSB, думаю тоже, не пробовал с letodb (пока с cdx вопросы)
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 737
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.07.15 14:42. Заголовок: Dima пишет:Да меня б..
Dima пишет: цитата: | Да меня больше ADSCDX интересовал. |
| Думаю, надо править сырец TSB, ввести переменную и заносить значение OrdKeyCount() при создании TSB, а в блоках кода по умолчанию (и своих) использовать ее, когда надо, самому обновлять значение переменной.
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4376
Зарегистрирован: 12.09.06
|
|
Отправлено: 08.07.15 16:04. Заголовок: Haz пишет: Тест кон..
Haz пишет: цитата: | Тест конечно стресс но не для бровса,, а для автора т.к. надо немного менять код |
| Для этого и вас всех просил посмотреть ! Haz пишет: цитата: | 3. Нагенерил 100 000 на локальном компе тормозов нет |
| Нужно по сетке хотя бы проверить.... И побольше базу ....
|
|
|
Dima
|
| |
Пост N: 5087
Зарегистрирован: 17.05.05
|
|
Отправлено: 08.07.15 16:48. Заголовок: Haz пишет: Когда ст..
Haz пишет: цитата: | Когда ставиться Scope - бровс об это ничего не знает |
| А вот с этого места можно поподробнее как для домохозяек ? Если я работаю по сети и в базе 100 записей. Завел новую запись 101 а по сети в это время добавили запись 102 , я ее не увижу ? В консоли с этим нет проблем. Молчу уже про Scope , Фильтра.........
|
|
|
Haz
|
| |
Пост N: 600
Зарегистрирован: 20.02.11
|
|
Отправлено: 08.07.15 20:12. Заголовок: Dima пишет: В консо..
Dima пишет: цитата: | В консоли с этим нет проблем. |
| думаю и в консоли при сформированном бровсе по полной базе , а какая то прцудура выставит фильтр , то бровсу как минимум :RefreshAll() потребуется . Проблемы такие же как и в консоли , к примеру если коллега отредактирует запись которая у меня висит перед глазами в бровсе , я не увижу изменений пока не обновлю запись
|
|
|
Haz
|
| |
Пост N: 601
Зарегистрирован: 20.02.11
|
|
Отправлено: 08.07.15 20:13. Заголовок: SergKis пишет: Для ..
SergKis пишет: цитата: | Для browse лучше skip буфер делать в кол-во строк browse, |
| Спасибо, проверю !
|
|
|
Dima
|
| |
Пост N: 5089
Зарегистрирован: 17.05.05
|
|
Отправлено: 08.07.15 21:23. Заголовок: Haz пишет: то бровс..
Haz пишет: цитата: | то бровсу как минимум :RefreshAll() потребуется . |
| Конечно я его делаю и в консоли , когда это требует логика проги. Все понял !
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 780
Зарегистрирован: 17.02.12
|
|
Отправлено: 03.08.15 08:14. Заголовок: Смотрю проблема cVal..
Смотрю проблема cValToChar(xValue) для чисел так и не решилась с давних времен http://clipper.borda.ru/?1-20-0-00000485-000-0-0-1150783273 Пост N: 191 FUNCTION cValToChar( xValue ) LOCAL cType := ValType( xValue ) LOCAL cValue := "", nDecimals if cType == 'N' if xValue == int(xValue) nDecimals := 0 else nDecimals := Set( _SET_DECIMALS ) endif endif DO CASE CASE cType $ "CM"; cValue := xValue CASE cType == "N" ; cValue := LTrim( Str( xValue, 20, nDecimals ) ) ... на мой взгляд применение (убрав строки определения nDecimals) CASE cType == "N" ; cValue := hb_ntos( xValue) работают правильнее для разных значений дробной части числа
|
|
|
gfilatov2002
|
| moderator
|
Пост N: 799
Зарегистрирован: 11.02.10
|
|
Отправлено: 03.08.15 10:52. Заголовок: SergKis пишет: проб..
SergKis пишет: цитата: | проблема cValToChar(xValue) для чисел так и не решилась |
| Благодарю за напоминание! Поправил для следующей сборки
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 781
Зарегистрирован: 17.02.12
|
|
Отправлено: 03.08.15 14:39. Заголовок: Подскажите (не вижу)..
Подскажите (не вижу), есть ли в MiniGui готовая функция для получения объекта TSBrowse по имени контрола и формы. Типа FUNCTION _GetObjTSBrowse( ControlName, ParentForm, nIndex) LOCAL oBrw LOCAL i := iif(pCount() > 2, nIndex, GetControlIndex(ControlName,ParentForm)) IF i > 0; oBrw:= _HMG_aControlIds [ i ] ENDIF RETURN oBrw
|
|
|
gfilatov2002
|
| moderator
|
Пост N: 800
Зарегистрирован: 11.02.10
|
|
Отправлено: 03.08.15 16:03. Заголовок: SergKis пишет: есть..
SergKis пишет: цитата: | есть ли в MiniGui готовая функция для получения объекта TSBrowse |
| Нет такой функции
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 782
Зарегистрирован: 17.02.12
|
|
Отправлено: 03.08.15 16:24. Заголовок: gfilatov2002 пишет:Н..
gfilatov2002 пишет: Выпадает TsBrowse из общей организации MiniGui. Нет тогда и min псевдообъекта oTSB := wForma.Magazin.Object
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4444
Зарегистрирован: 12.09.06
|
|
Отправлено: 12.08.15 19:53. Заголовок: Всем привет. Тестир..
Всем привет. Тестирую TBROWSE через сервер на медленном соединение... Не очень приятно видеть как TBROWSE медленно перерисовывает окно и саму таблицу. В терминалке была команда DispBegin() и DispEnd(). Есть ли такая команда для МиниГуи TBROWSE ?
|
|
|
Dima
|
| |
Пост N: 5210
Зарегистрирован: 17.05.05
|
|
Отправлено: 12.08.15 21:22. Заголовок: Andrey пишет: Тести..
Andrey пишет: цитата: | Тестирую TBROWSE через сервер на медленном соединение... |
| Тут тема про T SBROWSE... ЗЫ А по вопросу , коли медленный коннект повесь какой то индикатор или типа того...
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4446
Зарегистрирован: 12.09.06
|
|
Отправлено: 12.08.15 21:33. Заголовок: Dima пишет: При чем..
Dima пишет: Как читаю, так и написал: DEFINE TBROWSE oBrw3 ; AT 160,2 ; WIDTH nWinWidth-2*2 ; HEIGHT nWinHeight - 160*2 ; ON CHANGE { || ChangeBrowse("oBrw3") } ; ON GOTFOCUS ChangeBrowse("oBrw3") ; BACKCOLOR aBackColor ; CELL и т.д.
|
|
|
Dima
|
| |
Пост N: 5211
Зарегистрирован: 17.05.05
|
|
Отправлено: 12.08.15 21:37. Заголовок: Andrey Думаешь Disp..
Andrey Думаешь DispBegin() и DispEnd() ......аналоги...помогут ? Что то сомневаюсь. PS Есть там BeginPaint() и EndPaint()
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4447
Зарегистрирован: 12.09.06
|
|
Отправлено: 12.08.15 21:42. Заголовок: Dima пишет: А по во..
Dima пишет: цитата: | А по вопросу , коли медленный коннект повесь какой то индикатор или типа того... |
| Во первых не знаю как определить - медленный коннект или нет ? Во вторых - видно как T SBROWSE строит по ячейкам таблицу - визуально, медленно и не спеша. А при нажатии на стрелки- вверх/вниз видно как перерисовывается маркер/курсор. Для терминального TBROWSE были команды DispBegin() и DispEnd(), т.е. саму перерисовку пользователь не видел. Это классные команды ! Вот и хотелось бы узнать как провернуть такой же финт для T SBROWSE ?
|
|
|
Dima
|
| |
Пост N: 5212
Зарегистрирован: 17.05.05
|
|
Отправлено: 12.08.15 21:55. Заголовок: Andrey Сделай проще..
Andrey Сделай проще ))) Напиши , идет загрузка данных в лейбе индикатора а уж после загрузки покажи бровс. Не то ?
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4448
Зарегистрирован: 12.09.06
|
|
Отправлено: 12.08.15 22:05. Заголовок: Dima пишет: Напиши ..
Dima пишет: цитата: | Напиши , идет загрузка данных в лейбе индикатора а уж после загрузки покажи бровс. Не то ? |
| То что надо. А как сделать то ? Я сейчас на медленном коннекте вижу как прорисовывается вся таблица.
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 792
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.08.15 22:44. Заголовок: Andrey пишет:Я сейча..
Andrey пишет: цитата: | Я сейчас на медленном коннекте вижу как прорисовывается вся таблица. |
| Все верно, tbrows ходит (skip-ует) по базе, время обновления skip-буф. мало, он снова заполняется и получаешь то, что видишь цитата: | То что надо. А как сделать то ? |
| Твой же пример WAIT_WINDOW с потоком и без, сделай аналогично, повесь анимацию, отбери в массив или memio и показывай.
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4462
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.08.15 14:16. Заголовок: Помогите разобраться..
Помогите разобраться с глюком мышки. Пример MiniGUI\SAMPLES\Advanced\Tsb_config На самом Tsbrowse нажимаем правую кнопку мышки и выбираем "Enable display of deleted records" Клавиша PgDown до последней странице - нумерация строк (1-я колонка) в Tsbrowse - нормальная. Если крутить колёсиком мышки - нумерация строк (1-я колонка) неправильная. Как исправить ?
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4464
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.08.15 14:52. Заголовок: Собрал в новой верси..
Собрал в новой версии MiniGUI 2.5.1 - глюк тоже есть ! Вот так выглядит на экране: Если листать клавишей PageDown - то глюка нет ! Помогите пожалуйста исправить, юзера будут просто ВОПИТЬ - куда делись договора...
|
|
|
Haz
|
| |
Пост N: 629
Зарегистрирован: 20.02.11
|
|
Отправлено: 24.08.15 18:06. Заголовок: Andrey пишет: Если ..
Andrey пишет: цитата: | Если листать клавишей PageDown - то глюка нет |
| Это не глюк , минигуй тут не причем. Это ошибки алгоритма заложенного в пример. Меняй алгоритм и не переназначай внутренние переменные бровса если не уверен в том как это работает. Нет времени заниматься поиском косяков в чужом коде , вот куски кода которые корректно работают SET DELETED OFF .... INDEX ON Number TAG "ALL" INDEX ON Number TAG "DEL" FOR ( !Deleted() ) .... oBrw:bChange := { || oBrwChange() } .... STATIC FUNCTION oBrwChange() LOCAL cVal := HB_NToS( (oBrw:cAlias)->(OrdKeyNo()) ) + ' / ' + HB_NToS( (oBrw:cAlias)->(OrdKeyCount()) ) Form_0.StatusBar.Item(3) := " RecnO: " + cVal Form_0.oBrw.Setfocus RETURN Nil .... FUNCTION RecnoViewDel(lVal) LOCAL cMsg IF lVal (oBrw:cAlias)->(DbSetOrder("ALL")) cMsg := "Included a display of deleted records !" ELSE (oBrw:cAlias)->(DbSetOrder("DEL")) cMsg := "Offline mode display of deleted records !" ENDIF oBrw:Reset() MsgInfo(cMsg ) Eval( oBrw:bChange ) RETURN Nil
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4466
Зарегистрирован: 12.09.06
|
|
Отправлено: 24.08.15 23:37. Заголовок: Haz Спасибо ! Буду п..
Haz Спасибо ! Буду переделывать.... И еще заметил странность, если подёргать клавишами PageDown, PageUP а потом погонять клавишей стрелка вниз, то TsBrowse вешает программу наглухо.
|
|
|
Haz
|
| |
Пост N: 630
Зарегистрирован: 20.02.11
|
|
Отправлено: 25.08.15 10:38. Заголовок: Andrey пишет: TsBro..
Andrey пишет: цитата: | TsBrowse вешает программу наглухо. |
| Все верно, так и должно быть Перечитай эту ветку, один форумчанин примерно месяц назад. уже указывал тебе на эти грабли в твоем примере.
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4467
Зарегистрирован: 12.09.06
|
|
Отправлено: 25.08.15 17:51. Заголовок: Haz пишет: Перечита..
Haz пишет: цитата: | Перечитай эту ветку, один форумчанин примерно месяц назад. уже указывал тебе на эти грабли в твоем примере. |
| Да пока сам на грабли еще раз не наткнёшься, ни фига не запомнишь ! Только не всегда это происходит... Пост N: 586 Haz пишет: цитата: | и более того , в процедуре по ON CHANGE есть вызов Refresh() , что 100% приводит к зависаниюбровса стоит его прогнать стрелками вниз/вверх |
| Пост N: 717 SergKis пишет: цитата: | Мой (твой) пример Refresh(.F.) к зависанию не приводит, но по pgup или up ниже последней и назад - ломается веделенная закраска всей строки с фокусно ячейкой. Как то похитрее надо делать, может быть мтодом DrawLine(xRow) с цветами на пред.стоку и тек., без бутылки сразу не разберешься |
| Так же ломается счетчик записей левой колонки. Можно туда прикрутить в саму БИБЛИОТЕКУ - чтобы это не ломалось ?
|
|
|
Haz
|
| |
Пост N: 631
Зарегистрирован: 20.02.11
|
|
Отправлено: 25.08.15 17:57. Заголовок: в чем проблема ? пок..
в чем проблема ? показывай в первой колонке OrdKeyNo()
|
|
|
Haz
|
| |
Пост N: 632
Зарегистрирован: 20.02.11
|
|
Отправлено: 25.08.15 18:17. Заголовок: Haz пишет: Только н..
Andrey пишет: цитата: | Только не всегда это происходит... |
| Это происходит ВСЕГДА если в ON CHANGE есть Refresh() и бежать по длинной базе не отрывая пальца по стрелки вниз или вверх достаточно долго. Если почитать дальше 717 714 поста то там есть и пост 587 и ответ на него 716 . Читать надо внимательнее
|
|
|
Haz
|
| |
Пост N: 633
Зарегистрирован: 20.02.11
|
|
Отправлено: 25.08.15 18:28. Заголовок: Andrey пишет: Так ж..
Andrey пишет: цитата: | Так же ломается счетчик записей левой колонки. |
| в DBFCDX нет логического нумератора строк , кроме как номер ключа при наличии индекса. в TSBrowse ::nAt - тоже не нумератор , он может и отрицательные значения принимать Поэтому как отобразить логический номер - головняк разработчика программы где используется TSBrowse PS nAt совпадает с логическим номером только при бровсе по массиву.
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4468
Зарегистрирован: 12.09.06
|
|
Отправлено: 25.08.15 18:40. Заголовок: Понял. Спасибо БОЛЬШ..
Понял. Спасибо БОЛЬШОЕ ! Вопрос по ломке нумерации - это происходит ТОЛЬКО мышкой и клавишей стрелка вниз, когда находишься на последней строке в бровсе. Как то можно отловить этот момент и не давать маркеру/курсору скакнуть вниз ? Тогда и ломаться нумерация не будет. Но может я и не прав...
|
|
|
Dima
|
| |
Пост N: 5242
Зарегистрирован: 17.05.05
|
|
Отправлено: 25.08.15 21:21. Заголовок: Andrey Что бы не флу..
Andrey Что бы не флудить еще пару-тройку страниц , самодостаточный пример. Ни чего не глючит , не виснет и "ездит" как нужно Да простит меня Has Скрытый текст #include "minigui.ch" #include "tsbrowse.ch" MEMVAR oBrw FUNCTION Main() LOCAL cDbf := 'Test.dbf' LOCAL i := 0 REQUEST DBFCDX SET CENTURY ON SET DELETED OFF RDDSETDEFAULT('DBFCDX') if !file(cDbf) DBCreate( cDbf , {{"String", "C", 50 , 0}, {"number", "N", 5, 0} } ) USE (cDbf) Excl New Alias "TEST" FOR i := 1 TO 200 TEST->(DbAppend()) TEST->String := RandStr(50) TEST->Number := Random( 200) IF( i % 3 == 0, TEST->(DbDelete()) , NIL ) END INDEX ON Number TAG "ALL" TO ("TEST") INDEX ON Number TAG "DEL" TO ("TEST") FOR ( !Deleted() ) USE end DEFINE WINDOW Form_0 ; At 0, 0 ; WIDTH 800 ; HEIGHT 450 ; TITLE 'TsBrowse sample' ; ICON 'lupa.ico' ; MAIN ; DEFINE STATUSBAR SIZE 10 BOLD STATUSITEM "" STATUSITEM "Right mouse button - the popup menu TBROWSE" WIDTH 380 STATUSITEM " Recno: 0/0" WIDTH 200 STATUSITEM "Alias: "+ ALIAS() WIDTH 115 DATE END STATUSBAR END WINDOW USE (cDbf) Shared New Alias "TEST" INDEX ("TEST.CDX") TEST->(OrdSetFocus("DEL")) CreateBrowse( "oBrw", 'Form_0', 30, 2, Form_0.Width-20, Form_0.Height-95, 'TEST' ) AEval( oBrw:aColumns, { |oCol| oCol:lEdit := oCol:lFixLite := TRUE } ) oBrw:SetColor( { 6 }, { { |a,b,c| IF( c:nCell == b, { Rgb( 66, 255, 236 ), Rgb( 111, 183, 155 ) } , { Rgb( 220, 220, 220 ), Rgb( 220, 220, 220 ) }) } } ) // фон курсора oBrw:bChange := { || oBrwChange() } oBrw:lNoChangeOrd := .T. oBrw:SetColSize( "String", 600 ) oBrw:SetColSize( "Number", 150 ) oBrw:Display() DEFINE CONTEXT MENU CONTROL oBRW OF FORM_0 MENUITEM "Enable display of deleted records" ACTION { || RecnoViewDel(.T.) } NAME A1 MENUITEM "Disable display of deleted records" ACTION { || RecnoViewDel(.F.) } NAME A2 END MENU CENTER WINDOW Form_0 ACTIVATE WINDOW Form_0 RETURN Nil FUNCTION CreateBrowse( cBrw, cParent, nRow, nCol, nWidth, nHeight, cAlias ) LOCAL i PUBLIC &cBrw DEFINE TBROWSE &cBrw ; AT nRow, nCol ; ALIAS cAlias ; OF &cParent ; WIDTH nWidth ; HEIGHT nHeight ; COLORS { CLR_BLACK, CLR_BLUE } ; FONT "MS Sans Serif" ; SIZE 8 :SetAppendMode( .F. ) :SetDeleteMode( .F. ) :lNoHScroll := .T. :lCellBrw := .F. END TBROWSE LoadFields( cBrw, cParent ) &cBrw:nHeightCell += 6 &cBrw:nHeightHead += 14 &cBrw:nWheelLines := 1 &cBrw:SetColor( { 3 }, { RGB( 255, 255, 255 )}) &cBrw:SetColor( { 4 }, { { || { RGB( 43, 149, 168 ), RGB( 0, 54, 94 )}}}) &cBrw:SetColor( { 12 }, { { || { RGB( 128, 128, 128 ), RGB( 250, 250, 250 )}}}) &cBrw:SetColor( { 2 }, { { || IF( !(oBrw:cAlias)->(Deleted()), RGB( 230, 240, 255 ), RGB( 130, 140, 155 )) }}) &cBrw:SetColor( { 1 }, { { || IF( !(oBrw:cAlias)->(Deleted()), RGB( 0, 0, 0 ), RGB( 130, 40, 55 )) }}) &cBrw:SetColor( { 5 }, { { || RGB( 0, 0, 255 )}}) &cBrw:SetColor( { 11 }, { { || RGB( 0, 0, 0 )}}) &cBrw:nClrLine := COLOR_GRID &cBrw:ResetVScroll() RETURN Nil FUNCTION RandStr( nLen ) LOCAL cSet := "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM" LOCAL cStr := "" LOCAL i := 0 FOR i := 1 TO nLen cStr += SubStr( cSet, Random( 52 ), 1 ) NEXT RETURN cStr STATIC FUNCTION oBrwChange() LOCAL cVal := HB_NToS( (oBrw:cAlias)->(OrdKeyNo()) ) + ' / ' + HB_NToS( (oBrw:cAlias)->(OrdKeyCount()) ) Form_0.StatusBar.Item(3) := " RecnO: " + cVal Form_0.oBrw.Setfocus RETURN Nil FUNCTION RecnoViewDel(lVal) LOCAL cMsg IF lVal TEST->(DbSetOrder("ALL")) cMsg := "Included a display of deleted records !" ELSE TEST->(DbSetOrder("DEL")) cMsg := "Offline mode display of deleted records !" ENDIF oBrw:Reset() MsgInfo(cMsg ) Eval( oBrw:bChange ) RETURN Nil
| PS Пример не мой. https://www.youtube.com/watch?v=p0-TYMZ4iRE
|
|
|
Haz
|
| |
Пост N: 634
Зарегистрирован: 20.02.11
|
|
Отправлено: 25.08.15 22:06. Заголовок: Dima пишет: Да прос..
Dima пишет: Слил военную тайну тока так Теперь все узнают что TsBrowse работает нормально
|
|
|
Dima
|
| |
Пост N: 5243
Зарегистрирован: 17.05.05
|
|
Отправлено: 25.08.15 22:19. Заголовок: Haz пишет: Слил вое..
Haz пишет: цитата: | Слил военную тайну тока так |
| Чисто на благо форума (темы). Все , к стенке меня... PS Могу убрать если надо
|
|
|
Haz
|
| |
Пост N: 635
Зарегистрирован: 20.02.11
|
|
Отправлено: 25.08.15 22:23. Заголовок: Dima пишет: Все , ..
Dima пишет: цитата: | Все , к стенке меня... ))) |
| Ага, через оформление примера для минигуя жаль для примера этого маловато. В следующий раз - по всей строгости
|
|
|
Dima
|
| |
Пост N: 5244
Зарегистрирован: 17.05.05
|
|
Отправлено: 25.08.15 22:34. Заголовок: Haz пишет: жаль для..
Haz пишет: цитата: | жаль для примера этого маловато. |
| Пример в порядке что бы исправить другой пример. PS По ходу можно назначить тебя админом что бы иногда разгребать.......ну ты понял что. Если готов скажи
|
|
|
Haz
|
| |
Пост N: 636
Зарегистрирован: 20.02.11
|
|
Отправлено: 25.08.15 22:35. Заголовок: Dima пишет: разгреб..
Dima пишет: цитата: | разгребать.......ну ты понял что. |
|
|
|
|
Dima
|
| |
Пост N: 5245
Зарегистрирован: 17.05.05
|
|
Отправлено: 25.08.15 22:44. Заголовок: Haz ))))))..
Haz
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4469
Зарегистрирован: 12.09.06
|
|
Отправлено: 26.08.15 16:17. Заголовок: Dima пишет: Что бы ..
Dima пишет: цитата: | Что бы не флудить еще пару-тройку страниц , самодостаточный пример. |
| Спасибо Дима ! Только жалко, что там нет 1-ой колонки с нумерацией DATA oBrw:nLogicPos .... ----- Помнишь, говорили в этом фильме : Да гранаты у него не той системы... Жалко на ютубе не нашёл этого кусочка... Ну да ладно, буду смотреть.
|
|
|
Haz
|
| |
Пост N: 639
Зарегистрирован: 20.02.11
|
|
Отправлено: 26.08.15 16:30. Заголовок: Andrey пишет: Ну да..
Andrey пишет: цитата: | Ну да ладно, буду смотреть. |
| Ну куда там еще смотреть , все разжевано - пережевано дальше некуда цитата: | жалко, что там нет 1-ой колонки с нумерацией DATA oBrw:nLogicPos .... |
| так добавь с DATA ( oBrw:cAlias)->(OrdkeyNo()) , это же можно сделать самостоятельно
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4488
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.09.15 09:40. Заголовок: Всем привет ! Можно..
Всем привет ! Можно ли при построение узнать размер пустой строки перед подвалом ?
|
|
|
Dima
|
| |
Пост N: 5263
Зарегистрирован: 17.05.05
|
|
Отправлено: 01.09.15 10:22. Заголовок: Andrey Типа так Fu..
Andrey Типа так Func GetHole(obrw) local WorkHeight := oBrw:nHeight-oBrw:nHeightHead-oBrw:nHeightSuper-; oBrw:nHeightFoot-oBrw:nHeightSpecHd-if(!oBrw:lNoHScroll,16,0) RETURN (WorkHeight-Int(WorkHeight/oBrw:nHeightCell)*oBrw:nHeightCell)
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4489
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.09.15 11:16. Заголовок: Dima пишет: Типа та..
Dima пишет: Спасибо ! А как узнать кол-во строк в бровсе ? Хочу размер дырки/на кол-во строк в бровсе и добавить в oBrw:nHeightCell
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 808
Зарегистрирован: 17.02.12
|
|
Отправлено: 01.09.15 11:24. Заголовок: Andrey пишет:Хочу ра..
Andrey пишет: цитата: | Хочу размер дырки/на кол-во строк в бровсе и добавить в oBrw:nHeightCell |
| Если бы ровно делилось - не было бы дырки. Разницу надо относить к header, footer или менять размер по высоте tsb
|
|
|
Dima
|
| |
Пост N: 5264
Зарегистрирован: 17.05.05
|
|
Отправлено: 01.09.15 11:36. Заголовок: Andrey пишет: Хочу ..
Andrey пишет: цитата: | Хочу размер дырки/на кол-во строк в бровсе и добавить в oBrw:nHeightCell |
| типа так ngh:=GetHole(oBrw) END TBROWSE oBrw:nHeightHead+=ngh+1
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4490
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.09.15 14:22. Заголовок: Dima пишет: oBrw:n..
Dima пишет: Нет, так не пойдёт. Нужно ngh/ кол-во строк бровса ! Так как узнать кол-во строк в бровсе ?
|
|
|
Dima
|
| |
Пост N: 5265
Зарегистрирован: 17.05.05
|
|
Отправлено: 01.09.15 14:35. Заголовок: Andrey пишет: Так к..
Andrey пишет: цитата: | Так как узнать кол-во строк в бровсе ? |
| Да писали тебе уже 100 раз oBrw:nrowcount()
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4491
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.09.15 15:11. Заголовок: Dima пишет: oBrw:nr..
Dima пишет: Спасибо ! Получилось ! Дырки больше нет !
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4492
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.09.15 19:56. Заголовок: Показываю массив в T..
Показываю массив в Tsbrowse. 4 элемент массива логический T/F Как сделать блок кода для цвета, чтобы с F была окраска другим цветом ? oBrwF:SetColor( { 2 }, { ????
|
|
|
Haz
|
| |
Пост N: 647
Зарегистрирован: 20.02.11
|
|
Отправлено: 01.09.15 20:53. Заголовок: Andrey пишет: Как с..
Andrey пишет: цитата: | Как сделать блок кода для цвета, чтобы с F была окраска другим цветом ? oBrwF:SetColor( { 2 }, { ???? |
| Ты это серьезно , а что непонятно в примере который Dima неделю назад сюда же кидал показ/непоказ удаленных записей ? Там же если Deleted() красилось серым. Заменить Deleted() на oBrw:aArray[oBrw:nAt][4] проблема ... Или настолько лень читать что тебе же и пишут ...
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4493
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.09.15 21:15. Заголовок: Haz пишет: oBrw:aAr..
Haz пишет: цитата: | oBrw:aArray[oBrw:nAt][4] проблема |
| Вот в этом и была проблема. Не понимал логику нумерации в массиве. Теперь буду знать ! Читать не лень. Не всегда нужно сразу что обсуждается, а потом забывается. Спасибо БОЛЬШОЕ !
|
|
|
Dima
|
| |
Пост N: 5266
Зарегистрирован: 17.05.05
|
|
Отправлено: 01.09.15 21:22. Заголовок: Andrey пишет: Вот в..
Andrey пишет: цитата: | Вот в этом и была проблема. Не понимал логику нумерации в массиве. Теперь буду знать ! |
| Ага и потом спросишь тоже самое спустя месяц. "Все" развивается по спирали. Похоже ты вышел на новый виток Может тебе в отпуск нужно.....отдохни , сил наберись , мозги до кучи собери. Andrey пишет: цитата: | Читать не лень. Не всегда нужно сразу что обсуждается, а потом забывается. |
| Так ты же и спрашиваешь а потом БАЦ и оно у тебя забылось. Зачем спрашивал то ? PS Ни чего личного.
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4494
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.09.15 21:43. Заголовок: Dima пишет: Так ты ..
Dima пишет: цитата: | Так ты же и спрашиваешь а потом БАЦ и оно у тебя забылось. Зачем спрашивал то ? |
| Спросил, не ответили. Потом другим отвлекли на работе. Взялся опять за то что не сделал. Вот и ещё раз спрашиваю. Всё как у всех, работа отвлекает от освоения нового... Так что не обижайтесь, на повторное расспрашивание. Спасибо за помощь ! А в отпуск бы я с удовольствием уехал... Пока не отпускает работа... Новое приходиться осваивать уже дома, по вечерам-ночам...
|
|
|
Haz
|
| |
Пост N: 648
Зарегистрирован: 20.02.11
|
|
Отправлено: 01.09.15 22:06. Заголовок: Andrey пишет: Не п..
Andrey пишет: цитата: | Не понимал логику нумерации в массиве. Теперь буду знать ! |
| Хочется верить что надолго Tsb_Config - твой же пример FUNCTION ColorPicker(oBrw) LOCAL aColor := {} aColor := n2RGB(oBrw:aArray[oBrw:nAt][oBrw:nCell] ) // получить цвет из текущей ячейки aColor := GetColor(aColor) // стандартное меню цвета IF aColor[1] # NIL // поместить новый цвет в текущую ячейку oBrw:aArray[oBrw:nAt][oBrw:nCell] := RGB(aColor[1], aColor[2], aColor[3] ) ENDIF RETURN NIL что то быстро забывается в отпуск
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4495
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.09.15 22:15. Заголовок: Haz пишет: что то б..
Haz пишет: Забыл ! Точно, сам же делал... Из совместного примера с тобой - \MiniGUI\SAMPLES\Advanced\Tsb_colors_2 Да, надо бы в отпуск...
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4497
Зарегистрирован: 12.09.06
|
|
Отправлено: 02.09.15 17:55. Заголовок: Остался еще непоняте..
Остался еще непонятен один вопрос. Есть ли в TsBrowse переменная ведущая подсчёт кол-ва ОТОБРАЖАЕМЫХ записей в зависимости от условий показа ? Если использовать (oBrw:cAlias)->(OrdKeyCount()) или oBrw:nLen то они показывают ОБЩЕЕ кол-во записей в индексе и базе. Держать специально индекс (как в примере что дал Дима) - думаю не совсем верно, доп.расходы на ресурсы и под Leto - не нужно вообще. Самому считать/пересчитывать - как будет вести на больших базах не знаю... Как быть ?
|
|
|
Haz
|
| |
Пост N: 650
Зарегистрирован: 20.02.11
|
|
Отправлено: 02.09.15 18:33. Заголовок: Andrey пишет: Есть ..
Andrey пишет: цитата: | Есть ли в TsBrowse переменная ведущая подсчёт кол-ва ОТОБРАЖАЕМЫХ записей в зависимости от условий показа |
| TsBrowse тут не приделах , сам подумай где TS брать данные ? Если ты знаешь как получить это число напрямую из RDD DBFCDX - используй его. Я знаю только метод тупого пересчета или OrdKeyCount() по условному индексу. Другие RDD , например ADS позволяют дернуть количество записей в фильтре или получить нумератор в SQL запросе. Andrey пишет: Если хочешь что бы было сделано хорошо - сделай сам. Так что или считай или индексуй сам PS Вспомнил еще метод для подсчета удаленки - чтение файла FRead() блоками = длинне записи и подсчет '*' в заголовке записей
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4499
Зарегистрирован: 12.09.06
|
|
Отправлено: 02.09.15 18:48. Заголовок: Haz пишет: TsBrowse..
Haz пишет: цитата: | TsBrowse тут не приделах , сам подумай где TS брать данные ? |
| А завести в TsBrowse специальную функцию, чтобы возвращала кол-во записей в TsBrowse ? Там же есть переменные типа oBrw:nLogicPos() В примере Tsb_Config.prg - Григорий делал подсчет: oBrw:bLogicLen := {|| iif( Empty(( oBrw:cAlias )->( DbFilter() )), ; ( oBrw:cAlias )->( LastRec() ), ; ( oBrw:cAlias )->( DbEval( { || M->nRecnoDbFilter++ }, &("{||" + ( oBrw:cAlias )->( DbFilter() ) + "}") ) ) ) } но он ломается, если стоишь на последней записи и нажимаешь стрелку вниз или мышкой вниз... Разве только у меня такая проблема стоит - показать общее кол-во выбранных записей ? Всем нужно !
|
|
|
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)
|
|
|
Haz
|
| |
Пост N: 671
Зарегистрирован: 20.02.11
|
|
Отправлено: 28.09.15 11:05. Заголовок: Andrey пишет: Нашёл..
Andrey пишет: 1 Вопрос : Что сначала ? 1 Считаем размер дырки 2 Делаем все установки для бровса ( шрифты, высоты и пр ) Думаю сейчас порядок такой 1, 2 2 Вопрос : Что покажет функция GetHoleBrowse() после oBrw:Display() ?
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4528
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.09.15 12:52. Заголовок: Haz пишет: 1 Вопрос..
Haz пишет: цитата: | 1 Вопрос : Что сначала ? 1 Считаем размер дырки 2 Делаем все установки для бровса ( шрифты, высоты и пр ) |
| Нет ! Делаю как положено: 1) Делаем все установки - ( шрифты, высоты и пр. ) 2) oBrw:Display() // прорисовать второй раз для подсчёта остатка дырки 3) nHole := GetHoleBrowse(oBrw) - 1 При обычном шрифте считает правильно ! При включении БФ (большого фонта) в системе - считает неправильно !
|
|
|
Haz
|
| |
Пост N: 673
Зарегистрирован: 20.02.11
|
|
Отправлено: 28.09.15 14:02. Заголовок: Andrey пишет: Нет !..
Andrey пишет: цитата: | Нет ! Делаю как положено: |
| Андрей выведи чему равно то чего не хватает: 1) cBrw:nHeight := ? 2) cBrw:nHeightHead := 75 3) cBrw:nHeightSuper := ? 4) cBrw:nHeightFoot := 22 5) cBrw:nHeightSpecHd :=? 6) cBrw:nHeightCell := 50 ЗЫ визуально горизонтальный скроллер у тебя тоже 22 ( в расчете дырки он забит как 16 , 6 пикселей не много но есть ) Остального не видно из твоей картинки. Целиком ее дай с шапкой
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4529
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.09.15 17:50. Заголовок: http://f6.s.qip.ru/~..
Вот, сделал... 1) Height=516 2) HeightHead=75 3) HeightSuper=0 4) HeightFoot=22 5) HeightSpecHd=0 6) HeightCell=50 GetHoleBrowse()=3 Кол-во строк=7
|
|
|
Haz
|
| |
Пост N: 674
Зарегистрирован: 20.02.11
|
|
Отправлено: 28.09.15 18:06. Заголовок: Andrey пишет: Вот, ..
Andrey пишет: при подстановке цифирь в функцию GetHoleBrowse(... ) дает 19 а никак не 3 !! проверил - реально 3 Ищи что не так передается PS строк должно быть 8 а не 7 Скролл какой высоты ? в расчете дыры забит 16, а на кортинке явно больше чем подвал. Короче капай в сторону высоты скрола и ставь эту высоту в свою функцию, тогда должно все срастись
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4530
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.09.15 23:20. Заголовок: Haz пишет: Короче к..
Haz пишет: цитата: | Короче капай в сторону высоты скрола и ставь эту высоту в свою функцию, тогда должно все срастись |
| Спасибо БОЛЬШОЕ за совет ! Получилось ! Вот функция: //////////////////////////////////////////////////////////// // высота дырки внизу таблицы перед подвалом Function GetHoleBrowse(cBrw) Local nWorkHeight, nHScroll := IIF( LargeFonts(), 24, 16) nWorkHeight := cBrw:nHeight-cBrw:nHeightHead-cBrw:nHeightSuper-; cBrw:nHeightFoot-cBrw:nHeightSpecHd-if(!cBrw:lNoHScroll,nHScroll,0) RETURN (nWorkHeight-Int(nWorkHeight/cBrw:nHeightCell)* cBrw:nHeightCell)
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4546
Зарегистрирован: 12.09.06
|
|
Отправлено: 24.10.15 15:42. Заголовок: Привет всем ! Как по..
Привет всем ! Как получить массив уже созданного суперхидера в таблице ? Поля таблицы знаю как получить. For nI := 1 To oBrw:nColCount() cPole := oBrw:aColumns[nI]:cHeading
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 832
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.10.15 16:33. Заголовок: Andrey так он образ..
Andrey так он образуется: AAdd( ::aSuperHead, { nFromCol, nToCol, uHead, nClrText, nClrBack, l3dLook, hFont, uBitMap, lAdjust, nLineStyle, nClrLine, nHAlign, nVAlign, lTransp } )
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4547
Зарегистрирован: 12.09.06
|
|
Отправлено: 24.10.15 19:22. Заголовок: SergKis пишет: так ..
SergKis пишет: цитата: | так он образуется: AAdd( ::aSuperHead, { nFromCol, nToCol, uHead, nClrText, nClrBack, l3dLook, hFont, uBitMap, lAdjust, nLineStyle, nClrLine, nHAlign, nVAlign, lTransp } ) |
| А как тогда в цикле вывести значения суперхидера ?
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 833
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.10.15 19:32. Заголовок: Andrey Как ты получ..
Andrey Как ты получаешь элементы массива {{...},{...},...} ? глянь MsgDebug(oBrw:aSuperHead)
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4548
Зарегистрирован: 12.09.06
|
|
Отправлено: 24.10.15 20:19. Заголовок: SergKis пишет: глян..
SergKis пишет: цитата: | глянь MsgDebug(oBrw:aSuperHead) |
| Понял ! Спасибо БОЛЬШОЕ !
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4555
Зарегистрирован: 12.09.06
|
|
Отправлено: 30.10.15 05:02. Заголовок: Всем привет. Как сд..
Всем привет. Как сделать вставку из буфера винды в поля таблицы по клавишам Shift+Insert ?
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 834
Зарегистрирован: 17.02.12
|
|
Отправлено: 30.10.15 19:33. Заголовок: Andrey пишет:Как сде..
Andrey пишет: цитата: | Как сделать вставку из буфера винды в поля таблицы по клавишам Shift+Insert ? |
| ... oBrw:bUserKeys := {|nKy,nFl,oBr| UserKeyDown(nKy, nFl, oBr) } ... STATIC FUNC UserKeyDown( nKey, nFlag, oBrw ) Local lRet, cBuf If nKey == VK_INSERT .and. _GetKeyState( VK_SHIFT ) cBuf := System.Clipboard // тут обработка cBuf lRet := .F. EndIf RETURN lRet
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4557
Зарегистрирован: 12.09.06
|
|
Отправлено: 31.10.15 00:34. Заголовок: Спасибо БОЛЬШОЕ ! :..
Спасибо БОЛЬШОЕ ! Только наверное это нужно делать в GET - когда ячейка уже редактируется.
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4559
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.11.15 18:01. Заголовок: Как сделать в САМ..
Как сделать в САМОМ TSBROWSE при редактировании ячеек (только при УЖЕ редактировании, при наличии курсора) вставку/сохранения кармана WINDOWS как во всех других приложениях по клавишам Shift+Insert/Ctrl+Insert и Ctrl+V/Ctrl+С ?
|
|
|
Haz
|
| |
Пост N: 684
Зарегистрирован: 20.02.11
|
|
Отправлено: 05.11.15 20:27. Заголовок: Andrey пишет: Как с..
Andrey пишет: цитата: | Как сделать в САМОМ TSBROWSE при редактировании ячеек (только при УЖЕ редактировании, при наличии курсора) вставку/сохранения кармана WINDOWS как во всех других приложениях п |
| И так работает , ничего не делел
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4560
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.11.15 21:27. Заголовок: Haz пишет: И так ра..
Haz пишет: цитата: | И так работает , ничего не делел |
| А у меня нет... MiniGUI\SAMPLES\Advanced\Tsb_config - в текстовое поле пытаюсть вставить что в буфере, не вставляется. А в Фаре вставляется... Где и что править ?
|
|
|
Haz
|
| |
Пост N: 685
Зарегистрирован: 20.02.11
|
|
Отправлено: 05.11.15 21:37. Заголовок: Andrey пишет: не вс..
Andrey пишет: в текстовом поле жму Enter - входит в режим GET. потом Shift+Ins CTRL+V и вставляется то что в буфере обмена было. Ничего не правил вообще, продвинутые (которым лень набирать) пользователи с этим работают не один год PS тестил именно в TSB_Config
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4561
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.11.15 21:49. Заголовок: Хрень какая то... В ..
Хрень какая то... В мемо-поле (колонка List) - всё вставляется. Если берем текстовую колонку - Ctrl+V/Ctrl+С РАБОТАЕТ, а Shift+Insert/Ctrl+Insert НЕТ.... У меня 8.1 Буду пробовать на других системах...
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 835
Зарегистрирован: 17.02.12
|
|
Отправлено: 05.11.15 21:51. Заголовок: подтверждаю Ctrl+V т..
подтверждаю Ctrl+V тоже работатет. Tsb_config
|
|
|
Dima
|
| |
Пост N: 5332
Зарегистрирован: 17.05.05
|
|
Отправлено: 05.11.15 21:52. Заголовок: Shift+INS у меня тож..
Shift+INS у меня тоже не сработал в этом примере , меняется только форма курсора , CTRL+V пашет зы Win7
|
|
|
Haz
|
| |
Пост N: 686
Зарегистрирован: 20.02.11
|
|
Отправлено: 05.11.15 21:53. Заголовок: Andrey пишет: Shif..
Andrey пишет: цитата: | Shift+Insert/Ctrl+Insert НЕТ.... |
| Да с шифтом не работает . Сергей пару постов назад сказал куда копать ... Лови нажатие шифт+инс и пихай содержимое буфера Хотя .... ловить кнопки скорее надо уже в объекте oGet который создался в бровсе после нажатия ентер
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4562
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.11.15 22:21. Заголовок: Haz пишет: Лови наж..
Haz пишет: цитата: | Лови нажатие шифт+инс и пихай содержимое буфера Хотя .... ловить кнопки скорее надо уже в объекте oGet который создался в бровсе после нажатия ентер |
| А нельзя сделать это в самих исходниках TsBrowse ? Чтобы не делать велосипед... Всем же это нужно !
|
|
|
Dima
|
| |
Пост N: 5333
Зарегистрирован: 17.05.05
|
|
Отправлено: 05.11.15 22:26. Заголовок: Andrey пишет: Чтобы..
Andrey пишет: цитата: | Чтобы не делать велосипед... Всем же это нужно ! |
| Не знаю как всем , лично мне хватает стандарта CTRL+V
|
|
|
Haz
|
| |
Пост N: 687
Зарегистрирован: 20.02.11
|
|
Отправлено: 05.11.15 23:17. Заголовок: Тоже в основном поль..
Тоже в основном пользую ctrl-c/v До ins тянуться через всю клаву надо ... лень
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4563
Зарегистрирован: 12.09.06
|
|
Отправлено: 06.11.15 15:47. Заголовок: Работаю с SetArrayTo..
Работаю с SetArrayTo() SergKis писал где-то, что после ввода в ячейку таблицы (для отображения границ ячеек таблицы) нужно делать oBrw1:Refresh(FALSE) А в SetArrayTo() - это oBrw1:Refresh(FALSE) не работает ! oCol:bPostEdit := { || AADD( aStatExit, nYear ), AADD( aStatXTbr, cTbrName ),; MyPostEdit(), oBrw1:Refresh(FALSE) } Что делать или что использовать взамен ?
|
|
|
Haz
|
| |
Пост N: 688
Зарегистрирован: 20.02.11
|
|
Отправлено: 06.11.15 16:54. Заголовок: Andrey пишет: в Se..
Andrey пишет: цитата: | в SetArrayTo() - это oBrw1:Refresh(FALSE) не работает |
| Не совсем понял про :SetArrayTo(), мне казалось этот метод просто позволяет сразу назначать шрифты , размеры , хидинги и футинги при инициализации массива. В отличие от :SetArray() , где это все нужно делать позже. как связаны разные методы :Refresh(...) и :SetArrayTo(...) не уловил
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 836
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.11.15 18:43. Заголовок: Andrey пишет:SergKis..
Andrey пишет: цитата: | SergKis писал где-то, что после ввода в ячейку таблицы (для отображения границ ячеек таблицы) нужно делать oBrw1:Refresh(FALSE) |
| Запусти Tsb_array_2 и в строке ниже первой включи коректировку по Enter и пройди по нескольким полям и увидишь, что не прорисовываются линии между тек. строкой и предыдущей. Если воставить в bPostedit oBrw:Refresh(.F.), то линии прорисуются. Вот о чем я говорил. Возможно на dbf будет такое же поведение - не помню
|
|
|
gfilatov2002
|
| moderator
|
Пост N: 848
Зарегистрирован: 11.02.10
|
|
Отправлено: 06.11.15 21:33. Заголовок: SergKis пишет: про..
SergKis пишет: цитата: | пройди по нескольким полям и увидишь, что не прорисовываются линии между тек. строкой и предыдущей. |
| Благодарю за наводку Вроде удалось поправить прорисовку разделительной линии в методах GoRight и GoDown
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4569
Зарегистрирован: 12.09.06
|
|
Отправлено: 09.11.15 14:54. Заголовок: Делаю растяжку после..
Делаю растяжку последней колонки в SetArrayTo() nColSpace := LEN(aDim) oBrw1:nAdjColumn := nColSpace // растянуть колонку до заполнения пустоты в бровсе справа Не растягивается.... Почему ?
|
|
|
Dima
|
| |
Пост N: 5341
Зарегистрирован: 17.05.05
|
|
Отправлено: 09.11.15 15:08. Заголовок: Andrey Длина массив..
Andrey Длина массива aDim равна кол-ву видимых колонок ?
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4570
Зарегистрирован: 12.09.06
|
|
Отправлено: 09.11.15 15:19. Заголовок: Dima пишет: Длина м..
Dima пишет: цитата: | Длина массива aDim равна кол-ву видимых колонок ? |
| Да ! На экране 14 колонок, последняя пустая и некрасиво из-за этого.
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4580
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.11.15 14:33. Заголовок: Привет всем ! Опять ..
Привет всем ! Опять небольшая проблема с цветами в SetArrayTo(). Делаю так: LOCAL oBrw1 ....... oBrw1:SetColor( { 2 }, { { |a,b,o| iif( Month(o:aArray[o:nAt][5]) % 2 == 0, ; MyRGB( {0, 204, 255} ) ,; MyRGB(aBackClr) ) } } ) Потом беру эти цвета помещаю в массив AADD( aStatColorTable, { oBrw1:cControlName, 1, oBrw1:nClrText, NIL } ) AADD( aStatColorTable, { oBrw1:cControlName, 2, MyRGB({0,204,255}), MyRGB(aBackClr) } ) и записываю в ини-файл: ObjTable_1={"Set_Columns1", 1, 0, NIL} ObjTable_2={"Set_Columns1", 2, 16763904, 15515551} ObjTable_3={"Set_Columns1", 13, 255, NIL} Потом в ON INIT формы делаю считывание из ини-файла (массив aIni4Clr) и вывожу цвет в бровс: LOCAL oBrw52 ............... oBrw52 := gBrw52(cForm,"Set_Columns1") // считываю объект SetArrayTo() в локал переменную FOR nJ := 1 TO LEN(aIni4Clr) nVal := aIni4Clr[nJ,2] nColor := aIni4Clr[nJ,3] nColor2 := aIni4Clr[nJ,4] IF nVal == 2 oBrw52:SetColor( { 2 }, { { |a,b,o| iif( Month(o:aArray[o:nAt][5]) % 2 == 0, ; nColor , nColor2 ) } } ) ELSE IF nColor2 == NIL // если один цвет используется oBrw52:SetColor( { nVal }, { { || nColor } } ) ELSE oBrw52:SetColor( { nVal }, { { || { nColor , nColor2 } } } ) ENDIF ENDIF NEXT Цвета становятся ну просто светофор .... Чего я не учитываю ? Какая тонкость при восстановлении цветов ? Уже 3 день бьюсь... Помогите пожалуйста.
|
|
|
Haz
|
| |
Пост N: 696
Зарегистрирован: 20.02.11
|
|
Отправлено: 20.11.15 14:58. Заголовок: Andrey пишет: Чего ..
Andrey пишет: Не проверял , но уверен что с блоком кода не учитываешь. В блок кода передаются локальные переменные и когда этот блок исполняется при прорисовке бровса , значения этих переменных непредсказуемы , отсюда и ЗЫ. цитата: | Опять небольшая проблема с цветами в SetArrayTo(). |
|
не верно локализован источник проблемы
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4581
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.11.15 15:19. Заголовок: Haz пишет: В блок к..
Haz пишет: цитата: | В блок кода передаются локальные переменные и когда этот блок исполняется |
| Почему ? При первом построении тоже использую локал: LOCAL aBackClr Сделал так: PRIVATE nTsbColor, nTsbColor2 Ну и дальше все переменные переименовал. Всё равно цвета - светофор !
|
|
|
Haz
|
| |
Пост N: 697
Зарегистрирован: 20.02.11
|
|
Отправлено: 20.11.15 15:33. Заголовок: При чем тут local ....
При чем тут local ... Private говорю в блоке кода , к примеру в этом oBrw52:SetColor( { nVal }, { { || nColor } } ) . Чему равно nColor в момент прорисовки бровса при навигации по нему ? 100000% что не значению, которое было в цикле инициализации .... вот этим значением и рисует ЗЫ сделай так и удивись oBrw52:SetColor( { nVal }, { { || msgDebug(nVal, nColor), nColor } } )
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4582
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.11.15 15:53. Заголовок: Haz пишет: ЗЫ сдела..
Haz пишет: цитата: | ЗЫ сделай так и удивись oBrw52:SetColor( { nVal }, { { || msgDebug(nVal, nColor), nColor } } ) |
| Удивился... А как тогда правильно сделать ?
|
|
|
Haz
|
| |
Пост N: 698
Зарегистрирован: 20.02.11
|
|
Отправлено: 20.11.15 15:55. Заголовок: Andrey пишет: А как..
Andrey пишет: цитата: | А как тогда правильно сделать ? |
| делал же ... TSB_CONFIG глянь
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4583
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.11.15 16:12. Заголовок: Haz пишет: делал же..
Haz пишет: цитата: | делал же ... TSB_CONFIG глянь |
| Да, только там цветной блок попроще был.
|
|
|
Haz
|
| |
Пост N: 699
Зарегистрирован: 20.02.11
|
|
Отправлено: 20.11.15 16:18. Заголовок: Andrey пишет: Да, т..
Andrey пишет: цитата: | Да, только там цветной блок попроще был. |
| какая разница какой блок, важно как реализовано . или тут http://clipper.borda.ru/?1-1-0-00000399-000-240-0 твой пост N 3712 и два ответа ниже тоже с этой же ошибкой при вызоаве блока связаны
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4584
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.11.15 17:32. Заголовок: Понял... Спасибо ! ..
Понял... Спасибо ! Кстати насчёт Tsb_config. Можно исправить ( класс oBrw:Excel2(...) h_tbrowse.prg) вывод чисел ? Если использовать для вывода в таблице формат "999" или "@Z 999", то в Экселе колонка с числами - пустая. В Tsb_config пришлось ставить: IF aPole[nI,6] <> "N" // не использовать шаблон для числовых полей, т.к. // при печати в Excel поле будет пустое !!! oBrw:aColumns[nJ]:cPicture := aPole[nI,4] // шаблон колонки ENDIF Сейчас такая же беда в рабочих программах....
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4590
Зарегистрирован: 12.09.06
|
|
Отправлено: 03.12.15 13:38. Заголовок: Ещё вопрос созрел по..
Ещё вопрос созрел по Tsbrowse. Как можно запретить юзеру смену колонок местами, но оставить возможность юзеру изменить размеры колонок ? Нашёл флаги: oBrw:lNoMoveCols := TRUE oBrw:lMChange := .F. Но они запрещают и изменение размеров колонок...
|
|
|
Haz
|
| |
Пост N: 705
Зарегистрирован: 20.02.11
|
|
Отправлено: 03.12.15 14:15. Заголовок: Andrey пишет: Как м..
Andrey пишет: цитата: | Как можно запретить юзеру смену колонок местами |
| Простого способа похоже нет -или менять исходник , вводя и контролируя новые флаги -или на ON DRAW повесить процедуру, которая будет проверять нужный порядок колонок и приводить его в норму если юзер там чего поменял Посмотрел исходник и нашел один костыль ... Если у колонки есть суперхидер то размеры менять можно , а двигать нельзя. Сделай один суперхидер на все колонки с высотой 0 и будет тебе счастье ( правда супрхид будет не нулевой высоты )
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4591
Зарегистрирован: 12.09.06
|
|
Отправлено: 03.12.15 15:27. Заголовок: Haz пишет: Если у к..
Haz пишет: цитата: | Если у колонки есть суперхидер |
| У меня есть он в программе. Haz пишет: Какой он и как его использовать ?
|
|
|
Haz
|
| |
Пост N: 706
Зарегистрирован: 20.02.11
|
|
Отправлено: 03.12.15 15:48. Заголовок: Andrey пишет: Какой..
Andrey пишет: цитата: | Какой он и как его использовать ? |
| читай по слогам цитата: | Если у колонки есть суперхидер то размеры менять можно , а двигать нельзя. Сделай один суперхидер на все колонки с высотой 0 и будет тебе счастье |
|
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4592
Зарегистрирован: 12.09.06
|
|
Отправлено: 03.12.15 16:10. Заголовок: Суперхидер в таблице..
Суперхидер в таблице есть с 1 по 13 колонки высотой 38. Колонки местами меняются. Ставлю запрет на обмен колонками oBrw:lNoMoveCols := TRUE или oBrw:lMChange := .F. Колонки местами не меняются и нельзя уже изменить размер колонок !
|
|
|
Haz
|
| |
Пост N: 707
Зарегистрирован: 20.02.11
|
|
Отправлено: 03.12.15 16:20. Заголовок: Andrey пишет: Супер..
Andrey пишет: цитата: | Суперхидер в таблице есть. |
| Убери его , и добавь только такой ( для колонки 1 ) oBrw:AddSuperHead( 1 , 1 , '' ) После этого все колонки перестанут меняться местами PS. Говорю же , это "костыль" На счет всех, я не прав, не проверял а на одну работает! Советую лучше сюда смотреть -или менять исходник , вводя и контролируя новые флаги -или на ON DRAW повесить процедуру, которая будет проверять нужный порядок колонок и приводить его в норму если юзер там чего поменял
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4593
Зарегистрирован: 12.09.06
|
|
Отправлено: 03.12.15 17:21. Заголовок: Понял ! Спасибо БОЛЬ..
Понял ! Спасибо БОЛЬШОЕ ! Haz пишет: цитата: | Советую лучше сюда смотреть -или менять исходник , вводя и контролируя новые флаги -или на ON DRAW повесить процедуру, которая будет проверять нужный порядок колонок и приводить его в норму если юзер там чего поменял |
| Боюсь пока не осилить данное предложение. Опыта пока маловато...
|
|
|
Haz
|
| |
Пост N: 708
Зарегистрирован: 20.02.11
|
|
Отправлено: 04.12.15 11:11. Заголовок: Andrey пишет: Боюсь..
Andrey пишет: цитата: | Боюсь пока не осилить данное предложение. Опыта пока маловато. |
| какой тут опыт нужен ? Используется имя колонки, если оно не присвоено - работать не будет // Сохранения порядка колонок по их именам Func SaveColPos( oBrw ) Local aSave := {} aEval( oBrw:aColumns, { |oCol| AADD( aSave, oCol:cName ) } ) Return aSave // Восстановление порядка колонок по их именам Func RestColPos( oBrw, aSave ) aEval( aSave, { |cName| oBrw:MoveColumn( oBrw:nColumn(cName), Ascan( aSave, cName)) } ) Return nil При первой прорисовке бровса запоминаешь порядок в массив Проверку на соответствие текущего порядка и сохраненного в массиве уверен сделаешь. И если порядок нарушен по ON DRAW восстанавливаешь как oBrw:bOnDraw := {|| IF( ЕслиНарушен(), RestColPos( oBrw, aSave), NIL ) } Пользователь после этого может таскать колонки куда хочет, но при этом быстро устает т.к. они сразу возвращаются на место. PS. НЕ ПРОВЕРЯЛ , просто описал идею. Должна работать PPS проверку нужно в том же он драу поводить )))
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4600
Зарегистрирован: 12.09.06
|
|
Отправлено: 07.12.15 14:57. Заголовок: Всем привет. Как зам..
Всем привет. Как заменить ОДНУ картинку в уже созданной таблице ? Допустим есть LOCAL ahBmpPlus := { LoadImage( "bFolder48.bmp" ) } LOCAL ahBmpMinus:= { LoadImage( "bFolder48x2.bmp" ) } ..... // создать первую колонку с картинкой ADD COLUMN TO oBrwP HEADER "" ; DATA { || ahBmpPlus } ; SIZE 50 BITMAP ; ..... EDITABLE oBrwP:aColumns[1]:bPrevEdit := {|| MenuPlusMinus(ahBmpPlus,ahBmpMinus), FALSE } ............... Function MenuPlusMinus(ahBmpPlus,ahBmpMinus) ..... // вот здесь заменить одну картинку на другую. Как написать ?
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4605
Зарегистрирован: 12.09.06
|
|
Отправлено: 14.12.15 14:01. Заголовок: Всем привет ! Пытаюс..
Всем привет ! Пытаюсь для отладки добавить в свой проект h_tbrowse.prg Не собирается проект: Error: Unresolved external '_HB_FUN_GETSYSMETRICS' referenced from W:\HB_PROJECT\ Откуда взять эту функцию GETSYSMETRICS ? Раньше собиралось всё нормально.
|
|
|
Dima
|
| |
Пост N: 5404
Зарегистрирован: 17.05.05
|
|
Отправлено: 14.12.15 15:21. Заголовок: Andrey пишет: Откуд..
Andrey пишет: цитата: | Откуда взять эту функцию GETSYSMETRICS ? |
| в TSBROWSE.CH он заявлен
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4606
Зарегистрирован: 12.09.06
|
|
Отправлено: 14.12.15 15:35. Заголовок: Dima пишет: в TSBRO..
Dima пишет: Положил этот файл в свой проект. Всё равно пишет, нет такой функции... P.S. Удалил все obj - проект собрался !
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4607
Зарегистрирован: 12.09.06
|
|
Отправлено: 14.12.15 15:55. Заголовок: Отлавливаю ошибку дл..
Отлавливаю ошибку для SetArrayTo(). Вот такая ошибка: Error BASE/1122 Неверный аргумент: TRANSFORM Called from TRANSFORM(0) Called from TSBROWSE:DRAWLINE(2925) Called from TSBROWSE:PAINT(8713) Called from TSBROWSE:DISPLAY(2306) Called from _ENDTBROWSE(367) Called from CREATEBROWSEUSE(430) Лезу в исходник и хочу там установить просмотр. Как это сделать, чтобы ручками не считать какую строку ProcName(5) смотреть ? IF UPPER(ProcName( 5 )) == "CREATEBROWSEUSE" MsgDebug(uData, VALTYPE(uData), cPicture) ENDIF uData := If( uData == NIL, "", Transform( uData, cPicture ) )
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4608
Зарегистрирован: 12.09.06
|
|
Отправлено: 14.12.15 16:21. Заголовок: Странно, отладка раб..
Странно, отладка работает ОДНУ строку из массива, а потом прога сваливается: Called from TRANSFORM(0) Called from TSBROWSE:DRAWLINE(2928) Called from TSBROWSE:PAINT(8701) Called from TSBROWSE:DISPLAY(2306) Called from _ENDTBROWSE(367) Called from CREATEBROWSEUSE(430) Called from FORM_USEDBF(220) ..... Else IF UPPER(ProcName( 5 )) == "CREATEBROWSEUSE" MsgDebug(uData, VALTYPE(uData), cPicture) ENDIF uData := If( uData == NIL, "", Transform( uData, cPicture ) ) // строка 2928 EndIf Как поймать ошибку ?
|
|
|
Dima
|
| |
Пост N: 5405
Зарегистрирован: 17.05.05
|
|
Отправлено: 14.12.15 16:53. Заголовок: Andrey Сунь массив ..
Andrey Сунь массив в MsgDebug и позырь что в нем живет.
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4609
Зарегистрирован: 12.09.06
|
|
Отправлено: 14.12.15 17:01. Заголовок: Dima пишет: Сунь ма..
Dima пишет: цитата: | Сунь массив в MsgDebug и позырь что в нем живет. |
| Позырил... До этого смотрел, не увидел. Один элемент вместо строки - массив.... И как такие ошибки в будущем отлавливать ? Может проверку какую сделать в самом исходнике ? Function SetArrayTo( ControlName, ParentForm, Arr, uFontHF, aHead, aSizes, uFooter, aPicture, aAlign, aName ) Local ix, oBrw ix := GetControlIndex (ControlName,ParentForm) oBrw:= _HMG_aControlIds [ix] oBrw:SetArrayTo(Arr, uFontHF, aHead, aSizes, uFooter, aPicture, aAlign, aName) Return oBrw
|
|
|
Dima
|
| |
Пост N: 5406
Зарегистрирован: 17.05.05
|
|
Отправлено: 14.12.15 17:03. Заголовок: Andrey пишет: И как..
Andrey пишет: цитата: | И как такие ошибки в будущем отлавливать ? |
| Чрезмерно не косячить при написании
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4668
Зарегистрирован: 12.09.06
|
|
Отправлено: 25.01.16 12:18. Заголовок: Привет всем... Делаю..
Привет всем... Делаю новую таблицу на Tsbrowse. Ширину таблицы меняю в зависимости от окна, как Tsb_config. Скрытый текст DEFINE WINDOW Form_0 AT 0,0 WIDTH nDesktopWidth HEIGHT nDesktopHeight ; MINWIDTH 780 MINHEIGHT 500 ; .......... WINDOWTYPE STANDARD TOPMOST ; ........ ON SIZE { || ResizeTable() } ; ON MAXIMIZE { || ResizeTable() } ; ////////////////////////////////////////////////////////////////// FUNCTION ResizeTable() LOCAL cForm := _HMG_ThisFormName LOCAL hWnd := GetFormHandle(cForm) // По методу Move() запускается ReSize() - описание параметров см. ???, // который запускает в конце работы кодовый блок bResized - в нем можно что-то еще подвигать oBrw:Move( oBrw:nLeft ,oBrw:nTop , GetClientWidth(hWnd), ; GetClientHeight(hWnd) - oBrw:nTop, .t.) //oBrw:Display() oBrw:Paint() // Иначе не перерисовываются вертикальные разделители MyToolBarTable(,,.T.) // перепостроить кнопки на форме Return Nil
| При изменения размера окна мышкой, какие то артефакты вылазят: Как исправить ?
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4669
Зарегистрирован: 12.09.06
|
|
Отправлено: 25.01.16 15:51. Заголовок: Добился такого же эф..
Добился такого же эффекта (расползания подвала таблицы) в примере MiniGUI\SAMPLES\Advanced\Tsb_config Разница небольшая: 1) Окно WINDOWTYPE STANDARD TOPMOST ; При первом запуске "расползание подвала" нет. Если мышкой перейти в ячейки, а потом попробовать изменить размер экрана, то начинается "расползание подвала" : Вот исправленный проект с демонстрацией - https://cloud.mail.ru/public/FBzx/BzqAUUxZz Вопрос остается таким же: как исправить (убрать расползание подвала таблицы ) ?
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 840
Зарегистрирован: 17.02.12
|
|
Отправлено: 25.01.16 19:41. Заголовок: Andrey пишет: распол..
Andrey пишет: цитата: | расползание подвала таблицы |
| Это эффект фантомной строки (обсуждали в теме о ней), т.е. если строк сделать больше, высоту tsb меньше и увеличивать постепенно, проявляется фант. строка, когда строк становится меньше - остается прорисованный ранее подал, т.е. нет метода очистить часть экрана, после факт. строк :nRowCount() и подвалом. Как лечить ? Не менять высоту tsb, если реальная высота (расчет см. в SetNoHole(oBrw) ) всех строк и заголовков\подвалов меньше\равно new высоте после Resize окна и в расчете new высоты использовать :nRowCount() * :nHeightCell + высоты заголовков\подвалов (что бы те было фантомной строки).
|
|
|
Haz
|
| |
Пост N: 753
Зарегистрирован: 20.02.11
|
|
Отправлено: 25.01.16 20:51. Заголовок: SergKis пишет: Это ..
SergKis пишет: цитата: | Это эффект фантомной строки |
| Сергей, тут другая проблема. Глядя на скрины до фантома еще далеко т.к. строк в таблице мало. Тут лекарство к другому месту прикладывать надо. Andrey пишет: Во первых внимательно посмотреть на код и задать себе вопрос по каждой строке зачем это написано. 1) // По методу Move() запускается ReSize() - описание параметров см. ???, По этому методу никакой Resize() не запускается, в исходниках метод 4 строки , где там Resize()?, кокое описание параметров METHOD Move( nTop, nLeft, nWidth, nHeight, lRepaint ) CLASS TControl MoveWindow( ::hWnd, nTop, nLeft, nWidth, nHeight, lRepaint ) ::CoorsUpdate() return nil 2) это зачем ? есть же простой и понятный метод Refresh(.T.) //oBrw:Display() oBrw:Paint() // Иначе не перерисовываются вертикальные разделители 3) в примере ColorConfig еще какой то вызов CorrectFirstLast() ? Какого художника ... он вообще нужен ? Это была не совсем удачная попытка избавиться от залипания последней строки, как показала практика - не помогает. В теме про дырку , все расписали как надо с этим бороться и Сергей и Дима там все доступно рассказали Резюме Убрать неправильные комменты вместо паинта и дисплая поставить рефреш( Т) и чуть не забыл ... повыкидывать везде этот корректфёстласт
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 841
Зарегистрирован: 17.02.12
|
|
Отправлено: 25.01.16 21:13. Заголовок: Haz Я использовал ..
Haz Я использовал FUNCTION ResizeBrowse() LOCAL cForm := oBrw:cParentWnd LOCAL hWnd := GetFormHandle(cForm) LOCAL nHStBar := GetWindowHeight(GetControlHandle('STATUSBAR', cForm)) // height StatusBar Local actpos:={0,0,0,0} Local i, w, h GetClientRect(hWnd, actpos) w := actpos[3]-actpos[1] h := actpos[4]-actpos[2] - nHStBar - oBrw:nTop IF w !=0 .and. h != 0 SetProperty(oBrw:cParentWnd, oBrw:cControlName, "Enabled", .F.) _SetControlHeight( oBrw:cControlName, oBrw:cParentWnd, h) _SetControlWidth ( oBrw:cControlName, oBrw:cParentWnd, w) oBrw:Paint() SetProperty(oBrw:cParentWnd, oBrw:cControlName, "Enabled", .T.) // oBrw:Display() Endif Return Nil все видно в работе exe, как, я описал
|
|
|
Haz
|
| |
Пост N: 754
Зарегистрирован: 20.02.11
|
|
Отправлено: 25.01.16 21:26. Заголовок: SergKis пишет: oB..
SergKis пишет: цитата: | oBrw:Paint() SetProperty(oBrw:cParentWnd, oBrw:cControlName, "Enabled", .T.) // oBrw:Display() |
| Сергей, в примере у Андрея Tsb_config это код видимо с тебя списан , как и написал Андрей - в этом же примере приводит к залипанию футингов. При замене на банальный рефреш - залип исчезает
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 842
Зарегистрирован: 17.02.12
|
|
Отправлено: 25.01.16 21:37. Заголовок: Haz пишет:банальный ..
Haz пишет: цитата: | банальный рефреш - залип исчезает |
| работает я пробнул display() - не то (а с фантомной решалось через это), а Paint() перерисовал, но криво, на рефреш и не подумал - оказывается зря
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4670
Зарегистрирован: 12.09.06
|
|
Отправлено: 25.01.16 23:42. Заголовок: Haz пишет: Сергей, ..
Haz пишет: цитата: | Сергей, в примере у Андрея Tsb_config это код видимо с тебя списан |
| Мне этот код Григорий помогал писать. Если окно MAIN - работает без проблем. Я сделал окно WINDOWTYPE STANDARD - появился этот эффект. CorrectionFirstLast() убрал совсем, я Григорию предлагал новую версию этого примера для библиотеки, он не захотел. Из-за этого в старом примере и делал этот эффект, чтобы всем другим было понятней, от чего я исходил. Haz пишет: цитата: | При замене на банальный рефреш - залип исчезает |
| Да действительно исчез. Спасибо БОЛЬШОЕ !
|
|
|
Haz
|
| |
Пост N: 755
Зарегистрирован: 20.02.11
|
|
Отправлено: 26.01.16 10:55. Заголовок: Andrey пишет: Из-за..
Andrey пишет: цитата: | Из-за этого в старом примере и делал этот эффект, чтобы всем другим было понятней, от чего я исходил. |
| Андрей , Вот это главное. Не важно кто кому помогал, но если пример для обучения тех кто вообще впервые минигуи видит , то там не стоит оставлять комментарии которые могут запутать. Пример у тебя получился объемный и сложный, всего не углядишь и косяки могут вылезти внезапно. По мне , так вместо одного глобального примера - лучше 10 маленьких узко тематических И для понимания проще и поиграться проще при изучении. Вот ресайз тока что накидал , ничего лишнего и все понятно #include "minigui.ch" #include "tsbrowse.ch" FUNC Main() Local aArray := { ; {'AAAAAAAAAAAAAAAA', 1, Date() }, ; {'BBBBBBBBBBBBBBBB', 2, Date() }, ; {'CCCCCCCCCCCCCCCC', 3, Date() }, ; {'DDDDDDDDDDDDDDDD', 4, Date() }, ; {'EEEEEEEEEEEEEEEE', 5, Date() }, ; {'FFFFFFFFFFFFFFFF', 6, Date() }, ; {'GGGGGGGGGGGGGGGG', 7, Date() } ; } DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 400 ; HEIGHT 300 ; TITLE "TsBrowse ReSize Test" ; MAIN ; FONT 'Tahoma' SIZE 9; ON SIZE { || ResizeBrw( oBrw )} ; ON MINIMIZE { || ResizeBrw( oBrw )} ; ON MAXIMIZE { || ResizeBrw( oBrw )} DEFINE TBROWSE oBrw ; AT 5,5 ; OF Form_1 ; WIDTH GetProperty("Form_1", 'Width') - 25 ; HEIGHT GetProperty("Form_1", 'Height') - 50 ; FONT "Tahoma" ; SIZE 9 ; GRID ; EDIT oBrw:SetArray( aArray, .T. ) oBrw:nAdjColumn := 1 oBrw:aColumns[1]:cFooting := "STRING" oBrw:aColumns[2]:cFooting := "NUM" oBrw:aColumns[3]:cFooting := "DATE" oBrw:aColumns[1]:nFAlign := DT_LEFT oBrw:aColumns[2]:nFAlign := DT_LEFT oBrw:aColumns[3]:nFAlign := DT_CENTER oBrw:lFooting := .T. oBrw:lDrawFooters := .T. oBrw:nHeightFoot := 20 oBrw:DrawFooters() END TBROWSE END WINDOW ACTIVATE WINDOW Form_1 RETURN NIL FUNC ReSizeBrw( oBrw ) local nTop := GetProperty("Form_1", 'Row') + 5, ; nLeft := GetProperty("Form_1", 'Col') + 5, ; nWidth := GetProperty("Form_1", 'Width') - 25, ; nHeight := GetProperty("Form_1", 'Height') - 50 oBrw:Move( nTop,nLeft, nWidth, nHeight, .T. ) Return oBrw:Refresh(.T.)
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4671
Зарегистрирован: 12.09.06
|
|
Отправлено: 26.01.16 12:46. Заголовок: Haz пишет: По мне ,..
Haz пишет: цитата: | По мне , так вместо одного глобального примера - лучше 10 маленьких узко тематических И для понимания проще и поиграться проще при изучении. Вот ресайз тока что накидал , ничего лишнего и все понятно |
| Пример классный ! То что нужно для изучения новичку ! Когда делал свой пример, много не понимал. Что сделал - то сделал, нужно править. Выкладывал на форуме пробную версию - писал: комментарии и исправления приветствуются ! Haz пишет: цитата: | nTop := GetProperty("Form_1", 'Row') + 5, ; nLeft := GetProperty("Form_1", 'Col') + 5, |
| Только вместо этого лучше oBrw:nLeft ,oBrw:nTop ( новичку понятней буде как можно делать)
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4672
Зарегистрирован: 12.09.06
|
|
Отправлено: 26.01.16 12:54. Заголовок: SergKis пишет: IF w..
SergKis пишет: цитата: | IF w !=0 .and. h != 0 SetProperty(oBrw:cParentWnd, oBrw:cControlName, "Enabled", .F.) _SetControlHeight( oBrw:cControlName, oBrw:cParentWnd, h) _SetControlWidth ( oBrw:cControlName, oBrw:cParentWnd, w) oBrw:Paint() SetProperty(oBrw:cParentWnd, oBrw:cControlName, "Enabled", .T.) // oBrw:Display() Endif |
| Уточни пожалуйста для чего это нужно ?
|
|
|
Haz
|
| |
Пост N: 756
Зарегистрирован: 20.02.11
|
|
Отправлено: 26.01.16 14:51. Заголовок: Andrey пишет: Уточн..
Andrey пишет: цитата: | Уточни пожалуйста для чего это нужно ? |
| так тут все и так все понятно oBrw:cParentWnd вернет имя формы в которой бровс определен oBrw:cControlName вернет имя самого бровса А дальше если ширина и высота после ресайса больше нуля, то бровсу говорят Enabled := F, затем меняют его размеры, прорисовывают и Enabled := T Видимо так тоже сработает, мне больше через :Move() нравится PS: Andrey пишет: цитата: | Только вместо этого лучше oBrw:nLeft ,oBrw:nTop ( новичку понятней буде как можно делать) |
| В примере nTop , nLeft и пр. это координаты формы Form_1 , а не самого бровса. Тогда уж не oBrw:nTop , а Form_1.Row. Мне больше через GetProperty нравится , т.к. универсально ( не требуется DECLARE WINDOW указывать если окно не объявлено выше по тексту ), но это дело привычки
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4688
Зарегистрирован: 12.09.06
|
|
Отправлено: 11.02.16 12:48. Заголовок: Привет всем ! Как ра..
Привет всем ! Как работать с TBROWSE при перепоказе записей ? Описание проблемки: Установлен условный индекс по полю метка, меняем это значение, кол-во записей в TBROWSE изменилось. Указатель записи нужно поставить на следующую запись. cAlias := (oBrw:cAlias) .... CASE nKey == VK_SPACE cField := "MARK" IF FIELDNUM(cField) > 0 // есть ли такое поле в БД nRecno := (oBrw:cAlias)->(OrdKeyNo()) xVal := mFieldGet(cField, cAlias) xVal := ! xVal mFieldPut(cField, xVal, cAlias) oBrw:DrawSelect() IF LEN(aCargoFilter) > 0 // если стоит индекс-фильтр по этому полю, то обнулить бровс IF AT( cField, UPPER(aFilter[2]) ) > 0 oBrw:Reset() //oBrw:GoToRec( nRecno-1 ) // вот здесь не знаю как делать.... ENDIF ENDIF oBrw:Refresh(.F.) EndIf
|
|
|
Haz
|
| |
Пост N: 771
Зарегистрирован: 20.02.11
|
|
Отправлено: 12.02.16 17:05. Заголовок: Andrey пишет: Указа..
Andrey пишет: цитата: | Указатель записи нужно поставить на следующую запись. |
| Посмотри как это делает TSBrowse при удалении записи , т.к. суть одинакова
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4689
Зарегистрирован: 12.09.06
|
|
Отправлено: 12.02.16 19:25. Заголовок: Haz пишет: Посмотри..
Haz пишет: цитата: | Посмотри как это делает TSBrowse при удалении записи |
| Вот это - METHOD TSBrowse:DeleteRow() ?
|
|
|
Haz
|
| |
Пост N: 772
Зарегистрирован: 20.02.11
|
|
Отправлено: 13.02.16 11:54. Заголовок: Andrey пишет: Вот э..
Andrey пишет: цитата: | Вот это - METHOD TSBrowse:DeleteRow() ? |
| Да, именно это
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4690
Зарегистрирован: 12.09.06
|
|
Отправлено: 13.02.16 15:38. Заголовок: Спасибо ! :sm36: ..
Спасибо ! И ещё один вопрос созрел. Делаю: Add Super Header To oBrw1 From Column 1 To Column 8 ; Color CLR_BLACK, { CLR_RED , CLR_YELLOW } ; Title "Мой СУПЕРХИДЕР таблицы" 3DLook Можно ли на него создать обработку своей функции ? Как это сделать ? И как поменять центровку строк в этом суперхидере ?
|
|
|
Haz
|
| |
Пост N: 773
Зарегистрирован: 20.02.11
|
|
Отправлено: 13.02.16 16:31. Заголовок: Andrey пишет: Можно..
Andrey пишет: цитата: | Можно ли на него создать обработку своей функции |
| какую обработку ? если клик по хидеру - то вроде есть такая Andrey пишет: цитата: | И как поменять центровку строк в этом суперхидере |
| опять таки какую центровку - горизонтальная есть
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4691
Зарегистрирован: 12.09.06
|
|
Отправлено: 13.02.16 17:12. Заголовок: Haz пишет: если кли..
Haz пишет: цитата: | если клик по хидеру - то вроде есть такая |
| Да, клик по хидеру. Я не нашел как повесить, допустим MsgDebug("Мой СУПЕРХИДЕР таблицы") ? Haz пишет: цитата: | опять таки какую центровку - горизонтальная есть |
| А мне нужно влево центровать, а не по центру.
|
|
|
Haz
|
| |
Пост N: 774
Зарегистрирован: 20.02.11
|
|
Отправлено: 13.02.16 20:00. Заголовок: Andrey пишет: А мне..
Andrey пишет: цитата: | А мне нужно влево центровать, а не по центру. |
| влево вправо по центру - это все ГОРИЗОНТАЛЬНОЕ выравнивание По сути вопроса -гляну в исходниках позже
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 852
Зарегистрирован: 17.02.12
|
|
Отправлено: 13.02.16 21:26. Заголовок: Andrey пишет:А мне н..
Andrey пишет: цитата: | А мне нужно влево центровать, а не по центру. |
| #command ADD [ SUPER ] HEADER TO <oBrw> ; FROM [ COLUMN ] <nFrom> ; TO [ COLUMN ] <nTo> ; [ <head:TITLE, HEADER> <cHead> ] ; [ HEIGHT <nHeight> ] ; [ <color:COLOR, COLORS> <aColors,...> ] ; [ <l3dLook: 3DLOOK, LOOK3D> ] ; [ FONT <uFont> ] ; [ <lGrid:NOGRID, NOLINES> ] ; [ BITMAP <uBmp> ] ; [ <lAdj:ADJUST> ] ; [ <lTra:TRANSPARENT> ] ; [ <horz:HORZ, HORZ ALIGN> <nHAlign> ] ; [ <vert:VERT, VERT ALIGN> <nVAlign> ] ; => ; <oBrw>:AddSuperHead( <nFrom>, <nTo>, <cHead>, [ <nHeight> ], ; [ \{<aColors>\} ], <.l3dLook.>, <uFont>, ; <uBmp>, <.lAdj.>, <.lTra.>, <.lGrid.>, ; <nHAlign>, <nVAlign> ) * ============================================================================ * METHOD TSBrowse:AddSuperHead() Version 9.0 Nov/30/2009 * ============================================================================ Method AddSuperHead( nFromCol, nToCol, uHead, nHeight, aColors, l3dLook, uFont, uBitMap, lAdjust, lTransp, ; lNoLines, nHAlign, nVAlign ) CLASS TSBrowse Local cHeading, nAt, nLheight, nOcurs, cRest, nLineStyle, nClrText, nClrBack, nClrLine, ; hFont := If( ::hFont != Nil, ::hFont, 0 ) Default lAdjust := .F., ; l3DLook := ::aColumns[ nFromCol ]:l3DLookHead, ; nHAlign := DT_CENTER, ; nVAlign := DT_CENTER, ; lTransp := .T., ; uHead := "" ...
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4692
Зарегистрирован: 12.09.06
|
|
Отправлено: 13.02.16 21:55. Заголовок: Делаю: Add Super Hea..
Делаю: Add Super Header To oBrw1 From Column 1 To Column 8 ; Color CLR_BLACK, { CLR_RED , CLR_YELLOW } ; Title "Мой СУПЕРХИДЕР таблицы" 3DLook HORZ DT_LEFT Ура, заработало ! И как еще повесить при нажатии на этот "Super Header", допустим MsgDebug("Мой СУПЕРХИДЕР таблицы") ?
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 853
Зарегистрирован: 17.02.12
|
|
Отправлено: 13.02.16 22:00. Заголовок: Andrey ... HORZ AL..
Andrey ... HORZ ALIGN DT_LEFT // Default DT_CENTER
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 854
Зарегистрирован: 17.02.12
|
|
Отправлено: 13.02.16 22:19. Заголовок: Andrey пишет:И как е..
Andrey пишет: цитата: | И как еще повесить при нажатии на этот "Super Header" |
| есть блоки кода на колонку oCol:bHLClicked := {|nRowPix, nColPix, nAt| MsgDebug(nRowPix, nColPix, nAt) } // Block to be evaluated on header left clicked oCol:bHRClicked := {|nRowPix, nColPix, nAt| MsgDebug(nRowPix, nColPix, nAt) } // Block to be evaluated on header right clicked пикселы в nRow, nCol: nRow := oBrw:GetTxtRow( nRowPix ) nCol := oBrw:nAtCol( nColPix ) выведи их и по ним орентировка где кликали на header или SuperHeader вроде так в тестах делал.
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4713
Зарегистрирован: 12.09.06
|
|
Отправлено: 18.02.16 17:23. Заголовок: Я так понял, что мож..
Я так понял, что можно заменять картинки для сортировки Tsbrowsa даже на PNG ! Сделал тест - работает ! Спасибо SergKis !!! Замена: // --------- заменяем сортировку на свои картинки индикации --------- oBrw5:aSortBmp := { LoadImage("Arrow_down.png"), LoadImage("Arrow_up.png") } И не обязательно делать картинки квадратными. Для того чтобы круг (см.картинку) не касался шапки заголовка справа я сделал картинки размером 30х34. А высоту шапки заголовка сделал чуть больше - oBrw5:nHeightHead := 32
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4714
Зарегистрирован: 12.09.06
|
|
Отправлено: 18.02.16 17:59. Заголовок: Перешёл на новую вер..
Перешёл на новую версию 16.02 и сразу вопрос: Почему перестало в шапке таблицы сдвигаться влево заголовок шапки при активации сортировки на этой шапке ?
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 856
Зарегистрирован: 17.02.12
|
|
Отправлено: 18.02.16 18:23. Заголовок: Andrey http://clipp..
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4726
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.02.16 03:19. Заголовок: Как сделать, чтобы в..
Как сделать, чтобы в контекстном меню высвечивалась текущая строка колонки на которой стоит маркер ? Т.е. делаю так: // по правой кнопки мышки - контекстное меню TBROWSE DEFINE CONTEXT MENU CONTROL oBrw1 MENUITEM "File open 1: " + InfoFile(1,oBrw1:nAt) ACTION { || RunFile(1,oBrw1:nAt) } MENUITEM "File open 2: " + InfoFile(2,oBrw1:nAt) ACTION { || RunFile(2,oBrw1:nAt) } SEPARATOR .....
|
|
|
Haz
|
| |
Пост N: 797
Зарегистрирован: 20.02.11
|
|
Отправлено: 20.02.16 13:16. Заголовок: Andrey пишет: высве..
Andrey пишет: цитата: | высвечивалась текущая строка колонки |
| не проверял , но примерно так Eval( oBrw:aColumns[oBrw:nCell]:bData )
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4727
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.02.16 13:22. Заголовок: Andrey пишет: Так ?..
Andrey пишет: Нет. Вот так:
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4728
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.02.16 14:10. Заголовок: Haz пишет: не прове..
Haz пишет: цитата: | не проверял , но примерно так Eval( oBrw:aColumns[oBrw:nCell]:bData ) |
| Не прокатило.... DEFINE CONTEXT MENU CONTROL oBrw1 MENUITEM "File open 1: " + SUBSTR( Eval( oBrw1:aColumns[4]:bData ) ,1,60) ACTION { || RunFile(1) } MENUITEM "File open 2: " + SUBSTR( Eval( oBrw1:aColumns[4]:bData ) ,61 ) ACTION { || RunFile(2) } SEPARATOR Мне нужно из 4 колонки выбрать первую строчку, а потом вторую строчку. колонка сборная из 2х полей базы собрана: ADD COLUMN TO oBrw1 HEADER "Файлы" ; ......... DATA {|| (cAlias)->DIR1 + (cAlias)->FILE1 + CRLF + ; (cAlias)->DIR2 + (cAlias)->FILE2 }
|
|
|
Haz
|
| |
Пост N: 799
Зарегистрирован: 20.02.11
|
|
Отправлено: 20.02.16 14:20. Заголовок: Andrey пишет: Не пр..
Andrey пишет: ты по простому скажи , тебе надо чтоб в меню показывалось значение из текущей строки бровса ? ( то что строка составная сути не меняет, ловишь по разделителю )
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4729
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.02.16 14:29. Заголовок: Haz пишет: ты по пр..
Haz пишет: цитата: | ты по простому скажи , тебе надо чтоб в меню показывалось значение из текущей строки бровса ? |
| Да !
|
|
|
Haz
|
| |
Пост N: 800
Зарегистрирован: 20.02.11
|
|
Отправлено: 20.02.16 14:32. Заголовок: чтобы сменить строку..
чтобы сменить строку меню есть функция _SetMenuItemCaption ( cName , cWin , cCaption ) где cName задается при MENUITEM cCaption ACTION bAction NAME cName IMAGE cImage в твоем случае получается _SetMenuItemCaption() нужно вешать на ::bChange
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4731
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.02.16 14:38. Заголовок: Спасибо БОЛЬШОЕ ! :..
Спасибо БОЛЬШОЕ !
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4732
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.02.16 15:15. Заголовок: Сделал так: ..
Сделал так: MENUITEM "File open 1: " ACTION { || RunFile(1) } NAME MYNAMEOPENFILE1 MENUITEM "File open 2: " ACTION { || RunFile(2) } NAME MYNAMEOPENFILE2 ........ cCaption1 := "File open 1: " + (oBrw1:cAlias)->FILE1 _SetMenuItemCaption ( "MYNAMEOPENFILE1" , cForm , cCaption1 ) // строка 496 cCaption2 := "File open 2: " + (oBrw1:cAlias)->FILE2 _SetMenuItemCaption ( "MYNAMEOPENFILE2" , cForm , cCaption2 ) Выдаёт ошибку: Error BASE/1132 Переполнение массива: Неверное количество аргументов Called from _GETMENUIDS(561) Called from _SETMENUITEMCAPTION(757) Called from CHANGETABLE(496) Called from (b)MYCREATETABLE(432) Called from TSBROWSE:PAINT(8746) Called from TSBROWSE:DISPLAY(2306) Полез в h_menu.prg LOCAL x := GetControlIndex ( ItemName , FormName ) LOCAL h := _HMG_aControlPageMap [ x ] // строка 561 Я пока не знаю что это такое .... Что делать ?
|
|
|
Haz
|
| |
Пост N: 802
Зарегистрирован: 20.02.11
|
|
Отправлено: 20.02.16 15:22. Заголовок: Andrey пишет: Я пок..
Andrey пишет: цитата: | Я пока не знаю что это такое .... |
| это скорее всего значит что нет такого меню еще т.е на момент вызова bChange ничего не известно про меню примерный порядок DEFINE TSBROWSE END BROWSE DEFINE MENU END MENU oBrw:bChange := .......
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4734
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.02.16 15:45. Заголовок: Haz пишет: примерны..
Haz пишет: Да и у меня тоже такой же: DEFINE TBROWSE oBrw1 ; ............... ON CHANGE { || ChangeTable() } ; ON GOTFOCUS ChangeTable() ; BACKCOLOR aBackColorTbr ; CELL END TBROWSE MyCreateTable() MyCreateTableMenu() STATIC FUNCTION ChangeTable() .....
|
|
|
Haz
|
| |
Пост N: 804
Зарегистрирован: 20.02.11
|
|
Отправлено: 20.02.16 16:43. Заголовок: Andrey пишет: Да и ..
Andrey пишет: цитата: | Да и у меня тоже такой же |
| Разный , бровс который обращается к меню в ON СHANGE объявляется когда этого меню еще и нет обрати внимание где у меня oBrw:bChange := .......
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4737
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.02.16 16:55. Заголовок: Тогда нужно так: ..
Тогда нужно так: DEFINE TBROWSE oBrw1 ; END TBROWSE MyCreateTable() MyCreateTableMenu() oBrw1:bChange := { |oBrw| ChangeTable(oBrw) } ....... STATIC FUNCTION ChangeTable()
|
|
|
Haz
|
| |
Пост N: 805
Зарегистрирован: 20.02.11
|
|
Отправлено: 20.02.16 16:56. Заголовок: Andrey пишет: Тогда..
Andrey пишет: так скорее всего получиться
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4738
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.02.16 17:14. Заголовок: Нет, не пашет... Вал..
Нет, не пашет... Валится сразу при входе в программу. А как проверить наличие "MYNAMEOPENFILE1" ? LOCAL cForm := oBrw1:cParentWnd MsgLog( cForm , cCaption1, cCaption2 ) _SetMenuItemCaption ( "MYNAMEOPENFILE1" , cForm , cCaption1 ) _SetMenuItemCaption ( "MYNAMEOPENFILE2" , cForm , cCaption2 )
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4739
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.02.16 17:18. Заголовок: Победил сваливание т..
Победил сваливание так: IF nStaticViewRecno # 0 // при первом показе - не выводить cCaption1 := "File open 1: " + (oBrw1:cAlias)->FILE1 cCaption2 := "File open 2: " + (oBrw1:cAlias)->FILE2 _SetMenuItemCaption ( "MYNAMEOPENFILE1" , cForm , cCaption1 ) _SetMenuItemCaption ( "MYNAMEOPENFILE2" , cForm , cCaption2 ) oBrw1:aColumns[1]:cFooting := { || ALLTRIM(Transform( nLen, "9 999" )) } cText := IIF( M->nPubLang == 1, " Записи: ", " Recno: ") oBrw1:aColumns[4]:cFooting := { || cText + cVal + "/" + cLen } oBrw1:DrawFooters() // выполнить прорисовку подвала TblFocus() ENDIF Но всё равно в контекстном меню нет имени файла ? В лог-файл выводится имена файлов, а в менюшку нет.
|
|
|
Haz
|
| |
Пост N: 806
Зарегистрирован: 20.02.11
|
|
Отправлено: 21.02.16 11:08. Заголовок: Andrey пишет: Но вс..
Andrey пишет: цитата: | Но всё равно в контекстном меню нет имени файла ? В лог-файл выводится имена файлов, а в менюшку нет. |
| Дарю ( вместо _SetMenuItemCaption ), вешай на ::bChange. Проверил на своем примере , все работает как надо Func MenuCaptionSet( ItemName , FormName, Caption ) LOCAL a := _GetMenuIds ( ItemName , FormName ) LOCAL x := GetControlIndex ( ItemName , FormName ) LOCAL Id := _HMG_aControlIds [ x ] ModifyMenuItem ( a [1] , a [2] , Id , Caption ) return nil PS. подсмотрено в исходниках minigui - h_menu.prg - FUNCTION _ModifyMenuItem ( ItemName , FormName , Caption , action , name , Image )
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4740
Зарегистрирован: 12.09.06
|
|
Отправлено: 21.02.16 15:12. Заголовок: Haz пишет: Дарю ( в..
Haz пишет: цитата: | Дарю ( вместо _SetMenuItemCaption ), вешай на ::bChange. |
| Благодарю ! Сделаю пример - выложу. Только функцию _GetMenuIds() придётся тоже тащить из исходников к себе в проект. Там она STATIC FUNCTION _GetMenuIds().
|
|
|
Haz
|
| |
Пост N: 807
Зарегистрирован: 20.02.11
|
|
Отправлено: 21.02.16 17:12. Заголовок: Andrey пишет: Тольк..
Andrey пишет: цитата: | Только функцию _GetMenuIds() придётся тоже тащить из исходников к себе в проект. Там она STATIC FUNCTION _GetMenuIds(). |
| да придется
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4749
Зарегистрирован: 12.09.06
|
|
Отправлено: 26.02.16 20:05. Заголовок: Кодировка базы 866. ..
Кодировка базы 866. Выводил таблицу всю сразу на экран, было отлично. Юзера захотели чтобы последний поиск (фильтр по базе) сохранялся и потом сразу показывался вместо всей базы. Сделал. Использую условную индексацию, т.е. показ базы по индексу. Теперь при показе таблицы на несколько секунд все записи в кракозябах (другая кодировка), потом строится индекс и всё записи показываются нормально ! Вопрос - как убрать показ этих кракозяб на экран ? Пробовал делать: SetProperty(oBrw:cParentWnd, oBrw:cControlName, "Enabled", .F.) TsbNewIndex(cForm,nTable,aFilter[2], aFilter[1], aFilter[3] ) SetProperty(oBrw:cParentWnd, oBrw:cControlName, "Enabled", .T.) Если ставишь отладку через MsgDebug() - кракозяб не видно !
|
|
|
Haz
|
| |
Пост N: 810
Зарегистрирован: 20.02.11
|
|
Отправлено: 27.02.16 11:05. Заголовок: Andrey пишет: Вопро..
Andrey пишет: цитата: | Вопрос - как убрать показ этих кракозяб на экран ? |
| Зачем в windows задаче кодировка 866 ? перекодируй в 1251 и проблема сама исчезнет. А по сути вопроса - лучше выложи самодостаточный, а то не получается угадать какой код и где что не так
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4750
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.02.16 14:39. Заголовок: Haz пишет: Зачем в ..
Haz пишет: цитата: | Зачем в windows задаче кодировка 866 ? перекодируй в 1251 и проблема сама исчезнет. |
| Не могу. Терминалку перевожу постепенно, сразу все таблицы не перевести. Некоторые не хотят нового интерфейса, оставь им старый, привычный. Так что год-два придётся использовать базы с 866 кодировкой. Проблему решил таким кодом: InkeyGui(10) и всё .... Я сам в шоке от такой простоты.
|
|
|
Haz
|
| |
Пост N: 811
Зарегистрирован: 20.02.11
|
|
Отправлено: 27.02.16 14:56. Заголовок: Andrey пишет: Пробл..
Andrey пишет: цитата: | Проблему решил таким кодом: InkeyGui(10) и всё .... |
| Заплатку поставил. Ведь причина глюка осталась неясной, значит выскочит в другом месте. Andrey пишет: цитата: | Не могу. Терминалку перевожу постепенно, сразу все таблицы не перевести. Некоторые не хотят нового интерфейса, оставь им старый, привычный. Так что год-два придётся использовать базы с 866 кодировкой. |
| Если консольную программу уже не развивать то нет и смысла сползать с 866 Я уже много много лет не использую 866 , а только 1251 и никаких проблем ни в консоли ни в гуи. Правда с консолью почти не работаю , только мелкие сервисные утилиты, да и базы у меня все нативные от RDDADS. в ADS кодировка ANSI используется по умолчанию , а OEM требует вызова перекодирования, это по исходникам видно.
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4751
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.02.16 16:46. Заголовок: 1) Как в Tsbrowse за..
1) Как в Tsbrowse заменить картинки для oCol:lCheckBox := .T. // virtual checkbox ? И менюшку обработки по мышке:
|
|
|
Haz
|
| |
Пост N: 812
Зарегистрирован: 20.02.11
|
|
Отправлено: 27.02.16 17:35. Заголовок: Andrey пишет: 1) Ка..
Andrey пишет: цитата: | 1) Как в Tsbrowse заменить картинки для oCol:lCheckBox := .T. // virtual checkbox ? 2) Как организовать в Tsbrowse свои дополнительные поля со своими картинками ? т.е. в одной таблице нужен стандартный CheckBox и еще 2 дополнительных CheckBox со своими картинками. Примерно так же как в The Bat! |
| элементарно только не чеквокс это Организовать в базе 3 логических поля и по значению в них показывать или не показывать картинку см в примерах tsb_cursor я там календарь в текущей строке рисовал, замени lDrawSelect на значение из поля значение в поле должно инвертиться в bPrevEdit , который должен вернуть ложь чтоб не пустить в редактирование PS. если картинок в поле должно быть много то логическое поле не подойдет, сделай числовое и показывай нужную картинку в зависимости от числа в поле PSS в чекбоксе картинки определены из массива функции StockBmp() менять их там еще тот гемор ... но если есть желание - то желающие могут попробовать.
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 867
Зарегистрирован: 17.02.12
|
|
Отправлено: 27.02.16 18:05. Заголовок: Haz пишет: в чекбокс..
Haz пишет: цитата: | в чекбоксе картинки определены из массива функции StockBmp() менять их там еще тот гемор |
| это не совсем так METHOD DrawLine( xRow ) CLASS TSBrowse ... If lCheck Default ::aCheck := { StockBmp( 6 ), StockBmp( 7 )} hBitMap := ::aCheck[ If( Upper( uData ) == "T", 1, 2 ) ] делаем просто oBrw:aCheck := {LoadImage(<для .T.>), LoadImage(<для .F.>)} и все работает с новыми "галочками" (это может быть и файл и ресурс)
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 868
Зарегистрирован: 17.02.12
|
|
Отправлено: 27.02.16 18:13. Заголовок: Andrey пишет:InkeyGu..
Andrey пишет: цитата: | InkeyGui(10) и всё .... Я сам в шоке от такой простоты. |
| ты просто дал возможность обработать очередь, приостановив код на 10 мс., DO EVENTS тоже помогло бы, надо в гуи иногда давать возможность обрабатывать очередь сообщений
|
|
|
Haz
|
| |
Пост N: 813
Зарегистрирован: 20.02.11
|
|
Отправлено: 27.02.16 18:18. Заголовок: Andrey пишет: И мен..
Andrey пишет: цитата: | И менюшку обработки по мышке: |
| мат в форуме запрещен ? тогда иди пожалуйста почитай хелп по контекстному меню
|
|
|
Haz
|
| |
Пост N: 814
Зарегистрирован: 20.02.11
|
|
Отправлено: 27.02.16 18:23. Заголовок: SergKis пишет: дела..
SergKis пишет: цитата: | делаем просто oBrw:aCheck := {LoadImage(<для .T.>), LoadImage(<для .F.>)} и все работает с новыми "галочками" (это может быть и файл и ресурс) |
| Сергей , это да... но позволяет задать общий aCheck на все колонки, а Андрею нужны свои на каждую если бы было так aColumns[]:aCheck := ... надо подумать над этой идеей
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4752
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.02.16 18:46. Заголовок: Haz пишет: мат в фо..
Haz пишет: цитата: | мат в форуме запрещен ? тогда иди пожалуйста почитай хелп по контекстному меню |
| Да понял я.... Не надо матерится. Пример ты давал, я реализовал эту идею. Просто хотелось бы попроще эти галочки в контекстном меню реализовать. Может что то изменить в самом Tsbrowse ? Уж больно код выглядит не очень понятно для новичков ! Тестовый пример делаю. Как сделаю - выложу.
|
|
|
Dima
|
| |
Пост N: 5490
Зарегистрирован: 17.05.05
|
|
Отправлено: 27.02.16 18:57. Заголовок: Haz пишет: мат в фо..
Haz пишет: Нет
|
|
|
Haz
|
| |
Пост N: 815
Зарегистрирован: 20.02.11
|
|
Отправлено: 27.02.16 19:04. Заголовок: Andrey пишет: Прост..
Andrey пишет: цитата: | Просто хотелось бы попроще эти галочки в контекстном меню реализовать. Может что то изменить в самом Tsbrowse ? |
| я и не матерюсь контекстное меню реализовано проще некуда. А с картинками в колонках - только так , я пока не вижу как проще сделать кроме как Сергей навел на мысль про aColumns[]:aCheck И потом TS не для новмчков , также как browse класс в clipper / harbour т.к. не только новички а и некоторые старички в этот класс не лезут. То что имеет внутри множество инструментов для реализации почти любой хотелки - простым быть не может.
|
|
|
Haz
|
| |
Пост N: 816
Зарегистрирован: 20.02.11
|
|
Отправлено: 27.02.16 19:05. Заголовок: Dima пишет: Нет ..
Dima пишет: а чего ты молчал? теперь многие посты на форуме будут короткими и четкими как выстрел )
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 869
Зарегистрирован: 17.02.12
|
|
Отправлено: 27.02.16 21:50. Заголовок: Haz пишет:если бы бы..
Haz пишет: цитата: | если бы было так aColumns[]:aCheck := ... надо подумать над этой идеей |
| так вроде не сложно: 1. добавляем в TsColumn DATA aCheck 2. чуть правим METHOD DrawLine( xRow ) CLASS TSBrowse ... If lCheck Default ::aCheck := { StockBmp( 6 ), StockBmp( 7 )} If Valtype(oColumn:aCheck) =="A" .and. Len(oColumn:aCheck) > 1 hBitMap := oColumn:aCheck[ If( Upper( uData ) == "T", 1, 2 ) ] Else hBitMap := ::aCheck[ If( Upper( uData ) == "T", 1, 2 ) ] EndIf и все
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 870
Зарегистрирован: 17.02.12
|
|
Отправлено: 27.02.16 22:05. Заголовок: SergKis пишет:и все ..
SergKis пишет: надо добавить METHOD Destroy() CLASS TSBrowse ... If ::aCheck != Nil //V90 DeleteObject ( ::aCheck[ 1 ] ) DeleteObject ( ::aCheck[ 2 ] ) EndIf AEval(::aColumns, {|oCol| If( Valtype(oCol:aCheck) == "A", AEval(oCol:aCheck, {|hBmp| DeleteObject (hBmp) }), ) })
|
|
|
Haz
|
| |
Пост N: 817
Зарегистрирован: 20.02.11
|
|
Отправлено: 28.02.16 11:11. Заголовок: SergKis пишет: так ..
SergKis пишет: Сергей, отлично все сделал и реально не сложно. Я под "подумать" имел ввиду, а нужен ли такой функционал вообще. Да он дает гибкость чекбоксам , но в силу логики тогоже чекбокса имеет только 2 состояния. Думаю все же полезен будет т.к. на будущее не оставляю идею сделать раскрывающееся дерево на базе TS а там значки [+] и [-] будут. Так же на потом оставил чекбокс с тремя состояниями true. false. nil т.к. работаю с ADS а там как порядочной SQL есть NULL Подождем что скажет Григорий про aColumns:[]:aCheck
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 871
Зарегистрирован: 17.02.12
|
|
Отправлено: 28.02.16 11:55. Заголовок: Haz пишет: а нужен л..
Haz пишет: цитата: | а нужен ли такой функционал вообще .. ... чекбокс с тремя состояниями true. false. nil |
| функционал нужен (разные image в колонках) и с тремя состояниями тоже вот доработал по случаю METHOD DrawLine( xRow ) CLASS TSBrowse ... Local cCheckType, nCheckLen ... было lCheck := oColumn:lCheckBox .and. ValType( uData ) == "L" //V90 If lCheck .and. ValType( uData ) == "L" cPicture:= "" nVertText := If( uData, 3, 4 ) EndIf стало lCheck := oColumn:lCheckBox cCheckType := ValType( uData ) If lCheck .and. cCheckType == "L" cPicture:= "" nVertText := If( uData, 3, 4 ) EndIf было If lCheck Default ::aCheck := { StockBmp( 6 ), StockBmp( 7 )} hBitMap := ::aCheck[ If( Upper( uData ) == "T", 1, 2 ) ] nAlign := nMakeLong( DT_CENTER, DT_CENTER ) uData := "" EndIf стало If lCheck Default ::aCheck := { StockBmp( 6 ), StockBmp( 7 )} If Valtype(oColumn:aCheck) =="A" nCheckLen := Len(oColumn:aCheck) If cCheckType == "L" .and. nCheckLen > 1 hBitMap := oColumn:aCheck[ If( Upper( uData ) == "T", 1, 2 ) ] ElseIf nCheckLen > 2 hBitMap := oColumn:aCheck[ 3 ] EndIf ElseIf cChecType == "L" hBitMap := ::aCheck[ If( Upper( uData ) == "T", 1, 2 ) ] EndIf nAlign := nMakeLong( DT_CENTER, DT_CENTER ) uData := "" EndIf
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 872
Зарегистрирован: 17.02.12
|
|
Отправлено: 28.02.16 11:59. Заголовок: PS. ошибочка закрала..
PS. ошибочка закралась ElseIf cCheckType == "L" hBitMap := ::aCheck[ If( Upper( uData ) == "T", 1, 2 ) ] EndIf
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4753
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.02.16 15:33. Заголовок: Прикрутил к полю выб..
Прикрутил к полю выбор из меню: Через DEFINE CONTEXT MENU OF &cForm
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4754
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.02.16 16:08. Заголовок: Вот вопрос возник: h..
Вот вопрос возник:
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 873
Зарегистрирован: 17.02.12
|
|
Отправлено: 28.02.16 17:01. Заголовок: Andrey пишет:Вот воп..
Andrey пишет: вот ответик, в TsColumn.prg ... DATA uBmpCell // bitmap in cell (oBmp, hBmp or bBlock) DATA uBmpFoot // bitmap in footer (oBmp, hBmp or bBlock) DATA uBmpHead // bitmap in header (oBmp, hBmp or bBlock) DATA uBmpSpcHd // bitmap in special header (oBmp, hBmp or bBlock)
|
|
|
ММК
|
| постоянный участник
|
Пост N: 206
Зарегистрирован: 29.05.10
|
|
Отправлено: 28.02.16 21:02. Заголовок: Haz пишет: Думаю вс..
Haz пишет: цитата: | Думаю все же полезен будет т.к. на будущее не оставляю идею сделать раскрывающееся дерево на базе TS а там значки [+] и [-] будут. |
| Вот такой бровс с деревом в FWH если надо , могу исходник бровса прислать :)
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4755
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.02.16 21:12. Заголовок: SergKis пишет: вот ..
SergKis пишет: цитата: | вот ответик, в TsColumn.prg |
| Спасибо ! Не сообразил сразу там посмотреть ! Использую прозрачный PNG. Может по другому надо ?
|
|
|
Haz
|
| |
Пост N: 818
Зарегистрирован: 20.02.11
|
|
Отправлено: 28.02.16 21:17. Заголовок: ММК пишет: если над..
ММК пишет: цитата: | если надо , могу исходник бровса прислать :) |
| Ага Скинь в почту 047545(собака)mail(точка)ru плиз или ссылку на облако дай. Скачаю с интересом гляну как там реализовано. Мне нужно дерево с ветвями до восьмого уровня, пока не пойму как его сделать , пока на фильтрах пытаюсь делать
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4756
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.03.16 14:49. Заголовок: Григорий ! Предлага..
Григорий ! Предлагаю код, который сделал SergKis поместить в исходник TsBrowsa ! Скрытый текст Function GetCellSize( oBrw, nRowPos, nCell, lColSpecHd ) // координаты и размеры ячейки TsBrowse LOCAL nI, ix, nStartX := 0, oCol, cBrw, cForm LOCAL nRow, nCol, nWidth, nHeight Default nRowPos := oBrw:nRowPos, ; nCell := oBrw:nCell, ; lColSpecHd := .F. cForm := oBrw:cParentWnd cBrw := oBrw:cControlName oCol := oBrw:aColumns[ nCell ] If oBrw:nFreeze > 0 For nI := 1 To Min( oBrw:nFreeze , nCell - 1 ) nStartX += oBrw:GetColSizes()[ nI ] Next EndIf For nI := oBrw:nColPos To nCell - 1 nStartX += oBrw:GetColSizes()[ nI ] Next IF lColSpecHd // ячейка в SpecHeader nRow := oBrw:nHeightHead + oBrw:nHeightSuper + If( oCol:l3DLook, 2, 0 ) nCol := nStartX + If( oCol:l3DLook, 2, 0 ) nWidth := oBrw:GetColSizes()[ nCell ] - If( oCol:l3DLook, 2, 1 ) nHeight := oBrw:nHeightSpecHd - If( oCol:l3DLook, 1, -1 ) else // ячейка в таблице nRow := nRowPos - 1 nRow := ( nRow * oBrw:nHeightCell ) + oBrw:nHeightHead + ; oBrw:nHeightSuper + oBrw:nHeightSpecHd + If( oCol:l3DLook, 2, 0 ) nCol := nStartX + If( oCol:l3DLook, 2, 0 ) nWidth := oBrw:GetColSizes()[ nCell ] - If( oCol:l3DLook, 2, 0 ) nHeight := oBrw:nHeightCell - If( oCol:l3DLook, 1, -1 ) endif ix := GetControlIndex ( cBrw, cForm ) // размеры и координаты как для if _HMG_aControlContainerRow [ix] == -1 // TGETBOX !!! nRow += oBrw:nTop - 1 nCol += oBrw:nLeft else nRow += _HMG_aControlRow [ix] - 1 nCol += _HMG_aControlCol [ix] endif nRow += oBrw:aEditCellAdjust[1] nCol += oBrw:aEditCellAdjust[2] nWidth += oBrw:aEditCellAdjust[3] + 2 nHeight += oBrw:aEditCellAdjust[4] + 2 Return { nRow, nCol, nWidth, nHeight }
| Я в своё время намучился, но так и не сделал такую функцию.
|
|
|
Haz
|
| |
Пост N: 822
Зарегистрирован: 20.02.11
|
|
Отправлено: 02.03.16 13:18. Заголовок: Andrey пишет: // ко..
Andrey пишет: цитата: | // координаты и размеры ячейки TsBrowse |
| Два вопроса : 1) а если ячейка за пределами окна бровса , что вернет ? 2) Для чего нужно ?
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 874
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.03.16 13:44. Заголовок: Haz пишет:1) а если ..
Haz пишет: цитата: | 1) а если ячейка за пределами окна бровса , что вернет ? 2) Для чего нужно ? /quote] 1) проверяешь сам видима\не видима колонка 2) для доп. действий на Edit 3) для реализации external edition ... If oCol:bExtEdit != Nil // external edition ::lNoPaint := ::lEditing := .F. uVar := Eval( oCol:bExtEdit, uValue, Self ) ::lChanged := ValType( uVar ) != ValType( uValue ) .or. uVar != uValue ::lPostEdit := .T. ::oWnd:nLastKey := VK_RETURN ::PostEdit( uVar, nCell, bValid ) Return Nil EndIf |
| пример на базе Tsb_array_2 Скрытый текст [pre2] #include "minigui.ch" #include "TSBrowse.ch" PROCEDURE MAIN LOCAL oBrw, aDatos, aArray, aHead, aSize, aFoot, aPict, aAlign, aName, aFontHF LOCAL aFont := {} // Local hFontHead, hFontFoot LOCAL cFontName := _HMG_DefaultFontName LOCAL nFontSize := 11 LOCAL nY, nX, oCol SET DECIMALS TO 4 SET DATE TO GERMAN SET EPOCH TO 2000 SET CENTURY ON SET EXACT ON DEFINE FONT Font_1 FONTNAME cFontName SIZE nFontSize DEFINE FONT Font_2 FONTNAME cFontName SIZE nFontSize BOLD AAdd( aFont, GetFontHandle( "Font_1" ) ) AAdd( aFont, GetFontHandle( "Font_2" ) ) DEFINE WINDOW test ; TITLE "SetArray For Report Demo" ; MAIN ; NOMAXIMIZE NOSIZE DEFINE STATUSBAR FONT cFontName SIZE nFontSize STATUSITEM "0" // WIDTH 0 FONTCOLOR BLACK STATUSITEM "Item 1" WIDTH 230 // FONTCOLOR BLACK STATUSITEM "Item 2" WIDTH 230 // FONTCOLOR BLACK STATUSITEM "Item 3" WIDTH 230 // FONTCOLOR BLACK END STATUSBAR nY := test.HEIGHT - GetProperty( "test", "StatusBar", "Height" ) - 70 nX := 20 @ nY, nX LABEL Lbl_Test VALUE "" WIDTH 200 HEIGHT 40 BACKCOLOR { 35, 179, 15} DEFINE TBROWSE oBrw ; AT 1 + iif( IsVistaOrLater(), GetBorderWidth()/2, 0 ), ; 1 + iif( IsVistaOrLater(), GetBorderHeight()/2, 0 ) ; WIDTH test.WIDTH - 2 * GetBorderWidth() ; HEIGHT test.HEIGHT - GetTitleHeight() - ; GetProperty( "test", "StatusBar", "Height" ) - ; 2 * GetBorderHeight() - 50 ; ENUMERATOR ; FONT cFontName SIZE nFontSize ; GRID EDIT aDatos := CreateDatos() aArray := aDatos[ 1 ] aHead := aDatos[ 2 ] aSize := aDatos[ 3 ] aFoot := aDatos[ 4 ] aPict := aDatos[ 5 ] aAlign := aDatos[ 6 ] aName := aDatos[ 7 ] // hFontHead := aFont[1] // normal Header // hFontFoot := aFont[2] // bold Footer // aFontHF := { hFontHead, hFontFoot } // aFontHF := aFont[1] // normal Header, Footer aFontHF := aFont[2] // bold Header, Footer oBrw := SetArrayTo( "oBrw", "test", aArray, aFontHF, aHead, aSize, aFoot, aPict, aAlign, aName ) // oBrw:nLineStyle := LINES_NONE oBrw:nWheelLines := 1 oBrw:nClrLine := COLOR_GRID oBrw:nHeightCell += 5 oBrw:nHeightHead += 5 IF ! Empty( aFoot ) oBrw:nHeightFoot += 5 ENDIF IF oBrw:lEnum oBrw:nHeightSpecHd := oBrw:nHeightCell ENDIF oCol := oBrw:GetColumn("ColName_7") oCol:bPrevEdit := {|uVl,oBr | mPrevEdit(uVl, oBr) } oCol:bPostEdit := {|uVl,oBr,lAp| mPostEdit(uVl, oBr, lAp) } END TBROWSE END WINDOW DoMethod( "test", "Activate" ) RETURN * ====================================================================== STATIC FUNCTION CreateDatos() LOCAL i, k := 1000, aDatos, aHead, aSize, aFoot, aPict, aAlign, aName aDatos := Array( k ) FOR i := 1 TO k aDatos[ i ] := { " ", ; // 1 i, ; // 2 ntoc( i ) + "_123", ; // 3 Date() + i, ; // 4 PadR( "Test line - " + ntoc( i ), 20 ), ; // 5 Round( ( 10000 -i ) * i / 3, 2 ), ; // 6 100.00 * i, ; // 7 0.12, ; // 8 Round( 100.00 * i * 0.12, 2 ), ; // 9 Round( 1234567.00 / i, 3 ), ; // 10 PadR( "Line " + StrZero( i, 5 ), 20 ), ; // 11 Date(), ; // 12 Time(), ; // 13 i % 2 == 0 } // 14 NEXT aHead := AClone( aDatos[ 1 ] ) // AEval(aHead, {|x,n| aHead[ n ] := "Head_" + hb_ntos(n) }) AEval( aHead, {| x, n| aHead[ n ] := "Head" + hb_ntos( n ) + ; iif( n % 2 == 0, CRLF + "SubHead" + hb_ntos( n ), "" ) } ) aFoot := Array( Len( aDatos[ 1 ] ) ) AEval( aFoot, {| x, n| aFoot[ n ] := n } ) // aFoot := .T. // подножие есть с пустыми значениями aPict := Array( Len( aDatos[ 1 ] ) ) // можно не задавать, формируются aPict[ 10 ] := "99999999999.999" // автоматом для C,N по мах значению aSize := Array( Len( aDatos[ 1 ] ) ) // можно не задавать, формируются aSize[ 10 ] := aPict[ 10 ] // автоматом по мах значению в колонке aAlign := Array( Len( aDatos[ 1 ] ) ) // тип поля C - DT_LEFT aAlign[ 2 ] := DT_CENTER // D,L - DT_CENTER // N - DT_RIGHT aName := Array( Len( aDatos[ 1 ] ) ) AEval( aName, {| x, n| aName[ n ] := "ColName_" + hb_ntos( n ) } ) RETURN { aDatos, aHead, aSize, aFoot, aPict, aAlign, aName } Function GetCellSize( oBrw, nRowPos, nCell, lColSpecHd ) // координаты и размеры ячейки TsBrowse LOCAL nI, ix, nStartX := 0, oCol, cBrw, cForm LOCAL nRow, nCol, nWidth, nHeight Default nRowPos := oBrw:nRowPos, ; nCell := oBrw:nCell, ; lColSpecHd := .F. cForm := oBrw:cParentWnd cBrw := oBrw:cControlName oCol := oBrw:aColumns[ nCell ] If oBrw:nFreeze > 0 For nI := 1 To Min( oBrw:nFreeze , nCell - 1 ) nStartX += oBrw:GetColSizes()[ nI ] Next EndIf For nI := oBrw:nColPos To nCell - 1 nStartX += oBrw:GetColSizes()[ nI ] Next IF lColSpecHd // ячейка в SpecHeader nRow := oBrw:nHeightHead + oBrw:nHeightSuper + If( oCol:l3DLook, 2, 0 ) nCol := nStartX + If( oCol:l3DLook, 2, 0 ) nWidth := oBrw:GetColSizes()[ nCell ] - If( oCol:l3DLook, 2, 1 ) nHeight := oBrw:nHeightSpecHd - If( oCol:l3DLook, 1, -1 ) else // ячейка в таблице nRow := nRowPos - 1 nRow := ( nRow * oBrw:nHeightCell ) + oBrw:nHeightHead + ; oBrw:nHeightSuper + oBrw:nHeightSpecHd + If( oCol:l3DLook, 2, 0 ) nCol := nStartX + If( oCol:l3DLook, 2, 0 ) nWidth := oBrw:GetColSizes()[ nCell ] - If( oCol:l3DLook, 2, 0 ) nHeight := oBrw:nHeightCell - If( oCol:l3DLook, 1, -1 ) endif ix := GetControlIndex ( cBrw, cForm ) // размеры и координаты как для if _HMG_aControlContainerRow [ix] == -1 // TGETBOX !!! nRow += oBrw:nTop - 1 nCol += oBrw:nLeft else nRow += _HMG_aControlRow [ix] - 1 nCol += _HMG_aControlCol [ix] endif nRow += oBrw:aEditCellAdjust[1] nCol += oBrw:aEditCellAdjust[2] nWidth += oBrw:aEditCellAdjust[3] + 2 nHeight += oBrw:aEditCellAdjust[4] + 2 Return { nRow, nCol, nWidth, nHeight } STATIC FUNCTION mPrevEdit( uVal, oBrw ) LOCAL cForm := oBrw:cParentWnd LOCAL cBrw := oBrw:cControlName LOCAL nRowPos := oBrw:nRowPos LOCAL nCell := oBrw:nCell LOCAL oCol := oBrw:aColumns[ nCell ] LOCAL lRet := .T., aS, nY, nX, nW, nH, cLbl := "Lbl_Test" LOCAL lSH := .T. // .T. - SpecHead, .F. - Cell, меняем тут If oCol:cName == "ColName_7" aS := GetCellSize(oBrw, nRowPos, nCell, lSH) nY := aS[1] + If( lSH, 0, aS[4] ) nX := aS[2] nW := aS[3] nH := aS[4] SetProperty(cForm, cLbl, "Row" , nY) SetProperty(cForm, cLbl, "Col" , nX) SetProperty(cForm, cLbl, "Width" , nW) SetProperty(cForm, cLbl, "Height" , nH) SetProperty(cForm, cLbl, "Visible", .T.) SetProperty(cForm, cLbl, "Value" , "") EndIf RETURN lRet STATIC FUNCTION mPostEdit( uVal, oBrw, lApp ) LOCAL cForm := oBrw:cParentWnd LOCAL cBrw := oBrw:cControlName LOCAL nCell := oBrw:nCell LOCAL oCol := oBrw:aColumns[ nCell ] LOCAL lRet := .T., cLbl := "Lbl_Test" If oCol:cName == "ColName_7" SetProperty(cForm, cLbl, "Visible", .F.) EndIf RETURN lRet
|
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 875
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.03.16 13:46. Заголовок: PS вкл. Edit на коло..
PS вкл. Edit на колонке 7
|
|
|
Haz
|
| |
Пост N: 823
Зарегистрирован: 20.02.11
|
|
Отправлено: 02.03.16 14:35. Заголовок: Сергей привет Serg..
Сергей привет SergKis пишет: цитата: | проверяешь сам видима\не видима колонка |
| 1) а не проще сразу ::nCell использовать ? ( сам отвечу, проще но так универсальнее ) 2) как использовать и для чего я сразу понял , т. к. делал почти тоже но уже из oEdit объекта PS Пример хороший , сам присматривался к получению координат по аналогии с методом ::Edit() ,как раз то что ты реализовал. PSS правда не увидел в нем внешнего редактирования ) Григорий , действительно полезная функция, добавьте в библиотеку пожалуйста Пра мыслей как можно ее использовать 1) Организация всплывающий подсказок при редактировании ячейки 2) Псевдо комбобоксы под ячейкой ( бровс по вариантам )
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 876
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.03.16 14:55. Заголовок: Haz пишет: а не прощ..
Haz пишет: цитата: | а не проще сразу ::nCell использовать ? |
| не всегда нужен ::nCell иногда нужен nCell - 2 и т.д. и т.п. Haz пишет: цитата: | делал почти тоже но уже из oEdit объекта |
| в bPrevEdit, bExtEdit нет oEdit, потому нужен механизм размеров (в моем проекте это метод ::GetCellSize(...)) Haz пишет: цитата: | правде не увидел в нем внешнего редактирования |
| под BROWSE такой механизм (несколько GetBox на Label) работает, почему тут не будет ? что исп. для внешнего редактирования GetBox или др. TSB - по ситуации
|
|
|
Haz
|
| |
Пост N: 824
Зарегистрирован: 20.02.11
|
|
Отправлено: 02.03.16 15:04. Заголовок: SergKis пишет: пото..
SergKis пишет: цитата: | потому нужен механизм размеров (в моем проекте это метод ::GetCellSize(...)) |
| Сергей , раз уж начал ..... Может в метод переделаешь METHOD GetCellInfo() Возвращает объект oCell c данными ( примерно эти , дальше нарастет по необходимости ) ::nRow ::nCol ::nWidth ::nHeight и код из твоего примера станет таким oCell := oBrw:GetCellinfo(nRowPos, nCell, lSH) nY := oCell:nRow + If( lSH, 0, oCell:nHeight ) nX := oCell:nCol nW := oCell:nWidth nH := oCell:nHeight
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 877
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.03.16 20:22. Заголовок: Haz пишет:Может в ме..
Haz пишет: цитата: | Может в метод переделаешь METHOD GetCellInfo() |
| хорошее название - сделаю пример на 2-а GetBox для ввода в 7-ю колонку (Label не прикрутил - прорисовка линий на нем от TSB) Скрытый текст
#include "minigui.ch" #include "TSBrowse.ch" PROCEDURE MAIN LOCAL oBrw, aDatos, aArray, aHead, aSize, aFoot, aPict, aAlign, aName, aFontHF LOCAL aFont := {} // Local hFontHead, hFontFoot LOCAL cFontName := _HMG_DefaultFontName LOCAL nFontSize := 11 LOCAL nY, nX, oCol LOCAL cForm := "test" SET DECIMALS TO 4 SET DATE TO GERMAN SET EPOCH TO 2000 SET CENTURY ON SET EXACT ON DEFINE FONT Font_1 FONTNAME cFontName SIZE nFontSize DEFINE FONT Font_2 FONTNAME cFontName SIZE nFontSize BOLD AAdd( aFont, GetFontHandle( "Font_1" ) ) AAdd( aFont, GetFontHandle( "Font_2" ) ) DEFINE WINDOW test ; TITLE "SetArray For Report Demo" ; MAIN ; NOMAXIMIZE NOSIZE DEFINE STATUSBAR FONT cFontName SIZE nFontSize STATUSITEM "0" // WIDTH 0 FONTCOLOR BLACK STATUSITEM "Item 1" WIDTH 230 // FONTCOLOR BLACK STATUSITEM "Item 2" WIDTH 230 // FONTCOLOR BLACK STATUSITEM "Item 3" WIDTH 230 // FONTCOLOR BLACK END STATUSBAR DEFINE TBROWSE oBrw ; AT 1 + iif( IsVistaOrLater(), GetBorderWidth()/2, 0 ), ; 1 + iif( IsVistaOrLater(), GetBorderHeight()/2, 0 ) ; WIDTH test.WIDTH - 2 * GetBorderWidth() ; HEIGHT test.HEIGHT - GetTitleHeight() - ; GetProperty( "test", "StatusBar", "Height" ) - ; 2 * GetBorderHeight() - 50 ; ENUMERATOR ; FONT cFontName SIZE nFontSize ; GRID EDIT aDatos := CreateDatos() aArray := aDatos[ 1 ] aHead := aDatos[ 2 ] aSize := aDatos[ 3 ] aFoot := aDatos[ 4 ] aPict := aDatos[ 5 ] aAlign := aDatos[ 6 ] aName := aDatos[ 7 ] // hFontHead := aFont[1] // normal Header // hFontFoot := aFont[2] // bold Footer // aFontHF := { hFontHead, hFontFoot } // aFontHF := aFont[1] // normal Header, Footer aFontHF := aFont[2] // bold Header, Footer oBrw := SetArrayTo( "oBrw", "test", aArray, aFontHF, aHead, aSize, aFoot, aPict, aAlign, aName ) // oBrw:nLineStyle := LINES_NONE oBrw:nWheelLines := 1 oBrw:nClrLine := COLOR_GRID oBrw:nHeightCell += 5 oBrw:nHeightHead += 5 IF ! Empty( aFoot ) oBrw:nHeightFoot += 5 ENDIF IF oBrw:lEnum oBrw:nHeightSpecHd := oBrw:nHeightCell ENDIF oCol := oBrw:GetColumn("ColName_7") oCol:bPrevEdit := {|uVl,oBr| mPrevEdit(uVl, oBr) } // oCol:bPostEdit := {|uVl,oBr,lAp| mPostEdit(uVl, oBr, lAp) } // oCol:bExtEdit := {|uvl,oBr | mExtEdit (uVl, oBr ) } END TBROWSE // контролы ОБЯЗАТЕЛЬНО после TsBrowse, что бы z-ордер был большим у них, чем у TSB nY := test.HEIGHT - GetProperty( "test", "StatusBar", "Height" ) - 80 nX := 20 @ nY, nX LABEL Lbl_Test VALUE "" WIDTH 40 HEIGHT 40 BACKCOLOR { 35, 179, 15} nX += 40 + 10 @ nY, nX GETBOX Get_Sum1 WIDTH 40 HEIGHT 20 VALUE 0 PICTURE "999.99" ; VALID mGet_Sum() ON LOSTFOCUS mLostFocus() nX += 40 + 10 @ nY, nX GETBOX Get_Sum2 WIDTH 40 HEIGHT 20 VALUE 0 PICTURE "999.99" ; VALID mGet_Sum() ON LOSTFOCUS mLostFocus() test.Get_Sum1.Cargo := oBrw test.Get_Sum2.Cargo := oBrw oBrw:SetFocus() END WINDOW DoMethod( "test", "Activate" ) RETURN * ====================================================================== STATIC FUNCTION CreateDatos() LOCAL i, k := 1000, aDatos, aHead, aSize, aFoot, aPict, aAlign, aName aDatos := Array( k ) FOR i := 1 TO k aDatos[ i ] := { " ", ; // 1 i, ; // 2 ntoc( i ) + "_123", ; // 3 Date() + i, ; // 4 PadR( "Test line - " + ntoc( i ), 20 ), ; // 5 Round( ( 10000 -i ) * i / 3, 2 ), ; // 6 100.00 * i, ; // 7 0.12, ; // 8 Round( 100.00 * i * 0.12, 2 ), ; // 9 Round( 1234567.00 / i, 3 ), ; // 10 PadR( "Line " + StrZero( i, 5 ), 20 ), ; // 11 Date(), ; // 12 Time(), ; // 13 i % 2 == 0 } // 14 NEXT aHead := AClone( aDatos[ 1 ] ) // AEval(aHead, {|x,n| aHead[ n ] := "Head_" + hb_ntos(n) }) AEval( aHead, {| x, n| aHead[ n ] := "Head" + hb_ntos( n ) + ; iif( n % 2 == 0, CRLF + "SubHead" + hb_ntos( n ), "" ) } ) aFoot := Array( Len( aDatos[ 1 ] ) ) AEval( aFoot, {| x, n| aFoot[ n ] := n } ) // aFoot := .T. // подножие есть с пустыми значениями aPict := Array( Len( aDatos[ 1 ] ) ) // можно не задавать, формируются aPict[ 10 ] := "99999999999.999" // автоматом для C,N по мах значению aSize := Array( Len( aDatos[ 1 ] ) ) // можно не задавать, формируются aSize[ 10 ] := aPict[ 10 ] // автоматом по мах значению в колонке aAlign := Array( Len( aDatos[ 1 ] ) ) // тип поля C - DT_LEFT aAlign[ 2 ] := DT_CENTER // D,L - DT_CENTER // N - DT_RIGHT aName := Array( Len( aDatos[ 1 ] ) ) AEval( aName, {| x, n| aName[ n ] := "ColName_" + hb_ntos( n ) } ) RETURN { aDatos, aHead, aSize, aFoot, aPict, aAlign, aName } Function GetCellSize( oBrw, nRowPos, nCell, lColSpecHd ) // координаты и размеры ячейки TsBrowse LOCAL nI, ix, nStartX := 0, oCol, cBrw, cForm LOCAL nRow, nCol, nWidth, nHeight Default nRowPos := oBrw:nRowPos, ; nCell := oBrw:nCell, ; lColSpecHd := .F. cForm := oBrw:cParentWnd cBrw := oBrw:cControlName oCol := oBrw:aColumns[ nCell ] If oBrw:nFreeze > 0 For nI := 1 To Min( oBrw:nFreeze , nCell - 1 ) nStartX += oBrw:GetColSizes()[ nI ] Next EndIf For nI := oBrw:nColPos To nCell - 1 nStartX += oBrw:GetColSizes()[ nI ] Next IF lColSpecHd // ячейка в SpecHeader nRow := oBrw:nHeightHead + oBrw:nHeightSuper + If( oCol:l3DLook, 2, 0 ) nCol := nStartX + If( oCol:l3DLook, 2, 0 ) nWidth := oBrw:GetColSizes()[ nCell ] - If( oCol:l3DLook, 2, 1 ) nHeight := oBrw:nHeightSpecHd - If( oCol:l3DLook, 1, -1 ) else // ячейка в таблице nRow := nRowPos - 1 nRow := ( nRow * oBrw:nHeightCell ) + oBrw:nHeightHead + ; oBrw:nHeightSuper + oBrw:nHeightSpecHd + If( oCol:l3DLook, 2, 0 ) nCol := nStartX + If( oCol:l3DLook, 2, 0 ) nWidth := oBrw:GetColSizes()[ nCell ] - If( oCol:l3DLook, 2, 0 ) nHeight := oBrw:nHeightCell - If( oCol:l3DLook, 1, -1 ) endif ix := GetControlIndex ( cBrw, cForm ) // размеры и координаты как для if _HMG_aControlContainerRow [ix] == -1 // TGETBOX !!! nRow += oBrw:nTop - 1 nCol += oBrw:nLeft else nRow += _HMG_aControlRow [ix] - 1 nCol += _HMG_aControlCol [ix] endif nRow += oBrw:aEditCellAdjust[1] nCol += oBrw:aEditCellAdjust[2] nWidth += oBrw:aEditCellAdjust[3] + 2 nHeight += oBrw:aEditCellAdjust[4] + 2 Return { nRow, nCol, nWidth, nHeight } STATIC FUNCTION mLostFocus() LOCAL ix, lSum, hFocus := GetFocus() LOCAL cForm := _HMG_ThisFormName LOCAL cSm1 := "Get_Sum1" LOCAL cSm2 := "Get_Sum2" If hFocus != 0 ix := ascan(_HMG_aControlHandles, hFocus) If ix > 0 lSum := _HMG_aControlNames[ ix ] == cSm1 .or. ; _HMG_aControlNames[ ix ] == cSm2 If ! lSum SetProperty(cForm, cSm1, "Visible", .F.) SetProperty(cForm, cSm2, "Visible", .F.) EndIf EndIf EndIf RETURN Nil STATIC FUNCTION mGet_Sum() LOCAL lRet := .T., nCell, oCol, nSm1, nSm2, nSum LOCAL cForm := _HMG_ThisFormName LOCAL cName := _HMG_ThisControlName LOCAL oBrw := GetProperty(cForm, cName, "Cargo") LOCAL cSm1 := "Get_Sum1" LOCAL cSm2 := "Get_Sum2" If Valtype(oBrw) == "O" nCell := oBrw:nCell oCol := oBrw:GetColumn(nCell) If cName == "Get_Sum2" nSm1 := GetProperty(cForm, cSm1, "Value") nSm2 := GetProperty(cForm, cSm2, "Value") nSum := nSm1 * nSm2 mPostEdit(nSum, oBrw) EndIf EndIf RETURN lRet STATIC FUNCTION mPrevEdit( uVal, oBrw ) LOCAL cForm := oBrw:cParentWnd LOCAL cBrw := oBrw:cControlName LOCAL nRowPos := oBrw:nRowPos LOCAL nCell := oBrw:nCell LOCAL oCol := oBrw:aColumns[ nCell ] LOCAL lRet := .T., aS, nY, nX, nW, nH, nD := 4 LOCAL cLbl := "Lbl_Test" LOCAL cSm1 := "Get_Sum1" LOCAL cSm2 := "Get_Sum2" If oCol:cName == "ColName_7" aS := GetCellSize(oBrw, nRowPos, nCell - 1) nY := aS[1] nX := aS[2] nW := aS[3] nH := aS[4] SetProperty(cForm, cSm1, "Row" , nY) SetProperty(cForm, cSm1, "Col" , nX) SetProperty(cForm, cSm1, "Width" , nW) SetProperty(cForm, cSm1, "Height" , nH) SetProperty(cForm, cSm1, "Visible", .T.) SetProperty(cForm, cSm1, "Value" , 0) nY := aS[1] + aS[4] nX := aS[2] nW := aS[3] nH := aS[4] SetProperty(cForm, cSm2, "Row" , nY) SetProperty(cForm, cSm2, "Col" , nX) SetProperty(cForm, cSm2, "Width" , nW) SetProperty(cForm, cSm2, "Height" , nH) SetProperty(cForm, cSm2, "Visible", .T.) SetProperty(cForm, cSm2, "Value" , 0) DoMethod(cForm, cSm1, "SetFocus") lRet := .F. EndIf RETURN lRet STATIC FUNCTION mPostEdit( uVal, oBrw, lApp ) LOCAL cForm := oBrw:cParentWnd LOCAL cBrw := oBrw:cControlName LOCAL nCell := oBrw:nCell LOCAL oCol := oBrw:aColumns[ nCell ] LOCAL lRet := .T. LOCAL cLbl := "Lbl_Test" LOCAL cSm1 := "Get_Sum1" LOCAL cSm2 := "Get_Sum2" LOCAL nSum If oCol:cName == "ColName_7" SetProperty(cForm, cSm2, "Visible", .F.) SetProperty(cForm, cSm1, "Visible", .F.) nSum := EVal(oCol:bData) If uVal != nSum oBrw:aArray[oBrw:nAt][nCell] := uVal oBrw:DrawSelect() EndIf EndIf RETURN lRet
|
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 878
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.03.16 21:19. Заголовок: Haz переделал CLAS..
Haz переделал Скрытый текст
CLASS TSBcell VAR nRow AS NUMERIC INIT 0 VAR nCol AS NUMERIC INIT 0 VAR nWidth AS NUMERIC INIT 0 VAR nHeight AS NUMERIC INIT 0 METHOD New() INLINE ( Self ) ENDCLASS METHOD GetCellInfo( nRowPos, nCell, lColSpecHd ) CLASS TSBrowse LOCAL nI, ix, nStartX := 0, oCol, cBrw, cForm LOCAL nRow, nCol, nWidth, nHeight LOCAL oCell := TSBcell():New() Default nRowPos := ::nRowPos, ; nCell := ::nCell, ; lColSpecHd := .F. cForm := ::cParentWnd cBrw := ::cControlName oCol := ::aColumns[ nCell ] If ::nFreeze > 0 For nI := 1 To Min( ::nFreeze , nCell - 1 ) nStartX += ::GetColSizes()[ nI ] Next EndIf For nI := ::nColPos To nCell - 1 nStartX += ::GetColSizes()[ nI ] Next IF lColSpecHd nRow := ::nHeightHead + ::nHeightSuper + If( oCol:l3DLook, 2, 0 ) nCol := nStartX + If( oCol:l3DLook, 2, 0 ) nWidth := ::GetColSizes()[ nCell ] - If( oCol:l3DLook, 2, 1 ) nHeight := ::nHeightSpecHd - If( oCol:l3DLook, 1, -1 ) else nRow := nRowPos - 1 nRow := ( nRow * ::nHeightCell ) + ::nHeightHead + ; ::nHeightSuper + ::nHeightSpecHd + If( oCol:l3DLook, 2, 0 ) nCol := nStartX + If( oCol:l3DLook, 2, 0 ) nWidth := ::GetColSizes()[ nCell ] - If( oCol:l3DLook, 2, 0 ) nHeight := ::nHeightCell - If( oCol:l3DLook, 1, -1 ) endif ix := GetControlIndex ( cBrw, cForm ) if _HMG_aControlContainerRow [ix] == -1 nRow += ::nTop - 1 nCol += ::nLeft else nRow += _HMG_aControlRow [ix] - 1 nCol += _HMG_aControlCol [ix] endif nRow += ::aEditCellAdjust[1] nCol += ::aEditCellAdjust[2] nWidth += ::aEditCellAdjust[3] + 2 nHeight += ::aEditCellAdjust[4] + 2 oCell:nRow := nRow oCell:nCol := nCol oCell:nWidth := nWidth oCell:nHeight := nHeight Return oCell
|
|
|
|
Haz
|
| |
Пост N: 825
Зарегистрирован: 20.02.11
|
|
Отправлено: 02.03.16 22:33. Заголовок: SergKis пишет: пере..
SergKis пишет: отлично теперь с форума будем собирать идеи по наполнению класса CLASS TSBcell
|
|
|
gfilatov2002
|
| moderator
|
Пост N: 891
Зарегистрирован: 11.02.10
|
|
Отправлено: 02.03.16 22:33. Заголовок: SergKis пишет: пере..
SergKis пишет: Благодарю за помощь Подключил новый метод к классу, проверил работу примера с этим методом - полет нормальный
|
|
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|