Форум » 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:....

Ответов - 108, стр: 1 2 3 4 5 6 All

SergKis: Haz пишет метод работает. Я о том что просто не пользуюсь им. Я тоже не пользуюсь, но с тем что работает, не соглашусь. Если фонты по блоку кода - валится, нет footer вывода ... т.е. для того чтобы заработал, надо делать спец. отображение тсб. с изменениями, простенький вывод есть без адо, длл и др. спец.оборудования.

Vlad04: Tsb_seek ИЗ примеров c:\MiniGUI\SAMPLES\Advanced\Tsb_seek\ Сегодня обратил на такую странность в отображении. Если стрелкой прокручивать бровс вниз, то экран заполняется одинаковыми данными, не обновляется.

Andrey: Vlad04 пишет: то экран заполняется одинаковыми данными Наверное залипла последняя запись в таблице. Такое бывает часто. Нужно добавить разрыв в конец таблицы. Был бы подвал в конце таблицы, можно было бы воспользоваться функцией [pre2]oBrw:SetNoHoles() // убрать дырку внизу таблицы[/pre2]


Vlad04: Помогло , без подвала

Vlad04: Но не во всех случаях. Помогло добавить DEFINE TBROWSE Br_zaw AT 10, 1 OF o_test ALIAS "test" WIDTH (zox/2)-10 HEIGHT (zoy-150) ON CHANGE {||inkey(0.03),CorrectionFirstLast( Br_zaw )} CorrectionFirstLast - где то здесь описывается

Andrey: Vlad04 пишет: CorrectionFirstLast Выкинь эту функцию и забудь про неё ! Её дорабатывать нужно, я тоже её использовал, в каких то случаях помогает, в других вообще мешает. Наz советовал её не пользоваться. Делай высоту таблицы на 1-2 пикселя больше чем высота всех отображаемых ячеек. Это SergKis так рекомендует. У меня залипание пропало в таких случаях.

SergKis: Vlad04 пишет Но не во всех случаях если так[pre2] END WINDOW br_f:SetNoHoles(3) br_zaw:SetNoHoles(3) br_f:enabled(.f.) [/pre2]

Vlad04: SergKis br_zaw:SetNoHoles(3) Очень хорошо ! А (3) , что означает ? И вообще, что этот метод делает ?

SergKis: Vlad04 пишет что этот метод делает ? Метод убирает дырку в низу таблицы, распределяя разницу между присутствующими заголовками\подвалами, если их нет, есть только строки, то подправит размер тсб по высоте [pre2] METHOD SetNoHoles( nDelta, lSet ) CLASS TSBrowse LOCAL nH, nK, nHeight, nHole DEFAULT nDelta := 2, lSet := .T. ... [/pre2] nDelta := 2 - поправка для расчетов разницы lSet := .F. - рассчитает величину дырки, вернет из метода не меняя размер

Andrey: Делаю таблицу выбора по базе. Создаю колонки: [pre2] // создать 1-ю колонку ADD COLUMN TO oBrw2 HEADER "Номер"+CRLF+"графы" ; DATA FieldWBlock( "ID", Select() ) ; SIZE nWidth1 PICTURE "@Z 999" ; ALIGN DT_CENTER,DT_CENTER,DT_CENTER // создать 2-ю колонку ADD COLUMN TO oBrw2 HEADER "Наименование"+CRLF+"графы в карточке" ; DATA FieldWBlock( "FHEADER", Select() ) ; SIZE nWidth2 ; ALIGN DT_LEFT,DT_CENTER,DT_LEFT // создать 3-ю колонку ADD COLUMN TO oBrw2 HEADER "Печать"+CRLF+"в таблице" ; DATA FieldWBlock( "VIEW", Select() ) ; SIZE nWidth3 ; CHECKBOX ; // Editing with Check Box ALIGN DT_CENTER, DT_CENTER ; EDITABLE MOVE DT_MOVE_DOWN oBrw2:aColumns[3]:bPrevEdit := {|| CheckField(), TRUE } // проверка до ввода .... // --------- заменяем колонку CHECKBOX на свои картинки --------- oBrw2:aCheck := { LoadImage("CheckT28"), LoadImage("CheckF28") } ....[/pre2] Таблица не простая, для ID=0 делаются заголовки в таблице цветом и запрет на редактирование. Нужно убрать в таблице показ чекбокса по условию ID=0. Как это сделать ? Вот картинка:

Vlad04: if i =3 ADD COLUMN TO Brw_1 DATA {|| iif(Dogovor->Vid > 0,aVidD[Dogovor->Vid],' Нет ' )} .... ... А попробуй при формировании колонки установить условия показа чекбокса от значения ID. Т.е. вместо показа чекбокса можешь вывести пустое место.

Andrey: Vlad04 пишет: А попробуй при формировании колонки установить условия показа чекбокса от значения ID. Т.е. вместо показа чекбокса можешь вывести пустое место. Покажи как: [pre2] ADD COLUMN TO oBrw2 HEADER "Печать"+CRLF+"в таблице" ; DATA FieldWBlock( "VIEW", Select() ) ; [/pre2]

Haz: Andrey пишет: Таблица не простая, для ID=0 делаются заголовки в таблице цветом и запрет на редактирование. Нужно убрать в таблице показ чекбокса по условию ID=0. Как это сделать ? Не меняя класса TBROWSE можно только пытаться по условию ID=0 подменить ::aCheck в блоках ::bOnDrawLine и ::bOnDraw соответственно , а по условию ID <> 0 восстанавливать. Но думаю грязновато работать будет. В смысле работать будет , но с глючком. Оптимально - в классе дописать возможность ::aCheck назначать блок кода и добавить проверки на hb_isBlock( ::aCheck ). тогда картинки чекбокса можно будет менять на лету , в том числе и задавать NIL

