Форум » GUI » TsBrowse в Минигуи (продолжение) » Ответить

TsBrowse в Минигуи (продолжение)

Vlad04: TsBrows определяется в виде строки ПАРМЕТРОВ объекта и их значений К примеру [quote] 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 [/quote] Здесь я собрал параметры из разных tBrows Можно или нет и какие парметры заменить выражением ( и каким) ? oBrw2:.... oBrw2:....

Ответов - 300, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All

Andrey: Haz пишет: PS Кто тут увидел шаманов Да ты шаман ! Можешь у других спросить... Больше тебя и никто и не написал как делать ! Заодно и подскажи как для шапки таблицы такое же сделать ? А то тоже получается всегда в одну строчку !

Haz: Пересобрал библиотеку hbxlsxml.lib под BCC ( в родной с русским есть глюк) и дополнил свой пример Tsb_cursor выгрузкой в Excel по правой кнопке мышь. Это просто пример, как альтернатива BIFF или OLE Цветная раскраска и формулы поддерживается от автора библиотеки. по ссылке готовый пример, исходник примера и библиотека. исходники самой библы в искать харбуре click here

Haz: Andrey пишет: Заодно и подскажи как для шапки таблицы такое же сделать ? А то тоже получается всегда в одну строчку ! можно перед записью строки заголовков задать высоту по заголовку, а потом перед записью данных задать высоту данных


Andrey: Haz пишет: по ссылке готовый пример, исходник примера и библиотека. исходники самой библы в искать харбуре Пример понятен. Наверное всё таки тестовый пример нужно отдельно для этого делать, с разными типами полей. Или прикрутить этот новый экспорт в пример MiniGUI\SAMPLES\Advanced\Tsb_array_3 Желательно ещё бы сразу в примере задать многострочный Tsbrowse для экспорта. Суперхидер и подвал так же необходим в экспорте. А цвета наверное нужно как то задавать отдельным параметром в ЭКСПОРТ, тира 0-черно/белый, 1-цвет передать с Tsbrowse, 2-задать свои отдельные цвета. Это как предложение по цвету.

Haz: Andrey пишет: прикрутить этот новый экспорт в пример MiniGUI\SAMPLES\Advanced\Tsb_array_3 Я продемонстрировал сам механизм использования xmlxls. По которому можно примерно оценить скорость выгрузки 1000 строк и простейшее оформление. Конечно в этом механизме есть и форматы ячеек и формулы и использование цвета, объединения, задавать шрифты и пр. Конечно не все, но многое в нем есть. Сам по себе экспорт бровса в оригинальном виде в Excel, это как полуфабрикат. Выгрузка документа должна быть законченной, включая оформление. Под офомлением я понимаю вид документа, а не слответствие листа в Excel внешнему виду бровса. Оформление должно включать все реквизиты документа, а не только табличку. Сейчас лучшее оформление можно получить через OLE, но скорость оставляет желать лучшего. Понятно что можно выкинуть в олю массив, а потом наряжать лист, так и это не быстро. Наводить красоту можно и через тот же BIFF, но нет библиотеки, а в кодах по спецификации BIFF можно потеряться. В этом плане xmlxls это компромис с хорошей скоростью и возможностью рисовать почти как хочешь. Я на нем сделал несколько отчётов и могу сказать, что это именно альтернатива OLE для рисования на листе Excel. Теперь что касается выгрузки именно бровса в Excel. Встраивать сам класс в исходники TSBROWS скорее всго не рационально т. к. бровс потребует библиотеку xmlxls для сборки. А вот отдельный пример экспорта бровса сделать конечно можно. Подвалы, суперхидеры, шрифты и цвета, это все решаемо. Но делать из какого либо примера винегрет, тоже не вариант. Так что только отдельный и небольшой, чтоб было понятно что где.

Dima: Haz пишет: Встраивать сам класс в исходники TSBROWS скорее всго не рационально т. к. бровс потребует библиотеку xmlxls для сборки. +1

Andrey: Haz пишет: Но делать из какого либо примера винегрет, тоже не вариант. Так что только отдельный и небольшой, чтоб было понятно что где. Хорошо, я тогда сделаю пример таблицы для этого. А там далее уже поможешь... Возвращаюсь к вопросу: Haz пишет: можно перед записью строки заголовков задать высоту по заголовку, а потом перед записью данных задать высоту данных Можно для Григория (чтобы он добавил в библиотеку) дать код для этого ?

Haz: Andrey пишет: Хорошо, я тогда сделаю пример таблицы для этого. А там далее уже поможешь... договорились

Haz: Haz пишет: Можно для Григория (чтобы он добавил в библиотеку) дать код для этого ? Да можно конечно. Тем более, что это и так понятно по коду Excel2 куда что вставлять. Вопрос, а надо ли из простого экспорта, городить копию бровса?

