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

gfilatov2002: SergKis пишет: Предложение по Принято Но я добавлю эти изменения в обрамлении переменной __DEBUG__: #ifdef __DEBUG__ ... #endif

SergKis: gfilatov2002 пишет Но я добавлю эти изменения в обрамлении переменной __DEBUG__: Почему ? Это основной режим, в моем понимании. Сейчас Cargo окна пуст и доступа к нему нет. А сделать на базе Alert ф-ий по темам с доп. наполнением - большая потребность. Сейчас мешает полное отсутствие инф. о DRAW ICON ... и лишние манипуляции делать чтобы определять тип button-ов., а так доступна вся инф. о контролах окна в простом виде PS Сейчас пробую использовать добавки, для отладки, код получается ~ такой (если интересно)[pre2] код prg (еще в начальной стадии) cTitle := "OK-CANCEL" aBtnColor := { LGREEN , {189,30,73} } cIcoRes := nIcoSize := NIL bInit := oa:bInitSomeBtn AlertOkCancel( cMsg, cTitle,1, cIcoRes, nIcoSize, aBtnColor, .T., bInit ) cTitle := "YES-NO-CANCEL" aBtnColor := { FUCHSIA, LGREEN , {189,30,73} } cIcoRes := oa:cIcoYesNo64 //App.Cargo:cIcoYesNo64 nIcoSize := oa:nIcoSize //64 bInit := oa:bInitSomeBtn AlertYesNoCancel( cMsg, cTitle, 3, cIcoRes, nIcoSize, aBtnColor, .T., bInit ) cTitle := "YES-NO" aBtnColor := { FUCHSIA, {189,30,73} } bInit := oa:bInitSomeBtn //{|| bInitAlertSomeBtn() } AlertYesNo( cMsg, cTitle, , cIcoRes, nIcoSize, aBtnColor, .T., bInit ) ... код обработчика (замена BUTTON на OBUTTON) o:bInitSomeBtn := {|| Local lBExt, lTime, lEbox, lDraw, ob, oo, a, b, i, o Local oc := This.Cargo Local cFocus := This.FocusedControl lTime := !Empty(oc:oTimer) lEbox := !Empty(oc:EditBox) lDraw := !Empty(oc:Draw) lBExt := !Empty(oc:lExtButton) IF !lBExt // метяем Button -> OButton IF HB_ISBLOCK( b := oAlert():b_Cargo2oNew ) oo := EVal(b, oc) //_o2log(oo, 12, "=> oo:...", .T.) i := 0 FOR EACH a IN oo:GetAll() o := a[2] IF "BUTT" $ o:cType i++ ? str(i, 2), o:cName, o:cType IF HB_ISBLOCK( b := oAlert():b_Btn2BtnEx ) This.&(o:cName).Release ob := EVal(b, o) IF !Empty(cFocus) This.&(cFocus).SetFocus ENDIF //_o2log(ob, 12, "=> ob:...", .T.) ENDIF ENDIF NEXT ENDIF ENDIF Return Nil } o:b_Cargo2oNew := {|oc| Local oo := oHmgData(), a, o Default oc := This.Cargo FOR EACH a IN oc:GetAll() o := oHmgData() o:nPos := hb_enumindex(a) IF HB_ISCHAR(a[2]) o:cName := a[1] o:cType := a[2] o:nIndex := This.&(a[1]).Index o:nY := int(This.&(a[1]).Row) o:nX := int(This.&(a[1]).Col) o:nW := int(This.&(a[1]).Width) o:nH := int(This.&(a[1]).Height) IF "BUTT" $ a[2] // [O]BUTTON o:cCaption := This.&(a[1]).Caption o:cInpMask := _HMG_aControlInputMask [ o:nIndex ] o:bAction := _HMG_aControlProcedures[ o:nIndex ] o:cFont := _HMG_aControlFontName [ o:nIndex ] o:nFont := _HMG_aControlFontSize [ o:nIndex ] o:aFont := _HMG_aControlFontAttributes[ o:nIndex ] o:hFont := _HMG_aControlFontHandle[ o:nIndex ] ELSEIF "LABE" $ a[2] // LABEL o:cValue := This.&(a[1]).Value ELSEIF "EDIT" $ a[2] // EDIBOX ELSEIF "TIME" $ a[2] // TIMER ENDIF oo:Set(a[1], o) ELSEIF a[1] == "DRAW" o:cType := a[1] o:aDraw := AClone(a[2]) o:cName := a[2][1] o:nY := int(a[2][2]) o:nX := int(a[2][3]) o:nW := a[2][5] o:nH := a[2][5] o:cIcoFile := a[2][4] o:lIsNumber := HB_ISNUMERIC( o:cIcoFile ) IF o:lIsNumber o:lIsHIcon := IsHIcon( o:cIcoFile ) ELSE o:lIsHIcon := .F. ENDIF oo:Set(a[1], o) ENDIF NEXT DO EVENTS Return oo } o:b_Btn2BtnEx := {|o| // меняем Button -> OButton Local ob := oHmgData() ob:Set(o:GetAll()) DEFINE BUTTONEX &(ob:cName) ROW ob:nY COL ob:nX WIDTH ob:nW HEIGHT ob:nH CAPTION ob:cCaption //BACKCOLOR aBack NOHOTLIGHT .F. NOXPSTYLE .F. VERTICAL .T. FLAT .T. END BUTTONEX This.&(ob:cName).Action := ob:bAction ob:nIndex := This.&(ob:cName).Index ob:cType := This.&(ob:cName).Type //"OBUTTON" Return ob } ... [/pre2]

