Форум » GUI » Новая версия Расширенного релиза библиотеки MiniGUI (часть VI ) (продолжение) » Ответить

Новая версия Расширенного релиза библиотеки MiniGUI (часть VI ) (продолжение)

gfilatov: Начало темы находится здесь, а теперь АНОНС * АНОНС * АНОНС * АНОНС * АНОНС Готовится к опубликованию новая сборка №48, которая выйдет в конце недели. Если у Вас есть интересные наработки для включения в новый релиз, то сейчас самое удобное время для их отправки мне Кратко, что нового: - исправление обнаруженных ошибок и неточностей кода; - новый класс HEADERIMAGE для Grid и Browse; - свойство Address в Hyperlink может теперь открывать папку или файл на диске; - добавлен NOTABSTOP класс для Browse; - поддержка пользовательских компонентов (заимствована из оффициального релиза); - расширения и исправления в библиотеках TsBrowse и PropGrid; - обновлены сборки Харбор и HMGS-IDE; - новые и обновленные старые примеры (как обычно ).

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

gfilatov2002: SergKis пишет: На всякий случай Благодарю за оперативную помощь

SergKis: gfilatov2002 Добавил в CLASS TSColumn[pre2] DATA cField INIT "" // FieldName column DATA cFieldTyp INIT "" // FieldType column DATA nFieldLen INIT 0 // FieldLen column DATA nFieldDec INIT 0 // FieldDec column ... [/pre2] Помогает плясать от этих данных а не от :bData

Vlad04: Что-то не понял идеи. 1) При открытии справочника и выборе нужной записи, по моим понятиям, должна происходить замена данных в основной таблице ? А ничего не происходит 2)При открытии справочника, я обычно у себя в программах, позиционирую курсор на запись равной записи основной. Если в основной таблице - это имя "ВАСИЛИЙ", то при открытии справочника устанавливаю курсор на имя "ВАСИЛИЙ", если не найдено, то на первую запись


SergKis: Vlad04 пишет Что-то не понял идеи. В каком месте, если в примере, то позиционирование и не делалось, оставлено за скобками (техника), Так же за скобками осталось убрать заголовки окна, добавить элементы запроса для поиска (как у Haz в примере) В примере показана работа с базой колонок (baza 1, baza 2 содержат только поля ссылок на справочники), просмотр по ссылкам (исп. переменная колонки новая :bSeek в 2х вариантах исполнения), т.е. :LoadFields(...) не очень подходит надо доб. описания колонок. В примере исп. созданная база кол. и для работы с base1, base2 и справочн. Добавка в объект доп. переменных, так это для уточнений при работ с колонками. Так имеем :bData и от него пляшем -> :nWidth, :cPicture, :nAlign ставим интуитивно, примерно ... Если отображение через функцию в :bData (к примеру выбрать CHARSET фонта для отображения колонки для данных только типа C), то это опять интуитивное решение, т.к. :cField можент быть выражение с CRLF. А так можно делать проверку только для C типа поля делать, для др. нет или для других.

SergKis: PS В примере base 1, base 2 - Child окна (при этом ведут себя почти как модал Parent окно не реагирует на кнопки, пока не выйдем из окна child base1\2). base 1, base 2 можно сделать modal, при этом вызовы спр. на колонках будут работать, они child.

Haz: Vlad04 пишет: Что-то не понял идеи Еще идею Сергей озвучил пару страниц назад. Это вызов справочников через сообщение, это дает возможность не замораживать обработчик событий tsb на блоке bPrevEdit. Вместо записи в таблицу при выборе из справочника, ведётся лог. Так что пример Сергея как бы и о событиях. Мой пример это кусок из проекта, там запись из справочника есть. Но все через bPrevEdit. Предупредил что пример сырой в фазе вялой доработки. Сделаны блоки bPostblock для выполнения действий после выбора и bSearch для поиска. В плане как минимум bPreBlok для действий перед показом справочника. Используя блоки можно лочить таблицу только в момент записи или установить указатель куда угодно перед показом и пр. Ps Основная претензия к комбо, так это предварительное чтение справочника в массив. При узком канале и длинном справочнике бровс помирает при прорисовке и навигации. Так же нет поиска фильтрации, чекбоксов и прочих прелестей. У себя полностью отказался от комбо в tsb.

gfilatov2002: SergKis пишет: Добавка в объект доп. переменных Продублировал эти дополнения

SergKis: gfilatov2002 Сделал след. изменения[pre2] CLASS TSColumn ... DATA bSeek // Optional code block to seek a column data DATA bDecode // Charset decode or other ... METHOD SetProperty ( cName, xVal ) INLINE iif( __objHasData( Self, cName ), __objSendMsg( Self, '_'+cName, xVal ), Nil ) METHOD GetProperty ( cName ) INLINE iif( __objHasData( Self, cName ), __objSendMsg( Self, cName ), Nil ) METHOD AddProperty ( cName, xVal ) INLINE ( iif(!__objHasData( Self, cName ), __objAddData( Self, cName ), Nil ), ; iif( __objHasData( Self, cName ), __objSendMsg( Self, '_'+cName, xVal ), Nil ) ) ... METHOD DrawLine( xRow ) CLASS TSBrowse ... If ::lIsArr .and. ( ::lAppendMode .or. ::nAt > Len( ::aArray ) ) uData := "" // append mode for arrays ElseIf cColAls != Nil If Valtype( oColumn:bSeek ) == 'B' ( cColAls )->( Eval( oColumn:bSeek, Self, nJ ) ) EndIf uData := ( cColAls )->( Eval( oColumn:bData ) ) If Valtype( oColumn:bDecode ) == 'B' uData := ( cColAls )->( Eval( oColumn:bDecode, uData, Self, nJ ) ) EndIf Else If Valtype( oColumn:bSeek ) == 'B' Eval( oColumn:bSeek, Self, nJ ) EndIf uData := Eval( oColumn:bData ) If Valtype( oColumn:bDecode ) == 'B' uData := Eval( oColumn:bDecode, uData, Self, nJ ) EndIf EndIf ... METHOD DrawSelect( xRow ) CLASS TSBrowse ... If ::lIsArr .and. ( ::lAppendMode .or. ::nAt > Len( ::aArray ) ) uData := "" // append mode for arrays ElseIf cColAls != Nil If Valtype( oColumn:bSeek ) == 'B' ( cColAls )->( Eval( oColumn:bSeek, Self, nJ ) ) EndIf uData := ( cColAls )->( Eval( oColumn:bData ) ) If Valtype( oColumn:bDecode ) == 'B' uData := ( cColAls )->( Eval( oColumn:bDecode, uData, Self, nJ ) ) EndIf Else If Valtype( oColumn:bSeek ) == 'B' Eval( oColumn:bSeek, Self, nJ ) EndIf uData := Eval( oColumn:bData ) If Valtype( oColumn:bDecode ) == 'B' uData := Eval( oColumn:bDecode, uData, Self, nJ ) EndIf EndIf ... METHOD LoadFields( lEditable ) CLASS TSBrowse ... ATail( ::aColumns ):cData := ::cAlias + "->" + FieldName( nE ) ATail( ::aColumns ):cName := ( ::cAlias )->( FieldName( nE ) ) // 21.07.2015 ATail( ::aColumns ):cField := ( ::cAlias )->( FieldName( nE ) ) // 08.06.2018 ATail( ::aColumns ):cFieldTyp := aStru[ nE, 2 ] ATail( ::aColumns ):nFieldLen := aStru[ nE, 3 ] ATail( ::aColumns ):nFieldDec := aStru[ nE, 4 ] ... [/pre2] Пример по исп. CHARSET фонтов тут https://my-files.ru/dofcn3 Суть примера: U04.dbf -в дос кодировке LV866 (языки EN, LV, RU) bk8_c.lib содержит C функцию перекодировки Dos4W5(cString, 1) - dos -> win ansi 1251 RUSIAN_CHARSET Dos4W5(cString, 2) - dos -> win ansi 1257 BALTIC_CHARSET ... TSB показывает колонки в разных фонтах

SergKis: PS demo_ru.prg в OEM кодировке (опр. русских букв в dos) !!!

gfilatov2002: SergKis пишет: Сделал след. изменения Принято. Благодарю за помощь

Haz: SergKis пишет: показывает колонки в разных фонта Сергей, а при записи в поле все ок будет?

SergKis: Игорь, Надо обратную перекодировку делать, т.е. в edit использовать hFont с нужным charset потом перед записью делать win ansi -> dos, для LV866: Dos4W5(cString, 6) - win ansi rusian_charset -> LV866 Dos4W5(cString, 7) - win ansi baltic_charset -> LV866 В тек. версии не пробовал, пока потребности не было, но должно работать, в VO работает схема

Haz: SergKis пишет: Надо обратную перекодировку делать Я делал. Но перекодировки и шрифты назначались в bData. Если поле подстановочное через bSeek или bData и хранит ID, то перекодировка не нужна в общем случае. У меня был авто пополняемый справочник в OEM, в поле хранил ID. Поле это было редактируемо с BTNBox и при нажатии на кнопку был выбор, при редакции - запись в справочник и в поле подстановка нового ID. Ох и намучился я с этим BTN....идея оказалась не удобной для пользователя.