Andrey: Haz пишет: Не меняя класса TBROWSE можно только пытаться по условию ID=0 подменить ::aCheck в блоках ::bOnDrawLine и ::bOnDraw соответственно , а по условию ID <> 0 восстанавливать. Но думаю грязновато работать будет. В смысле работать будет , но с глючком. Вот я с этим и бился... Решил сделать по другому:[pre2] LOCAL hImgTrue := LoadImage("CheckT28"), hImgFalse := LoadImage("CheckF28") ..... // создать 3-ю колонку ADD COLUMN TO oBrw2 HEADER "Печать"+CRLF+"в таблице" ; DATA FieldWBlock( "VIEW", Select() ) ; // эту строку наверное можно выкинуть ? SIZE nWidth3 ; NAME VIEW BITMAP ; ALIGN DT_CENTER, DT_CENTER ; EDITABLE MOVE DT_MOVE_DOWN oBrw2:aColumns[3]:bPrevEdit:= {|| CheckField(), FALSE } // проверка до ввода oBrw2:aColumns[3]:uBmpCell := {|| IF( (oBrw2:cAlias)->ID == 0, '' , IF( (oBrw2:cAlias)->VIEW , hImgTrue, hImgFalse ) ) } oBrw2:aColumns[3]:bData := {||Nil} oBrw2:aColumns[3]:cData := '{||Nil}' oBrw2:aColumns[3]:nAlign := nMakeLong( DT_CENTER, DT_CENTER )[/pre2]

Haz: Andrey пишет: Решил сделать по другому: вполне нормальное решение отказаться от чекбокса и использовать подмену ::bData и ::uBmpCell и главное оно универсально

Vlad04: Andrey Покажи как: ADD COLUMN TO Brw_1 DATA {|| iif(Dogovor->Vid <> 0,aVidD[Dogovor->Vid],' Нет ' )} ... Вариант не для ПРЯМОГО РЕДАКТИРОВАНИЯ.

Haz: Vlad04 пишет: Вариант не для ПРЯМОГО РЕДАКТИРОВАНИЯ. Это скорее вариант не прямой выборки. Для редактирования ему как до луны. Но это ни в коем случае не упрёк. Как работает блок выборки_записи, все знают со времен клиппера, и допилить - не вопрос. PS. сам часто использую этот прием, ступор иногда возникает при инкрементальном поиске по таким колонкам

Dima: Haz пишет: Для редактирования ему как до луны Да уж

Andrey: Andrey пишет: oBrw2:aColumns[3]:bPrevEdit:= {|| CheckField(), FALSE } // проверка до ввода Редактировать нужно ТОЛЬКО ТРЕТИЙ столбец. Мышка и Enter в CheckField() прекрасно с этим справляются. Там ещё параллельно в другую базу пишется... [pre2]//////////////////////////////////////////////////////////// STATIC FUNCTION CheckField() LOCAL cAlias := oBrw2:cAlias // "XLS_HEADER" LOCAL nID := M->oBrw2:nAt // номер строки и номер для поиска LOCAL aMenuHead := aStatMenuPrn[nID] // строка массива меню LOCAL lVal, cNameField := "VIEW" IF (cAlias)->ID == 0 // выбор здесь не предусмотрен RETURN .F. ENDIF lVal := (cAlias)->( FIELDGET( FIELDNUM(cNameField) ) ) (cAlias)->( FIELDPUT(FIELDNUM(cNameField), !lVal ) ) DO EVENTS IF (cAlias)->VIEW == .T. // значит нужно добавить запись в БД:XLS_GALKI SELECT("XLS_GALKI") APPEND BLANK XLS_GALKI->FNN := RECNO() XLS_GALKI->FNAME := (cAlias)->FHEADER XLS_GALKI->FALIAS := aMenuHead[2] XLS_GALKI->FPOLE := aMenuHead[3] XLS_GALKI->FPICT := aMenuHead[4] XLS_GALKI->FTYPE := aMenuHead[5] XLS_GALKI->FKOD := aMenuHead[6] XLS_GALKI->FRECNO := nID // номер записи из XLS_HEADER->ID XLS_GALKI->FLETTER := CHR(64 + XLS_GALKI->FNN ) ELSE // значит нужно удалить запись в БД:XLS_GALKI SELECT("XLS_GALKI") LOCATE FOR XLS_GALKI->FRECNO == nID IF FOUND() DELETE PACK ENDIF DO WHILE !EOF() XLS_GALKI->FNN := RECNO() XLS_GALKI->FLETTER := CHR(64 + XLS_GALKI->FNN ) SKIP ENDDO ENDIF oBrw1:Reset() oBrw1:Refresh(.T.) oBrw2:DrawSelect() SELECT(cAlias) RETURN .T.[/pre2]

Vlad04: Haz Такую конструкцию использую только для информационных столбцов, прямое редактирование использую для простых таблиц, типа справочник (1-2 колонки), что сложней - в отдельной форме.

Vlad04: А есть примеры многострочных бровсов ? Вариантов может быть несколько: в одной строке - Поле 1 - Поле 2 или - Часть1(Поле 1) - Часть2(Поле 1)

SergKis: Vlad04 пишет А есть примеры многострочных бровсов ? сделать пример не сложно Tsb_array_2 demo.prg[pre2] STATIC FUNCTION CreateDatos() ... FOR i := 1 TO k aDatos[ i ] := { " ", ; // 1 i, ; // 2 ntoc( i ) + CRLF + "_123", ; // 3 Date() + i, ; // 4 ... [/pre2]

Haz: SergKis пишет: А есть примеры многострочных бровсов ? В примерах есть только вариант с широкими строками , где в ячейке может быть многострочный текст. Такой вариант удобно использовать в виде календарика с событиями , привычно смотрится и можно каждую ячейку развернуть в окно с подробным описанием. Все остальные случаи многострочного бровса можно поделить условно на 2 вида : 1) когда заранее готовятся многострочные данные для скармливания бровсу , это может быть подготовка массива, временной базы или результат SQL запроса к таблице. Получаем многострочность в однострочном бровсе. 2) когда под задачу пишется свой Skipper() и FieldWblock(). Этот путь не простой , но проходимый. Я использую вариант 1 , нет желания и времени возиться с 2 PS дополню вариант 1 предпочтителен еще и тем что позволяет фильтровать ( срывать подразделы )

Vlad04: Haz В примерах есть только вариант с широкими строками , где в ячейке может быть многострочный текст. Такой вариант удобно использовать в виде календарика с событиями , привычно смотрится и можно каждую ячейку развернуть в окно с подробным описанием. О каких примерах конкретно идёт речь ?

Haz: Vlad04 пишет: О каких примерах конкретно идёт речь ? О базовом примере MiniGUI\SAMPLES\Advanced\TsBrowse\demo.exe Menu -> Samples on Windows -> Sample 4 -> колонка Address

Andrey: Всем привет. Использую многострочный Tsbrowse (из 2х строк). Всё работает отлично. При экспорте в Эксель высота строк ставиться почему то как одна строка. И приходиться твблицу в Экселе вручную высоту править... Убийственная работа. Нельзя там в исходниках исправить высоту ячеек, сделать её зависимой от высоты таблицы ячеек ?

Vlad04: в Эксель высота строк ставиться почему то как одна строка. А у Эксель для данного столбца нельзя ли установить свойство - ПЕРЕНОСИТЬ ПО СЛОВАМ. Тогда Эксель будет сам высоту строк править

Andrey: Vlad04 пишет: А у Эксель для данного столбца нельзя ли установить свойство Я там исходник глянул .... и ничего не понял...

Haz: Andrey пишет: Я там исходник глянул .... и ничего не понял... Надо внимательнее глядеть . Вся запись в методе ::Excel2() идет в так называемом двоичном формате BIFF. Этот формат был основным форматом Excel до 2007 года. Дальше используется Open XML , а BIFF поддерживается только с целью совместимости. Именно с форматом BIFF связаны все ограничения Excel до 2007 года ( одно из них это 65535 строк , но есть много других) Так вот про внимательность, Excel в методе заполняется в цикле через вызов BiffRec( opCode , ... ), где этот самый opCode - константа Excel по кодам операций ( в инете ссылок полно ). В самой функции BiffRec() отсутствует обработка кода 8 ( код операции ROWHEIGHT ) и 37 ( код операции DEF_ROWHEIGHT). Видимо автору метода она была не нужна. Но это не мешает ее туда добавить самостоятельно. Функция живет в TSColumn.prg и ее содержимое понятно без каких либо тайных знаний. PS Подарок тем , кому лень искать константы: http://www.purebasic.fr/english/viewtopic.php?p=267584 PPS Добавлю свое мнение, которое может не совпадать со мнгоми форумчанами. Формат BIFF считаю устаревшим, и не уверен что его следует развивать библиотеке. В 2007 микрософт формально его похоронил перейдя на xml. В исходнках harbour есть что то типа xlsxml. Пишу с мобильного и точно не помню. Уверен xml более перспективен как экспорт данных, т. к. микрософт теперь его использует в основе движка. И вот в xml готов поучаствовать. Тестовые примеры выгрузки в Excel из harbour у меня идут отлично и по скорости и по оформлению. Прикрутить класс к Tsbrowse, например как :Excel3() считаю вопросом времени (свободного времени)

Haz: И в новое сообщение тоже PPS Добавлю свое мнение, которое может не совпадать со мнгоми форумчанами. Формат BIFF считаю устаревшим, и не уверен что его следует развивать библиотеке. В 2007 микрософт формально его похоронил перейдя на xml. В исходнках harbour есть что то типа xlsxml. Пишу с мобильного и точно не помню. Уверен xml более перспективен как экспорт данных, т. к. микрософт теперь его использует в основе движка. И вот в xml готов поучаствовать. Тестовые примеры выгрузки в Excel из harbour у меня идут отлично и по скорости и по оформлению. Прикрутить класс к Tsbrowse, например как :Excel3() считаю вопросом времени (свободного времени)

Andrey: Haz пишет: Но это не мешает ее туда добавить самостоятельно. [pre2]* ============================================================================ * FUNCTION BiffRec() Version 9.0 Nov/01/2009 * Excel BIFF record wrappers (Biff2) * ============================================================================ Function BiffRec( nOpCode, uData, nRow, nCol, lBorder, nAlign, nPic, nFont ) ....[/pre2] Блин, да это только для шаманов ....

Haz: Andrey пишет: Блин, да это только для шаманов Шаманом себя не считаю, но проблем не вижу. В понед гляну с компа. И прочитай мое последнее сообщение по поводу BIFF

Andrey: Haz пишет: И вот в xml готов поучаствовать. Тестовые примеры выгрузки в Excel из harbour у меня идут отлично и по скорости и по оформлению. Прикрутить класс к Tsbrowse, например как :Excel3() считаю вопросом времени (свободного времени) Очень хочется иметь этот новый класс в исходниках. Я так же готов поучаствовать в тестировании и настройке этого класса, по мере своей квалификации.

Vlad04: Haz Тестовые примеры выгрузки в Excel из harbour у меня идут отлично Это не OLE и Excel 2007 и выше? Тогда может в начале с примерами ознакомить ? Выгрузка в Tsbrows частный случай.

Vlad04: из Tsbrows

Haz: Vlad04 пишет: Это не OLE и Excel 2007 и выше? Тогда может в начале с примерами ознакомить ? Выгрузка в Tsbrows частный случай. Это не OLE, до 2007 микрософт отстегивал стороннему разработчику за использование xml позже написал свою компоненту. Поддержка xml была и до 2007. Примеры все в исходниках харбура. Знакомся на здоровье, все в свободном доступе. Ссылки на исходники есть в разделе Harbour на этом форуме

Dima: Andrey пишет: Я так же готов поучаствовать в тестировании и настройке этого класса, по мере своей квалификации. +1 Потестю на древнем Excel 2003

Haz: Dima пишет: Потестю на древнем Excel 2003 Так ты уже потестил)

Dima: Haz пишет: Так ты уже потестил) Это было не с Минигуи