Andrey: Haz пишет: Вопрос, а надо ли из простого экспорта, городить копию бровса? Нет не надо, надо только 2 позиции: 1) Просто если шапка таблицы (а это часто бывает) состоит из нескольких строк, то при экспорте надо учитывать высоту шапки. 2) Если данные таблицы 2-3 строки, то при экспорте тоже учитываем высоту данных таблицы. У меня несколько таблиц есть с такими параметрами, да я думаю и другие порадуются более корректному экспорту.

Haz: Andrey пишет: Нет не надо, надо только 2 позиции: [pre2] В :Excel2() после этого FWrite( nHandle, BiffRec( 66, GetACP() ) ) FWrite( nHandle, BiffRec( 12 ) ) FWrite( nHandle, BiffRec( 13 ) ) Следующую строку убираем ( если кто то ужк успел ее суда добавить ) // FWrite( nHandle, BiffRec( 37 , ::nHeightCell * 15) ) После этого ... If ! Empty( cTitle ) cTitle := StrTran( cTitle, CRLF, Chr( 10 ) ) nAlign := If( Chr( 10 ) $ cTitle, 5, 1 ) FWrite( nHandle, BiffRec( 4, cTitle, 0, 0,, nAlign ) ) nLine := 3 EndIf Добавляем это FWrite( nHandle, BiffRec( 37 , ::nHeightHead * 15) ) А После этого ... If bPrintRow != Nil .and. ! Eval( bPrintRow, nRow ) ::Skip( 1 ) Loop EndIf Добавляем это If nRow == 2 FWrite( nHandle, BiffRec( 37 , ::nHeightCell * 15) ) END [/pre2] Andrey пишет: У меня несколько таблиц есть с такими параметрами, да я думаю и другие порадуются более корректному экспорту. может кто и порадуется , а по мне это просто способ схалявить на выгрузке таблицы. НУ чтоб юзер отстал , или для себя бумажку распечатать надо. такую выгрузку до ума еще доводить и доводить ( к примеру форматы ячеек ставить "процентный" или "финансовый" или как принято в фин отчетности - все отрицательные числа в скобках ) Проще уж сразу выгружать нормально

Haz: для справки; Обнаружил неприятную особенность :aCheck , при задании в качестве картинки хендла картинки из внешней переменной ( в моём случаи PUBLIC ) , повторный вызов TS картинку уже не показывал . Беглый просмотр кода исходников показал что при дестрое TS , так же дестроятся и эти хендлы. Т.е. закрытие бровса убивало PUBLIC переменные с хендлами картинок. Из ситуации вышел без изменения исходников , храня хендлы в самом бровсе через [pre2] __objAddData (oBrw, 'hPic1' ) oBrw:hPic1:= LoadImage("PICTURE1") и oBrw:GetColumn( 'COL1'):aCheck := {oBrw:hPic1, nil } [/pre2]

SergKis: Haz пишет oBrw:GetColumn( 'COL1'):aCheck := {oBrw:hPic1, nil } Почему сразу не делать oBrw:GetColumn( 'COL1'):aCheck := {LoadImage('PICTURE1'), nil } ?

Haz: SergKis пишет: Почему сразу не делать Логично, но не рискнул. При uBmpCell при этом идёт утечка памяти. В aCheck возможно утечка не проявится... тестировать не стал Хотя uBmpCell я вызвал в блоке...

SergKis: Haz пишет При uBmpCell при этом идёт утечка памяти. Как я понимаю, uBmpCell это полностью собственное управление, сам поставил, сам снял\освободил. Остальные свойства доводились "до кондиции"[pre2] If ::aSortBmp != Nil DeleteObject ( ::aSortBmp[ 1 ] ) DeleteObject ( ::aSortBmp[ 2 ] ) EndIf If ::aCheck != Nil DeleteObject ( ::aCheck[ 1 ] ) DeleteObject ( ::aCheck[ 2 ] ) EndIf If Len( ::aColumns ) > 0 For i := 1 To Len( ::aColumns ) If Valtype( ::aColumns[ i ]:aCheck ) == "A" AEval( ::aColumns[ i ]:aCheck, {|hBmp| If( Empty( hBmp ), , DeleteObject( hBmp ) ) } ) EndIf If Valtype( ::aColumns[ i ]:aBitMaps ) == "A" AEval( ::aColumns[ i ]:aBitMaps, {|hBmp| If( Empty( hBmp ), , DeleteObject( hBmp ) ) } ) EndIf Next EndIf [/pre2] Рекомендовал бы, вместо uBmpCell, использовать :aBitMaps с цифровым значением (Tsb_aBitMaps)[pre2] oBrw:GetColumn("FLD1"):aCheck := { LoadImage(".\RES\Print32.png"), NIL } oBrw:GetColumn("FLD2"):aCheck := { LoadImage(".\RES\Save32.png" ), NIL } oBrw:GetColumn("FLD3"):aCheck := { LoadImage(".\RES\Mail32.png" ), NIL } oBrw:GetColumn("FLD4"):aCheck := { LoadImage(".\RES\check1.bmp" ), ; LoadImage(".\RES\check0.bmp") } oBrw:GetColumn("FLD6"):lBitMap := .T. oBrw:GetColumn("FLD6"):aBitMaps := { LoadImage(".\RES\edit_delete.bmp" ), ; LoadImage(".\RES\edit_cancel.bmp" ) } ... oBrw:GetColumn("FLD7"):lBitMap := .T. oBrw:aBitMaps := { LoadImage(".\RES\flag_bel.bmp"), ; LoadImage(".\RES\flag_en.bmp" ), ; LoadImage(".\RES\flag_kaz.bmp"), ; LoadImage(".\RES\flag_ru.bmp" ), ; LoadImage(".\RES\flag_ua.bmp" ) } [/pre2]

