Форум » GUI » Пример экспорта Tsbrowse в разные форматы (Tsb_Export)... » Ответить

Пример экспорта Tsbrowse в разные форматы (Tsb_Export)...

Andrey: Всем привет. Что то у меня цвета с таблицы Tsbrowse не такими экспортируются в XML. Т.е. что-то в библиотеке hbxlsxml цвета по другому получаются... В Tsb2xml.prg цвет задаю так:[pre2] nColor := oBrw:aColumns[nCol]:nClrBack If hb_isBlock( nColor ) nColor := Eval(nColor, oBrw:nAt, nCol, oBrw ) end // в aColors храним массивы ( строка, столбец. стиль ) Aadd( aColors, {nLine, nCol, "S" + hb_ntoc(nColor, 16)} )[/pre2] Может неправильно делаю ?

Ответов - 71, стр: 1 2 3 4 All

Andrey: Собрал проект Tsb_Export под MSVC 2017 64bit ! О чудо, на игровом компе, где раньше вылетало (меню "New: Export to Ole-Excel 1 (xls)"), теперь не вылетает ! Слава MSVC 2017. Правда на меню "New: Export to Ole-Excel 2 (xls)" вылетает, что то с фонтами. Разница в размере между 32бит и 64бит на 400Кб больше ехе-ник весит.

Andrey: Добавил следующее меню - "Export to C# Dll Ole-Excel (xls)" ! Создание массивов таблицы и передача их в C# - ExcelOleLib.dll сам проект ExcelOleLib.dll на C# (преобразование из массива и заполнение через OLE эксельной таблицы). Вызов из харбора dll-ки на C# выглядит так:[pre2] aParam := { cFile, oBrw:nLen, aImage, aTTitle, aTTitle2, aTSuperHd, aTHeading, aTFooting, aTTitle3, aTCellType } oCLR := CLR_RUNTIME():New("v4.0.30319") // clrdyn.dll - работа с Common Language Runtime // (загрузка и выполнение C# сборок) oAsm := oCLR:LoadAssembly("ExcelOleLib") // вызов ExcelOleLib.dll на C# oExcel := oAsm:CreateInstance("Library.Runner") //oAsm:CallStatic("Library.Debug", "PrintArray", aParam ) // отладка oExcel:Call("SetSettings", aParam) // передача параметров в ExcelOleLib.dll на C# oExcel:Call("AddData", aTCell) // передача массива всех ячеек таблицы //oAsm:CallStatic("Library.Debug", "PrintArray", aTCell) // отладка hExcelHandle := oExcel:Call("ShowAndGetHwnd") // возврат хендла окна экселя[/pre2] На игровом компе не вылетает. Большая просьба протестировать на ваших компах. Сами ехе-ники собраны на 2-х компиляторах: https://cloud.mail.ru/public/2QaA/52ay65T9T Для работы с C# необходимы: clrdyn.dll и ExcelOleLib.dll смотреть - http://clipper.borda.ru/?1-7-0-00000046-000-0-1-1540654515 Сами исходники отправлены Григорию.

Andrey: Вот пример аналог Tsb_Export написанный на C# - https://cloud.mail.ru/public/2wYs/pJMfZSrtD Демонстрация грида на C# - 239 Кб. Исходники здесь - https://github.com/NoTimeForHero/TSBExport_CSharp/archive/master.zip Обратите внимание на очень интересное поведение грида при растягивании окна ! Автоматом добавляются для всех колонок таблицы в той же пропорции что и была до растягивания. Код на C# всего вот такой: Как бы сделать ТАК ЖЕ и для Tsb_Export ?


Haz: Andrey пишет: Как бы сделать ТАК ЖЕ Так же и делай, по тому же алгоритму. Есть же метод SetColSize(). Возможно не совсем плавная прорисов ка получится, но это другая история

SergKis: Haz пишет Так же и делай, по тому же алгоритму. Можно задавать ВСЕ контролы в % к клиентской области и колонки тсб в % к ширине тсб. Тогда не нужно сохранять OldWidth, всегда расчет от тек. width и %. Фонты размеры так же наложить с учетом %. Иногда исп. для форм. размеров 2-х окон (совместное использование) и контролов на них в % от desktop (c noresize)

Haz: SergKis пишет: Можно задавать ВСЕ контролы в % Согласен, тогда на разных мониторах будет приемлемо смотреться Но ... Андрей хотел сделать ТАК ЖЕ и для этого в TS все есть, просто бери и делай

Andrey: Вот ещё один тестовый проект - считывание DBF и передача его в Грид C# на DevExpress. http://clipper.borda.ru/?1-7-0-00000046-000-0-1-1543420166 Пост N: 6129

Andrey: Возвращаюсь к изменению ширин колонок Tsbrowse на окне. Если сделать так: [pre2] ON MAXIMIZE ( ResizeTable(oBrw) ) ; ON SIZE ( ResizeTable(oBrw) ) ;[/pre2] То при изменение размеров окна таблица прямо таки вся мерцает (перерисовывается) ! Что не очень красиво. В C# есть свойства для окна: Form_ResizeBegin(...) и Form_ResizeEnd(...) Из-за этого там плавная перерисовка таблицы. Можно ли как то в МиниГуи сделать похоже ? Или как то клик мышки отловить, нажата она или отпустили её ?

