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

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

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

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

SergKis: PS видел, но не понял к чему относятся #xtranslate IsErrorLogActive () ; => ; _HMG_CreateErrorLog и #xcommand SET LOGERROR <x:ON,OFF> => _HMG_CreateErrorlog := ( Upper(<(x)>) == "ON" ) возможно надо такую еще #xcommand SET LOGERROR TO [<uVal>] => _HMG_CreateErrorlog := !Empty( <uVal> ) #xtranslate SetErrorLogActive ( <uVal> ) ; => ; _HMG_CreateErrorLog := !Empty( <uVal> ) и тогда в _LogFile(...)[pre2] IF ! IsErrorLogActive () RETURN .F. ENDIF [/pre2] Это, если речь об этом шла с переменной _HMG_CreateErrorLog

gfilatov2002: SergKis пишет: Пропустил ошибку в строке Поправил. Большое спасибо! SergKis пишет: тогда в _LogFile(...) IF ! IsErrorLogActive () RETURN .F. ENDIF Добавил этот код.

gfilatov2002: Выложил финальную сборку 24.01 с последними исправлениями и дополнениями по адресу Скачать SHA-256: 8d506a1c284bb8cbc6ba3f1298a6a806585ee9a718e560113111e8998b91324e и в виде архива Скачать SHA-256: 3f40d354e2e7247c670f45bba4f55096e9823468f22f30d5c86b0f6e0f84e67c Желаю всем хорошего дня P.S. За последние годы была прекращена разработка и поддержка нескольких проектов, основанных на синтаксисе команд Минигуи: - 2017 - официальный релиз HMG - 2017 - Marinas GUI, основанный на Qt (http://marinas-gui.org/projects/marinas-gui/_Index_help_marinas-gui.htm) - 2023 - OOHG, использующий OOП Если не трудно, напишите ваш комментарий...


SergKis: gfilatov2002 пишет ваш комментарий... - релиз HMG, не было TsBrowse и был ли препроцессор команд, уже забыл, помню, что в основе была работа напрямую с _HMG_SYSDATA - Marinas GUI, сложноватый синтаксис и переход с VO - OOHG, ООП был (отличный от VO), но суть (наличие массива _HMG_SYSDATA), а значит вся работа по доступу к окнам, контролам это AScan() Когда появился hb 2.0 unicode все это пощупали, HMG Extended оказалась единственным работоспособным и адаптируемым к своим возможностям проектом, к тому в очень актуальном состоянии С 2010 года перевели проекты на hb console+wvt, а 2011 года, пощупав, многое, перешли с VO на HMG Extended. Товарищ полностью обвязал объектами, как VO и с мин. затратами перешел. У меня была сильная помесь кода от clipper (в VO на базе VOSсripta) и GUI (свои ф-ии окна), то идти его путем (объектов) было сложно. Переход на родной язык hmg препроцессора оказался оч. к стати. Григорию, за его труд, БОЛЬШОЕ СПАСИБО ! Единственным минусом, который не преодолел я (переход на последние версии hmg) это 1. сокрытие команд, функций из FUNCTION -> STATIC FUNCTION, например, в h_controlmisc.prg не было static ф-ий, теперь все скрыто, доступ, практически только через Set\GetProperty() 2. ускорение доступа к элементам hmg, например, в моей версии сделано (работа через полученный ранее index)[pre2] *-----------------------------------------------------------------------------* Function GetControlName ( ControlName, ParentForm, Index ) *-----------------------------------------------------------------------------* Local i := GetControlIndex ( ControlName, ParentForm, Index ) if i == 0; Return '' EndIf Return ( _HMG_aControlNames [ i ] ) *-----------------------------------------------------------------------------* Function GetControlHandle ( ControlName, ParentForm, Index ) *-----------------------------------------------------------------------------* Local i := GetControlIndex ( ControlName, ParentForm, Index ) if i == 0; Return 0 EndIf Return ( _HMG_aControlHandles [ i ] ) *-----------------------------------------------------------------------------* Function GetControlContainerHandle ( ControlName, ParentForm, Index ) *-----------------------------------------------------------------------------* Local i := GetControlIndex ( ControlName, ParentForm, Index ) if i == 0; Return 0 EndIf Return ( _HMG_aControlContainerHandle [ i ] ) ... Сейчас я бы это упростил, сделав IF HB_ISNUMERIC(ControlName) i := ControlName ControlName := _HMG_aControlNames [ i ] ELSE i := GetControlIndex ( ControlName, ParentForm ) ENDIF [/pre2] PS. Пару лет назад товарищ сделал вывод, что делать проект на псевдо ООП командах hmg значительно быстрее, чем на VO, согласен с этим выводом уже давно.

gfilatov2002: SergKis пишет: делать проект на псевдо ООП командах hmg значительно быстрее Как обычно, благодарю за Ваш быстрый ответ. Надеюсь, что это интересно не только мне.

Andrey: gfilatov2002 пишет: За последние годы была прекращена разработка и поддержка нескольких проектов, основанных на синтаксисе команд Минигуи: - 2017 - официальный релиз HMG - 2017 - Marinas GUI, основанный на Qt (http://marinas-gui.org/projects/marinas-gui/_Index_help_marinas-gui.htm) - 2023 - OOHG, использующий OOП 2017 - официальный релиз HMG - не понравился 2017 - Marinas GUI - пробовал делать свою программу, тоже не понравился 2023 - OOHG - не смотрел В 2012 году начал разбираться с МиниГуи, понравилось присутствие разработчика на этом сайте, ну и его помощь в освоении МиниГуи ! Григорий, ОГРОМНОЕ СПАСИБО за твой такой большой труд ! Да и без Сергея я бы тоже не осилил перенос программы на МиниГуи, тоже ОГРОМНОЕ СПАСИБО ! Свою большую прогу с терминалки на МиниГуи переводил 4 года.

SergKis: gfilatov2002 Не понял с примером FiveLibsTest. Может не так понимаю его ? prgflags=-DHBMK_HAS_HMGE -работает а prgflags=-DHBMK_HAS_GTWVG - нет, не находит frm_class.ch(50) Error F0029 Can't open #include file 'gtwvg.ch' его нет и в core-master от 09.03.23, есть hbgtwvg.ch т.е. пример должен работать под разными проектами hmge, hwgui, ... но gtwvg - должен быть в hb и по идее должен работать или ошибаюсь ? то что нет gtwvg.lib понимаю, но у меня под msvc hb (от 2020 года) в contrib есть gtwvg.lib, но файла gtwvg.ch так же нет PS. Может gtwvg.lib надо вкл. в сборку hmg ?

gfilatov2002: SergKis пишет: prgflags=-DHBMK_HAS_HMGE -работает Этот пример был доработан для корректного использования с библиотекой Минигуи. Работа с другими библиотеками не тестировалась...

gfilatov2002: Продолжаем хорошие новости Рекомендую посмотреть довольно зрелый IDE, заточенный для работы с SQL базами, свежая версия которого была выпущена вчера. Этому проекту уже пять лет, и он поставляется в 3-х версиях: - полной; - персональной; - для экспертов. click here

SergKis: gfilatov2002 Небольшая правка[pre2] CLASS TIniData INHERIT THmgData ... VAR aYesNo AS ARRAY INIT { "Yes", "No" } VAR nMaxVal AS NUMERIC INIT 20 // Max. length Value for note ... METHOD Write( cFile, lUtf8 ) CLASS TIniData ... IF ! Empty( cStr[2] ) IF lBlk cVal := iif( ! ::lUtf .AND. lUtf8, hb_StrToUtf8( cStr[2] ), cStr[2] ) ELSE IF Len(cVal) <= ::nMaxVal cVal := Left( cVal + Space( ::nMaxVal ), ::nMaxVal ) ENDIF cVal += space(3) + iif( ! ::lUtf .AND. lUtf8, hb_StrToUtf8( cStr[2] ), cStr[2] ) ENDIF ENDIF ... [/pre2] Тогда будет выравнивание в секции oIni для строк с наличием примечания на длину :nMaxVal и можно задать new значение oIni:nMaxVal := 40 для выполнения oIni:Write() И предложение [pre2] *----------------------------------------------------------------------------* FUNCTION HMG_GetAllFonts( lObj ) *----------------------------------------------------------------------------* LOCAL oFonts := oHmgData() LOCAL aFonts := {}, cName LOCAL aFont := {}, cFont, hFont FOR EACH cFont IN _HMG_aControlType IF cFont == "FONT" AAdd( aFonts, _HMG_aControlNames[ hb_enumindex( cFont ) ] ) ENDIF NEXT IF lObj == NIL ; RETURN aFonts ENDIF FOR EACH cName IN aFonts hFont := GetFontHandle( cName ) cFont := GetFontParam ( hFont ) hb_AIns( cFont, 1 , cName , .T. ) hb_ADel( cFont, Len(cFont), .T. ) IF Empty( lObj ) AAdd( aFont, AClone( cFont ) ) ELSE oFonts:Set( cName, AClone( cFont ) ) ENDIF NEXT IF Empty( lObj ) ; RETURN aFont ENDIF RETURN oFonts [/pre2]

SergKis: gfilatov2002 Вопросик по использованию hrb в hmg с использованием hb_compileFromBuff(...), hb_compileBuf(...). Как быть, например, с i_psevdofunc.ch ? Его, наверно, надо отключить из hmg.ch сборки по какому то признаку, а из i_psevdofunc.ch сделать psevdofunc.lib ? Или есть др. варианты ?

gfilatov2002: SergKis пишет: Небольшая правка Большое спасибо SergKis пишет: Вопросик по использованию hrb в hmg Я глубоко не разбирался с использованием hrb в hmg (только проверял для Харбор-кода). SergKis пишет: надо отключить из hmg.ch сборки по какому то признаку, а из i_psevdofunc.ch сделать psevdofunc.lib ? Полностью доверяю вашему опыту в этом вопросе.

gfilatov2002: Решил не добавлять новую функцию PrivateExtractIcons(), а вместо этого изменить уже существующую в ядре функцию ExtractIconEx(), добавив в нее два новых параметра, которые задают высоту и ширину иконки. Syntax: ExtractIconEx( cResName, nItem [, nX ] [, nY ] ) => { hIcon, nId }, where nX and xY are the icon sizes in pixels (32x32 by default). Примеры использования: ExtractIconEx( cIcon, -1 ) возвращает количество иконок в DLL или EXE hIconFromDll := ExtractIconEx( cIcon, nIcon, 256, 256 )[1] получает хэндл иконки с номером nIcon, которая находится в файле cIcon

Andrey: gfilatov2002 пишет: ExtractIconEx(), добавив в нее два новых параметра, которые задают высоту и ширину иконки. Супер !

Andrey: А можно ещё сделать так ? [pre2]aIcons := ExtractIconEx( cIcon, nIcon ) - вытащить ВСЕ иконки, т.е. все размеры иконок[/pre2] Или ключик какой то предусмотреть, чтобы осталась совместимость со старым синтаксисом ?

gfilatov2002: Andrey пишет: вытащить ВСЕ иконки, т.е. все размеры иконок В системе не хранятся иконки ВСЕХ размеров. Если в ресурсной DLL нет иконки требуемого размера, то при извлечении иконки этого размера она масштабируется из хранящейся там иконки большего размера.

SergKis: gfilatov2002 Предложение для ф-ий Alert...(...) сделать обработку параметра Title как массива, например, для ф-ии[pre2] *-----------------------------------------------------------------------------* FUNCTION AlertYesNo ( Message, Title, RevertDefault, Icon, nSize, aColors, lTopMost, bInit ) *-----------------------------------------------------------------------------* LOCAL aOptions := { '&' + _HMG_aABMLangLabel [20], '&' + _HMG_aABMLangLabel [21] } LOCAL nDefaultButton := 1 IF HB_ISARRAY( Title ) aOptions := Title[2] Title := Title[1] ENDIF ...[/pre2] а то получается много мороки, сохранять перед AlertYesNo(...) и др. функциями данные из _HMG_aABMLangLabel [20] и _HMG_aABMLangLabel [21], а потом надо восстанавливать и + к этому может мешать '&' + _HMG_..., надо на другое место '&' поставить.

gfilatov2002: SergKis пишет: Предложение для ф-ий Alert...(...) Сделал, конечно. Благодарю за подсказку

gfilatov2002: gfilatov2002 пишет: Примеры использования: Иконка номер 308 размера 64x64, взятая из системной DLL, выглядит так:

SergKis: gfilatov2002 Предложение по [pre2] FUNCTION HMG_Alert( cMsg, aOptions, cTitle, nType, cIcoFile, nIcoSize, aBtnColors, bInit, lClosable, cFontName ) ... ON RELEASE iif( ! _SetGetGlobal( "_HMG_PressButton" ) .AND. lClosable, _HMG_ModalDialogReturn := 0, NIL ) This.Cargo := oHmgData() FillDlg( cMsg, aOptions, nLineas, cIcoFile, nIcoSize, aBtnColors, bInit, lClosable, cFontName, nMaxLen ) ... STATIC FUNCTION FillDlg( cMsg, aOptions, nLineas, cIcoFile, nIcoSize, aBtnColors, bBlock, lClosable, cFont, nMaxLen ) ... LOCAL lExt, nY, nX, cIco ... DEFINE TIMER oTimer OF ( cForm ) INTERVAL nSeconds * 1000 ACTION ( _SetGetGlobal( "_HMG_PressButton", .T. ), ThisWindow.Release() ) This.Cargo:oTimer := "TIMER" This.oTimer.Enabled := .F. ... IF nLineas > 1 IF nLineas > nMaxLines cLblName := "Say_01" ... This.Cargo:Set( cLblName, This.&(cLblName).Type ) ELSE FOR n := 1 TO nLineas cLblName := "Say_" + StrZero( n, 2 ) ... This.Cargo:Set( cLblName, This.&(cLblName).Type ) NEXT n ... ELSE cLblName := "Say_01" ... This.Cargo:Set( cLblName, This.&(cLblName).Type ) ENDIF IF nIcoSize > 0 nY := nRow + GetBorderHeight() cIco := "ICON" IF ISNUMBER( cIcoFile ) IF IsHIcon( cIcoFile ) nX := MARGIN / iif( nIcoSize == 32, 1.4, iif( nIcoSize == 48, 1.7, 2 ) ) DRAW ICON IN WINDOW ( cForm ) ; AT nRow + GetBorderHeight(), MARGIN / iif( nIcoSize == 32, 1.4, iif( nIcoSize == 48, 1.7, 2 ) ) ; HICON cIcoFile WIDTH nIcoSize HEIGHT nIcoSize TRANSPARENT ELSE nX := MARGIN / 1.4 cIco := "SYSICON" DRAW SYSICON IN WINDOW ( cForm ) ; AT nRow + GetBorderHeight(), MARGIN / 1.4 ; ICON cIcoFile WIDTH nIcoSize HEIGHT nIcoSize TRANSPARENT ENDIF ELSE nX := MARGIN / iif( nIcoSize == 32, 1.4, iif( nIcoSize == 48, 1.7, 2 ) ) DRAW ICON IN WINDOW ( cForm ) ; AT nRow + GetBorderHeight(), MARGIN / iif( nIcoSize == 32, 1.4, iif( nIcoSize == 48, 1.7, 2 ) ) ; PICTURE cIcoFile WIDTH nIcoSize HEIGHT nIcoSize TRANSPARENT ENDIF This.Cargo:Draw := { cIco , nY , nX , cIcoFile , nIcoSize } ENDIF This.Cargo:lExtButton := lExt FOR n := 1 TO nLenaOp ... IF lExt ... This.Cargo:Set( cBtnName, This.&(cBtnName).Type ) ELSE ... This.Cargo:Set( cBtnName, This.&(cBtnName).Type ) ENDIF ... тогда bInit := {|| Local oWnd := _WindowObj( _HMG_THISFORMNAME ) _o2log(oWnd:Cargo, 12, "=>", .T.) Return Nil } выдаст в log => O:THMGDATA ARRAY[8] 1. SAY_01 = LABEL 2. SAY_02 = LABEL 3. SAY_03 = LABEL 4. SAY_04 = LABEL 5. DRAW = {"ICON", 34.0000, 22.8571, {{0, 128, 0}, {189, 30, 73}}, 32} 6. LEXTBUTTON = .F. 7. BTN_01 = BUTTON 8. BTN_02 = BUTTON ... или => O:THMGDATA ARRAY[5] 1. SAY_01 = EDITBOX 2. DRAW = {"ICON", 34.0000, 22.8571, {{0, 128, 0}, {189, 30, 73}}, 32} 3. LEXTBUTTON = .F. 4. BTN_01 = BUTTON 5. BTN_02 = BUTTON ... PS. Вместо oWnd := _WindowObj( _HMG_THISFORMNAME ) можно использовать ?v GetProperty(_HMG_THISFORMNAME, "Cargo"):GetAll() получим 1 {"SAY_01", "EDITBOX"} 2 {"DRAW", {"ICON", 34.0000, 22.8571, {{0, 128, 0}, {189, 30, 73}}, 32}} 3 {"LEXTBUTTON", .F.} 4 {"BTN_01", "BUTTON"} 5 {"BTN_02", "BUTTON"} ... 1 {"SAY_01", "LABEL"} 2 {"SAY_02", "LABEL"} 3 {"SAY_03", "LABEL"} 4 {"SAY_04", "LABEL"} 5 {"DRAW", {"ICON", 34.0000, 22.8571, {{0, 128, 0}, {189, 30, 73}}, 32}} 6 {"LEXTBUTTON", .F.} 7 {"BTN_01", "BUTTON"} 8 {"BTN_02", "BUTTON"} ... [/pre2]



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