gfilatov2002: SergKis пишет: Это основной режим Понял. Тогда обрамление кода будет другим: #ifdef _OBJECT_ ... #endif поскольку в лайт-версии библиотеки команда SET OOP ON не поддерживается. P.S. Кстати, решил разделить Минигуи на две сборки: 1) профессиональную версию (с разными дополнительными оптимизациями в Харборе и компактным бинарником Минигуи) 2) стандартную версию, которая будет распространяться бесплатно, но без дополнительных оптимизаций в Харборе и с отладочным кодом в библиотеке). Что скажете по этому поводу На мой взгляд, надо стимулировать пользователей, которые поддерживают развитие и поддержание библиотеки в актуальном состоянии.


SergKis: gfilatov2002 пишет поскольку в лайт-версии библиотеки команда SET OOP ON не поддерживается Поддерживается (включен) CLASS THmgData и oHmgData() до команды #ifdef _OBJECT_ в h_objects.prg

gfilatov2002: SergKis пишет: Поддерживается А как же тогда работает эта запись в заголовке minigui.ch /* *********************************************************************** * Enable support for the internal OOP classes * * By default this is turned ON. */ #ifndef _LITE_ #define _OBJECT_ #endif

SergKis: gfilatov2002 Смотрю h_objects.prg[pre2] /* * MINIGUI - Harbour Win32 GUI library source code * * Copyright 2017-2022 Aleksandr Belov, Sergej Kiselev <bilance@bilance.lv> */ #include "minigui.ch" #include "i_winuser.ch" #ifdef __XHARBOUR__ #include "hbcompat.ch" #else #xtranslate hb_HSetCaseMatch( <x>[, <z>] ) => ( hb_HCaseMatch( <x>[, <z>] ), <x> ) #endif #include "hbclass.ch" #define _METHOD METHOD STATIC o_AppDlu2Pixel /////////////////////////////////////////////////////////////////////////////// CLASS THmgData /////////////////////////////////////////////////////////////////////////////// ... #ifdef _OBJECT_ #ifndef __XHARBOUR__ /////////////////////////////////////////////////////////////////////////////// CLASS TIniData INHERIT THmgData /////////////////////////////////////////////////////////////////////////////// ... [/pre2] Объект-контейнер в любой версии должен быть, мое мнение, он, как и препроцессор, основа в псевдо ООП

gfilatov2002: SergKis пишет: Смотрю h_objects.prg Все верно! Функция oHmgData() используется при создании глобальных статических переменных в ядре библиотеки. Тогда обрамление будет таким #ifdef _NAMES_LIST_ ...