SergKis: Andrey пишет То при изменение размеров окна таблица прямо таки вся мерцает (перерисовывается) ! Может надо перевести пример на дискретные приращения размеров (масштаб +\- 10 %) к текущим значениям (кнопки zoom +\-) Нажимай на окне примера кнопки Maximize, Normalize - приемлемо отображает, если тсб в светлых тонах, так совсем нормально

Haz: Andrey пишет: Или как то клик мышки отловить, нажата она или отпустили её ? в h_events.prg есть два события WM_LBUTTONDOWN и WM_LBUTTONUP можешь вставить в них установку флага , а в процедуре ResizeTable этот флаг анализировать

SergKis: Haz пишет в h_events.prg есть два события Ловить их надо скорее в блоке кода тсб :bEvents := {|oBrw, nMsg, nWParam, nLParam| ... }

Andrey: Haz пишет: в h_events.prg есть два события WM_LBUTTONDOWN и WM_LBUTTONUP можешь вставить в них установку флага , а в процедуре ResizeTable этот флаг анализировать Если я вставлю, то код точно работать не будет ! Да и это только у меня будет, а в других версиях потом не будет. Как бы сделать общий код для всех, чтобы Григорий добавил в МиниГуи ?

SergKis: Andrey пишет Как бы сделать общий код для всех, чтобы Григорий добавил в МиниГуи ? Код общий чего надо вставлять ? resize мне, к примеру совсем не нужен для работы с данными базы и клиента это вполне устраивает. Все размеры идут от фонта _HMG_DefaultFont... устанавливаются извне. Если понадобится обработчик для ловли сообщений, то сделать вполне можно :bEvents := {|oBrw, nMsg, nWParam, nLParam| MyEvents(oBrw, nMsg, nWParam, nLParam) } FUNC MyEvents(oBrw, nMsg, nWParam, nLParam) If nMsg == WM_LBUTTONDOWN ... ElseIf nMsg == WM_LBUTTONUP ... EndIf Return 0 // если выполнение главной Events(...) продолжать или Return 1 // если выполнение главной Events(...) НЕ продолжать, все уже сделано

Andrey: SergKis пишет: Код общий чего надо вставлять ? Да я не про то подумал. SergKis пишет: resize мне, к примеру совсем не нужен для работы с данными базы и клиента это вполне устраивает. Все размеры идут от фонта _HMG_DefaultFont... устанавливаются извне. Согласен, но хочется сделать изменяемое окно. Или хотя бы попробовать сделать. Т.е. типа такого ? [pre2]STATIC FUNCTION ResizeTable(oBrw) ... oBrw:bEvents := {|oBrw, nMsg, nWParam, nLParam| MyEvents(oBrw, nMsg, nWParam, nLParam) } ....[/pre2]

Haz: SergKis пишет: Ловить их надо скорее в блоке кода тсб Не проверял, но есть сомнения что это сработает когда таскаем за угол парент окна. Проверил по быстрому , клики естественно ловятся только на TSB, парент окно на котором TSB - хоть обкликайся. Значит клики при таскании парента за угол так не поймать

Haz: Andrey пишет: Если я вставлю, то код точно работать не будет ! Да и это только у меня будет, а в других версиях потом не будет. Как бы сделать общий код для всех, чтобы Григорий добавил в МиниГуи ? На деле все просто если хотя бы заглянуть в исходник . А в нем при нажатии кнопки устанавливаются переменные [pre2] _HMG_MouseRow := HIWORD( lParam ) _HMG_MouseCol := LOWORD( lParam ) _HMG_MouseState := 1, 2, 3 - зависит от какую кнопку давим [/pre2] При отпускании [pre2] _HMG_MouseState := 0 [/pre2] Вот чтобы точно работало - ничего точно вставлять в общий код не надо. Надо в своем проверять _HMG_MouseState

Andrey: Haz пишет: Вот чтобы точно работало - ничего точно вставлять в общий код не надо. Надо в своем проверять _HMG_MouseState Понял. СПАСИБО !

Andrey: Нет изменения _HMG_MouseState в функции ResizeTable(), всегда возвращает 0. Как тогда делать ? [pre2]STATIC FUNCTION ResizeTable(oBrw) nMouseState := _HMG_MouseState nMouseRow := _HMG_MouseRow nMouseCol := _HMG_MouseCol ? "nMouseState=", nMouseState, nMouseRow, nMouseCol ....[/pre2] nMouseState= 0 410 1252 nMouseState= 0 410 1252 nMouseState= 0 410 1252

Haz: Andrey пишет: Нет изменения _HMG_MouseState в функции ResizeTable(), всегда возвращает 0. Как тогда делать ? Искать косяки , спецом проверил при нажатии и отпускании переменная меняется Проверял так DEFINE TIMER Timer_MTest OF Form_1 INTERVAL 100 ACTION {|| SetProperty( "Form_1", "TITLE", hb_NTOC( M->_HMG_MouseState ) ) }

Haz: Andrey пишет: Нет изменения _HMG_MouseState в функции ResizeTable(), всегда возвращает 0. При таскании за угол - не меняется (НОЛЬ) тогда искать другое решение



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