On-line: гостей 1. Всего: 1 [подробнее..]
АвторСообщение
постоянный участник




Пост N: 7956
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.03.25 12:35. Заголовок: TsBrowse. Как сделать объединение ячеек ?


Создаю ТСБ из массивов, небольшой отчет по годам.
Возможно ли сделать показ одной большой строки в ТСБ ?
Это как в Экселе делается объединение нескольких ячеек для показа длинного текста - подзаголовка.
Вот так как на картинке:


Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 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:...)
Поиграйся.

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




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


Спасибо БОЛЬШОЕ SergKis
Вот пример, кому интересно - https://cloud.mail.ru/public/ehxt/4SGtWxfYR

Спасибо: 1 
ПрофильЦитата Ответить
постоянный участник




Пост 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
Большая просьба протестировать на других версиях МиниГуи.
А то у меня вылетает, а на другом компе НЕТ !

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




Пост N: 7959
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 05.04.25 19:31. Заголовок: А можно в ТСБ для ма..


А можно в ТСБ для массива встроить сразу показ типов: "A" и "O" ?
Т.е. если колонки такого типа, то преобразовывать их в строку и работать дальше с ними как со строкой ????

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




Пост 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

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




Пост N: 7974
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 10.05.25 12:43. Заголовок: Решил поделиться опы..


Решил поделиться опытом, может кому пригодиться.
Давно была нужно сделать УДОБНУЮ карточку для юзера в МиниГуи.
Много вариантов сделал, и на TAB объекте и другие разные варианты.
Смотрел что делал Сергей на TSB, не устраивали эти варианты.

Сергей натолкнул на мысль как это можно сделать.
ОГРОМНОЕ СПАСИБО ему за терпенье и помощь в создание этого примера.

Идея простая, считываем одну запись dbf-базы в ТСБ на основе массива и вот карточка юзера готова.
Причём на одну строку можем считать несколько десятков полей базы.
В качестве примера сделан поиск/фильтр по массиву и фильтр по базе oBrw:FilterFTS()
Компактный и удобный вид карточки.

Вот внешний вид карточки:




Вот поля и функции из базы в массиве,
причём 3-колонка это порядок показа и сортировки строк показа юзера, он сам редактирует эту колонку:


сортировка сохраняется в ини-файле GetUserTempFolder() + "\tmp_SortUser.ini"


Сделано редактирование ячеек таблиц разное:



Можно писать и свои функции окон ввода, добавив свою обработку строки таблицы:


Или такое:



Или такое:



Или такое:



Исходники отправлены Григорию.

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2438
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 10.05.25 13:32. Заголовок: Andrey пишет: Исход..


Andrey пишет:

 цитата:
Исходники отправлены


Большое спасибо, Андрей!
Еще бы добавить подробную документацию к этим картинкам выше.

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




Пост N: 7975
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 10.05.25 13:47. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Еще бы добавить подробную документацию к этим картинкам выше.


В каком виде сделать ?
Просто для меня это сложно уже представить, так как я с помощью Сергея разобрался как это делается.

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2439
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 10.05.25 14:18. Заголовок: Andrey пишет: В как..


Andrey пишет:

 цитата:
В каком виде сделать ?


Желательно сделать так, чтобы и другие неподготовленные пользователи могли разобраться.

Andrey пишет:

 цитата:
я с помощью Сергея


Ведь не у всех есть возможность обратится к Сергею, а код не всегда понятен для начинающих за счет интенсивного использования событий и встроенных возможностей объектов.

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




Пост N: 7976
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 10.05.25 14:50. Заголовок: Это не совсем понятн..


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

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2440
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 10.05.25 15:07. Заголовок: Andrey пишет: Начин..


Andrey пишет:

 цитата:
Начинающие пользователи тоже разные.


Согласен.

Andrey пишет:

 цитата:
какую документацию ?


Просто проиллюстрируй картинки из поста 7974 примерами кода, которые реализуют этот функционал.

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




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


Сделаю ! Но завтра !

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




Пост 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 проверку на количество размерности массивов ???
Там же немного вариантов всего...

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




Пост 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 } )

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




Пост 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

Новые переменные не добавлял, код вроде короткий. Григорий, можно добавить этот код для удобства ?
Очень часто букву перепутаешь или поле такого в базе нет, а просто забыл про это, и начинается пересмотр всех мест кода где сам накосячил.
Этот код избавить от глупых ошибок !!!

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2443
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 18.05.25 19:45. Заголовок: Andrey пишет: хотел..


Andrey пишет:

 цитата:
хотелось бы в коде h_tbrowse.prg иметь такую проверку


Добавил такую проверку для случая, когда явно указаны имена полей в виде массива aNames.

Спасибо: 1 
ПрофильЦитата Ответить
постоянный участник




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


Спасибо !

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




Пост 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 )


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




Пост 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
Есть какой нибудь системный хендл, чтобы показывать его без вылета ???

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




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


На базе предыдущего примера сделал новый - показ карточки с цветными TAB из TSB.
Получилась универсальная карточка для любой задачи.










Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 25 , стр: 1 2 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 20
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет