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

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

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

Ответов - 166, стр: 1 2 3 4 5 6 7 8 9 All

gustow: Григорий, в процессе составления "списка примеров" получил (при запуске скомпилированного примера из BASIC\Charts такой вот вылет (см. http://slil.ru/27270178). Win98 SE

gfilatov: gustow пишет: Win98 SE Called from TOLEAUTO:OPEN(0) Called from OPENTABLE(246) in demo.prg Called from (b)MAIN(46) in demo.prg Ничего удивительного - проверьте, установлен ли у Вас MDAC 2.8 SP1 по ссылке http://msdn2.microsoft.com/en-us/data/aa937730.aspx Это необходимо только для "устаревшей" Win98 SE естественно.

gfilatov: Новый релиз библиотеки выложил по адресу: http://minigui.mylivepage.ru/file/?fileid=6882 а также, как обычно, на сервере http://hmgextended.com по адресу: http://hmgextended.com/files/CONTRIB/hmg-1.6-64-setup.zip Также обновил с учетом последних изменений полную сборку IDE на сайте http://minigui.mylivepage.ru по адресу: http://minigui.mylivepage.ru/file/?fileid=6881 Что нового в IDE: - исправление ошибок (как обычно ); - значительно ускорена загрузка больших форм за счет ее оптимизации; - добавлена возможность компиляции проектов с помощью MinGW (я не проверял).


valery2: DEFINE CHECKBOX Control_1 ROW 0 COL 0 WIDTH This.CellWidth CAPTION '' VALUE CellData FONTNAME _hmg_aControlFontName FONTSIZE _hmg_aControlFontSize ON CHANGE IF( _IsWindowActive('_InPlaceEdit'),; _InPlaceEditOk ( i , _InPlaceEdit.Control_1.Value , aValid , CellColIndex ,; sFieldName , _GridWorkArea , aValidMessages , lock , ControlType , aInputItems ), NIL ) END CHECKBOX

gustow: gfilatov пишет: проверьте, установлен ли у Вас MDAC 2.8 SP1 Да оно мне как-то (пока) "и даром не надь!.. и с деньгами не надь!.." ((с) м/ф "Волшебное кольцо" - по "Архангельским новеллам") :) Просто проверял "на дурака" (для описания - "что вижу, о том пою") :) Хорошо бы прежде чем пытаться открывать - как-то проверить: а оно у клиента на машинке есть? И коли нет - "по-человечески" сказать: мол, обойдесся...

gfilatov: gustow пишет: Хорошо бы прежде чем пытаться открывать - как-то проверить Нет проблем - добавьте в самом начале Procedure Main такую проверку: IF !IsWinNT() .AND. !CheckMDAC() MsgStop( 'This Program Runs In Win2000/XP Only!', 'Stop' ) Return ENDIF где Static Function CheckMDAC() LOCAL oReg, cKey := "" OPEN REGISTRY oReg KEY HKEY_LOCAL_MACHINE ; SECTION "Software\CLASSES\MDACVer.Version\CurVer" GET VALUE cKey NAME "" OF oReg CLOSE REGISTRY oReg Return !EMPTY(cKey)

gustow: gfilatov пишет: Нет проблем - добавьте в самом начале Procedure Main Я про пример, который идет в сборке (там бы поправить)... или я уж перфекционизмом мучаюсь?.. :) (хотя, наверно, маловато будет "новичков" с "устаревшей" Win98 - но хочется, чтобы уж все или работало "везде" - или говорило внятно, почему не работает [чтоб новичка непонятными вылетами не пугать]) И... Григорий, не пора ли новую ветку открывать ("часть IV")? Или рановато? А то эта начинается с анонса аж 48-го билда... :)

gfilatov: gustow пишет: Я про пример, который идет в сборке (там бы поправить)... Сделаю в следующей сборке gustow пишет: не пора ли новую ветку открывать ("часть IV")? Или рановато? Ждем-с, пока эта ветка получит хотя бы четыре звезды в форуме

gfilatov: Обновил сборку компилятора Харбор 1.1.0 для BCC 5.5.1 (Harbour MiniGUI Extended Distribution) по адресу: http://minigui.mylivepage.ru/file/?fileid=6894 Harbour Build Info --------------------------- Version: Harbour 1.1.0dev (Rev. 10684) Compiler: Borland C++ 5.5.1 (32-bit) PCode version: 0.2 ChangeLog last entry: 2009-03-24 01:08 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) ChangeLog ID: ChangeLog 10684 2009-03-24 00:02:25Z druzus Built on: Mar 24 2009 10:29:35 Extra C compiler options: -DHB_FM_STATISTICS_OFF -DHB_GUI -DHB_FM_STD_ALLOC Build options: Language options: (Clipper 5.3) (Clipper 5.x undoc) (Xbase++) (Flagship) (dirty extensions)

gfilatov: Снова обновил сборку компилятора Харбор 1.1.0 для BCC 5.5.1 (Harbour MiniGUI Extended Distribution) по адресу: http://minigui.mylivepage.ru/file/?fileid=6936 Harbour Build Info --------------------------- Version: Harbour 1.1.0dev (Rev. 10775) Compiler: Borland C++ 5.5.1 (32-bit) PCode version: 0.2 ChangeLog last entry: 2009-04-03 03:45 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) ChangeLog ID: ChangeLog 10775 2009-04-03 01:39:08Z druzus Built on: Apr 3 2009 11:37:04 Extra C compiler options: -DHB_FM_STATISTICS_OFF -DHB_GUI -DHB_FM_STD_ALLOC Build options: Language options: (Clipper 5.3) (Clipper 5.x undoc) (Xbase++) (Flagship) (dirty extensions) ---------------------------

gfilatov: Новый релиз библиотеки выложил по адресу: http://minigui.mylivepage.ru/file/?fileid=7017 а также, как обычно, на сервере http://hmgextended.com по адресу: http://hmgextended.com/files/CONTRIB/hmg-1.6-65-setup.zip Что нового: - исправление обнаруженных ошибок и неточностей кода; - добавлена возможность перемещения внутри строки по полям в элемент управления GRID - добавлена возможность перетаскивания записей в элементе управления ListBox; - обновлена библиотека HbSqlite3 (спасибо Петру Черному!); - обновлены сборки компилятора Харбор и HMGS-IDE; - новые примеры использования TsBrowse совместно с ADORDD, простые транзакции для DBF - обновлены некоторые старые примеры (как обычно ).

Sergey Spirin: Григорий, здравствуйте, Не могли бы Вы в двух словах рассказать о вот этом: - поддержка пользовательских компонентов (заимствована из оффициального релиза); Это реализовано в полном объеме? Интересно, что сейчас тестируют Xailer2, в котором ждут, похоже, аналогичную функциональность. У некоторых пользователей Xailer "витает" идея User Preview Фаста как обычного контрола.... Хочу понять, это применимо только к Xailer или может использоваться каким-то образом шире.

