Форум » 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: Петр 1. Не очень понимаю, как это поможет решить задачу, установки таблицы- код нажатой клавиши и исп. блока кода В VO это решалось, в основном, через ресурсный редактор, но этого хотелось бы избежать. В Events нет WM_KEYDOWN (только WM_HOTKEY). Если на окне есть Tsb (несколько), и по hWnd получается объект тсб, то обработчик oBrw:HandleEvent, т.е. работают уст. клавиши на тсб, что нормально. Что мешает, вкл. обработчик на WN_KEYDOWN (тсб проскочил), схематично[pre2] IF IsInitMenuPopup .AND. wParam == VK_ESCAPE _CloseMenu() ELSE i := ascan( _HMG_aControlHandles, hWnd ) If i > 0 oWnd := _GetWindowObj( _HMG_aControlParentHandle[ i ] ) If HB_ISOBJECT(oWnd) /* в объект окна добавляем объект oKeyDown (похожий на TKeyData, для VK_клавиш) и выполняем блок кода (если установлен) с передачей Indexа контрола, который в фокусе, для вып. _DoControlEventprocedure(bBlock, i ), для обрамления переменными _HMG_This... Ведь в фокусе могут быть кнопка, GetBox, ..., т.е. ставим таблицу oWnd:KeyDown(VK_..., {|o...| ... }) Так же можем сделать и для WM_KEYUP, oKeyUp ... Что бы разъединить схемы работы wm_HotKey (сейчас в работе) и wm_KeyDown, в класс окна поставим :lHotKey := .T. - как сейчас. Что успел посмотреть, вроде склеивается (надо подправить возврат после UserKey, что то перепутал\недосмотрел), добавить в пример кнопки Button[ex], GetBox, др. окно и пробовать (это планы, вопрос только время найти. Машина сломалась, время нашлось. что то сделал, пока в ремонте). А Post\SendMsg по нажатиям\отпусканиям можем посылать др. окнам, с того, что в фокусе и получить с др. окна на текущее. */ RETURN 0 EndIf EndIf ENDIF exit 2. Уже писал, с С\WinApi не очень дружу, потому кто бы сделал (но не я) [/pre2]

Петр: SergKis пишет: Не очень понимаю, как это поможет решить задачу, установки таблицы- код нажатой клавиши и исп. блока кода А в чем проблема? Я же написал - пример ограниченной поддержки, с минимальным изменением кода библиотеки. Полную интеграцию можно провести по разному - стандартный поиск в массивах никто не отменял. SergKis пишет: В VO это решалось, в основном, через ресурсный редактор, но этого хотелось бы избежать. Опять же пример с упором на работу с ресурсами. Таблицу акселераторов также можно и создавать и менять на лету. Но это тема другого примера. SergKis пишет: Так же можем сделать и для WM_KEYUP Да мы и теперь любое сообщение (причем без всяких дополнительных обьектов) можем обрабатывать (set events) - ничего не мешает.

SergKis: Петр пишет можем обрабатывать (set events) - ничего не мешает. В версии 2.07 этого нет, да я писал, что такое решение на постоянной основе мне не по душе (как отладка какого то решения - можно использовать). Лучше привести код Evens к нужному решению, чем плодить set eventsы. В целом проблема решена (на нашей версии) работать без HotKey, но если переходить на тек. версию, все проблемы SET KEY ... ACTION ... опять вылезут. Потому я и поднимаю волну, но пока перехода не предвидится это не горит, а других все устраивает. Петр СПАСИБО за участие


gfilatov2002: Петр пишет: пример с упором на работу с ресурсами Добавил такое описание в текущий файл changelog: [pre2] * New: Added possibility to load a Menu from a resource with the accelerators. It was a postponed user's request. Contributed by Petr Chornyj <myorg63@mail.ru> (see demo in folder \samples\Basic\MenuRES) [/pre2]Благодарю за помощь

Петр: MenuRES, я так понял, по аналогии с MenuDBF. gfilatov2002 пишет: Благодарю за помощь Да не за что, будет что-то интересное поделюсь еще В часности, SergKis подбросил интересную идею, попробую реализовать что-то подобное ON APPEVENT [NAME] <evName> [ID <id>] | [AUTO] EVAL <{block}> [ONCE] EMIT <evName>

SergKis: Петр пишет попробую реализовать что-то подобное ON APPEVENT [NAME] <evName> [ID <id>] | [AUTO] EVAL <{block}> [ONCE] EMIT <evName> Как это поможет реализовать такую схему (из HwGui) [pre2] CLASS HCustomWindow содержит переменную для наращивания обработчика для своих нужд DATA bOther ... METHOD onEvent( msg, wParam, lParam ) CLASS HCustomWindow LOCAL i // Writelog( "== "+::Classname()+Str(msg)+IIF(wParam!=NIL,Str(wParam),"NIL")+IIF(lParam!=NIL,Str(lParam),"NIL") ) IF ( i := Ascan( aCustomEvents[ EVENTS_MESSAGES ], msg ) ) != 0 RETURN Eval( aCustomEvents[ EVENTS_ACTIONS, i ], Self, wParam, lParam ) ELSEIF ::bOther != NIL RETURN Eval( ::bOther, Self, msg, wParam, lParam ) ENDIF RETURN - 1 от этого класса наследованы окна, контролы и следовательно задав :bOther, получаем работу своего обработчика как на окна, так и на контролах. В МиниГуи есть некоторве обработчики на контролы, что позволило расширить поведение их Function OLABELEVENTS( hWnd, nMsg, wParam, lParam ) ... ElseIf nMsg == WM_HMG_NOTIFY_LBL // BAA IF ValType( _HMG_aControlMiscData1 [ i ] [4] )=='B' _DoControlEventProcedure( _HMG_aControlMiscData1[ i ][4], i ) ELSE // быстрый refresh MoveWindow( _HMG_aControlHandles[ i ], ; // hWnd _HMG_aControlCol[ i ], ; // X _HMG_aControlRow[ i ], ; // Y _HMG_aControlWidth[ i ], ; // W _HMG_aControlHeight[ i ], .T. ) // H SetWindowText( _HMG_aControlHandles[ i ], ; // hWnd _HMG_aControlCaption[ i ] ) // Text ENDIF EndIf Function OGETEVENTS( hWnd, nMsg, wParam, lParam ) что позволило реализовать для GetBox обработку событий ASSIGN OnEscape( bOnEscape ) ASSIGN OnEnter( bOnEnter ) ASSIGN OnDown( bOnDown ) ASSIGN OnUp( bOnUp ) ASSIGN OnF5( bOnF5 ) ASSIGN OnDblClick( bOnDblClick ) ASSIGN OnClick( bOnClick ) ASSIGN OnSetCaret( bOnSetCaret ) ASSIGN OnAfter( bOnSetAfter ) METHOD OnBlock( bPostBlock ) METHOD OnKeyEvent(nExit) [/pre2]