SergKis: gfilatov2002 пишет Кстати, решил разделить Минигуи на две сборки: Не оч. понятно деление. По мне сейчас Min. комплект - SET OOP OFF, даже не представляю, что что то, серьезное, можно делать с ним (SQLRDD лишнее в ней). Когда заходили в hmg (~2012 г.) именно SET OOP ON не было, сделали и с тех пор это рабочая версия (по TsBrowse по мелочи перенес изменения из тек. версии в свою и всего хватает) PS В той, старой, версии еще не было тотальной борьбы за минимизацию кода и это хорошо, в ней спокойно работают hrb компиляции на лету, без комплекта harbour.exe и Include файлов, сейчас компиляция на лету затруднена, т.к. практически все нужные ф-ии убраны в файлы *.ch, например, это одна из причин, по которой не могу задействовать тек. версии hmg (только в качестве небольших утилит использовал) PS Пример для наглядности работы с macro использованием псевдо ф-й (т.е. городим огород), на основе oHmgData() делаем [pre2] *----------------------------------------------------------------------------* FUNCTION oSys(cSec) // App.Cargo:oSystem usage: oSys():cTempFolder *----------------------------------------------------------------------------* LOCAL o IF Empty( App.Cargo:oSystem ) App.Cargo:oSystem := oHmgData() ; o := App.Cargo:oSystem o:nBorderWidth := GetBorderWidth() o:nBorderHeight := GetBorderHeight() o:nTitleHeight := GetTitleHeight() o:nMenuBarHeight := GetMenuBarHeight() o:BorderWidth := o:nBorderWidth o:BorderHeight := o:nBorderHeight o:TitleHeight := o:nTitleHeight o:MenuBarHeight := o:nMenuBarHeight // System folder o:cDesktopFolder := Sys.DesktopFolder + hb_ps() o:cMyDocumentsFolder := Sys.MyDocumentsFolder + hb_ps() o:cProgramFilesFolder := Sys.ProgramFilesFolder + hb_ps() o:cSystemFolder := Sys.SystemFolder + hb_ps() o:cTempFolder := Sys.TempFolder + hb_ps() o:cUserTempFolder := Sys.UserTempFolder + hb_ps() o:cWindowsFolder := Sys.WindowsFolder + hb_ps() o:DesktopFolder := Sys.DesktopFolder o:MyDocumentsFolder := Sys.MyDocumentsFolder o:ProgramFilesFolder := Sys.ProgramFilesFolder o:SystemFolder := Sys.SystemFolder o:TempFolder := Sys.TempFolder o:UserTempFolder := Sys.UserTempFolder o:WindowsFolder := Sys.WindowsFolder // Desktop area o:nRow := 0 o:nCol := 0 - GetBorderWidth() o:nWidth := Sys.DesktopWidth o:nHeight := Sys.DesktopHeight o:nDesktopWidth := Sys.DesktopWidth o:nDesktopHeight := Sys.DesktopHeight o:Y := o:nRow o:X := o:nCol o:W := o:nWidth o:H := o:nHeight o:MaxW := GetDesktopWidth() + 2*GetBorderWidth () o:MinH := GetTitleHeight () + 2*GetBorderHeight() + 2*GetMenuBarHeight() o:Row := o:nRow o:Col := o:nCol o:Width := o:nWidth o:Height := o:nHeight o:DesktopWidth := o:nDesktopWidth o:DesktopHeight := o:nDesktopHeight // Cliend area o:nClientRow := Sys.ClientRow o:nClientCol := Sys.ClientCol o:nClientWidth := Sys.ClientWidth o:nClientHeight := Sys.ClientHeight o:nY := o:nClientRow o:nX := o:nClientCol o:nW := o:nClientWidth o:nH := o:nClientHeight o:ClientRow := o:nClientRow o:ClientCol := o:nClientCol o:ClientWidth := o:nClientWidth o:ClientHeight := o:nClientHeight // TsBrowse color o:oTsbClr := oHmgData() o:oTsbClr:nClrText := GetSysColor( COLOR_WINDOWTEXT ) // [ 1 ] o:oTsbClr:nClrPane := GetSysColor( COLOR_WINDOW ) // [ 2 ] o:oTsbClr:nClrHeadFore := GetSysColor( COLOR_BTNTEXT ) // [ 3 ] o:oTsbClr:nClrHeadBack := GetSysColor( COLOR_BTNFACE ) // [ 4 ] o:oTsbClr:nClrForeFocu := GetSysColor( COLOR_CAPTIONTEXT ) // [ 5 ] o:oTsbClr:nClrFocuBack := GetSysColor( COLOR_ACTIVECAPTION ) // [ 6 ] o:oTsbClr:nClrEditFore := GetSysColor( COLOR_WINDOWTEXT ) // [ 7 ] o:oTsbClr:nClrEditBack := GetSysColor( COLOR_WINDOW ) // [ 8 ] o:oTsbClr:nClrFootFore := GetSysColor( COLOR_BTNTEXT ) // [ 9 ] o:oTsbClr:nClrFootBack := GetSysColor( COLOR_BTNFACE ) // [ 10 ] o:oTsbClr:nClrSeleFore := CLR_HGRAY // [ 11 ] inactive focused o:oTsbClr:nClrSeleBack := CLR_GRAY // [ 12 ] inactive focused o:oTsbClr:nClrOrdeFore := GetSysColor( COLOR_BTNTEXT ) // [ 13 ] o:oTsbClr:nClrOrdeBack := GetSysColor( COLOR_BTNFACE ) // [ 14 ] o:oTsbClr:nClrLine := GetSysColor( COLOR_BTNSHADOW ) // [ 15 ] o:oTsbClr:nClrSupHeadFore := GetSysColor( COLOR_BTNTEXT ) // [ 16 ] o:oTsbClr:nClrSupHeadBack := GetSysColor( COLOR_BTNFACE ) // [ 17 ] o:oTsbClr:nClrSpecHeadFore := GetSysColor( COLOR_BTNTEXT ) // [ 18 ] o:oTsbClr:nClrSpecHeadBack := GetSysColor( COLOR_BTNFACE ) // [ 19 ] o:oTsbClr:nClrSpecHeadActive := CLR_HRED // [ 20 ] o:oTsbClr:nClrAutoFilter := GetSysColor( COLOR_INACTCAPTEXT ) // [ 19 ] o:oTsbClr:nClrAutoSearch := GetSysColor( COLOR_INFOBK ) // [ 19 ] o:oTsbClr:nClrBtnHighLight := GetSysColor( COLOR_BTNHIGHLIGHT ) o:oTsbClr:nClrBtnChadow := GetSysColor( COLOR_BTNSHADOW ) o:oTsbClr:nClr_1 := o:nClrText // [ 1 ] o:oTsbClr:nClr_2 := o:nClrPane // [ 2 ] o:oTsbClr:nClr_3 := o:nClrHeadFore // [ 3 ] o:oTsbClr:nClr_4 := o:nClrHeadBack // [ 4 ] o:oTsbClr:nClr_5 := o:nClrForeFocu // [ 5 ] o:oTsbClr:nClr_6 := o:nClrFocuBack // [ 6 ] o:oTsbClr:nClr_7 := o:nClrEditFore // [ 7 ] o:oTsbClr:nClr_8 := o:nClrEditBack // [ 8 ] o:oTsbClr:nClr_9 := o:nClrFootFore // [ 9 ] o:oTsbClr:nClr_10 := o:nClrFootBack // [ 10 ] o:oTsbClr:nClr_11 := o:nClrSeleFore // [ 11 ] inactive focused o:oTsbClr:nClr_12 := o:nClrSeleBack // [ 12 ] inactive focused o:oTsbClr:nClr_13 := o:nClrOrdeFore // [ 13 ] o:oTsbClr:nClr_14 := o:nClrOrdeBack // [ 14 ] o:oTsbClr:nClr_15 := o:nClrLine // [ 15 ] o:oTsbClr:nClr_16 := o:nClrSupHeadFore // [ 16 ] o:oTsbClr:nClr_17 := o:nClrSupHeadBack // [ 17 ] o:oTsbClr:nClr_18 := o:nClrSpecHeadFore // [ 18 ] o:oTsbClr:nClr_19 := o:nClrSpecHeadBack // [ 19 ] o:oTsbClr:nClr_20 := o:nClrSpecHeadActive // [ 20 ] ENDIF IF HB_ISCHAR(cSec) IF "TSBC" $ upper(cSec) .or. "TSB" $ upper(cSec) RETURN App.Cargo:oSystem:oTsbClr ENDIF ENDIF RETURN App.Cargo:oSystem [/pre2] и используем в ini aWindow_YXWH = { oSys():Y, oSys():X, oSys():MaxW, oSys():MinH + 64 } PS Используя такую методику, теряется совместимость кодов для получения hrb, т.е. надо используемые ф-ии из *.ch переносить в отдельную lib и отключать *.ch от сборки проекта (собирать harbour.exe+Include можно, но для меня не вариант). Пока др. мыслей у меня нет

SergKis: gfilatov2002 пишет Тогда обрамление будет таким #ifdef _NAMES_LIST_ ... CLASS THmgData не должен иметь никаких обрамлений кода, т.е. доступен всегда, как и заполнение Cargo Alert окна. Обрамление, как было, так и должно остаться при определении public переменных

gfilatov2002: SergKis пишет: CLASS THmgData не должен иметь никаких обрамлений кода Да. Именно так сейчас и сделано в коде ядра. И в заголовке minigui.ch указано: [pre2] /* *********************************************************************** * Enable support for the internal OOP classes * * By default this is turned ON. */ #ifndef _LITE_ #define _OBJECT_ #endif [/pre2]

SergKis: gfilatov2002 пишет Именно так сейчас и сделано в коде ядра. Я бы еще добавил уст. Значения во всех окнах, контролах (где сейчас пусто) _HMG_aControlMiscData2 [k] := oHmgData() вместо '' _HMG_aFormMiscData2 [ k ] := oHmgData() вместо '' и ,возможно, App.Cargo тоже, сейчас там версия (значение char), его перенести в объект App.Cargo под опред. именем "раз пошла такая пьянка ..."

Andrey: Да при старте программы делаем:[pre2] INIT PROCEDURE SetsENV() SET DATE TO GERMAN SET DECIMALS TO 4 SET EPOCH TO 2000 SET EXACT ON SET SOFTSEEK ON SET CENTURY ON SET AUTOPEN OFF SET DELETED OFF ? Valtype(App.Cargo), App.Cargo .....[/pre2] Получаем - C Harbour MiniGUI 3.2.8 (stable) А почему сразу нельзя присвоить так: [pre2] App.Cargo := oHmgData() App.Cargo:MiniGui := "Harbour MiniGUI 3.2.8 (stable)" [/pre2] И потом нигде не мучиться по коду, делая своё пере присвоение для App.Cargo !