SergKis: Haz пишет Но перекодировки и шрифты назначались в bData :bData с перегрузом была (все в ней делать ... мучение) Мой товарищ по работе не выдерживал и переводил VO в уникод и hmg 2.07 перевел, на ней и работаем, голова не болит. Сейчас решил использовать наработки Андрея tsb -> Excel\OO (много новых мелких отчетов как в примере APP_OOPREPORT). Делать настройки на них в своей версии лениво, вот и полез в тек. версию hmg с charset. Хочу утилитку сделать и запускать

Haz: SergKis пишет: вот и полез в тек. версию hmg с charset тогда уж логичнее обойтись одной проверкой перед TSDrawCell [pre2] If hb_isBlock( oColumn:bDecode ) uData := Eval( oColumn:bDecode, uData, Self, nJ ) EndIf TsDrawCell( ... [/pre2]

SergKis: Haz пишет логичнее обойтись одной проверкой перед TSDrawCell Я тоже так сначала подумал, но опять проверять cColAls != Nil ..., поставил по веткам там где есть. А использовать HB_ISBLOCK логичнее, наверно копипастил

SergKis: gfilatov2002 Поправил xmlxls.lib[pre2] CREATE CLASS ExcelWriterXML ... VAR cCodePage INIT '' ... METHOD ExcelWriterXML:writeData( target ) ... xml += '<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel" />' + hb_eol() xml += "<Styles>" + hb_eol() If empty( ::cCodePage ) xml := hb_StrToUTF8( xml ) Else xml := hb_StrToUTF8( xml , ::cCodePage ) EndIf // xml := hb_StrToUTF8( xml , ::cCodePage ) FWrite( handle, xml ) xml := "" FOR EACH style IN ::styles xml += style:getStyleXML() NEXT xml += "</Styles>" + hb_eol() If empty( ::cCodePage ) xml := hb_StrToUTF8( xml ) Else xml := hb_StrToUTF8( xml , ::cCodePage ) EndIf // xml := hb_StrToUTF8( xml , ::cCodePage ) FWrite( handle, xml ) ... xml += "</Workbook>" If empty( ::cCodePage ) xml := hb_StrToUTF8( xml ) Else xml := hb_StrToUTF8( xml , ::cCodePage ) EndIf // xml := hb_StrToUTF8( xml , ::cCodePage ) FWrite( handle, xml ) ... xlsxml_s.prg CREATE CLASS ExcelWriterXML_Sheet ... LOCAL row, rowData, rowHeight, formula LOCAL cCdp := GetExcelWriterXMLCodePage() ... xml += " <Table>" + hb_eol() If empty( cCdp ) xml := hb_StrToUTF8( xml ) Else xml := hb_StrToUTF8( xml , cCdp ) Endif // xml := hb_StrToUTF8( xml , GetExcelWriterXMLCodePage() ) FWrite( handle, xml ) ... xml += ' <Column ss:Index="' + colIndex + '" ss:AutoFitWidth="0" ss:Width="' + colWidth + '"/>' + hb_eol() NEXT If empty( cCdp ) xml := hb_StrToUTF8( xml ) Else xml := hb_StrToUTF8( xml , cCdp ) Endif // xml := hb_StrToUTF8( xml , GetExcelWriterXMLCodePage() ) FWrite( handle, xml ) ... xml += " </Row>" + hb_eol() If empty( cCdp ) xml := hb_StrToUTF8( xml ) Else xml := hb_StrToUTF8( xml , cCdp ) Endif // xml := hb_StrToUTF8( xml , GetExcelWriterXMLCodePage() ) FWrite( handle, xml ) xml := "" NEXT xml += " </Table>" + hb_eol() xml += "</Worksheet>" + hb_eol() If empty( cCdp ) xml := hb_StrToUTF8( xml ) Else xml := hb_StrToUTF8( xml , cCdp ) Endif // xml := hb_StrToUTF8( xml , GetExcelWriterXMLCodePage() ) FWrite( handle, xml ) ... [/pre2] т.е. по умолчанию работает страница уст. в программе.

gfilatov2002: SergKis пишет: Поправил xmlxls.lib Спасибо

SergKis: gfilatov2002 SergKis пишет ... If empty( cCdp ) xml := hb_StrToUTF8( xml ) Else xml := hb_StrToUTF8( xml , cCdp ) Endif // xml := hb_StrToUTF8( xml , GetExcelWriterXMLCodePage() ) ... Все проще оказалось, достаточно сделать в первоначальном варианте STATIC cCp := Nil // "" REQUEST HB_CODEPAGE_RU1251, HB_CODEPAGE_RU866, HB_CODEPAGE_UTF8 CREATE CLASS ExcelWriterXML VAR styles INIT {} VAR formatErrors INIT { => } VAR sheets INIT {} VAR lShowErrorSheet INIT .F. VAR overwriteFile INIT .F. VAR cCodePage INIT Nil // 'RU1251' ... тогда тоже все работает как надо

gfilatov2002: SergKis пишет: Все проще оказалось



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