SergKis: Петр Чем Ваше решение будет лучше, к примеру, такого (схема) в класс вводим переменную :oEvens := TKeyData():New() :UserKeys(WM_..., {|o| ... }) :UserKeys(WM_KEYDOWN, {|o| o:OnKeyDownUp(...) }) :UserKeys(WM_KEYUP, {|o| o:OnKeyDownUp(...) }) ... :oKeyDownUp := TKeyDownUp():New() METHOD OnKeyDownUp(...) METHOD OnEvens( nMsg, wParam, Param ) функция Events по hWnd получает объект и выполняет :OnEvens такой же класс можно сделать для контролов и в _Define... таким образом получим обработчики на контролы, т.е. функция Events по hWnd получает объект и выполняет :OnEvens на контрол

SergKis: PS. читать так такой же класс можно сделать для контролов и в _Define... кониролов заполнить ...

Петр: SergKis пишет: В версии 2.07 этого нет, да я писал, что такое решение на постоянной основе мне не по душе (как отладка какого то решения - можно использовать). Лучше привести код Evens к нужному решению, чем плодить set eventsы. Я уже, вроде, обьяснял 2012/02/14: HMG Extended Edition 2.0.7 Published. 2007/02/15: Build 31 (HMG 1.3 Extended) Published. * New: SET EVENTS FUNCTION TO <funcname> command. Это конечно, если ваша версия 2.07 и HMG Extended Edition 2.0.7 одно и тоже В большинстве случаев функция - обработчик событий, устанавливаемая посредством set events func, является дополнением к Events и может использоваться в таких случаях 1) При обработке сообщений, которые неизвестны Events; 2) Для увеличения скорости реакции приложения на сообщение; 3) Для отладки; 4) Специальные случае (вроде отключение (изменение) реакции на действия пользователя в демо - версии) Если вы посмотрите, те примеры с использованием set events func to, которые приводил я, то в большинстве случаев после каких то манипуляций вызывается стандартный обработчик Events. И использование set events func to не отменяет работу над улучшением качества Events.

Петр: SergKis пишет: Как это поможет реализовать такую схему (из HwGui) SergKis пишет: Чем Ваше решение будет лучше, к примеру, такого (схема) Это вообще, что называется "из другой оперы". Реализую и выложу здесь, тогда и вопросы можно будет по существу задавать. P.S. Присмотритесь к TTaskDialog - уверен, что найдете для себя много интересного.