gfilatov2002: Andrey пишет: почему сразу нельзя присвоить так: App.Cargo := oHmgData() Уже сделал Благодарю за подсказку

Andrey: gfilatov2002 пишет: P.S. Кстати, решил разделить Минигуи на две сборки: 1) профессиональную версию (с разными дополнительными оптимизациями в Харборе и компактным бинарником Минигуи) 2) стандартную версию, которая будет распространяться бесплатно, но без дополнительных оптимизаций в Харборе и с отладочным кодом в библиотеке). Что скажете по этому поводу Может и надо такое деление... Только в проф-версию ещё бы предоставить сборку с MS-C и Unicode

SergKis: gfilatov2002 Небольшая добавка [pre2] CLASS TIniData INHERIT THmgData ... VAR nMaxVal AS NUMERIC INIT 20 // Max. length Value for note VAR cSrcReplChar AS STRING INIT "" // Original replacement character VAR cOutReplChar AS STRING INIT "" // Replacement by output symbol METHOD New( cIni, lMacro, lUtf8, cChar, cData, cSrcChar, cOutChar ) INLINE ( ::Super:New( .T. ), ; ::Def( cIni, lMacro, lUtf8, cChar, cData, cSrcChar, cOutChar ), Self ) CONSTRUCTOR _METHOD Def( cIni, lMacro, lUtf8, cChar, cData, cSrcChar, cOutChar ) _METHOD Read( cIniNew ) ... METHOD Def( cIni, lMacro, lUtf8, cChar, cData, cSrcChar, cOutChar ) CLASS TIniData ... ::cCommentChar := hb_defaultValue( cChar, ::cCommentChar ) IF HB_ISCHAR( cSrcChar ) .and. HB_ISCHAR( cOutChar ) ::cSrcReplChar := cSrcChar ::cOutReplChar := cOutChar ENDIF ... METHOD ToValue( cStr ) CLASS TIniData LOCAL xVal IF Empty( cStr ) ; RETURN cStr ENDIF IF !Empty( ::cSrcReplChar ) cStr := StrTran( cStr, ::cSrcReplChar, ::cOutReplChar ) ENDIF ... Это для оформления строк ini как таблица с колонками, задавать надо оба значения сразу, т.е. o:oMenuData := TIniData():New(o:cMenuFile, .T., , , , "|", ","):Read() или o:oMenuData := TIniData():New(o:cMenuFile, .T., , , , chr(9), ""):Read() [/pre2] содержимое ini, например, такое [pre2] [MENU_1] ; //--------------------------------------------------------------------------------------------------------------------------------- ; // Name Item text Icon Font Disable Function Param Separator ; //--1-------------------2---------------------------3------------------------4--------5-------6---------------7---------------8---- 010 = { 0 | gTxt('Caption_1') | "i_About32" | "Bold" | 1 | "MsgInfo" | "" | 1 } 020 = {"I_1"| '&1. '+gTxt('Menu_by_1') | oAC('ICO'):cIcoMyDbg | "Bold" | | "My_Debug" | {1,2,3} | } 030 = {"I_2"| '&2. '+gTxt('Menu_by_2') | oAC('ICO'):cIcoMyDbg | "Normal" | | "My_Debug" | {2,"Str3"} | } 040 = {"I_3"| '&3. '+gTxt('Menu_by_3') | oAC('ICO'):cIcoMyDbg | "Bold" | | "My_Debug" | {3,"Str4"} | 1 } 050 = {"I_4"| '&4. '+gTxt('Menu_by_4') | oAC('ICO'):cIcoMgDbg | "Normal" | | "Mg_Debug" | {4,"Str4"} | } 060 = {"I_5"| '&5. '+gTxt('Menu_by_5') | oAC('ICO'):cIcoMgDbg | "Bold" | | "Mg_Debug" | {5,"Str5"} | 1 } 070 = {"M11"| '&6. '+gTxt('Menu_by_6') | oAC('ICO'):cIcoYesNo | "DlgFont" | | "My_YesNo" | {"test11"} | } 080 = {"M13"| '&7. '+gTxt('Menu_by_7') | oAC('ICO'):cIcoYesNo | "ComSnMs" | | "My_YesNo" | {"test12"} | 1 } 090 = {"M14"| '&8. '+gTxt('Menu_by_8') | oAC('ICO'):cIcoInfo | "Bold" | | "AlertInfo" | {"test14"} | } 100 = {"M15"| '&9. '+gTxt('Menu_by_9') | oAC('ICO'):cIcoInfo | "DlgFont" | | "AlertInfo" | {"test15"} | 1 } 110 = {"YYY"| '&A. '+gTxt('Run_Notepad_1') | oAC('ICO'):cIcoNtpd | "ComSnMs" | | "myViewLog" | {1,2,3,.F. , ,"a"} | } 120 = {"ZZZ"| '&B. '+gTxt('Run_Notepad_2') | oAC('ICO'):cIcoNtpd | "ComSnMs" | | "myOpenLog" | {2,4,6,.T. , ,"b"} | 1 } 130 = {"I_7"| '&C. '+gTxt('No_processing_f_1') | "i_About32" | "Bold" | 1 | "No_Funct" | {"Str7",7} | } 140 = {"I_8"| '&D. '+gTxt('No_processing_f_2') | oAC('ICO'):cIcoNoExe | "Normal" | | "No_Funct" | {"Str8",8} | } [/pre2]

gfilatov2002: SergKis пишет: Небольшая добавка OK

SergKis: gfilatov2002 пишет Кстати, решил разделить Минигуи на две сборки: Сборки, по мне, должны содержать WVT, WVG lib, т.к. часто надо делать доступы к разным, чужим базам, почта, ... Это проще делать на WVT (у нас она сделана была как WVG еще на hb 2.0, содержит main menu, statusbar, button, ...). Сейчас иду делать это на свою сбору hb и hmg, т.к. для таких работ не требуется GUI интерфейс, но схожесть нужна

SergKis: PS Как относится к тек. версии hmg, как к конечной ? След. сборки уже поделятся на 2-е ? Т.к. новые сборки пока изучишь, пока поймешь, что можно, что нельзя ..., т.е. до реал. использования много времени утечет.

gfilatov2002: SergKis пишет: След. сборки уже поделятся на 2-е ? Да. Но разница между ними будет только в отсутствии оптимизации кода Минигуи и Харбора в стандартной сборке. Эти оптимизации будут использованы в платной PRO-версии. Вот и все.

SergKis: gfilatov2002 пишет Да. Тогда под нее, с некоторыми предложенными правками, пример (кому интересно) Тут https://TransFiles.ru/k17ey



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