Haz: Andrey пишет: Блин, да это только для шаманов .... Глянул с компа. Какие шаманы ??? примитив в 4 строки кода Чтоб ::Excel2 был зависим от высоты строк бровса нужно всего - то 1) перейти по ссылке которую я давал и найти там установку высоты строки по умолчанию увидеть там код команды, ее длину и прочитать про размерность единицы высоты [pre2] DEFHEIGHT.DEF_ROWHEIGHT_RECORD DEFHEIGHT\opcode = 37 DEFHEIGHT\length = 2 [/pre2] 2) Открыть исходник BiffRec() и после команды 36 ( ну чтоб попорядку ) вставить нашу 37 [pre2] Case nOpCode == 37 // DEF_ROWHEIGHT_RECORD record Default nCol := nRow cHead := I2Bin( 37 ) + ; // opCode I2Bin( 2 ) // body length cBody := I2BIN( uData ) [/pre2] 3) Открыть исходник Excel2() и задать высоту строк по умолчанию по высоте строки бровса ( про размерность по ссылке конечно прочитали - поэтому *20, но мне точнее показалось на 15 ) [pre2] FWrite( nHandle, BiffRec( 66, GetACP() ) ) FWrite( nHandle, BiffRec( 12 ) ) FWrite( nHandle, BiffRec( 13 ) ) FWrite( nHandle, BiffRec( 37 , ::nHeightCell * 20) ) [/pre2] PS Кто тут увидел шаманов

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 как особенность тсб, просто надо учитывать я про это же . Пока сам не наткнешься- не поймешь )

gfilatov2002: SergKis пишет: В моей версии еще такие строки в методе Destroy(): Благодарю за исправление Добавил его в текущий код. Кстати, уже готов RC 3 для новой сборки. Кратко, что нового см. ниже [pre2]- The RadioGroup control supports an optional AUTOSIZE clause. - The Report Generator by Roberto Lopez was moved to MiniGUI core. - Added the command CHECK TYPE [ SOFT ] <var1> AS <type1> [ , <var2> AS <type2> [ , <varN> AS <typeN> ] ] (synchronized with Official HMG). - The function HttpConnect was modified to use TUrl and TIpClientHttp classes. - Updated and improved the following libraries: TSBrowse, HbNetIO, SddODBC. - Updated Harbour Compiler 3.2.0dev to a latest Git-version. - Added the new interesting samples and updated some Advanced samples. [/pre2]

Andrey: Haz пишет: А вот отдельный пример экспорта бровса сделать конечно можно. Подвалы, суперхидеры, шрифты и цвета, это все решаемо. Но делать из какого либо примера винегрет, тоже не вариант. Так что только отдельный и небольшой, чтоб было понятно что где. Сделал отдельный пример. Отправил на почту. Ждем что выйдет из под руки мастера !

Haz: Andrey пишет: Ждем что выйдет За пару дней, что нибудь да выйдет.

gfilatov2002: Andrey пишет: Отправил на почту На какую Ничего не пришло...

Haz: gfilatov2002 пишет: На какую Ничего не пришло... Григорий, мне пришло Андрей хочет выгрузку в Excel из бровса в формате XML увидеть. Я так вывожу отчёты из программ. Качество оформления как OLE, скорость выгрузки как BIFF

gfilatov2002: Haz пишет: мне пришло Понял, буду ждать от Вас выгрузку в Excel из бровса в формате XML

Haz: Andrey пишет: Сделал отдельный пример. Отправил на почту. Ждем что выйде Андрей, скинул на почту. Для справки : Под выгрузку немного допиливал библиотеку hbxlsxml, в оригинальной косяки с русским языком и многострочными ячейками в Excel. Библиотека не секрет , могу выложить все исходники. Теперь немного про особенности XML выгрузки . Для выгрузки необходимо сначала определить все возможные форматы ячеек , которые будут на листе экселя. И в момент экспорта ссылаться на них, в примере это видно. Сама выгрузка должна идти заполнением листа сверху - вниз и слева - направо т.е сначала первая строка , потом вторая и так далее , вернуться на первую уже нельзя ( тоже и по колонкам ) И наконец выгрузка бровса - частный случай. Я рисую морду отчету и гружу из DBF ЗЫ В примере не стал трогать Excel3() , которую подправил Сергей, а написал Brw2Xml и вставил ее вызов.

Andrey: Haz пишет: Андрей, скинул на почту. 1) Заголовок таблицы - косяк: размер фонта не тот.[pre2] FUNC Brw2xml( oBrw, cFile, lActivate, hProgress, cTitle ) нужно как сейчас в библиотеке: Excel2( cFile, lActivate, hProgress, aTitle, lSave, bPrintRow ), где aTitle := { cTitle, hFont } // титул со своим фонтом из-за этого я и сделал похожую функцию: Excel3Xml( oBrw, cFile, lActivate, aTitle, lSave ), где aTitle := { cTitle, hFont } // титул со своим фонтом[/pre2] 2) Суперхидера в экспорте НЕТ ! 3) Формат вывода 6-ой колонки не соответствует Tsbrowse 4) Далее нет цветового оформления. Т.е. нужно бы сделать цвета таблицы полностью как в Tsbrowse. Возможно ли такое сделать ? А так - классно получилось ! Haz пишет: Библиотека не секрет , могу выложить все исходники. Это наверное тоже нужно добавить в проект. Пускай Григорий папку отдельно сделает, чтобы были исходники, откуда плясать можно всем. P.S. Судя по правкам в исходнике, у тебя ещё старая версия МиниГуи !

Haz: Andrey пишет: Заголовок таблицы - косяк: размер фонта не тот. Я его и не делал, все для этого есть. Как задать шрифт видно из примера по хидеру и футеру. Опрелить стиль для заголовка дело 3 минут. То же и суперхидер, сделать можно, но зачем? Задачу воспроизводства бровса в Excel один в один, решить то можно, только кому она нужна? Более востребованы быстрые выгрузки в Excel, тем более оформленные как отчёты. Andrey пишет: Формат вывода 6-ой колонки не соответствует Tsbrowse Форматы все задаются в функции XMLSetDefault(), специально задал только 2. Не хочу писать транслятор с форматов PICTURE в форматы Excel. Это отдельное и бесполезное развлечение. Andrey пишет: Далее нет цветового оформления. Т.е. нужно бы сделать цвета таблицы полностью как в Tsbrowse. Возможно ли такое сделать ? Возможно, при условии что цвет задан явно, а не блоком кода. В примере это показано по хидеру и футеру. Кстати твоя выгрузка через Excel2() вообще ничем в этом раскладе, ни шрифтов ни цвета. PS Andrey пишет: Судя по правкам в исходнике, у тебя ещё старая версия МиниГуи ! Там правка только карго касается, не гонюсь сразу обновряться, т. к. некоторые библиотеки харбура приходится обновлять (в поставке они старые) Да и сюрпризы в отлаженном коде после обновлений иногда бывают. Обновляюсь когда есть время на ловлю блох в своих проектах после обновлений. Ну и главное, мы тут переписываемся, а народ не знает о чем. Кто выложит пример? PS сегодня, внесу мелкие правки

Andrey: Haz пишет: Ну и главное, мы тут переписываемся, а народ не знает о чем. Кто выложит пример? Григорию отправлю пример, как сделаем. Haz пишет: Возможно, при условии что цвет задан явно, а не блоком кода. В примере это показано по хидеру и футеру. Кстати твоя выгрузка через Excel2() вообще ничем в этом раскладе, ни шрифтов ни цвета. Тогда, если можно дай пример закраски шапки таблицы (любым цветом) и отрицательных чисел. Чтобы потом можно было делать на базе этого свою раскраску отчёта. А выгрузка через Excel2() ограничена, из-за чего я и ухватился за твой пример. Haz пишет: Форматы все задаются в функции XMLSetDefault(), специально задал только 2. Не хочу писать транслятор с форматов PICTURE в форматы Excel. Это отдельное и бесполезное развлечение. Согласен с этим, но в качестве примера как сделать ТОЛЬКО для одного формата я и ввел в пример такое поле. Чтобы потом, каждый кто будет использовать это, смог сделать свою обработку.

Haz: Andrey пишет: Согласен с этим, но в качестве примера как сделать ТОЛЬКО для одного формата я и ввел в пример такое поле. Чтобы потом, каждый кто будет использовать это, смог сделать свою обработку. Лови https://drive.google.com/open?id=1J_3jTxCSvdPg_xzhhLgSqi7yro6l_NyL

Haz: Andrey пишет: Тогда, если можно дай пример закраски шапки таблицы (любым цветом) и отрицательных чисел. Чтобы потом можно было делать на базе этого свою раскраску отчёта. в примере шапка и так красится, что касается отрицательных чисел , то это задается теми же форматами Excel к примеру так "# ##0,00_ ;[Красный]-# ##0,00\ " на числовой колонке PS Проверил. Точнее так [pre2] XmlSetDefault( oBrw ) // Можно значения по умолчанию переопределять oBrw:aColumns[6]:XML_Format := "00\:00\:00" oBrw:aColumns[9]:XML_Format := "0.00_ ;[Red]\-0.00\ " Brw2Xml(oBrw, "TEST.XML", .T.,, aTitle) XmlReSetDefault( oBrw ) [/pre2]

Haz: Haz пишет: А выгрузка через Excel2() ограничена На самом деле если бы была нормальная спецификация пл BIFF2(4) , то выгрузка Excel2() довольно легко дополняется. Видел только англоязычную где то, да и с примерами по BIFF очень скудно.

Andrey: Haz пишет: в примере шапка и так красится, У меня нет. Excel 2003

Dima: Andrey пишет: Excel 2003 Я думал один такой на форуме

Haz: Andrey пишет: У меня нет. Excel 2003 Да , у 2003 ограничения по палитре. Попробуй в коде подставить [pre2] вместо этого oStyle:bgColor( '#' + NToC(oBrw:nClrSpcHdBack, 16) ) вот это oStyle:bgColor( '#' + NToC(CLR_GREEN, 16) ) [/pre2]

Haz: Dima пишет: Я думал один такой на форуме Надо же чтоб кто то на старье потестил )))

Dima: Haz пишет: На самом деле если бы была нормальная спецификация пл BIFF2(4) Не она ? https://www.openoffice.org/sc/excelfileformat.pdf

Haz: Dima пишет: Не она ? Это видел, кто возьмется перевести на "великий и могучий" ?

Andrey: Я поставил для суперхидера, шапки и подвала: oStyle:bgColor( '#' + NToC(CLR_HGRAY, 16) ) // only Excel 2003 Пример получился классным. При смене таблицы на одну строку: #define MULTILINE_TSB .F. , то же экспортирует классно. Остался ОДНА проблема касающаяся METHOD Excel2(). При использовании колонки в Tsbrowse числового формата "@R 99:99:99", то при экспорте всегда лезет такая ошибка: И колонка остаётся без формата. Я сделал 6-ю колонку специально для тестирования. Можно как нибудь убрать/починить этот формат для METHOD Excel2() ?

Haz: Andrey пишет: Можно как нибудь убрать/починить этот формат для METHOD Excel2() ? или полностью переделывать , то есть все предустановки выносить из Excel2() и назначать до экспорта ( у меня для этого служит XMLSetDefault() и переопределения перед экспортом) или навсегда вшивать этот ( никому не нужный формат ) в исходник Excel2(). Сам формат можно подсмотреть у меня в выгрузке.

Andrey: Haz пишет: или навсегда вшивать этот ( никому не нужный формат ) в исходник Excel2(). Хотя бы так или сделать определение этого формата до вызова Excel2(), как ты сделал у себя: [pre2] XmlSetDefault( oBrw ) // Можно значения по умолчанию переопределять oBrw:aColumns[6]:XML_Format := "00\:00\:00" oBrw:aColumns[9]:XML_Format := "0.00_ ;[Red]\-0.00\ " Brw2Xml(oBrw, "TEST.XML", .T.,, aTitle) // экспорт в Excel XmlReSetDefault( oBrw )[/pre2] А лучше наверное в исходнике дать этот формат и небольшое описание, типа для назначения своих форматов. Можно название твоей функции поменять на Excel3Xml() ? И ещё вопрос: [pre2] For nCol := 1 To Len( oBrw:aColumns ) uData := Eval( oBrw:aColumns[ nCol ]:bData ) cType := ValType( uData )[/pre2] можно добавить сюда сразу:[pre2] nBackColor := oBrw:aColumns[ nCol ]:nClrBack oStyle:bgColor( '#' + NToC(nBackColor, 16) ) // Excel > 2003 [/pre2] Или так не пойдёт, потому что цвета Tsbrowsa состоят из блок-кода ?