SergKis: gfilatov2002 К :UserKeys добавил Evens блоки кода по WM_USER+... сообщениям с примером http://my-files.ru/3d4ctz Что сделал [pre2] Изменения: ========== Функцию _GetWindowObj( FormName ) переименовал в _WindowObj ( FormName ) т.к. уже есть _WindowCargo( FormName ), _GetWindowObj вынес на #translate. Причина - в тек. версии есть функция _GetControlObject(...), чтобы не путаться. #xtranslate _GetWindowObj( <cFormName> ) ; => ; _WindowObj( <cFormName> ) Комплект базовых функций получился такой: *-----------------------------------------------------------------------------* FUNCTION _WindowObj( FormName, nIndex ) *-----------------------------------------------------------------------------* LOCAL i := iif( Pcount() > 1, nIndex, iif( HB_ISNUMERIC( FormName ), ; AScan( _HMG_aFormHandles, FormName ), GetFormIndex( FormName ) ) ) IF i > 0 .and. HB_ISOBJECT( _HMG_aFormMiscData1 [ i ][ 1 ] ) RETURN _HMG_aFormMiscData1 [ i ][ 1 ] ENDIF RETURN NIL *-----------------------------------------------------------------------------* FUNCTION _WindowCargo( FormName, xValue ) *-----------------------------------------------------------------------------* LOCAL i := iif( HB_ISOBJECT ( FormName ), FormName:Index, ; iif( HB_ISNUMERIC( FormName ), ; AScan( _HMG_aFormHandles, FormName ), GetFormIndex( FormName ) ) ) If Pcount() > 1; _HMG_aFormMiscData2 [ i ] := xValue Else ; RETURN _HMG_aFormMiscData2 [ i ] Endif RETURN NIL *-----------------------------------------------------------------------------* FUNCTION _WindowEvent( FormName, nKey, bEvent, p2, p3 ) *-----------------------------------------------------------------------------* LOCAL i := iif( HB_ISOBJECT ( FormName ), FormName:Index, ; iif( HB_ISNUMERIC( FormName ), ; AScan( _HMG_aFormHandles, FormName ), GetFormIndex( FormName ) ) ) LOCAL o IF i > 0 o := _HMG_aFormMiscData1 [ i ][ 1 ] IF HB_ISOBJECT( o ) If HB_ISBLOCK(bEvent); RETURN o:Event( nKey, bEvent ) EndIf RETURN o:Event( nKey, bEvent, p2, p3 ) ENDIF ENDIF RETURN NIL *-----------------------------------------------------------------------------* FUNCTION _ControlObj( ControlName, FormName ) *-----------------------------------------------------------------------------* LOCAL i := iif( HB_ISNUMERIC( FormName ), FormName, ; iif( HB_ISOBJECT ( ControlName ), ControlName:Index, ; iif( HB_ISNUMERIC( ControlName ), ; AScan( _HMG_aControlHandles, ControlName ), ; GetControlIndex( ControlName , FormName ) ) ) ) IF i > 0 .and. Len( _HMG_aControlMiscData0 [ i ] ) > 0 If HB_ISOBJECT ( _HMG_aControlMiscData0 [ i ][ 1 ] ) RETURN _HMG_aControlMiscData0 [ i ][ 1 ] EndIf ENDIF RETURN NIL *-----------------------------------------------------------------------------* FUNCTION _ControlCargo( ControlName, FormName, xValue ) *-----------------------------------------------------------------------------* LOCAL i := iif( HB_ISNUMERIC( FormName ), FormName, ; iif( HB_ISOBJECT ( ControlName ), ControlName:Index, ; iif( HB_ISNUMERIC( ControlName ), ; AScan( _HMG_aControlHandles, ControlName ), ; GetControlIndex( ControlName , FormName ) ) ) ) If Pcount() > 2; _HMG_aControlMiscData2 [ i ] := xValue Else ; RETURN _HMG_aControlMiscData2 [ i ] EndIf RETURN NIL *-----------------------------------------------------------------------------* FUNCTION _ControlEvent( ControlName, FormName, nKey, bEvent, p2, p3 ) *-----------------------------------------------------------------------------* LOCAL i := iif( HB_ISNUMERIC( FormName ), FormName, ; iif( HB_ISOBJECT ( ControlName ), ControlName:Index, ; iif( HB_ISNUMERIC( ControlName ), ; AScan( _HMG_aControlHandles, ControlName ), ; GetControlIndex( ControlName , FormName ) ) ) ) LOCAL o IF i > 0 .and. Len( _HMG_aControlMiscData0 [ i ] ) > 0 o := _HMG_aControlMiscData0 [ i ][ 1 ] If HB_ISOBJECT ( o ) If HB_ISBLOCK(bEvent); RETURN o:Event( nKey, bEvent ) EndIf RETURN o:Event( nKey, bEvent, p2, p3 ) EndIf ENDIF RETURN NIL Классы и вспом. функции такие: /////////////////////////////////////////////////////////////////////////////// Зарезервированы для работы два сообщения: #define WM_HMG_USER_MSG_W (WM_USER+77) #define WM_HMG_USER_MSG_C (WM_USER+78) /////////////////////////////////////////////////////////////////////////////// *-----------------------------------------------------------------------------* FUNCTION oWndData( nIndex, cName, nHandle, nParent, cType, cVar, oWin ) *-----------------------------------------------------------------------------* Default nIndex := 0, ; cName := '', ; nHandle := 0, ; nParent := 0, ; cType := '', ; cVar := '' If HB_ISOBJECT(oWin) RETURN TCntData():New( nIndex, cName, nHandle, nParent, cType, cVar, oWin ) EndIf RETURN TWndData():New( nIndex, cName, nHandle, nParent, cType, cVar ) /////////////////////////////////////////////////////////////////////////////// CLASS TWndData PROTECTED: VAR cVar VAR cName VAR cType VAR nIndex VAR nHandle VAR nParent VAR oName VAR oHand EXPORTED: VAR oCargo VAR oUserKeys VAR oEvent VAR cChr INIT ',' METHOD New( nIndex, cName, nHandle, nParent, cType, cVar ) INLINE ( ; ::nIndex := nIndex, ::cName := cName, ::nHandle := nHandle, ; ::nParent := nParent, ::cType := cType, ::cVar := cVar, ; ::oName := oKeyData(), ; ::oHand := oKeyData(), ; ::oCargo := oKeyData(), ; ::oUserKeys := oKeyData(), ; ::oEvent := oKeyData( Self ), ; Self ) CONSTRUCTOR ACCESS Index INLINE ::nIndex ACCESS Name INLINE ::cName ACCESS Handle INLINE ::nHandle ACCESS Parent INLINE ::nParent ACCESS Type INLINE ::cType ACCESS VarName INLINE ::cVar ACCESS Row INLINE GetWindowRow ( ::Handle ) ACCESS Col INLINE GetWindowCol ( ::Handle ) ACCESS Width INLINE GetWindowWidth ( ::Handle ) ACCESS Height INLINE GetWindowHeight( ::Handle ) ACCESS ClientWidth INLINE _GetClientRect ( ::Handle )[ 3 ] ACCESS ClientHeight INLINE _GetClientRect ( ::Handle )[ 4 ] ACCESS Title INLINE GetWindowText ( ::Handle ) ACCESS Cargo INLINE _WindowCargo( Self ) ASSIGN Cargo( xVal ) INLINE _WindowCargo( Self, xVal ) METHOD Cargo( xVal ) INLINE _WindowCargo( Self, xVal ) ACCESS WM_nMsgW INLINE WM_HMG_USER_MSG_W ACCESS WM_nMsgC INLINE WM_HMG_USER_MSG_C METHOD UsK ( Key, Block, p2, p3 ) INLINE iif( HB_ISBLOCK( Block ), ; ::oUserKeys:Set( Key, Block ), ; ::oUserKeys:Do ( Key, Block, p2, p3 ) ) METHOD UserKeys( Key, Block, p2, p3 ) INLINE ::UsK( Key, Block, p2, p3 ) METHOD Event ( Key, Block, p2, p3 ) INLINE iif( HB_ISBLOCK( Block ), ; ::oEvent:Set( Key, Block ), ; ::oEvent:Do ( Key, Block, p2, p3 ) ) METHOD PostMsg( nKey, nHandle, lMsgW ) INLINE ( lMsgW := lMsgW == Nil .or. !Empty(lMsgW), ; lMsgW := empty(nHandle) .or. lMsgW, ; PostMessage( ::Handle, iif( lMsgW, ::WM_nMsgW, ::WM_nMsgC ), nKey, ; hb_defaultValue(nHandle, 0) ) ) METHOD SendMsg( nKey, nHandle, lMsgW ) INLINE ( lMsgW := lMsgW == Nil .or. !Empty(lMsgW), ; lMsgW := empty(nHandle) .or. lMsgW, ; SendMessage( ::Handle, iif( lMsgW, ::WM_nMsgW, ::WM_nMsgC ), nKey, ; hb_defaultValue(nHandle, 0) ) ) METHOD DoEvent( Key, nHandle, nParam, cEvent ) METHOD Controls( xType ) ENDCLASS METHOD DoEvent ( Key, nHandle, nParam, cEvent ) CLASS TWndData LOCAL o, lW := .T. nParam := iif( HB_ISNUMERIC(nParam), nParam, 0 ) cEvent := cValToChar(cEvent) If ! empty(nHandle) o := _ControlObj(nHandle) If HB_ISOBJECT(o) lW := .F. EndIf EndIf If ! HB_ISOBJECT(o) o := Self EndIf If lW _DoWindowEventProcedure ( ::oEvent:Get(Key), o:Index, cEvent, nParam ) Else _DoControlEventProcedure( ::oEvent:Get(Key), o:Index, cEvent, nParam ) EndIf RETURN Nil METHOD Controls( xType ) CLASS TWndData LOCAL aObj := {}, c, i, o, m := {} If HB_ISCHAR ( xType ) c := ::cChr xType := hb_ATokens(xType, c) AEval(xType, {|t| iif( Empty(t), Nil, aAdd( m, upper(alltrim( t )) ) ) }) ElseIf HB_ISARRAY( xType ) AEval(xType, {|t| iif( Empty(t), Nil, aAdd( m, upper(alltrim( t )) ) ) }) Else For i := 1 To ::oName:Len o := ::oName:Value( i ) If HB_ISOBJECT( o ); aAdd( m, o:Type ) EndIf Next EndIf For i := 1 To Len( m ) o := ::oName:Value( i ) If HB_ISOBJECT( o ) .and. m[ i ] == o:Type aAdd( aObj, o ) EndIf Next RETURN aObj /////////////////////////////////////////////////////////////////////////////// CLASS TCntData INHERIT TWndData EXPORTED: VAR oWin METHOD New( nIndex, cName, nHandle, nParent, cType, cVar, oWin ) INLINE ( ; ::Super:New(nIndex, cName, nHandle, nParent, cType, cVar), ; ::oWin := oWin, ; Self ) CONSTRUCTOR ACCESS Title INLINE ::oWin:Title ACCESS Caption INLINE _GetCaption( , , ::Index ) METHOD PostMsg( nKey, nHandle ) INLINE PostMessage( ::oWin:Handle, ; iif( empty(nHandle), ::WM_nMsgW, ::WM_nMsgC ), ; nKey, hb_defaultValue(nHandle, 0) ) METHOD SendMsg( nKey, nHandle ) INLINE SendMessage( ::oWin:Handle, ; iif( empty(nHandle), ::WM_nMsgW, ::WM_nMsgC ), ; nKey, hb_defaultValue(nHandle, 0) ) METHOD Set() INLINE ( ::oWin:oName:Set( upper(::Name ), Self ), ; ::oWin:oHand:Set( ::Handle, Self ) ) METHOD Del() INLINE ( ::oWin:oName:Del( upper(::Name ), Self ), ; ::oWin:oHand:Del( ::Handle, Self ) ) ENDCLASS *-----------------------------------------------------------------------------* FUNCTION oKeyData( o ) *-----------------------------------------------------------------------------* RETURN TKeyData():New(o) ////////////////////////////////////////////////////////////////////////////////////////////// CLASS TKeyData PROTECTED: VAR oObj VAR aKey INIT hb_Hash() VAR bBlk EXPORTED: VAR Cargo METHOD New( o ) INLINE ( ::Obj := o, Self ) CONSTRUCTOR METHOD Value( nPos ) INLINE hb_HValueAt( ::aKey, nPos ) METHOD Set( Key, Block ) INLINE hb_HSet( ::aKey, Key, Block ) METHOD Get( Key, Def ) INLINE hb_HGetDef( ::aKey, Key, Def ) METHOD Del( Key ) INLINE iif( hb_hHasKey( ::aKey, Key ), hb_HDel( Key ), ) METHOD Do ( Key, p1, p2, p3 ) INLINE ( ::bBlk := ::Get(Key), iif( HB_ISBLOCK(::bBlk), ; EVal(::bBlk, ::Obj, Key, p1, p2, p3), Nil ) ) ACCESS Obj INLINE ::oObj ASSIGN Obj( o ) INLINE ::oObj := iif( HB_ISOBJECT(o), o, Self ) ACCESS Len INLINE Len( ::aKey ) ENDCLASS ////////////////////////////////////////////////////////////////////////////// Подправил для совместимости и быстрого доступа через индекс контрола: h_controlmisc.prg *-----------------------------------------------------------------------------* STATIC FUNCTION _GetCaption ( ControlName , ParentForm, nIndex ) *-----------------------------------------------------------------------------* LOCAL cRetVal LOCAL i := iif( Pcount() > 2, nIndex, GetControlIndex ( ControlName , ParentForm ) ) IF _HMG_aControlType [ i ] == 'TOOLBUTTON' cRetVal := _HMG_aControlCaption [ i ] ELSE cRetVal := GetWindowText ( _HMG_aControlHandles [ i ] ) ENDIF RETURN cRetVal h_windows.prg Function _DoControlEventProcedure ( bBlock , i , cEventType , nParam ) ... if valtype( bBlock ) == 'B' .and. i > 0 ... Function _DoWindowEventProcedure ( bBlock , i , cEventType, nParam ) ... if valtype( bBlock ) == 'B' .and. i > 0 ... Посмотрел, что править связанное с _HMG_aControlMiscData1, для расширения возможностей, трудоемко (много где) и стремно, то ввел новую переменную _HMG_aControlMiscData0 i_var.ch #define _HMG_SYSDATA_SIZE 448 // было 445 ... #xtranslate _HMG_aScrollStep => _HMG_SYSDATA\[445\] #xtranslate _HMG_aFormMiscData1 => _HMG_SYSDATA\[446\] #xtranslate _HMG_aFormMiscData2 => _HMG_SYSDATA\[447\] #xtranslate _HMG_aFormMiscData0 => _HMG_SYSDATA\[448\] i_windows.ch #xtranslate <w> . \<c\> . \<p:Object\> => _ControlObj ( \<"c"\> , <"w"> ) ;; i_this.ch #xtranslate This . <p:Object> => iif ( _HMG_ThisType == 'C' , _ControlObj ( _HMG_THISCONTROLNAME , _HMG_THISFORMNAME ) , _WindowObj ( _HMG_THISFORMNAME ) ) #xtranslate This . <c> . <p:Object> => _ControlObj ( <"c"> , _HMG_THISFORMNAME ) h_init.prg ... _HMG_aFormMiscData1 := {} _HMG_aFormMiscData2 := {} _HMG_aFormMiscData0 := {} h_events.prg добавил обработку сообщений *********************************************************************** case WM_HMG_USER_MSG_W *********************************************************************** a := _WindowObj( hWnd ) If HB_ISOBJECT(a) a:DoEvent( wParam, lParam, nMsg - WM_HMG_USER_MSG_W + 1 ) EndIf exit *********************************************************************** case WM_HMG_USER_MSG_C *********************************************************************** a := iif( empty(lParam), _WindowObj( hWnd ), _ControlObj( lParam ) ) If HB_ISOBJECT(a) a:DoEvent( wParam, lParam, nMsg - WM_HMG_USER_MSG_W + 1 ) EndIf exit *********************************************************************** line 3271 _HMG_aFormMiscData1 [ i ] := {} _HMG_aFormMiscData2 [ i ] := '' _HMG_aFormMiscData0 [ i ] := {} Добавление переменной _HMG_aControlMiscData0 делал так. Во всех файлах h_*.prg искал _HMG_aControlMiscData2 и добавлял _HMG_aControlMiscData2 [k] := '' _HMG_aControlMiscData0 [k] := {} или _HMG_aControlMiscData0 [k] := { oWndData( k , ; _HMG_aControlNames [k], ; _HMG_aControlHandles [k], ; _HMG_aControlParenthandles [k], ; _HMG_aControlType [k], ; mVar, ; _WindowObj( _HMG_aControlParenthandles [k] ) ) ; } ставил значение на _HMG_aControlMiscData0 [k] там, где есть смысл от значений параметров, иначе ставил _HMG_aControlMiscData0 [k] := {} Можно заполнить значением переменную у распространенных контролов, а в остальные пустышку и постепенно заполнять по возможности и нал. времени. Функции учитывают наличие пустышки в контролах. В окнах поменял прямое создание объекта, на созд. через функцию, т.е. там где было TWndData():New(...) надо заменить с aAdd( _HMG_aFormMiscData1 [k], TWndData():New( k, ; _HMG_aFormNames [k], ; _HMG_aFormHandles [k], ; _HMG_aFormParentHandle [k], ; _HMG_aFormType [k], ; &mVar. ) ) на aAdd( _HMG_aFormMiscData1 [k], oWndData( k , ; _HMG_aFormNames [k], ; _HMG_aFormHandles [k], ; _HMG_aFormParentHandle [k], ; _HMG_aFormType [k], ; mVar ) ) В TWndData и TsBrowse добавил (у себя) методы, аналоги :UserKeys(...) с кортким названием :UsK(...), это на любителя. Пример для тестирования будет приложен. [/pre2]

