Готовится к опубликованию новая сборка №48, которая выйдет в конце недели. Если у Вас есть интересные наработки для включения в новый релиз, то сейчас самое удобное время для их отправки мне
Кратко, что нового:
- исправление обнаруженных ошибок и неточностей кода; - новый класс HEADERIMAGE для Grid и Browse; - свойство Address в Hyperlink может теперь открывать папку или файл на диске; - добавлен NOTABSTOP класс для Browse; - поддержка пользовательских компонентов (заимствована из оффициального релиза); - расширения и исправления в библиотеках TsBrowse и PropGrid; - обновлены сборки Харбор и HMGS-IDE; - новые и обновленные старые примеры (как обычно ).
h_windows.prg ============ ... *-----------------------------------------------------------------------------* Function GetParentFormName( nControlIndex ) *-----------------------------------------------------------------------------* Local i, nParentForm, cParentForm
IF valtype(nControlIndex) == "N" // BAA 16-Apr-2012 i := ascan( _HMG_aFormHandles, _HMG_aControlParentHandles [nControlIndex] ) Return iif( i > 0, _HMG_aFormNames , "" ) ENDIF
h_hotkey.prg - лучше использовать собственную функцию nDetermineKey( nKey ) ... h_windows.prg - снова лучше использовать собственную функцию ИМХО
Да так и делал. Только размножается ... с похожими именами ... в разных местах ... А с _HMG_MainClientMDIName у меня неувязочка была (наверно был где-то не прав) потому и перешел на функцию.
Завершена подготовка к опубликованию новой версии 2.1.0, которая выйдет послезавтра.
Кратко, что нового: - исправление обнаруженных ошибок и неточностей кода (увы, увы ); - мелкие оптимизации ядра библиотеки с целью уменьшения числа используемых функций и ускорения работы; - обновлена WINANSI-сборка Харбора версии 3.1.0dev, а также библиотека TsBrowse; - пересобрана HMGS-IDE с текущей версией библиотеки; - добавлены новые и обновлены старые примеры (как обычно).
Спасибо за внимание!
gfilatov2002
moderator
Пост N: 376
Зарегистрирован: 11.02.10
Отправлено: 25.04.12 11:01. Заголовок: Новый релиз библиоте..
Новый релиз библиотеки для компилятора BCC выложил, как и обещал, по адресу:
if _HMG_BeginWindowMDIActive //JP MDI HotKey IF ! empty(_HMG_ActiveFormName) // BK 22-Apr-2012 cParentForm := _HMG_ActiveFormName // BK nParentForm := GetFormHandle ( cParentForm ) // BK ELSE nParentForm := GetActiveMdiHandle() If nParentForm == 0 nParentForm := GetFormHandle ( cParentForm ) EndIf //End JP ENDIF else nParentForm := GetFormHandle ( cParentForm ) endif ...
h_events.prg ============ ... case WM_SETFOCUS *********************************************************************** ... For x := 1 To ControlCount //JP MDI HotKey If _HMG_aControlType [x] == 'HOTKEY' If .Not. _HMG_BeginWindowMDIActive ReleaseHotKey ( 0 , _HMG_aControlIds [x] ) // BK 22-Apr-2012 ElseIf _HMG_aControlParentHandles [x] == hWnd .Or. ; _HMG_InplaceParentHandle <> 0 // BK 22-Apr-2012 ReleaseHotKey ( 0 , _HMG_aControlIds [x] ) // BK 22-Apr-2012 Endif EndIf //End Next x
For x := 1 To ControlCount If _HMG_aControlType [x] == 'HOTKEY' If _HMG_aControlParentHandles[x] == hWnd // BK 22-Apr-2012 InitHotKey ( hWnd , _HMG_aControlPageMap [x] , _HMG_aControlValue [x] , _HMG_aControlIds [x] ) EndIf EndIf Next x ...
h_windows.prg ============= ... Procedure _SetActivationFocus(i) *-----------------------------------------------------------------------------* ... For x := 1 To Len (_HMG_aControlHandles) If _HMG_aControlParenthandles [x] == h .and. _HMG_aControlType[x] != "HOTKEY" // BK 25-Apr-2012 ... Next x If FocusDefined == .F. SetFocus( GetNextDlgTabItem ( h , 0 , .F. ) ) If _HMG_BeginWindowMDIActive // BK 25-Apr-2012 _HMG_aFormFocusedControl := GetFocus() // Endif // BK End EndIf ...
Пример. Сборка hb 2.0 hmg 2.07 vc9. Для bcc сборки нет. Не могу разрешить один момент: запущены все три Child окна (последним запустить вторую кнопку [Project])), то VK_TAB не всегда реагирует, переставить фокус на др.бровсе (кнопка F7 работает - клавиши назначены). Выполнив Alt+Tab, Alt+Tab VK_TAB или после F7 работает. Что я делаю не так ? Спасибо.
gfilatov2002
moderator
Пост N: 377
Зарегистрирован: 11.02.10
Отправлено: 25.04.12 16:15. Заголовок: SergKis пишет: Для ..
SergKis пишет:
цитата:
Для работы с MDI сделаны изменения
Изменения в файлах h_hotkey.prg и h_windows.prg принимаются, а вот то, что предложено для h_events.prg, я отверг
SergKis пишет:
цитата:
Что я делаю не так ?
Трудно сказать Видимо, еще не все косяки при обработке горячих клавиш в MDI устранены...
SergKis
постоянный участник
Пост N: 22
Зарегистрирован: 17.02.12
Отправлено: 26.04.12 09:48. Заголовок: Для gfilatov2002. Вр..
Для gfilatov2002. Вроде проблему решило (на сколько правильно - вопрос): Скрытый текст
h_windowsMDI.prg ============ ... Function _ActivateMdiWindow ( FormName ) *-----------------------------------------------------------------------------* Else
If _HMG_IsModalActive MsgMiniGUIError( Formname + ": Non Modal Windows can't be activated when a modal window is active." ) endif
If _HMG_aFormNoShow == .F. ShowWindow( GetFormHandle(FormName) ) EndIf
_SetActivationFlag(i)
_ProcessInitProcedure(i)
SetFocus(GetFormHandle(_HMG_MainClientMDIName)) // BK 26-Apr-2012 SetFocus(GetFormHandle(FormName)) // BK 26-Apr-2012
_RefreshDataControls(i)
If _SetFocusedSplitChild(i) == .f. _SetActivationFocus(i) endif Endif ...
SergKis
постоянный участник
Пост N: 23
Зарегистрирован: 17.02.12
Отправлено: 26.04.12 11:08. Заголовок: Для gfilatov2002 В р..
Для gfilatov2002 В родном h_events.prg Edit Inplace не работает ! В измененном работает: Скрытый текст
case WM_SETFOCUS ... For x := 1 To ControlCount If _HMG_aControlType [x] == 'HOTKEY' If _HMG_BeginWindowMDIActive // BK IF _HMG_aControlParentHandles[x] == hWnd // BK InitHotKey ( hWnd , _HMG_aControlPageMap [x] , _HMG_aControlValue [x] , _HMG_aControlIds [x] ) ENdif Else If _HMG_aControlParentHandles[x] == hWnd .Or. ( _HMG_BeginWindowMDIActive .And. _HMG_InplaceParentHandle == GetActiveMdiHandle() ) InitHotKey ( hWnd , _HMG_aControlPageMap [x] , _HMG_aControlValue [x] , _HMG_aControlIds [x] ) EndIf EndIf EndIf Next x ...
gfilatov2002
moderator
Пост N: 378
Зарегистрирован: 11.02.10
Отправлено: 26.04.12 11:37. Заголовок: SergKis пишет: В из..
SergKis пишет:
цитата:
В измененном работает:
Может, так будет сделать проще:
цитата:
ююю For x := 1 To ControlCount If _HMG_aControlType [x] == 'HOTKEY' If _HMG_aControlParentHandles[x] == hWnd //.Or. ( _HMG_BeginWindowMDIActive .And. _HMG_InplaceParentHandle == GetActiveMdiHandle() ) InitHotKey ( hWnd , _HMG_aControlPageMap [x] , _HMG_aControlValue [x] , _HMG_aControlIds [x] ) EndIf EndIf Next x ...
У меня это место так и было. И по форме записи ReleaseHotKey(...) форма: ReleaseHotKey ( 0 , _HMG_aControlIds [x] ) без учета hWnd, больше подходит (по моему пониманию hotkey). По поводу ActivateMdiWindow в VO ClassMate это выглядит так: Скрытый текст
METHOD Dispatch(oEvent AS cEvent) AS LONGINT PASCAL CLASS cMDIChild LOCAL hFocusWnd AS PTR
~"ONLYEARLY+"
IF oEvent:uMsg==WM_MDIACTIVATE RETURN SELF:OnMDIActivate(oEvent)
METHOD OnMDIActivate(oEvent AS cEvent) AS LONGINT PASCAL CLASS cMDIChild /* This event handler is called in response to a WM_MDIACTIVATE message.
This event occurs when a MDI child window is deactivated and again when a MDI child window is activated.
PARAMETERS: oEvent - A cEvent object that provides additional information about the event.
Within the context of this event, the cEvent export variables have the following meaning:
PTR(_cast,oEvent:wParam) - Handle to the MDI child window being deactivated.
PTR(_cast,oEvent:lParam) - Handle to the MDI child window being activated.
RETURN VALUES: If an application processes this message, it should return zero.
REMARKS: This event handler is used internally by the cMDIChild class. If an application overrides this event, it is highly recommended that the event be passed to the super class:
super:OnMDIActivate(oEvent)
See the WIN32 API help for more information on the WM_MDIACTIVATE message.
*/ LOCAL oShell AS cMDIShell LOCAL hWndClient AS PTR LOCAL oMenu AS cMenu LOCAL oLastWin AS cWindow LOCAL oTB AS cToolbar
// if we are being activated IF PTR(_CAST,oEvent:lParam)==SELF:hWnd
// get the menu we will be using. If we don't have one, use our parent's IF (oMenu:=SELF:oMenu)==NULL_OBJECT oMenu := oShell:Menu ENDIF
// there is no menu anywhere IF oMenu==NULL_OBJECT SendMessage(hWndClient,WM_MDISETMENU,0,0) SendMessage(hWndClient,WM_MDIREFRESHMENU,0,0)
// we have a menu ELSE SendMessage(hWndClient,WM_MDISETMENU,DWORD(_CAST,oMenu:hMenu),LONGINT(_CAST,oMenu:hWindowMenu)) SendMessage(hWndClient,WM_MDIREFRESHMENU,0,0) ENDIF
// get the window that is deactivating... IF (oLastWin:=WindowObjectFromHandle(PTR(_CAST,oEvent:wParam)))==NULL_OBJECT // if there is no window deactivating, default to the shell window oLastWin:=oShell ENDIF
// if we don't have a toolbar... IF SELF:oToolbar==NULL_OBJECT // try to show the shell toolbar IF !(oTB:=oShell:Toolbar)==NULL_OBJECT oTB:Show(SW_NORMAL) ENDIF
// hide the currently displayed toolbar IF !oLastWin==oShell .and. !(oTB:=oLastWin:Toolbar)==NULL_OBJECT oTB:Hide() ENDIF
// we do have a toolbar...show it ELSE SELF:oToolbar:Show(SW_NORMAL)
// hide the toolbar from the deactivating window IF !(oTB:=oLastWin:Toolbar)==NULL_OBJECT .and. oTB:IsVisible() oTB:Hide() ENDIF ENDIF
// if we do not currently have an inplace active object... IF SELF:oIOleInPlaceActiveObject==NULL_OBJECT oShell:DrawMenuBar() oShell:AlignControls() ELSE SELF:oIOleInPlaceActiveObject:OnDocWindowActivate(TRUE) ENDIF
// we are being deactivated ELSEIF PTR(_CAST,oEvent:wParam)==SELF:hWnd
// if we have an inplace active object IF !SELF:oIOLEInplaceActiveObject==NULL_OBJECT SELF:oIOLEInplaceActiveObject:OnDocWindowActivate(FALSE) oShell:OnIOleInPlaceUIWindow_SetBorderSpace(NULL_PTR) ENDIF
// no one else is being activated IF oEvent:lParam==0 oMenu:=oShell:Menu
// no menu IF oMenu==NULL_OBJECT SendMessage(hWndClient,WM_MDISETMENU,0,0) SendMessage(hWndClient,WM_MDIREFRESHMENU,0,0)
// there is a menu ELSE SendMessage(hWndClient,WM_MDISETMENU,DWORD(_CAST,oMenu:hMenu),LONGINT(_CAST,oMenu:hWindowMenu)) SendMessage(hWndClient,WM_MDIREFRESHMENU,0,0) ENDIF
IF !(oTB:=oShell:Toolbar)==NULL_OBJECT oTB:Show(SW_NORMAL) ENDIF
IF !SELF:oToolBar==NULL_OBJECT SELF:oToolBar:Hide() ENDIF
// refresh and repaint the menu oShell:DrawMenuBar()
// this is required because AlignControls won't work here because we are still the current MDI child oShell:PostMessage(WM_SIZE,0,0) ENDIF
ENDIF
RETURN SELF:_Default(oEvent)
~"ONLYEARLY-"
Обрабатывается еще WM_NCACTIVATE .
Петр
постоянный участник
Пост N: 1102
Зарегистрирован: 09.10.06
Отправлено: 26.04.12 13:05. Заголовок: SergKis пишет: У ме..
SergKis пишет:
цитата:
У меня это место так и было.
Где? SergKis пишет:
цитата:
case WM_SETFOCUS ... For x := 1 To ControlCount If _HMG_aControlType [x] == 'HOTKEY' If _HMG_BeginWindowMDIActive // BK IF _HMG_aControlParentHandles[x] == hWnd // BK InitHotKey ( hWnd , _HMG_aControlPageMap [x] , _HMG_aControlValue [x] , _HMG_aControlIds [x] ) ENdif Else If _HMG_aControlParentHandles[x] == hWnd .Or. ( _HMG_BeginWindowMDIActive .And. _HMG_InplaceParentHandle == GetActiveMdiHandle() ) InitHotKey ( hWnd , _HMG_aControlPageMap [x] , _HMG_aControlValue [x] , _HMG_aControlIds [x] ) EndIf EndIf EndIf Next x
жесть вообще
SergKis
постоянный участник
Пост N: 25
Зарегистрирован: 17.02.12
Отправлено: 26.04.12 19:49. Заголовок: Петр пишет: Где? ....
Петр пишет:
цитата:
Где? ... жесть вообще
Думаю это не ко мне. В посте от 25.04.2012 14:31 это было. Григорий написал:
цитата:
Изменения в файлах h_hotkey.prg и h_windows.prg принимаются, а вот то, что предложено для h_events.prg, я отверг
h_events.prg ============ ... case WM_SETFOCUS *********************************************************************** ... For x := 1 To ControlCount //JP MDI HotKey If _HMG_aControlType [x] == 'HOTKEY' If .Not. _HMG_BeginWindowMDIActive ReleaseHotKey ( 0 , _HMG_aControlIds [x] ) // BK 22-Apr-2012 ElseIf _HMG_aControlParentHandles [x] == hWnd .Or. ; _HMG_InplaceParentHandle <> 0 // BK 22-Apr-2012 ReleaseHotKey ( 0 , _HMG_aControlIds [x] ) // BK 22-Apr-2012 Endif EndIf //End Next x
!!! For x := 1 To ControlCount !!! If _HMG_aControlType [x] == 'HOTKEY' !!! If _HMG_aControlParentHandles[x] == hWnd // BK 22-Apr-2012 !!! InitHotKey ( hWnd , _HMG_aControlPageMap [x] , _HMG_aControlValue [x] , _HMG_aControlIds [x] ) !!! EndIf !!! EndIf !!! Next x ...
Думаю с Григорием мы друг друга поняли. А текст от Сегодня 12:08
цитата:
В родном h_events.prg ...
Специально оставил родной текст и минимальные изменения, чтобы обозначить ситуацию.
Петр
постоянный участник
Пост N: 1104
Зарегистрирован: 09.10.06
Отправлено: 26.04.12 20:43. Заголовок: Я объясню, почему же..
Я объясню, почему жесть
If _HMG_BeginWindowMDIActive // --------- вот здесь _HMG_BeginWindowMDIActive == .T., правильно? IF _HMG_aControlParentHandles[x] == hWnd // BK InitHotKey ( hWnd , _HMG_aControlPageMap [x] , _HMG_aControlValue [x] , _HMG_aControlIds [x] ) ENdif Else // ------------------------------------------------------- здесь _HMG_BeginWindowMDIActive == .F. If _HMG_aControlParentHandles[x] == hWnd .Or. ( _HMG_BeginWindowMDIActive .And. _HMG_InplaceParentHandle == GetActiveMdiHandle() ) InitHotKey ( hWnd , _HMG_aControlPageMap [x] , _HMG_aControlValue [x] , _HMG_aControlIds [x] ) EndIf EndIf
Т.е. вся перечеркнутая конструкция имеет смысл, если ( _HMG_aControlParentHandles[x] == hWnd ) == .T. а раз так, то все описанное выше можно воспроизвести как
Отправлено: 26.04.12 21:26. Заголовок: Петр пишет: ... вся ..
Петр пишет:
цитата:
... вся перечеркнутая конструкция ...
Это родной текст MiniGui. Я для MDI ветку направил к себе, оставив без изменения родное, т.е. другие запуски пойдут к себе, как и было.
Петр
постоянный участник
Пост N: 1105
Зарегистрирован: 09.10.06
Отправлено: 26.04.12 21:49. Заголовок: Дело не в том, что в..
Дело не в том, что вы сделали, а как сделали, вот и Григорий несколько был озадачен. Посмотрите, что он вас спросил - зачем так усложнять?
SergKis
постоянный участник
Пост N: 27
Зарегистрирован: 17.02.12
Отправлено: 27.04.12 08:25. Заголовок: Петр пишет:зачем так..
Петр пишет:
цитата:
зачем так усложнять?
Я не усложнял (и текст не был предложением для проекта), а показал, что с частично принятыми изменениями по MDI не все работает. Код, написанный Григорием, исправляет ситуацию, т.е. мы поняли друг друга. А в каком виде он внесет предложения в проект это решать только Григорию: взять как есть, подправить под концепцию MiniGUI, принять как идею или отбросить как бред. Вас Петр понимаю, увидев такое ... не вынесла душа поэта ...
Петр
постоянный участник
Пост N: 1110
Зарегистрирован: 09.10.06
Отправлено: 27.04.12 16:03. Заголовок: Andrey пишет: Не ра..
Andrey пишет:
цитата:
Не работает пример из MiniGUI\SAMPLES\Advanced\Downloader
Работает, и следующий раз, пожалуйста, пишите в правильной ветке, которую, к тому же, сами и создали - примеры, ошибки и т.д.
Завершена подготовка к опубликованию новой версии 2.1.1, которая выйдет послезавтра.
Кратко, что нового: - исправление обнаруженных ошибок в реализации MDI - благодарю за содействие SergKis ; - переработана внутренняя Си-функция loadolepicture() - благодарю за содействие Петра ; - переработаны внутренние функции управления шрифтами - благодарю за содействие Петра ; - добавлено автоматическое автоопределение и установка кодовой страницы пользователя при старте программы; - добавлена возможность изменить шрифт в команде DRAW GRAPH по запросу пользователей; - обновлена UNICODE-сборка Харбора до версии 3.2.0dev, а также библиотека HbPrinter; - пересобрана HMGS-IDE с текущей версией библиотеки; - добавлены новые и обновлены старые примеры.
Спасибо за внимание!
SergKis
постоянный участник
Пост N: 28
Зарегистрирован: 17.02.12
Отправлено: 15.05.12 17:21. Заголовок: Для gfilatov2002. Ме..
Для gfilatov2002. Мелочь, но в некоторых случаях удобно (перенести в MDI тестовый пример) Скрытый текст
// BK 10-Май-2012 IF AScan( _HMG_aFormNames, FormName ) > 0 FormName += '_'+alltrim(str(ChildIndex)) IF ChildIndex > 1 ChildIndex -= 1 ENDIF ENDIF // BK End
Все даты в формате GMT
3 час. Хитов сегодня: 89
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет