| Автор | Сообщение |
|
|
| постоянный участник
|
Пост 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. Заголовок: На базе предыдущего ..
|
 |

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