SergKis: PS Надо подправить i_var.ch ... #xtranslate _HMG_aScrollStep => _HMG_SYSDATA\[445\] #xtranslate _HMG_aFormMiscData1 => _HMG_SYSDATA\[446\] #xtranslate _HMG_aFormMiscData2 => _HMG_SYSDATA\[447\] #xtranslate _HMG_aControlMiscData0 => _HMG_SYSDATA\[448\] было (размножено и не исправлено) #xtranslate _HMG_aFormMiscData0 => _HMG_SYSDATA\[448\]

Softlog86: Добрый день , форумчане ! Что сделать чтоб можно было менять ширину контрола RADIOGROUP ? Отбой тревоги .... WIDTH - это ширина одного элемента выбора , а не всего контрола .... Уже и забыл ху-из-ху :) (*) Первый ( ) Второй ( ) Третий После команды изменения ширины MyWindow.MyRADIO.WIDTH:=600 . ( Новое значение ширины гораздо больше исходного , всё должно влазить ) Отображается только первый элемент группы : (*) Первый

SergKis: gfilatov2002 Довел до рабочей кондиции пример и тексты hmg по Post\SendMessage. Пример: http://my-files.ru/gbuo3t Комплект базовых функций, классы: [pre2] *-----------------------------------------------------------------------------* FUNCTION _WindowCargo( FormName, xValue ) *-----------------------------------------------------------------------------* LOCAL i := iif( HB_ISOBJECT ( FormName ), FormName:Index, ; iif( HB_ISNUMERIC( FormName ), ; AScan( _HMG_aFormHandles, FormName ), GetFormIndex( FormName ) ) ) If Pcount() > 1; _HMG_aFormMiscData2 [ i ] := xValue Else ; RETURN _HMG_aFormMiscData2 [ i ] Endif RETURN NIL *-----------------------------------------------------------------------------* FUNCTION _WindowEvent( FormName, nKey, bEvent, p2, p3 ) *-----------------------------------------------------------------------------* LOCAL i := iif( HB_ISOBJECT ( FormName ), FormName:Index, ; iif( HB_ISNUMERIC( FormName ), ; AScan( _HMG_aFormHandles, FormName ), GetFormIndex( FormName ) ) ) LOCAL o IF i > 0 o := _HMG_aFormMiscData1 [ i ][ 1 ] IF HB_ISOBJECT( o ) If HB_ISBLOCK(bEvent); RETURN o:Event( nKey, bEvent ) EndIf RETURN o:Event( nKey, bEvent, p2, p3 ) ENDIF ENDIF RETURN NIL *-----------------------------------------------------------------------------* FUNCTION _WindowObj( FormName, nIndex ) *-----------------------------------------------------------------------------* LOCAL i := iif( Pcount() > 1, nIndex, iif( HB_ISNUMERIC( FormName ), ; AScan( _HMG_aFormHandles, FormName ), GetFormIndex( FormName ) ) ) IF i > 0 .and. HB_ISOBJECT( _HMG_aFormMiscData1 [ i ][ 1 ] ) RETURN _HMG_aFormMiscData1 [ i ][ 1 ] ENDIF RETURN NIL *-----------------------------------------------------------------------------* FUNCTION _ControlObj( ControlName, FormName ) *-----------------------------------------------------------------------------* LOCAL i := iif( HB_ISNUMERIC( FormName ), FormName, ; iif( HB_ISOBJECT ( ControlName ), ControlName:Index, ; iif( HB_ISNUMERIC( ControlName ), ; AScan( _HMG_aControlHandles, ControlName ), ; GetControlIndex( ControlName , FormName ) ) ) ) IF i > 0 .and. Len( _HMG_aControlMiscData0 [ i ] ) > 0 If HB_ISOBJECT ( _HMG_aControlMiscData0 [ i ][ 1 ] ) RETURN _HMG_aControlMiscData0 [ i ][ 1 ] EndIf ENDIF RETURN NIL *-----------------------------------------------------------------------------* FUNCTION _ControlEvent( ControlName, FormName, nKey, bEvent, p2, p3 ) *-----------------------------------------------------------------------------* LOCAL i := iif( HB_ISNUMERIC( FormName ), FormName, ; iif( HB_ISOBJECT ( ControlName ), ControlName:Index, ; iif( HB_ISNUMERIC( ControlName ), ; AScan( _HMG_aControlHandles, ControlName ), ; GetControlIndex( ControlName , FormName ) ) ) ) LOCAL o IF i > 0 .and. Len( _HMG_aControlMiscData0 [ i ] ) > 0 o := _HMG_aControlMiscData0 [ i ][ 1 ] If HB_ISOBJECT ( o ) If HB_ISBLOCK(bEvent); RETURN o:Event( nKey, bEvent ) EndIf RETURN o:Event( nKey, bEvent, p2, p3 ) EndIf ENDIF RETURN NIL *-----------------------------------------------------------------------------* FUNCTION _ControlCargo( ControlName, FormName, xValue ) *-----------------------------------------------------------------------------* LOCAL i := iif( HB_ISNUMERIC( FormName ), FormName, ; iif( HB_ISOBJECT ( ControlName ), ControlName:Index, ; iif( HB_ISNUMERIC( ControlName ), ; AScan( _HMG_aControlHandles, ControlName ), ; GetControlIndex( ControlName , FormName ) ) ) ) If Pcount() > 2; _HMG_aControlMiscData2 [ i ] := xValue Else ; RETURN _HMG_aControlMiscData2 [ i ] EndIf RETURN NIL ================================================================================ Классы и вспом. функции : ================================================================================ /////////////////////////////////////////////////////////////////////////////// Зарезервированы для работы два сообщения: #define WM_HMG_USER_MSG_W (WM_USER+77) #define WM_HMG_USER_MSG_C (WM_USER+78) /////////////////////////////////////////////////////////////////////////////// *-----------------------------------------------------------------------------* FUNCTION oWndData( nIndex, cName, nHandle, nParent, cType, cVar, oWin ) *-----------------------------------------------------------------------------* LOCAL o Default nIndex := 0, ; cName := '', ; nHandle := 0, ; nParent := 0, ; cType := '', ; cVar := '' If HB_ISOBJECT(oWin) o := TCntData():New( nIndex, cName, nHandle, nParent, cType, cVar, oWin ) If ! Empty(o:Name) .and. ! Empty(o:Handle) If o:Type == 'TBROWSE' o:TBrowse := _HMG_aControlIds [ o:Index ] ElseIf o:Type == 'MESSAGEBAR' o:StatusBar := o EndIf o:Set() EndIf RETURN o EndIf RETURN TWndData():New( nIndex, cName, nHandle, nParent, cType, cVar ) /////////////////////////////////////////////////////////////////////////////// CLASS TWndData PROTECTED: VAR cVar VAR cName VAR cType VAR nIndex VAR nHandle VAR nParent VAR oMenu VAR oToolBar VAR oStatusBar VAR cChr INIT ',' VAR uTmp EXPORTED: CLASSDATA oName INIT oKeyData() CLASSDATA oHand INIT oKeyData() VAR oCargo VAR oUserKeys VAR oEvent METHOD New( nIndex, cName, nHandle, nParent, cType, cVar ) INLINE ( ; ::nIndex := nIndex, ::cName := cName, ::nHandle := nHandle, ; ::nParent := nParent, ::cType := cType, ::cVar := cVar, ; ::oCargo := oKeyData(), ; ::oUserKeys := oKeyData(), ; ::oEvent := oKeyData( Self ), ; Self ) CONSTRUCTOR ACCESS Index INLINE ::nIndex ACCESS Name INLINE ::cName ACCESS Handle INLINE ::nHandle ACCESS Parent INLINE ::nParent ACCESS Type INLINE ::cType ACCESS VarName INLINE ::cVar ACCESS Row INLINE GetWindowRow ( ::Handle ) ACCESS Col INLINE GetWindowCol ( ::Handle ) ACCESS Width INLINE GetWindowWidth ( ::Handle ) ACCESS Height INLINE GetWindowHeight( ::Handle ) ACCESS ClientWidth INLINE _GetClientRect ( ::Handle )[ 3 ] ACCESS ClientHeight INLINE _GetClientRect ( ::Handle )[ 4 ] ACCESS Title INLINE GetWindowText ( ::Handle ) ACCESS Cargo INLINE _WindowCargo( Self ) ASSIGN Cargo( xVal ) INLINE _WindowCargo( Self, xVal ) ACCESS IsWindow INLINE .T. ACCESS IsControl INLINE .F. ACCESS Chr INLINE ::cChr ASSIGN Chr( cChr ) INLINE ::cChr := iif( HB_ISCHAR(cChr), cChr, ::cChr ) ACCESS StatusBar INLINE ::oStatusBar ASSIGN StatusBar( o ) INLINE ::oStatusBar := o ACCESS WM_nMsgW INLINE WM_HMG_USER_MSG_W ACCESS WM_nMsgC INLINE WM_HMG_USER_MSG_C METHOD UsK ( Key, Block, p2, p3 ) INLINE iif( HB_ISBLOCK( Block ), ; ::oUserKeys:Set( Key, Block ), ; ::oUserKeys:Do ( Key, Block, p2, p3 ) ) METHOD UserKeys( Key, Block, p2, p3 ) INLINE ::UsK( Key, Block, p2, p3 ) METHOD Event ( Key, Block, p2, p3 ) INLINE iif( HB_ISBLOCK( Block ), ; ::oEvent:Set( Key, Block ), ; ::oEvent:Do ( Key, Block, p2, p3 ) ) METHOD PostMsg( nKey, nHandle, lMsgW ) INLINE ( lMsgW := lMsgW == Nil .or. !Empty(lMsgW), ; lMsgW := empty(nHandle) .or. lMsgW, ; PostMessage( ::Handle, iif( lMsgW, ::WM_nMsgW, ::WM_nMsgC ), nKey, ; hb_defaultValue(nHandle, 0) ) ) METHOD SendMsg( nKey, nHandle, lMsgW ) INLINE ( lMsgW := lMsgW == Nil .or. !Empty(lMsgW), ; lMsgW := empty(nHandle) .or. lMsgW, ; SendMessage( ::Handle, iif( lMsgW, ::WM_nMsgW, ::WM_nMsgC ), nKey, ; hb_defaultValue(nHandle, 0) ) ) METHOD DoEvent( Key, nHandle, nParam, cEvent ) METHOD GetListType() METHOD GetObj4Type( cType ) METHOD GetObj4Name( cName ) METHOD GetObj( xName ) INLINE iif( HB_ISCHAR(xName), ::oName:Get(xName), ; ::oHand:Get(xName) ) ENDCLASS METHOD GetListType() CLASS TWndData LOCAL oType := oKeyData() LOCAL aType := {} ::oName:Eval({|k,o,i| k := i, oType:Set(o:Type, o:Type) }) oType:Eval({|k,v,i| k := i, aAdd(aType, v) }) oType := Nil RETURN aType METHOD GetObj4Type( cType, lEque ) CLASS TWndData LOCAL aObj := {}, a, i, o If ! empty(cType) lEque := hb_defaultValue(lEque, .T.) If ::Chr $ cType; lEque := .F. EndIf a := hb_ATokens(upper(cType), ::Chr) FOR EACH cType IN a For i := 1 To ::oName:Len o := ::oName:Value( i ) If lEque If cType == o:cType; aAdd( aObj, o ) EndIf ElseIf cType $ o:cType; aAdd( aObj, o ) EndIf Next NEXT EndIF RETURN aObj METHOD GetObj4Name( cName ) CLASS TWndData LOCAL aObj := {}, a, i, o If ! empty(cName) a := hb_ATokens(cName, ::Chr) FOR EACH cName IN a For i := 1 To ::oName:Len o := ::oName:Value( i ) If cName $ o:cName; aAdd( aObj, o ) EndIf Next NEXT EndIF RETURN aObj METHOD DoEvent ( Key, nHandle, nParam, cEvent ) CLASS TWndData LOCAL o, lW := .T. nParam := iif( HB_ISNUMERIC(nParam), nParam, 0 ) cEvent := hb_defaultValue(cEvent, '') If ! empty(nHandle) o := _ControlObj(nHandle) If HB_ISOBJECT(o); lW := .F. EndIf EndIf If ! HB_ISOBJECT(o); o := Self EndIf If lW; _DoWindowEventProcedure ( ::oEvent:Get(Key), o:Index, cEvent, nParam, o ) Else ; _DoControlEventProcedure( ::oEvent:Get(Key), o:Index, cEvent, nParam, o ) EndIf RETURN Nil /////////////////////////////////////////////////////////////////////////////// CLASS TCntData INHERIT TWndData PROTECTED: VAR oWin VAR oTBrowse EXPORTED: METHOD New( nIndex, cName, nHandle, nParent, cType, cVar, oWin ) INLINE ( ; ::Super:New(nIndex, cName, nHandle, nParent, cType, cVar), ; ::oWin := oWin, ; Self ) CONSTRUCTOR ACCESS Title INLINE ::oWin:Title ACCESS Caption INLINE iif( ::Type == 'TBROWSE', ; ::oWin:Name + "." + ::Name, ; _GetCaption( ::Name, ::oWin:Name ) ) ACCESS Cargo INLINE _ControlCargo( , ::Index ) ASSIGN Cargo( xVal ) INLINE _ControlCargo( , ::Index, xVal ) ACCESS Window INLINE ::oWin ACCESS IsWindow INLINE .F. ACCESS IsControl INLINE .T. METHOD PostMsg( nKey ) INLINE PostMessage( ::oWin:Handle, ::WM_nMsgC, nKey, ::nHandle ) METHOD SendMsg( nKey ) INLINE SendMessage( ::oWin:Handle, ::WM_nMsgC, nKey, ::nHandle ) METHOD Set() INLINE ( ::oName:Set( ::Name , Self ), ; ::oHand:Set( ::Handle, Self ) ) METHOD Del() INLINE ( ::oName:Del( ::Name ), ; ::oHand:Del( ::Handle ) ) ACCESS StatusBar INLINE ::oWin:oStatusBar ASSIGN StatusBar( o ) INLINE ::oWin:oStatusBar := o ACCESS TBrowse INLINE ::oTBrowse ASSIGN TBrowse( oBrw ) INLINE ::oTBrowse := oBrw ACCESS Value INLINE _GetValue( , , ::Index ) ASSIGN Value( xVal ) INLINE _SetValue( , , xVal, ::Index, .T. ) METHOD SetFocus() INLINE _SetFocus ( ::Name, ::oWin:Name ) METHOD Disable( nPos ) INLINE _DisableControl( ::Name, ::oWin:Name, nPos ) METHOD Enable ( nPos ) INLINE _EnableControl ( ::Name, ::oWin:Name, nPos ) METHOD Show() INLINE _ShowControl ( ::Name, ::oWin:Name ) METHOD Hide() INLINE _HideControl ( ::Name, ::oWin:Name ) ENDCLASS *-----------------------------------------------------------------------------* FUNCTION oKeyData( o ) *-----------------------------------------------------------------------------* RETURN TKeyData():New(o) ////////////////////////////////////////////////////////////////////////////////////////////// CLASS TKeyData PROTECTED: VAR oObj VAR aKey INIT hb_Hash() VAR bBlk EXPORTED: VAR Cargo METHOD New( o ) INLINE ( ::Obj := o, Self ) CONSTRUCTOR METHOD Value( nPos ) INLINE hb_HValueAt( ::aKey, nPos ) METHOD Set( Key, Block ) INLINE hb_HSet( ::aKey, Key, Block ) METHOD Get( Key, Def ) INLINE hb_HGetDef( ::aKey, Key, Def ) METHOD Del( Key ) INLINE iif( hb_hHasKey( ::aKey, Key ), hb_HDel( Key ), ) METHOD Do ( Key, p1, p2, p3 ) INLINE ( ::bBlk := ::Get(Key), iif( HB_ISBLOCK(::bBlk), ; EVal(::bBlk, ::Obj, Key, p1, p2, p3), Nil ) ) ACCESS Obj INLINE ::oObj ASSIGN Obj( o ) INLINE ::oObj := iif( HB_ISOBJECT(o), o, Self ) ACCESS Len INLINE Len( ::aKey ) METHOD Eval( Block ) ENDCLASS METHOD Eval( Block ) CLASS TKeyData LOCAL i, b := HB_ISBLOCK(Block) LOCAL a := iif( b, Nil, array(0) ) For i := 1 To ::Len If b; Eval( Block, hb_HKeyAt( ::aKey, i ), hb_HValueAt( ::aKey, i ), i ) Else; aAdd( a, { hb_HKeyAt( ::aKey, i ), hb_HValueAt( ::aKey, i ), i } ) EndIf Next RETURN a [/pre2] Изменения в hmg: [pre2] h_controlmisc.prg *-----------------------------------------------------------------------------* FUNCTION _SetValue ( ControlName, ParentForm, Value, index, lSetGet ) *-----------------------------------------------------------------------------* ... RETURN iif( empty(lSetGet), Nil, _GetValue( ControlName, ParentForm, Index ) ) *-----------------------------------------------------------------------------* FUNCTION _EraseControl ( i, p ) *-----------------------------------------------------------------------------* LOCAL mVar, t, hWnd, x If HB_ISOBJECT( _HMG_aControlMiscData0 [ i ] ) _HMG_aControlMiscData0 [ i ]:Del() EndIf DeleteObject ( _HMG_aControlFontHandle [ i ] ) ... h_events.prg добавил обработку сообщений *********************************************************************** case WM_HMG_USER_MSG_W *********************************************************************** a := _WindowObj( hWnd ) If HB_ISOBJECT(a) a:DoEvent( wParam, lParam, wParam ) EndIf exit *********************************************************************** case WM_HMG_USER_MSG_C *********************************************************************** a := iif( empty(lParam), _WindowObj( hWnd ), _ControlObj( lParam ) ) If HB_ISOBJECT(a) a:DoEvent( wParam, lParam, wParam ) EndIf exit *********************************************************************** h_windows.prg *-----------------------------------------------------------------------------* Function _DoControlEventProcedure ( bBlock , i , cEventType , nParam, p2, p3 ) *-----------------------------------------------------------------------------* ... if valtype( bBlock ) == 'B' .and. i > 0 ... If _HMG_BeginWindowActive == .F. .or. !( cEventType == 'CONTROL_ONCHANGE' ) .or. _HMG_MainClientMDIHandle != 0 Eval( bBlock, nParam, p2, p3 ) EndIf ... *-----------------------------------------------------------------------------* Function _DoWindowEventProcedure ( bBlock , i , cEventType, nParam, p2, p3 ) *-----------------------------------------------------------------------------* ... if valtype( bBlock ) == 'B' .and. i > 0 ... _HMG_ThisControlName := "" lRetVal := Eval( bBlock, nParam, p2, p3 ) _PopEventInfo() ... Посмотрел, что править связанное с _HMG_aControlMiscData1, для расширения возможностей, трудоемко (много где) и стремно, то ввел новую переменную _HMG_aControlMiscData0 i_var.ch #define _HMG_SYSDATA_SIZE 448 // было 445 ... #xtranslate _HMG_aScrollStep => _HMG_SYSDATA\[445\] #xtranslate _HMG_aFormMiscData1 => _HMG_SYSDATA\[446\] #xtranslate _HMG_aFormMiscData2 => _HMG_SYSDATA\[447\] #xtranslate _HMG_aControlMiscData0 => _HMG_SYSDATA\[448\] i_windows.ch #xtranslate <w> . \<c\> . \<p:Object\> => _ControlObj ( \<"c"\> , <"w"> ) ;; i_this.ch #xtranslate This . <p:Object> => iif ( _HMG_ThisType == 'C' , _ControlObj ( _HMG_THISCONTROLNAME , _HMG_THISFORMNAME ) , _WindowObj ( _HMG_THISFORMNAME ) ) #xtranslate This . <c> . <p:Object> => _ControlObj ( <"c"> , _HMG_THISFORMNAME ) h_init.prg ... _HMG_aFormMiscData1 := {} _HMG_aFormMiscData2 := {} _HMG_aControlMiscData0 := {} Добавление переменной _HMG_aControlMiscData0 делал так. Во всех файлах h_*.prg искал _HMG_aControlMiscData2 и добавлял _HMG_aControlMiscData2 [k] := '' _HMG_aControlMiscData0 [k] := {} или _HMG_aControlMiscData0 [k] := { oWndData( k , ; _HMG_aControlNames [k], ; _HMG_aControlHandles [k], ; _HMG_aControlParenthandles [k], ; _HMG_aControlType [k], ; mVar, ; _WindowObj( _HMG_aControlParenthandles [k] ) ) ; } ставил значение на _HMG_aControlMiscData0 [k] там, где есть смысл от значений параметров, иначе ставил _HMG_aControlMiscData0 [k] := {} Можно заполнить значением переменную у распространенных контролов, а в остальные пустышку и постепенно заполнять по возможности и нал. времени. Функции учитывают наличие пустышки в контролах. В окнах поменял прямое создание объекта, на созд. через функцию, т.е. там где было TWndData():New(...) надо заменить с aAdd( _HMG_aFormMiscData1 [k], TWndData():New( k, ; _HMG_aFormNames [k], ; _HMG_aFormHandles [k], ; _HMG_aFormParentHandle [k], ; _HMG_aFormType [k], ; &mVar. ) ) на aAdd( _HMG_aFormMiscData1 [k], oWndData( k , ; _HMG_aFormNames [k], ; _HMG_aFormHandles [k], ; _HMG_aFormParentHandle [k], ; _HMG_aFormType [k], ; mVar ) ) В TWndData и TsBrowse добавил (у себя) методы, аналоги :UserKeys(...) с кортким названием :UsK(...), это на любителя. [/pre2] Замечания, дополнения принимаются.

SergKis: PS Еще [pre2] *-----------------------------------------------------------------------------* Function GetProperty ( Arg1 , Arg2 , Arg3 , Arg4 , Arg5 , Arg6 , Arg7 ) *-----------------------------------------------------------------------------* ... ElseIf Pcount() == 3 // CONTROL ... ElseIf Arg3 == "AUTOFONT" // Kevin Carmody <i@kevincarmody.com> 2007.04.23 RetVal := _SetGetAutoFont ( Arg2 , Arg1 ) ElseIf Arg3 == "OBJECT" RetVal := _ControlObj( Arg2, Arg1 ) EndIf ElseIf Pcount() == 4 // CONTROL WITH ARGUMENT OR TOOLBAR BUTTON OR (JK) HMG 1.0 Experimental Buid 6 GRID/BROWSE COLUMN - ColumnWidth ... Неточность в *-----------------------------------------------------------------------------* FUNCTION _EraseControl ( i, p ) *-----------------------------------------------------------------------------* LOCAL mVar, t, hWnd, x If HB_ISOBJECT( _HMG_aControlMiscData0 [ i ][1] ) _HMG_aControlMiscData0 [ i ][1]:Del() EndIf ... пропустил [1] [/pre2]

SergKis: PS У себя сделал [pre2] *-----------------------------------------------------------------------------* FUNCTION GetControlIndex ( ControlName, ParentForm ) *-----------------------------------------------------------------------------* LOCAL mVar IF HB_ISNUMERIC(ParentForm ); RETURN ParentForm ELSEIF HB_ISOBJECT (ControlName); RETURN ControlName:Index ELSEIF HB_ISNUMERIC(ControlName); RETURN Ascan( _HMG_aControlHandles, ControlName ) ENDIF mVar := '_' + ParentForm + '_' + ControlName IF __mvExist ( mVar ) RETURN __mvGet ( mVar ) ENDIF RETURN 0 [/pre2]

Петр: SergKis пишет: METHOD New( o ) INLINE ( ::Obj := o, Self ) CONSTRUCTOR "and please remember that :NEW() will be class method so it should not be redefined as constructor in user class. Instead :INIT() method should be used as constructor. It's executed automatically when object is created from the :NEW() method." цитата из xhb-diff

SergKis: Петр Согласен. METHOD New( o ) INLINE ( ::oObj := iif( HB_ISOBJECT(o), o, Self ), Self ) CONSTRUCTOR

SergKis: SergKis пишет Неточность в *-----------------------------------------------------------------------------* FUNCTION _EraseControl ( i, p ) *-----------------------------------------------------------------------------* LOCAL mVar, t, hWnd, x If HB_ISOBJECT( _HMG_aControlMiscData0 [ i ][1] ) _HMG_aControlMiscData0 [ i ][1]:Del() EndIf Надо усилить проверку [pre2] *-----------------------------------------------------------------------------* Function _EraseControl (i, p) *-----------------------------------------------------------------------------* Local mVar, t, hWnd, x If Len( _HMG_aControlMiscData0 [ i ] ) > 0 If HB_ISOBJECT( _HMG_aControlMiscData0 [ i ][1] ) _HMG_aControlMiscData0 [ i ][1]:Del() EndIf EndIf [/pre2] Т.е. _HMG_aControlMiscData0 [ i ] := {} - пустышка

SergKis: gfilatov2002 Повторю предложение, иметь в GetControIndex( ControlName, ParentForm ) If empty(ControlName); ControlName := _HMG_ThisControlName EndIf If empty(ParentForm); ParantForm := _HMG_ThisFormName EndIf Тогда в control ACTION можно сравнивать одинаковые контролы на разных окнах так (быстрый способ): v1 := _GetValue( , , GetControlIndex()) v2 := _GetValue( , , GetControlIndex( , 'win_2')) If v1 > v1 ... ElseIf v1 < v2 ... Else ... EndIf GetControlIndex(...) [pre2] *-----------------------------------------------------------------------------* FUNCTION GetControlIndex ( ControlName, ParentForm ) *-----------------------------------------------------------------------------* LOCAL mVar IF HB_ISNUMERIC(ParentForm ); RETURN ParentForm ELSEIF HB_ISOBJECT (ControlName); RETURN ControlName:Index ELSEIF HB_ISNUMERIC(ControlName); RETURN Ascan( _HMG_aControlHandles, ControlName ) ENDIF IF empty(ControlName); ControlName := _HMG_ThisControlName ENDIF IF empty(ParentForm); ParantForm := _HMG_ThisFormName ENDIF mVar := '_' + ParentForm + '_' + ControlName IF __mvExist ( mVar ) RETURN __mvGet ( mVar ) ENDIF RETURN 0 [/pre2]



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