Haz: Andrey пишет: сделать определение этого формата до вызова Excel2(), как ты сделал у себя: Это потребует переделки метода, лучше выносить наружу, т.к форматов в Excel гораздо больше чем в харбур и могут они быть любые Andrey пишет: Можно название твоей функции поменять на Excel3Xml() Называй как хочешь )

SergKis: Andrey пишет Или так не пойдёт, потому что цвета Tsbrowsa состоят из блок-кода ? Сделай обработку блока кода[pre2] nBackColor := oBrw:aColumns[ nCol ]:nClrBack If Valtype( nBackColor ) == "B" Eval( nBackColor, oBrw:nAt, nCol, oBrw ) EndIf oStyle:bgColor( '#' + NToC(nBackColor, 16) ) // Excel > 2003 [/pre2]

SergKis: PS сори, пропустил пока набирал (маленький экран) nBackColor := Eval( nBackColor, oBrw:nAt, nCol, oBrw )

Andrey: SergKis пишет: Сделай обработку блока кода Сделал. Цвета не появляются ! Хотя коды цвета правильные, совпадают с CLR_HGRAY Вот код:[pre2] For nCol := 1 To Len( oBrw:aColumns ) uData := Eval( oBrw:aColumns[ nCol ]:bData ) cType := ValType( uData ) nBackColor := oBrw:aColumns[ nCol ]:nClrBack If Valtype( nBackColor ) == "B" nBackColor := Eval( nBackColor, oBrw:nAt, nCol, oBrw ) EndIf //? nLine, nCol, nBackColor, "== 12632256", CLR_HGRAY oStyle:bgColor( '#' + NToC(nBackColor, 16) ) switch cType[/pre2] Наверное ещё что-то нужно сделать, чтобы применить цвет к этой ячейке ?

Haz: Andrey пишет: Наверное ещё что-то нужно сделать, чтобы применить цвет к этой ячейке ? Стиль нужно определить заранее. С блоками скорее в два прохода придётся. Сначала анализируем весь бровс на возможные форматы по цвету, шрифту и пр. На основе анализа формируем все эти форматы, а потом, при выводе бровса в зависимости от результата блока выбираем нужный формат. Excel читает XML построчно. К момену вывода ячейки формат должен быть определен Из примера куска кода не ясно где он расположен в тексте Ps почитал выше, тут не сработает. Тут идёт вывод и форматы уже определены ранее. Андрей, ты зациклен на воспроизводстве внешнего вида бровса. Либо заранее опрелить цвет которам ты будешь рисовать. Либо взять цвет из каждой ячейки при первомпроходе, сформитовать форматы запомнив координаты. А при выводе брать по координатам. Я же сторонник того, что копия бровса в Excel никому не нужна. Достаточно вывести данные в читаемом и оформленном виде, для маньков путь анализа бровса. Другим способом можно назвать условное ворматирование Excel, но там тоже все не само появится, и нужно как минимум знать как написать условный формат.

Andrey: Haz пишет: Из примера куска кода не ясно где он расположен в тексте Вот код: [pre2] While nLine <= nLen oSheet:cellHeight( nRow, 1, oBrw:nHeightCell / 1.3 ) For nCol := 1 To Len( oBrw:aColumns ) uData := Eval( oBrw:aColumns[ nCol ]:bData ) cType := ValType( uData ) nBackColor := oBrw:aColumns[ nCol ]:nClrBack If Valtype( nBackColor ) == "B" nBackColor := Eval( nBackColor, oBrw:nAt, nCol, oBrw ) EndIf //? nLine, nCol, nBackColor, "== 12632256" oStyle:bgColor( '#' + NToC(nBackColor, 16) ) switch cType[/pre2] Haz пишет: Я же сторонник того, что копия бровса в Excel никому не нужна. Достаточно вывести данные в читаемом и оформленном виде, для маньков путь анализа бровса. Согласен, просто хотелось бы иметь просто пример как это делается (оформление цветами). В качестве примера и сделал меню для повтора цветов:[pre2] MENUITEM 'color table white ' ACTION nTsbColor := 1 FONT Font1 MENUITEM 'color table gray ' ACTION nTsbColor := 2 FONT Font1 MENUITEM 'color of the table "ruler"' ACTION nTsbColor := 3 FONT Font1 MENUITEM 'color of the table "columns"' ACTION nTsbColor := 4 FONT Font1 MENUITEM 'color of the table "chess"' ACTION nTsbColor := 5 FONT Font1[/pre2] Вот я решил сделать цвета в xml и не могу с ходу. Для этого нужно разбираться. А что за пример в котором не показано как можно сделать ! И не маньяк я, а хочу иметь в качестве примера - как нужно правильно делать, а не методом тыка работает/не работает. Т.е. отдельно написать: // секция для цветового оформления таблицы. Шапку, суперхидер и подвал как заполнять цветом уже понятно, осталось только саму таблицу покрасить.

Haz: Andrey пишет: Вот я решил сделать цвета в xml и не могу с ходу. Для этого нужно разбираться. Определить стиль перед выводом заранее. При выводе указать каким стилем. Ты же пытаешься во время вывода ячеек бровса сунуть цвет непонятно какому стилю. Это как раскраски, хочу фигурку закрасить желтым, беру жёлтый фломастер каторый уже заранее преготовлен. Я же не просто так говорил про варианты : 1 выбирать заранее определенные стили - условные цвета вывода 2 попытаться при прогоне по бровсу сформировать все комбинации цвет, шрифт, рамка, выравнивание. Опрелить их как стили с привязкой к координатам ячейки и при выводе бровса брать эти стили 3 тоже что и 2 но использовать условное форматирование. Мне не сложно еще раз повторить, что Excel читает XML сверху вниз и слева направо. То есть сначала раскладываем фломастеры и их уже не меняем. Потом рисуем тем что разложили. Реализация динамической раскраски начинается с вопроса, а какие фломастеры потребуются. Ну уж если совсем по простому То обрати внимание что цвет шапки и подвала задаётся в соответствуюших местах кода под коментарием ОПРЕДЕЛЯЕМ СТИЛИ ШАПКИ и ОПРЕДЕЛЯЕМ СТИЛИ ПОДВАЛА. Там же есть и комментарий ОПРЕДЕЛЯЕМ СТИЛИ КОЛОНОК, вот туда свой цвет и пихай. И учти каждый стиль одного цвета, нужен другой цвет - определяй новый стиль.

Andrey: Haz пишет: На самом деле если бы была нормальная спецификация пл BIFF2(4) , то выгрузка Excel2() довольно легко дополняется. Видел только англоязычную где то, да и с примерами по BIFF очень скудно. Пример MiniGUI\SAMPLES\Advanced\Tsb_Brw2xml из последней версии МиниГуии - классный получился ! Спасибо Haz ! Экспорт для Excel2() для нескольких строк - то что нужно ! Даже наверное шрифты можно не уменьшать. Но да ладно, пускай остаются в качестве примера, как можно делать. Единственно что не хватает в экспорте для Excel2() рамок в ячейках таблицы. В шапке и подвале таблицы рамки есть, а на ячейках нет ! Можно это как то подправить ?

Haz: Andrey пишет: Единственно что не хватает в экспорте для Excel2() рамок в ячейках таблицы. В шапке и подвале таблицы рамки есть, а на ячейках нет ! Можно это как то подправить ? А самому хотя бы посмотреть что мешает ? [pre2]Function BiffRec( nOpCode, uData, nRow, nCol, lBorder, nAlign, nPic, nFont )[/pre2]

Andrey: Прикрутил к этому же проекту ещё один экспорт, через ОЛЮ ! 1) Для одной строки всё прекрасно работает, для многострочных строк нет ! 2) Как задать титул перед шапкой определённым фонтом (также, как для нового oBrw:Excel2() ) ? Как бы исправить исходники ? Проект вот тут - https://cloud.mail.ru/public/JNeH/xGmMBvmVD Почему не работает в методе oBrw:ExcelOle( cXlsFile, ....) следующее назначение ? [pre2] lSave := .T. cPath := GetStartUpFolder() + "\" // путь записи файла cMaska := "A14_ДолгСальдо" // шаблон файла cXlsFile := cPath + cMaska + "_" + DTOC( DATE() ) + "_" cXlsFile += SUBSTR( CharRepl( ":", TIME(), "-" ), 1, 5 ) + ".xls"[/pre2] Обрезает до A14_ДОЛГСАЛЬДО_12.03.2018_23-18

Andrey: Andrey пишет: Почему не работает в методе oBrw:ExcelOle( cXlsFile, ....) следующее назначение ? lSave := .T. cPath := GetStartUpFolder() + "\" // путь записи файла cMaska := "A14_ДолгСальдо" // шаблон файла cXlsFile := cPath + cMaska + "_" + DTOC( DATE() ) + "_" cXlsFile += SUBSTR( CharRepl( ":", TIME(), "-" ), 1, 5 ) + ".xls" Обрезает до A14_ДОЛГСАЛЬДО_12.03.2018_23-18 Убрал в модуле h_tbrowse.prg строку 4809: [pre2] If ! Empty( cXlsFile ) //cXlsFile := AllTrim( StrTran( Upper( cXlsFile ), ".XLS" ) ) поставил // EndIf[/pre2] Перестало обрезать ! И убрался только верхний регистр ! То что нужно ! Григорий, убери пожалуйста в исходниках эту строку. Или замени её как нужно, для следующих версий МиниГуи ! Заранее спасибо !

Andrey: [pre2] oBrw:ExcelOle( cXlsFile, lActivate, hProgress, cTitle, hFont, lSave, bExtern, aColSel, bPrintRow ) cXlsFile // имя файла lActivate := .T. // открыть Excel hProgress := nil // хенд для ProgressBar lSave := .T. // сохранить файл bExtern := nil // ? aColSel := nil // ? bPrintRow := nil // ?[/pre2] Подскажите пожалуйста, что за параметры (за что отвечают) ?

Andrey: SergKis пишет: Предлагаю новый метод для tsb, для растяжки нескольких колонок до размера тсб по ширине. ..... Использование при ширине tsb > ширины колонок :AdjColumns() - все колонки :AdjColumns({"NAME", "SUMMA"}) - указанные колонки по cName :AdjColumns({3, 4, 5}) - указанные колонки по номеру А нормально будет работать ? Я при включении предыдущего метода на примере Tsb_Config.prg [pre2] oBrw:nAdjColumn := 2 // stretch column 2 to fill the voids in the right Tbrowse[/pre2] имел хороший баг при изменении ширины окна ! Григорий помог его решить через: [pre2] // repartition column 2 (1 + 1 -SELECTOR) - otherwise buggy oBrw:bInit := {|| oBrw:SetColSize( 2, nWidthFirstColumn )} .... ////////////////////////////////////////////////////////////////// FUNCTION ResizeBrowse() .... Eval(oBrw:bInit) // read the second column of the table ... [/pre2]

SergKis: Andrey пишет А нормально будет работать ? Я при включении предыдущего метода на примере Tsb_Config.prg oBrw:nAdjColumn := 2 SergKis пишет Использование при ширине tsb > ширины колонок т.е. ты вызываешь метод так (др. вариантов не предполагал пока)[pre2] :AdjColumns({3, 4, 5}) // или :AdjColumns() END TBROWSE oRpt:SetNoHoles()[/pre2] возможно при увеличении окна и размера тсб, тоже сработает, если вызвать. Можешь пробовать libу кинул

Andrey: SergKis пишет: Можешь пробовать libу кинул Классно ! Работает ! Но, если использовать [pre2] oBrw:HideColumns( {10} ,.t.) // скрыть колонки [/pre2] То последняя колонка становится слишком широкой ! Т.е. наверное не учитываются скрытые колонки ? А так очень понравился этот метод !

SergKis: Andrey пишет То последняя колонка становится слишком широкой ! Есть такая бяка. Надо правки делать[pre2] METHOD AdjColumns( aColumns, nDelta ) CLASS TSBrowse ... LOCAL nVisible := 0, aVisible := {} ... AEval( ::aColumns, {|oc| nVisible += iif( oc:lVisible, oc:nWidth, 0 ) }) AEval( aCol , {|nc| iif( obr:aColumns[ nc ]:lVisible, AAdd(aVisible, nc), Nil ) }) k := Len(aVisible) ... For i := 1 To k c := aVisible[ i ] ... [/pre2] вроде работает, погоняй еще, либу кинул

Andrey: SergKis пишет: вроде работает, погоняй еще, либу кинул Погонял... Не работает... Свой пример кинул.

SergKis: Andrey пишет Погонял... Не работает... SergKis пишет :AdjColumns({3, 4, 5}) // или :AdjColumns() END TBROWSE а у тебя[pre2] :lLockFreeze := .T. // избегать прорисовки курсора на замороженных столбцах :AdjColumns() // растяжка колонок до размера тсб по ширине ... :GetColumn("Name_8"):lEdit := .T. :HideColumns( {10} ,.t.) // скрыть колонки TsbColor( oBrw ) // задание цветов таблицы ... т.е. сначала разместили по ширине колонки, потом скрыли. ЗАМЕЧАТЕЛЬНО Убрал в самый низ ... :AdjColumns() // растяжка колонок до размера тсб по ширине END WITH // oBrw объект снят сработало как надо. [/pre2]

Andrey: SergKis пишет: Убрал в самый низ Поторопился я ... Как всегда.

Andrey: Сделал пример ! Tsb кладу на уже готовую форму в другом модуле. Всё показывает нормально, кроме вертикального скролинга. Должен быть, а не показывает при старте. Если стрелками(мышкой) подёргать, то линия скролинга появляется... обгрызанная, без стрелки вверху и внизу. Можно ли как то перерисовать весь вертикальный скролинг ?

Andrey: Новая версия МиниГуи - 18.04 Метод oBrw:ExcelOle(). При экспорте в таблице столбец с номерами домов (примерно такой порядок: 1, 2, 5, 9/2 и т.д.) неправильно экспортирует. Превращает этот столбец в 1,2,5, 09 февраля. Григорий, я сделаю тестовый пример с этим и вышлю на почту.

Andrey: Как указать правильно формат показа в Tsbrowse для текстового поля (значения "123300") по шаблону "@R 99:99:99" ? Для числового поля показ идёт правильный, а как задать такой же шаблон для текстового поля ? Если создаём aPict := { nil, nil, nil, nil, nil, "@R 99:99:99", nil } и передаём в [pre2]oBrw:SetArrayTo(aArray, aFontHF, aHead, aSize, aFoot, aPict, aAlign, aName)[/pre2] То показ 6 колонки будет так - "123300" Если сделать [pre2] oBrw:SetArrayTo(aArray, aFontHF, aHead, aSize, aFoot, aPict, aAlign, aName) oBrw:aColumns[6]:cPicture := '@R 99:99:99' [/pre2] То показ в 6 колонке будет уже "12:33:00" Опять глюк нашёл в Tsb ?

SergKis: Andrey пишет Опять глюк нашёл в Tsb ? Это от того, что игнорируешь исходники. :SetArrayTo не обрабатывает сложные Picture, а делает расчет ширины колонок для размещения правильно данных header, строк, footer (что бы помещалось все в колонке при просмотре), превращая Picture в простой вид для строки к примеру cPict := Replicate( "X", Len( ::aDefValue[ nI ] ) ). Все что не устраивает, в полученном варианте, правишь сам после создания тсб. К примеру, в массиве в колонке мах длина всех элементов 20 символов, но в процессе работы может быть 30 длина, тогда можешь регулировать колонкой задав ширину в пикселях или задав aPict[6] := repl('X', 30), ::aDefValue[ 6 ], будет от заданного aPict[6].

Andrey: Предложение по METHOD Excel2() - сделать как у METHOD ExcelOle() в самом конце метода: [pre2] If lActivate ShellExecute( 0, "Open", If( lSave, cFile, cWork ),,, 3 ) EndIf ::Display() If hProgress != Nil SendMessage( hProgress, PBM_SETPOS, 0, 0 ) EndIf Return Nil [/pre2] В METHOD ExcelOle() предлагаю сделать в самом начале: [pre2] Default lSave := ! lActivate .and. ! Empty( cXlsFile ), ; cXlsFile := "", ; hFntTitle := hFont CursorWait() // Check the file name for the number of points If AtNum( ".", HB_FNameName( cFile ) ) > 0 cMsg := 'Calling from: ' + ProcName(0) + '(' + hb_ntos( ProcLine(0) ) cMsg += ') --> ' + ProcFile(0) + ';;' cMsg += 'Output File Name - "' + HB_FNameName( cFile ) + '";' cMsg += 'contains several signs dot !;' cMsg += 'Excel can "truncate" the file name !;;' cMsg := AtRepl( ";", cMsg, CRLF ) MsgStop( cMsg , "Error" ) Endif If ::lSelector[/pre2] Только это обязательно нужно сделать, я ОЧЕНЬ ДОЛГО не мог понять почему у меня режет имя файла, а на некоторых компах нет ! Чтобы потом другим было легче это понять !!! Если в имени файла использовать несколько точек, то САМ EXCEL "режет" имя файла. Можно конечно сделать немного по другому: переименовать входящее имя файла, но тогда нужно будет потом закрывать Ole-Эксель, и открывать его заново с переименованным файлом. Не очень красивое решение здесь для Экселя. Этот вариант сделал для Экспорта Dbf-файла.

Haz: Andrey пишет: предлагаю сделать Поддержу Андрея. По первому предложению лишним не будет. В принципе хорошийстиль за собой все проводить в исходное состояние. По второму думаю все сложнее, проблема может быть не только в количестве точек. Как вариант - может сообщать о недопустимости такого имени файла, а со временем критерии могут быть расширены.

SergKis: Andrey пишет If AtNum( ".", HB_FNameName( cFile ) ) > 0 ... Не уверен, скорее уверен, что этого в ExelOle делать не надо. Как пишет Игорь варианты возможны разные, все не засунешь, да и процедура ExelOle вызывается где то, вот там как надо и лепим имя файла, если очень надо, то и excel можно запустить отдельно не в ExcelOle. Второе предложение это перегруз



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