Haz: SergKis пишет: Рекомендовал бы, вместо uBmpCell, использовать :aBitMaps Да, согласен спасибо за подсказку. В uBmpCell утечка была именно из-за блока. При каждом DrawLine() инмциализировался новый хендл.

SergKis: SergKis пишет Остальные свойства доводились "до кондиции" Упс. Потерялось однако. В моей версии еще такие строки есть в методе Destroy():[pre2] ... If Len( ::aColumns ) > 0 For i := 1 To Len( ::aColumns ) If Valtype( ::aColumns[ i ]:aCheck ) == "A" AEval( ::aColumns[ i ]:aCheck, {|hBmp| If( Empty( hBmp ), , DeleteObject( hBmp ) ) } ) EndIf If Valtype( ::aColumns[ i ]:aBitMaps ) == "A" AEval( ::aColumns[ i ]:aBitMaps, {|hBmp| If( Empty( hBmp ), , DeleteObject( hBmp ) ) } ) EndIf Next EndIf If Valtype(::aBitMaps) == "A" AEval(::aBitMaps, {|hBmp| If( empty(hBmp), , DeleteObject(hBmp) ) }) EndIf ... [/pre2] т.е. в тек. версии утечка есть при oBrw:aBitMaps := {LoadImage(...), ...} на колонках утечки нет.

Haz: SergKis пишет: т.е. в тек. версии утечка есть при oBrw:aBitMaps := {LoadImage(...), ...} на колонках утечки нет Возможно и а текущей не будет утечки если aBitMaps задавать массивом. Внутренние переменные бровса убьются сборщиком мусора после дестроя самого бровса. А во время работы бровса новые объекты не создаются. В моем же случае было uBmpCell := {¦¦ if( lFllag, Loadimage(), nil)} тоесть при навигации бровса постоянно создаётся новый хендл картинки, не уничтожая старый. GdiPlus при навигации показал утечки. Обнаружил проблему Дима, у него пользователь от скуки гонял курсор вверх вниз и брос падал. С дестроем в твой версии все понятно. Непривычно само поведение - кормишь бровсу переменную, а он ее убивает. Этот момент нужно учитывать. У меня маленькая статусная картинка используется в нескольких модулях и в каждом бровсе, я ее определил в паблик переменной при старте программы сслаюсь на нее везде. т. е. LoadImage() делал один раз. Поскольку aCheck практически не использовал то проблем не видел. Будем считать это особеннстью бровса.

SergKis: Haz пишет В моем же случае было uBmpCell := {¦¦ if( lFllag, Loadimage(), nil)} Это скорее недосмотр кода, т.к. именно для oCol:uBmpCell можно использовать PUBLIC\PRIVATE переменные, т.е. oCol:uBmpCell := {¦¦ if( lFllag, m->hPicture1, nil)} или из массива брать handle image Будем считать это особеннстью бровса Пара LoadImage() -> DeleteObject() для aChecк, aMitMaps как особенность тсб, просто надо учитывать, а усилить поведение, при необходимости, всегда можно, к примеру :aCheck := { 'PICTURE1', Nil } - будет внутри делать LoadImage('PICTURE1') и DeleteObject() при Dectroy() :aCheck := { hPicture1, Nil } - не будет делать ни LoadImage() ни DeleteObject() при Dectroy() для :aBitMaps аналогично. Надо ли ?

Haz: SergKis пишет: aChecк, aMitMaps как особенность тсб, просто надо учитывать я про это же . Пока сам не наткнешься- не поймешь )



полная версия страницы