| Автор | Сообщение |
|
|
| постоянный участник
|
Пост N: 7956
Зарегистрирован: 12.09.06
|
|
Отправлено: 22.03.25 12:35. Заголовок: TsBrowse. Как сделать объединение ячеек ?
Создаю ТСБ из массивов, небольшой отчет по годам. Возможно ли сделать показ одной большой строки в ТСБ ? Это как в Экселе делается объединение нескольких ячеек для показа длинного текста - подзаголовка. Вот так как на картинке: 
|
 |

|
|
Ответов - 25
, стр:
1
2
All
[только новые]
|
|
|
|
| постоянный участник
|
Пост N: 4700
Зарегистрирован: 17.02.12
|
|
Отправлено: 22.03.25 13:36. Заголовок: Andrey пишет Возможн..
Andrey пишет | цитата: | | Возможно ли сделать показ одной большой строки в ТСБ ? |
| Прямого решения нет, но есть блок кода oBrw:bTSDrawCell, который вызывается перед C ф-ей вывода строки, в методе (смотри его) METHOD TSDrawCell( oCell, oCol ) CLASS TSBrowse LOCAL lDraw IF ISBLOCK( ::bTSDrawCell ) lDraw := Eval( ::bTSDrawCell, Self, oCell, oCol ) IF ISLOGICAL( lDraw ) .AND. Empty( lDraw ) RETURN .F. ENDIF ENDIF lDraw := TSDrawCell( oCell:hWnd, ; // 1 ... в блоке можно попробовать обыграть объединение колонок, возвращая .T.\.F. из него и подменяя данные для ф-ии TSDrawCell( oCell:...) Поиграйся.
|
 |

|
|
|
| постоянный участник
|
Пост N: 7957
Зарегистрирован: 12.09.06
|
|
Отправлено: 23.03.25 13:50. Заголовок: Спасибо БОЛЬШОЕ Serg..
|
 |

|
|
|
| постоянный участник
|
Пост N: 7958
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.04.25 16:10. Заголовок: Сделал другой пример..
Сделал другой пример на вставку/удаления колонок в ТСБ. После этой операции прога вылетает при редактировании ячеек таблицы. Почему ??? Вылетает не всегда: 1) Ставим галочку, делаем Edit ячейки 11, выходит окно Alert*(), снимаем галочку, делаем Edit ячейки 8 - ВЫЛЕТ !!! 2) Ставим галочку, делаем Edit ячейки 8, снимаем галочку, делаем Edit ячейки 7 - НЕТ ВЫЛЕТА !! Вот пример - https://cloud.mail.ru/public/RaJL/F6VN37XVN Большая просьба протестировать на других версиях МиниГуи. А то у меня вылетает, а на другом компе НЕТ ! 
|
 |

|
|
|
| постоянный участник
|
Пост N: 7959
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.04.25 19:31. Заголовок: А можно в ТСБ для ма..
А можно в ТСБ для массива встроить сразу показ типов: "A" и "O" ? Т.е. если колонки такого типа, то преобразовывать их в строку и работать дальше с ними как со строкой ???? 
|
 |

|
|
|
| постоянный участник
|
Пост N: 4705
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.04.25 00:10. Заголовок: Andrey Используй oC..
Andrey Используй oCol:bDecode := {|xVal [, oBrw[, nCol[, oCol]]| ...<обрабатывай как надо>...<возвращай xVal := строку>, xVal } Только xVal := _o2log(xVal,, ">>>", .T., .T.) не используй - будет медленно через файл (для oHmgData() можно преобразовывать в строку json). С массивом, наверно, лучше сразу заполнять колонки в показе Например, массив и колонки: 1-8 - тут что то 9,10,11 - тут что то 12,13,14 - тут преобразования для показа из 15,16,17 15,16,17 - тут объекты, массивы, ... в показе тсб колонки 1-14, 15-17 только в массиве. Вызов myToArray(oBrw:aArray, aN1, aN2) aN1 := {12,13,14} aN2 := {15,16,17} FUNC myToArray(aArr, aN1, aN2) Local aa, n1, n2 FOR EACH aa IN aArr FOR EACH n1, n2 IN aN1, aN2 aa[n1] := myVal2Str(aa[n2]) NEXT NEXT RETURN aArr Примеры работы с колонками тут https://TransFiles.ru/yvddj
|
 |

|
|
|
| постоянный участник
|
Пост N: 7974
Зарегистрирован: 12.09.06
|
|
Отправлено: 10.05.25 12:43. Заголовок: Решил поделиться опы..
Решил поделиться опытом, может кому пригодиться. Давно была нужно сделать УДОБНУЮ карточку для юзера в МиниГуи. Много вариантов сделал, и на TAB объекте и другие разные варианты. Смотрел что делал Сергей на TSB, не устраивали эти варианты. Сергей натолкнул на мысль как это можно сделать. ОГРОМНОЕ СПАСИБО ему за терпенье и помощь в создание этого примера. Идея простая, считываем одну запись dbf-базы в ТСБ на основе массива и вот карточка юзера готова. Причём на одну строку можем считать несколько десятков полей базы. В качестве примера сделан поиск/фильтр по массиву и фильтр по базе oBrw:FilterFTS() Компактный и удобный вид карточки. Вот внешний вид карточки: Вот поля и функции из базы в массиве, причём 3-колонка это порядок показа и сортировки строк показа юзера, он сам редактирует эту колонку: сортировка сохраняется в ини-файле GetUserTempFolder() + "\tmp_SortUser.ini" Сделано редактирование ячеек таблиц разное: Можно писать и свои функции окон ввода, добавив свою обработку строки таблицы: Или такое: Или такое: Или такое: Исходники отправлены Григорию.
|
 |

|
|
|
| moderator
|
Пост N: 2438
Зарегистрирован: 11.02.10
|
|
Отправлено: 10.05.25 13:32. Заголовок: Andrey пишет: Исход..
Andrey пишет: Большое спасибо, Андрей! Еще бы добавить подробную документацию к этим картинкам выше. 
|
 |

|
|
|
| постоянный участник
|
Пост N: 7975
Зарегистрирован: 12.09.06
|
|
Отправлено: 10.05.25 13:47. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: | цитата: | Еще бы добавить подробную документацию к этим картинкам выше. |
| В каком виде сделать ? Просто для меня это сложно уже представить, так как я с помощью Сергея разобрался как это делается.
|
 |

|
|
|
| moderator
|
Пост N: 2439
Зарегистрирован: 11.02.10
|
|
Отправлено: 10.05.25 14:18. Заголовок: Andrey пишет: В как..
Andrey пишет: Желательно сделать так, чтобы и другие неподготовленные пользователи могли разобраться. Andrey пишет: Ведь не у всех есть возможность обратится к Сергею, а код не всегда понятен для начинающих за счет интенсивного использования событий и встроенных возможностей объектов. 
|
 |

|
|
|
| постоянный участник
|
Пост N: 7976
Зарегистрирован: 12.09.06
|
|
Отправлено: 10.05.25 14:50. Заголовок: Это не совсем понятн..
Это не совсем понятно ! Начинающие пользователи тоже разные. По событиям в библиотеке уже много примеров. Дай пожалуйста кратко, по шагам - что по тексту примера нужно сделать, какую документацию ? 
|
 |

|
|
|
| moderator
|
Пост N: 2440
Зарегистрирован: 11.02.10
|
|
Отправлено: 10.05.25 15:07. Заголовок: Andrey пишет: Начин..
Andrey пишет: | цитата: | | Начинающие пользователи тоже разные. |
| Согласен. Andrey пишет: Просто проиллюстрируй картинки из поста 7974 примерами кода, которые реализуют этот функционал. 
|
 |

|
|
|
|
|
| постоянный участник
|
Пост N: 7977
Зарегистрирован: 12.09.06
|
|
Отправлено: 10.05.25 15:13. Заголовок: Сделаю ! Но завтра !..
Сделаю ! Но завтра ! 
|
 |

|
|
|
| постоянный участник
|
Пост N: 7980
Зарегистрирован: 12.09.06
|
|
Отправлено: 18.05.25 11:23. Заголовок: Делаю новый примет с..
Делаю новый примет с ТСБ. Получаю вылет в нём, такой: Error BASE/1132 Переполнение массива: Неверное количество аргументов Args: [1] = A { ... } length: 0 [2] = N 0 --------------------------------- Stack Trace --------------------------------- Called from TSBROWSE:LOADFIELDS(9410) in module: h_tbrowse.prg Called from _DEFINETBROWSE(363) in module: h_tbrowse.prg Called from _TBROWSE(655) in module: h_controlmisc2.prg Called from FORMTABLE12(114) in module: form_Table12.prg Called from TABLE_ONE(85) in module: demo3_1Base.prg Called from (b)MAIN(73) in module: demo3.prg По коду - вот это место: nAlign := iif( ::aJustify != NIL .AND. Len( ::aJustify ) >= nE, ::aJustify[ nE ], ; iif( ( cAlias )->( ValType( FieldGet( nE ) ) ) == "N", 2, ; iif( ( cAlias )->( ValType( FieldGet( nE ) ) ) $ "DL", 1, 0 ) ) ) // TSBROWSE:LOADFIELDS(9410) Ну и как это понять ? У меня в проге нет задания nAlign. Задаю проверку перед построением - ? "oTsb:aAlign=", oTsb:aAlign выдаёт oTsb:aAlign= NIL И как проверить чего не хватает ? Нельзя выдавать нормальную ошибку в коде ТСБ ??? Сделать перед FOR n := 1 TO nCols проверку на количество размерности массивов ??? Там же немного вариантов всего...
|
 |

|
|
|
| постоянный участник
|
Пост N: 4734
Зарегистрирован: 17.02.12
|
|
Отправлено: 18.05.25 13:35. Заголовок: Andrey пишет Нельзя ..
Andrey пишет | цитата: | | Нельзя выдавать нормальную ошибку в коде ТСБ ??? |
| Этот вопрос задай себе, в том смысле, проверить факт. наличие полей в dbf, которые пишешь в настройке, т.е. ? (cAlias)->(FieldPos (...)) для 1-го поля "MARK", например AADD( aCol, { 2 , "W", "L" , "(о)" , "MARK" , REPL("X",5) , REPL("X",1) , nil , nil , nil } )
|
 |

|
|
|
| постоянный участник
|
Пост N: 7982
Зарегистрирован: 12.09.06
|
|
Отправлено: 18.05.25 17:09. Заголовок: SergKis пишет: пров..
SergKis пишет: | цитата: | | проверить факт. наличие полей в dbf, которые пишешь в настройке |
| Я ошибся немного, перетащив с рабочей базы этот код. Есть такие поля в базе, а в тесте нет. Всё равно хотелось бы в коде h_tbrowse.prg иметь такую проверку: nCols := iif( aNames == NIL, ( cAlias )->( FCount() ), Len( aNames ) ) aColSizes := iif( Len( ::aColumns ) == Len( aColSizes ), NIL, aColSizes ) cTmp := "" FOR n := 1 TO nCols nE := ( cAlias )->( FieldPos( aNames[ n ] ) ) IF nE == 0 cTmp += HB_NtoS(n) + ". " + aNames[ n ] + CRLF ENDIF NEXT IF LEN(cTmp) > 0 MsgStop("Error! No fields in DB: " + cAlias + CRLF + CRLF + cTmp) ENDIF FOR n := 1 TO nCols Новые переменные не добавлял, код вроде короткий. Григорий, можно добавить этот код для удобства ? Очень часто букву перепутаешь или поле такого в базе нет, а просто забыл про это, и начинается пересмотр всех мест кода где сам накосячил. Этот код избавить от глупых ошибок !!!
|
 |

|
|
|
| moderator
|
Пост N: 2443
Зарегистрирован: 11.02.10
|
|
Отправлено: 18.05.25 19:45. Заголовок: Andrey пишет: хотел..
Andrey пишет: | цитата: | | хотелось бы в коде h_tbrowse.prg иметь такую проверку |
| Добавил такую проверку для случая, когда явно указаны имена полей в виде массива aNames. 
|
 |

|
|
|
| постоянный участник
|
Пост N: 7983
Зарегистрирован: 12.09.06
|
|
Отправлено: 18.05.25 20:50. Заголовок: Спасибо ! :sm36:..
Спасибо ! 
|
 |

|
|
|
| постоянный участник
|
Пост N: 7988
Зарегистрирован: 12.09.06
|
|
Отправлено: 21.05.25 18:37. Заголовок: Перетащил код из при..
Перетащил код из примера к себе в новую программу. Очередной вылет на ТСБ: Error BASE/1068 Неверный аргумент: Неверное количество аргументов Args: [1] = A { ... } length: 15 [2] = U --------------------------------- Stack Trace --------------------------------- Called from TSBROWSE:BDATAEVAL(1975) in module: h_tbrowse.prg Called from (b)TSBROWSE(1395) in module: h_tbrowse.prg Called from TSBROWSE:SETGETVALUE(0) Called from (b)TSBROWSE(1399) in module: h_tbrowse.prg Called from TSBROWSE:GETVALUE(0) Called from (b)EVAL(345) in module: 0Main.prg Called from TSBROWSE:DRAWSELECT(4859) in module: h_tbrowse.prg Called from TSBROWSE:DRAWSUPER(5024) in module: h_tbrowse.prg Called from TSBROWSE:PAINT(11232) in module: h_tbrowse.prg Called from TSBROWSE:DISPLAY(3507) in module: h_tbrowse.prg Called from _ENDTBROWSE(624) in module: h_tbrowse.prg Called from _TBROWSE(786) in module: h_controlmisc2.prg Called from FORMTABLE12(113) in module: form_Table12.prg Всё вроде правильно перетащил, а вылетает... И как найти где что забыл добавить в ТСБ ? Смотрел исходник h_tbrowse.prg, ничего не понял, где ставить трассировку не понятно... Строка 113 oBrw := _TBrowse( oTsb, cAls, cBrw, owc:nTsbY, owc:nTsbX, owc:nTsbW, owc:nTsbH )
|
 |

|
|
|
| постоянный участник
|
Пост N: 7989
Зарегистрирован: 12.09.06
|
|
Отправлено: 21.05.25 22:42. Заголовок: Нашёл ошибку. Не заг..
Нашёл ошибку. Не загружены ресурсы на колонку ТСБ, т.е. забыл включить картинки в ресурсы. cField := "KZBID" nI := ob:nColumn(cField, .T.) IF nI > 0 oc := ob:aColumns[nI] oc:Cargo := oHmgData() // создадим контейнер на колонку oc:Cargo:cField := cField oc:Cargo:aBmp := aBmp oc:Cargo:aMsg := aMsg oc:nClrBack := CLR_WHITE oc:lEdit := .T. oc:nEditMove := 0 // перечитать ячейку oc:lBitMap := .T. // убрать показ значений поля из колонки oc:aBitMaps := {} For i := 1 To Len(aBmp) cImg := aBmp AAdd( oc:aBitMaps, LoadImage(cImg,,nHImg,nHImg) ) Next bBmpCell := {|nc,ob| // показ картинки в зависимости от поля "K????" Local ocol := ob:aColumns[nc] Local ni := 0 // bFZero32 Local nMax := LEN(ocol:aBitMaps) // bFZero32 Local nCode := ob:GetValue(ob:Cargo:cField) // колонка коды типа файлов //? ProcName(), nCode, ocol:cName, ocol:cField //nCode := FIELDGET(FIELDNUM(ob:Cargo:cField)) // можно и так IF !IsNumeric(nCode) nCode := 0 ENDIF IF nCode <= 0 .OR. nCode >= nMax ni := nMax ELSE ni := nCode ENDIF Return ocol:aBitMaps[ni] // картинку с позиции массива } oc:uBmpCell := bBmpCell // блок-код смены картинок И как это можно проверить при построении ТСБ ??? Return ocol:aBitMaps[ni] - т.е. вылет здесь, показ хендла = 0 Есть какой нибудь системный хендл, чтобы показывать его без вылета ??? 
|
 |

|
|
|
| постоянный участник
|
Пост N: 7992
Зарегистрирован: 12.09.06
|
|
Отправлено: 26.05.25 14:39. Заголовок: На базе предыдущего ..
|
 |

|
|
|
| постоянный участник
|
Пост N: 7999
Зарегистрирован: 12.09.06
|
|
Отправлено: 09.06.25 17:32. Заголовок: Показ карточки с цве..
Показ карточки с цветными TAB из TSB в новой версии МиниГуи C:\MiniGUI_2506\SAMPLES\Advanced\Tsb_EditDbf\demo3.hbp
|
 |

|
|
|
|
|
| постоянный участник
|
Пост N: 8000
Зарегистрирован: 12.09.06
|
|
Отправлено: 11.06.25 12:08. Заголовок: Что то не собирается..
Что то не собирается пример C:\MiniGUI_2506\SAMPLES\Advanced\Tsb_EditDbf\demo1-ru.hbp Под новым компилятором: W:\…ProjectMiniGui\@PROJECT\@TSBROWSE---\Tsb_array_EditDbf>c:\MiniGuiBcc77_2506\build.bat -DDEBUG demo1-ru.hbp building... c:\MiniGuiBcc77_2506\ c:\MiniGuiBcc77_2506\build.bat c:\bcc770 Harbour 3.2.0dev (r2502211016) Copyright (c) 1999-2025, https://harbour.github.io/ Borland Resource Compiler Version 5.40 Copyright (c) 1990, 1999 Inprise Corporation. All rights reserved. Borland Resource Compiler Version 5.40 Copyright (c) 1990, 1999 Inprise Corporation. All rights reserved. OBJ\demo1.c: OBJ\demo1_array.c: OBJ\GetSet_array_dbf.c: OBJ\demo1_util.c: OBJ\demo1_line64.c: OBJ\tsb_Checkerboard.c: OBJ\tsb_EditWindows.c: OBJ\tsb_SprDefect.c: OBJ\tsb_Tovar.c: OBJ\tsb_tovar_outfit.c: OBJ\tsb_memo_cell.c: OBJ\tsb_util.c: OBJ\util_button.c: OBJ\_hbmkaut_demo1.c: Turbo Incremental Link 5.66 Copyright (c) 1997-2002 Borland Error: Unresolved external '___get_std_stream' referenced from C:\MINIGUIBCC77_2506\HARBOUR\LIB\WIN\BCC\HBVMMT.LIB|fm Error: Unresolved external 'SwitchToThisWindow' referenced from C:\MINIGUIBCC77_2506\LIB\MINIGUI.LIB|c_windowsAPI Error: Unresolved external 'PrivateExtractIconsA' referenced from C:\MINIGUIBCC77_2506\LIB\MINIGUI.LIB|c_icon Error: Unresolved external '__itoa' referenced from C:\MINIGUIBCC77_2506\LIB\MINIGUI.LIB|c_winapimisc hbmk2[demo1-ru]: Error: Running linker. 2 Для продолжения нажмите любую клавишу . . . Да и другие тоже. Harbour 3.2.0dev (r2502211016) Copyright (c) 1999-2025, https://harbour.github.io/ D:\TEMP\hbmk_krl4a2.dir\demo.c: D:\TEMP\hbmk_puhvy8.c: Turbo Incremental Link 5.66 Copyright (c) 1997-2002 Borland Error: Unresolved external '___get_std_stream' referenced from C:\MINIGUIBCC77_2506\HARBOUR\LIB\WIN\BCC\HBVM.LIB|fm Error: Unresolved external 'SwitchToThisWindow' referenced from C:\MINIGUIBCC77_2506\LIB\MINIGUI.LIB|c_windowsAPI Error: Unresolved external 'PrivateExtractIconsA' referenced from C:\MINIGUIBCC77_2506\LIB\MINIGUI.LIB|c_icon Error: Unresolved external '__itoa' referenced from C:\MINIGUIBCC77_2506\LIB\MINIGUI.LIB|c_winapimisc hbmk2: Error: Running linker. 2
|
 |

|
|
|
| постоянный участник
|
Пост N: 8055
Зарегистрирован: 12.09.06
|
|
Отправлено: 07.10.25 15:07. Заголовок: https://i.postimg.cc..
Имею построенный ТСБ, все колонки текстовые. Нужно превратить определенную колонку по выбору в числовую и выдать итог в подвале. Проблема, не получается изменить тип колонки. Как это сделать ??? Вот код: aSum[x] := { числа, полученное из текстовой колонки } oCol := oBrw:GetColumn("Col_10") oCNew := oCol:Clone() nPos := 11 oBrw:InsColumn(nPos, oCNew) oCol := oBrw:aColumns[nPos] oCol:cPicture := NIL oCol:cDataType := "N" oBrw:Reset() oBrw:GoTop() FOR nJ := 1 TO oBrw:nLen oBrw:SetValue(nPos,aSum[nJ]) oBrw:Skip(1) NEXT .... oBrw:DelColumn( nPos-1 ) // удалить колонку в таблицу oBrw:DrawFooters() oBrw:Reset() oBrw:Refresh(.T.) // перечитывает данные в таблице oBrw:GoTop() oBrw:SetFocus() DO EVENTS После перерисовки ТСБ - прога падает с ошибкой: Error BASE/2022 Неверный аргумент: ALLTRIM Args: [1] = N 1.00 Called from ALLTRIM(0) Called from (b)EVAL(523) in module: demo.prg Called from TSBROWSE:BDATAEVAL(1993) in module: h_tbrowse.prg Called from TSBROWSE:DRAWSELECT(4795) in module: h_tbrowse.prg Called from TSBROWSE:DRAWSUPER(5054) in module: h_tbrowse.prg Called from TSBROWSE:PAINT(11268) in module: h_tbrowse.prg Called from TCONTROL:HANDLEEVENT(872) in module: TControl.prg Called from TSBROWSE:HANDLEEVENT(9764) in module: h_tbrowse.prg Called from EVENTS(144) in module: h_events.prg Called from DOEVENTS(0) Called from TSB_1COLTRANSF(280) in module: tsb_actions.prg
|
 |

|
|
|
| постоянный участник
|
Пост N: 8056
Зарегистрирован: 12.09.06
|
|
Отправлено: 07.10.25 17:04. Заголовок: Отбой. Код заработал..
Отбой. Код заработал !!!
|
 |

|
|
|
| постоянный участник
|
Пост N: 8057
Зарегистрирован: 12.09.06
|
|
Отправлено: 07.10.25 18:22. Заголовок: Есть отличная функци..
Есть отличная функция в ТСБ - oBrw:FilterFTS( cVal, .T. ) Можно ли такую же сделать для ТСБ с массивом типа oBrw:FilterArr( cVal, .T. ) ? 
|
 |

|
|
Ответов - 25
, стр:
1
2
All
[только новые]
|
|