gfilatov: Здравствуйте, Сергей! Под пользовательскими компонентами в МиниГуи подразумевается возможность создавать собственные элементы управления, не изменяя самой библиотеки. Описание на языке оригинала ниже: User Components Development Reference This standard interface allow HMG users to create its own components (ie: new controls) without need to modify HMG library itself. - InstallEventHandler ( <cEventHandlerFunctionName> )       Every time that an event is triggered by the system the specified       function will be called.       This function will receive the following parameters:                   hWnd, nMsg, wParam, lParam       If your function process the message, it must return a not NIL       value. If not, it must return NIL. - InstallMethodHandler(<cMethodName>,<cMethodHandlerProcName>)       Every time that specified method is called, your procedure will       be executed.       If your procedure process the method, you must set the 'user       process flag' to .T. If not, you must       set it to .F. - InstallPropertyHandler(<cPropName>,<cSetFucName>,<cGetFuncName>)       When the specified property is set, <cSetFucName> is called       with all the original parameters               When the specified property is value retrieved <cGetFucName> is       called with all the original parameters.       In both cases if your functions process the property, you must       set the 'user process flag' to .T.       If not, you must set it to .F. Other Considerations:       If you've created components that requires #command directives       (ie. a control) you must add these definitions to i_UsrInit.ch       file located at HMG's INCLUDE folder.       The definitions must include start and end markers that will be       used to allow the creation of automated installation and       maintenance procedures for components.       The format for start marker is:       #define BASEDEF_<YourComponentTypeName>       The format for end marker is:       #undef BASEDEF_<YourComponentTypeName>       If you've created methods or properties with new names (not       currently specified in i_windows.ch, DECLARE WINDOW command       definition) you must add translation directives for them in       'i_UsrSOOP.ch' file, located at HMG's INCLUDE folder.       The definitions must include start and end markers too and the       translation directives must follow special rules.       The format for start marker is:       #define SOOP_<YourComponentTypeName> ;;       The format for translation directives for methods is:       #xtranslate <Window> . \<Control\> . MethodName  => Domethod ( <"Window">, \<"Control"\> , "MethodName" ) ;;       The format for translation directives for properties is:       #xtranslate <Window> . \<Control\> . PropName  => GetProperty ( <"Window">, \<"Control"\> , "PropName" )  ;;       #xtranslate <Window> . \<Control\> . PropName  := \<v\> => SetProperty ( <"Window">, \<"Control"\> , "PropName" , \<v\> )  ;;       The format for end marker is:       #undef SOOP_<YourComponentTypeName> ;;

Sergey Spirin: Ок. Спасибо. То есть, создание дополнительных компонентов-контролов возможно. Тогда у меня такой вопрос: Что необходимо было бы от FrsystH.dll, чтобы реализовать контрол-предпросмотр? Например, достаточно ли будет таких методов: SetHDC() - передать хэндл графического контекста контрола. DrawPage() - нарисовать страницу на этом контексте. Этого достаточно?

gfilatov: Sergey Spirin пишет: Этого достаточно? Сергей! Мне трудно что-либо сказать без понимания работы Вашей DLL. В качестве примера могу привести реализацию универсального обращения к элементу ActiveX, выполненную в качестве пользовательского компонента: *------------------------------------------------------------------------------* Init Procedure _InitActiveX *------------------------------------------------------------------------------* InstallMethodHandler ( 'Release' , 'ReleaseActiveX' ) InstallPropertyHandler ( 'Object' , 'SetActiveXObject' , 'GetActiveXObject' ) Return *------------------------------------------------------------------------------* Procedure _DefineActivex ( cControlName, cParentForm, nRow, nCol , nWidth , nHeight , cProgId ) *------------------------------------------------------------------------------* Local mVar , nControlHandle , aControlHandles , k := 0 , nParentFormHandle , oOle Local nAtlDllHandle , nInterfacePointer * If defined inside DEFINE WINDOW structure, determine cParentForm if _HMG_BeginWindowActive = TRUE .or. _HMG_BeginDialogActive = TRUE cParentForm := iif(_HMG_BeginDialogActive, _HMG_ActiveDialogName, _HMG_ActiveFormName) endif * If defined inside a Tab structure, adjust position and determine * cParentForm if _HMG_FrameLevel > 0 nCol := nCol + _HMG_ActiveFrameCol [_HMG_FrameLevel] nRow := nRow + _HMG_ActiveFrameRow [_HMG_FrameLevel] cParentForm := _HMG_ActiveFrameParentFormName [_HMG_FrameLevel] EndIf * Check for errors * Check Parent Window If .Not. _IsWindowDefined (cParentForm) MsgMiniGuiError("Window: "+ cParentForm + " is not defined. Program terminated" ) Endif * Check Control If _IsControlDefined (cControlName,cParentForm) MsgMiniGuiError ("Control: " + cControlName + " Of " + cParentForm + " Already defined. Program Terminated" ) Endif * Check cProgId If valType (cProgId) <> 'C' MsgMiniGuiError ("Control: " + cControlName + " Of " + cParentForm + " PROGID Property Invalid Type. Program Terminated" ) EndIf If Empty (cProgId) MsgMiniGuiError ("Control: " + cControlName + " Of " + cParentForm + " PROGID Can't be empty. Program Terminated" ) EndIf * Define public variable associated with control mVar := '_' + cParentForm + '_' + cControlName nParentFormHandle := GetFormHandle (cParentForm) * Init Activex aControlHandles := InitActivex( nParentFormHandle , cProgId , nCol , nRow , nWidth , nHeight ) nControlHandle := aControlHandles [1] nInterfacePointer := aControlHandles [2] nAtlDllHandle := aControlHandles [3] If _HMG_BeginTabActive = .T. aAdd ( _HMG_ActiveTabCurrentPageMap , nControlhandle ) EndIf * Create OLE control oOle := CreateObject( nInterfacePointer ) k := _GetControlFree() Public &mVar. := k _HMG_aControlType [k] := "ACTIVEX" _HMG_aControlNames [k] := cControlName _HMG_aControlHandles [k] := nControlHandle _HMG_aControlParenthandles [k] := nParentFormHandle _HMG_aControlIds [k] := 0 _HMG_aControlProcedures [k] := "" _HMG_aControlPageMap [k] := {} _HMG_aControlValue [k] := Nil _HMG_aControlInputMask [k] := "" _HMG_aControllostFocusProcedure [k] := "" _HMG_aControlGotFocusProcedure [k] := "" _HMG_aControlChangeProcedure [k] := "" _HMG_aControlDeleted [k] := .F. _HMG_aControlBkColor [k] := Nil _HMG_aControlFontColor [k] := Nil _HMG_aControlDblClick [k] := "" _HMG_aControlHeadClick [k] := {} _HMG_aControlRow [k] := nRow _HMG_aControlCol [k] := nCol _HMG_aControlWidth [k] := nWidth _HMG_aControlHeight [k] := nHeight _HMG_aControlSpacing [k] := 0 _HMG_aControlContainerRow [k] := iif ( _HMG_FrameLevel > 0 ,_HMG_ActiveFrameRow [_HMG_FrameLevel] , -1 ) _HMG_aControlContainerCol [k] := iif ( _HMG_FrameLevel > 0 ,_HMG_ActiveFrameCol [_HMG_FrameLevel] , -1 ) _HMG_aControlPicture [k] := "" _HMG_aControlContainerHandle [k] := 0 _HMG_aControlFontName [k] := Nil _HMG_aControlFontSize [k] := Nil _HMG_aControlFontAttributes [k] := {} _HMG_aControlToolTip [k] := '' _HMG_aControlRangeMin [k] := 0 _HMG_aControlRangeMax [k] := 0 _HMG_aControlCaption [k] := '' _HMG_aControlVisible [k] := .t. _HMG_aControlHelpId [k] := nAtlDllHandle _HMG_aControlFontHandle [k] := Nil _HMG_aControlBrushHandle [k] := 0 _HMG_aControlEnabled [k] := .T. _HMG_aControlMiscData1 [k] := oOle Return *------------------------------------------------------------------------------* Procedure ReleaseActiveX ( cWindow , cControl ) *------------------------------------------------------------------------------* If _IsControlDefined ( cControl, cWindow ) .And. GetControlType ( cControl , cWindow ) == 'ACTIVEX' ExitActivex( GetControlHandle ( cControl , cWindow ), _HMG_aControlHelpId [ GetControlIndex ( cControl , cWindow ) ] ) _HMG_UserComponentProcess := .T. else _HMG_UserComponentProcess := .F. endif Return *------------------------------------------------------------------------------* Function SetActiveXObject ( cWindow , cControl ) *------------------------------------------------------------------------------* If GetControlType ( cControl , cWindow ) == 'ACTIVEX' MsgExclamation ( 'This Property is Read Only!' , 'Warning' ) endif _HMG_UserComponentProcess := .F. Return Nil *------------------------------------------------------------------------------* Function GetActiveXObject ( cWindow , cControl ) *------------------------------------------------------------------------------* Local RetVal := Nil If GetControlType ( cControl , cWindow ) == 'ACTIVEX' _HMG_UserComponentProcess := .T. RetVal := _GetControlObject ( cControl , cWindow ) else _HMG_UserComponentProcess := .F. endif Return RetVal *-----------------------------------------------------------------------------* Function _GetControlObject ( ControlName, ParentForm ) *-----------------------------------------------------------------------------* Local mVar , i mVar := '_' + ParentForm + '_' + ControlName i := &mVar if i == 0 Return '' EndIf Return ( _HMG_aControlMiscData1 [ &mVar ] ) *------------------------------------------------------------------------------* * Low Level C Routines *------------------------------------------------------------------------------* #pragma BEGINDUMP #include <windows.h> #include <commctrl.h> #include <hbapi.h> #include <hbvm.h> #include <hbstack.h> typedef HRESULT(WINAPI *LPAtlAxGetControl)(HWND hwnd,IUnknown** unk); typedef HRESULT(WINAPI *LPAtlAxWinInit)(void); /* InitActivex() function. 2008.07.15 - Roberto Lуpez <harbourminigui@gmail.com> http://harbourminigui.googlepages.com Inspired by the works of Oscar Joel Lira Lira <oskar78@users.sourceforge.net> for Freewin project http://www.sourceforge.net/projects/freewin */ HB_FUNC( INITACTIVEX ) { HMODULE hlibrary; HWND hchild; IUnknown *pUnk; IDispatch *pDisp; LPAtlAxWinInit AtlAxWinInit; LPAtlAxGetControl AtlAxGetControl; hlibrary = LoadLibrary( "Atl.Dll" ); AtlAxWinInit = ( LPAtlAxWinInit ) GetProcAddress( hlibrary, "AtlAxWinInit" ); AtlAxGetControl = ( LPAtlAxGetControl ) GetProcAddress( hlibrary, "AtlAxGetControl" ); AtlAxWinInit(); hchild = CreateWindowEx( 0, "AtlAxWin",hb_parc(2), WS_CHILD | WS_VISIBLE , hb_parni(3), hb_parni(4), hb_parni(5), hb_parni(6), (HWND)hb_parnl( 1 ) , 0 , 0 , 0 ); AtlAxGetControl( (HWND) hchild , &pUnk ); pUnk->lpVtbl->QueryInterface(pUnk,&IID_IDispatch,(void**)&pDisp); hb_reta( 3 ); hb_stornl( (LONG) hchild , -1, 1 ); hb_stornl( (LONG) pDisp , -1, 2 ); hb_stornl( (LONG) hlibrary , -1, 3 ); } HB_FUNC( EXITACTIVEX ) { DestroyWindow ( (HWND)hb_parnl( 1 ) ); FreeLibrary ( (HMODULE)hb_parnl( 2 ) ); } #pragma ENDDUMP А теперь пример программы для использования WMPlayer.OCX в качестве элемента ActiveX: /* * MINIGUI - Harbour Win32 GUI library Demo * * Copyright 2002-2008 Roberto Lopez <harbourminigui@gmail.com> * http://harbourminigui.googlepages.com/ * * Activex Sample: Inspired by Freewin Activex inplementation by * Oscar Joel Lira Lira http://sourceforge.net/projects/freewin */ #include "minigui.ch" Procedure Main DEFINE WINDOW Win1 ; AT 0,0 ; WIDTH 800 ; HEIGHT 500 ; TITLE 'ActiveX Component Demo' ; MAIN ; ON MAXIMIZE ( Win1.Test.Width := (Win1.Width) - 100, Win1.Test.Height := (Win1.Height) - 100 ) ; ON SIZE ( Win1.Test.Width := (Win1.Width) - 100, Win1.Test.Height := (Win1.Height) - 100 ) ; ON RELEASE Win1.Test.Release DEFINE MAIN MENU POPUP "Test" MENUITEM "Play File" ACTION Test() END POPUP END MENU DEFINE ACTIVEX Test ROW 10 COL 50 WIDTH 700 HEIGHT 400 PROGID "WMPlayer.OCX.7" END ACTIVEX END WINDOW CENTER WINDOW Win1 ACTIVATE WINDOW Win1 Return Procedure Test() Win1.Test.Object:url := "c:\\minigui\\samples\\basic\\resourcedemo\\sample.wav" Return Возможно, это покажет Вам путь (например, оформление Вашей DLL как элемента ActiveX )

Sergey Spirin: Добрый день, Григорий. Вы меня не совсем поняли. В данном случае, я не собираюсь сам писать контролы для предпросмотра ни под Xailer, ни под MiniGui и т.д. Я только хочу обеспечить такую возможность написания тем, кому это потребуется или захочется ActiveX делать не буду. В данном случае это был бы "чрезмерный огород", я же хочу найти оптимальное решение, с максимальным быстродействием, без раздутого кода и т.д. То есть, нужно "нативное" решение... Как COM-решение, есть FastReport Studio - можно брать и пользоваться FRH же по задумке - "родной".... То есть, мне хорошо бы сейчас понять с Вашей помощью что нужно было бы для реализации такого контрола в MiniGUI. Ok. Чуть конкретизирую вопросы: - Известен ли hdc (device context handle) у контролов в MiniGUI? - Для своей отрисовки контрол обрабатыват WM_PAINT? - Существуют ли какие-нибудь ограничения при отрисовках или все только "в русле" WinApi? Спасибо.

gfilatov: Sergey Spirin пишет: - Известен ли hdc (device context handle) у контролов в MiniGUI? - Для своей отрисовки контрол обрабатыват WM_PAINT? - Существуют ли какие-нибудь ограничения при отрисовках или все только "в русле" WinApi? 1) Да, hdc контрола всегда известен, он сохраняется в массиве _HMG_aControlHandles на prg-уровне. 2) нет, событие WM_PAINT используется только для отрисовки графических задач (линии, дуги и т.д.) и выполнения функции DefWindowProc() для форм, а также выполнения пользовательской прорисовки форм. 3) точно не скажу, но вроде используется только WinApi

Sergey Spirin: gfilatov пишет: 1) Да, hdc контрола всегда известен, он сохраняется в массиве _HMG_aControlHandles на prg-уровне. 2) нет, событие WM_PAINT используется только для отрисовки графических задач (линии, дуги и т.д.) и выполнения функции DefWindowProc() для форм, а также выполнения пользовательской прорисовки форм. 3) точно не скажу, но вроде используется только WinApi Ok. Спасибо. А как, схематично, выглядело бы реализация контрола, который, допустим, рисует пять красных квадратов на hdc-полотне 100x100, но имеющий размер 50x50? То есть, выводящий графический примитив, но скроллируемый.

gfilatov: Sergey Spirin пишет: А как, схематично, выглядело бы реализация контрола Сергей! Вот реальный пример подключения пользовательского компонента для универсальной печати содержания элемента управления GRID: *------------------------------------------------------------------------------* Init Procedure _InitPrintGrid *------------------------------------------------------------------------------* InstallMethodHandler ( 'Print' , 'MyGridPrint' ) Return *------------------------------------------------------------------------------* Procedure MyGridPrint ( cWindowName , cControlName , MethodName ) *------------------------------------------------------------------------------* MethodName := Nil If GetControlType ( cControlName , cWindowName ) == 'GRID' gridprint( cControlName , cWindowName ) _HMG_UserComponentProcess := .T. else _HMG_UserComponentProcess := .F. endif Return Здесь пользовательской функции gridprint( cControlName , cWindowName ) передаются только имя контрола и его родительского окна, но возможно передавать любой список параметров, а также имя требуемого метода для выполнения (в этом примере не используется). Затем вся обработка происходит в этой пользовательской функции

Sergey Spirin: gfilatov пишет: Вот реальный пример подключения Ok. Насколько я понимаю, это добавление метода... К тому же, работа gridprint(), кажется, не визуальна, нет отрисовок.. Меня все-таки интересует именно новый контрол со скроллируемой поверхностью для рисования на ней. Хочется понять момент инициализации этого контрола, чтобы вызвать что-то типа: FrPrn:SetDC( Control:hDC ) И момент отрисовки, чтобы вызвать что-то типа: FrPrn:DrawPage()



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