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

Dima: SergKis пишет: Товарищ по работе так предлагает InKeyGUI Чем такой варик лучше ?

SergKis: Dima пишет Чем такой варик лучше ? При клике с inkeigui, цикл его разрывается, а клик передается туда где кликнул. На примере Tsb_addrecord3 кл. F3 с предыдущими изменениями inkeygui, при клике на др. стр. тсб, просто уберет getbox с ShowGetValid сообщением и все (курсор тсб останется на той же строке), а после предлагаемых изменений, переключится на ту строку, где кликнули, т.е. более естественное поведение inkeygui на кликах мыши

Dima: SergKis пишет: т.е. более естественное поведение inkeygui на кликах мыши


Петр: SergKis пишет: Товарищ по работе так предлагает InKeyGUI Окультуренная версия [pre2] #include "inkey.ch" extern void hmg_ErrorExit( LPCTSTR lpMessage, DWORD dwError, BOOL bExit ); #ifndef USER_TIMER_MINIMUM #define USER_TIMER_MINIMUM 0x0000000A #define USER_TIMER_MAXIMUM 0x7FFFFFFF #endif HB_FUNC( INKEYGUI ) { UINT uElapse = hb_parnidef( 1, USER_TIMER_MINIMUM ); UINT_PTR uTimer; MSG Msg; BOOL bRet, bBreak = FALSE; UINT uRet = 0; if( uElapse == 0 ) uElapse = USER_TIMER_MAXIMUM; uTimer = SetTimer( NULL, 0, uElapse, NULL ); while( ( bRet = GetMessage( &Msg, NULL, 0, 0 ) ) != 0 ) { if( bRet == -1 ) { // handle the error and possibly exit hmg_ErrorExit( TEXT( "INKEYGUI" ), 0, TRUE ); } else { switch( Msg.message ) { case WM_KEYDOWN: case WM_SYSKEYDOWN: bBreak = TRUE; uRet = Msg.wParam; break; case WM_TIMER: bBreak = ( Msg.wParam == uTimer ); break; case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: bBreak = TRUE; uRet = ( Msg.message == WM_LBUTTONDOWN ) ? K_LBUTTONDOWN : K_RBUTTONDOWN; PostMessage( Msg.hwnd, Msg.message, Msg.wParam, Msg.lParam ); break; } } if( bBreak ) { KillTimer( NULL, uTimer ); break; } else { TranslateMessage( &Msg ); // Translates virtual key codes DispatchMessage( &Msg ); // Dispatches message to window } } hb_retns( uRet ); } [/pre2]

SergKis: Петр Дадуда Даду внедрёж. Окультуриваться надо. Вы со мной согласны. Окультуриваться надо.

Andrey: Helper Minigui - последняя версия. Ищу по указателю: Label - показывает @...CHECKLABEL DEFINE CHECKLABEL Так должно быть ? Смотрю там даже два Label.... и два ListBox.... Очепятка наверное...

Alex_Cher: Andrey пишет: Helper Minigui - последняя версия. у меня тоже самое, а поиск с версии 16.07 вообще не работает (я кидал эту тему ранее) ... Беда с Helper ....

gfilatov2002: Опубликована очередная сборка 17.05 для следующих С-компиляторов: - BCC 5.51 (Harbour и xHarbour) - BCC 10.1 (только Harbour) Базовый дистрибутив для BCC 5.5.1 и компилятора Harbour 3.2 лежит по адресу http://hmgextended.com/files/CONTRIB/hmg-17.05-setup.exe Прямые ссылки на другие дистрибутивы есть на домашней странице библиотеки Под заказ возможно сделать сборки для таких дополнительных С-компиляторов: - MinGW 7.1.0 32-bit и Harbour 3.4.0dev; - MinGW 7.1.0 64-bit и Harbour 3.4.0dev; - MS VisualC 2015 32-bit and Harbour 3.2.0dev; - MS VisualC 2017 32-bit and Harbour 3.2.0dev; - PellesC 8.0 32-bit и xHarbour 1.2.3 build 10194. Благодарю за Ваше внимание

SergKis: gfilatov2002 Когда то, давно, предлагал добавить на окно, по аналогии с контролами (_HMG_aControlMiscData1, _HMG_aControlMiscData2) _HMG_aFormMiscData1 - для внутренних штучек окна _HMG_aFormMiscData2 - для Cargo окна предлагаю вернуться к этому вопросу, т.к. без такой добавки затруднено наращивание функционала окна. Т.е. i_var.ch [pre2] #define _HMG_SYSDATA_SIZE 447 // было 445 ... #xtranslate _HMG_aScrollStep => _HMG_SYSDATA\[445\] #xtranslate _HMG_aFormMiscData1 => _HMG_SYSDATA\[446\] #xtranslate _HMG_aFormMiscData2 => _HMG_SYSDATA\[447\] h_init.prg ... _HMG_aFormMiscData1 := {} _HMG_aFormMiscData2 := {} ... h_dialog.prg line 217 _HMG_aFormMiscData1 [k] := {} _HMG_aFormMiscData2 [k] := '' line 273 aAdd( _HMG_aFormMiscData1, {} ) aAdd( _HMG_aFormMiscData2, '' ) line 598 _HMG_aFormMiscData1 [ i ] := {} _HMG_aFormMiscData2 [ i ] := '' h_events.prg line 3271 _HMG_aFormMiscData1 [ i ] := {} _HMG_aFormMiscData2 [ i ] := '' h_folder.prg line 237 _HMG_aFormMiscData1 [k] := {} _HMG_aFormMiscData2 [k] := '' line 293 aAdd( _HMG_aFormMiscData1, {} ) aAdd( _HMG_aFormMiscData2, '' ) line 483 _HMG_aFormMiscData1 [k] := {} _HMG_aFormMiscData2 [k] := '' line 539 aAdd( _HMG_aFormMiscData1, {} ) aAdd( _HMG_aFormMiscData2, '' ) line 905 _HMG_aFormMiscData1 [ i ] := {} _HMG_aFormMiscData2 [ i ] := '' h_windows.prg line 356 _HMG_aFormMiscData1 [k] := {} _HMG_aFormMiscData2 [k] := '' line 414 aAdd( _HMG_aFormMiscData1, {} ) aAdd( _HMG_aFormMiscData2, '' ) line 621 _HMG_aFormMiscData1 [k] := {} _HMG_aFormMiscData2 [k] := '' line 678 aAdd( _HMG_aFormMiscData1, {} ) aAdd( _HMG_aFormMiscData2, '' ) line 857 _HMG_aFormMiscData1 [k] := {} _HMG_aFormMiscData2 [k] := '' line 914 aAdd( _HMG_aFormMiscData1, {} ) aAdd( _HMG_aFormMiscData2, '' ) h_windowsMDI.prg line 277 _HMG_aFormMiscData1 [ i ] := {} _HMG_aFormMiscData2 [ i ] := '' line 426 _HMG_aFormMiscData1 [k] := {} _HMG_aFormMiscData2 [k] := '' line 483 aAdd( _HMG_aFormMiscData1, {} ) aAdd( _HMG_aFormMiscData2, '' ) h_PropSheet.prg line 379 _HMG_aFormMiscData1 [k] := {} _HMG_aFormMiscData2 [k] := '' line 432 aAdd( _HMG_aFormMiscData1, {} ) aAdd( _HMG_aFormMiscData2, '' ) line 613 _HMG_aFormMiscData1 [k] := {} _HMG_aFormMiscData2 [k] := '' line 666 aAdd( _HMG_aFormMiscData1, {} ) aAdd( _HMG_aFormMiscData2, '' ) line 1047 _HMG_aFormMiscData1 [ i ] := {} _HMG_aFormMiscData2 [ i ] := '' [/pre2] При наличии этих штучек, можно что то пробовать, к примеру аналог :UserKeys _HMG_aFormMiscData1 в нашей версии уже задействована чуть - чуть.

gfilatov2002: SergKis пишет: предлагал добавить на окно, по аналогии с контролами Благодарю за напоминание! Добавил эти изменения для следующей сборки

Andrey: gfilatov2002 пишет: - MS VisualC 2015 32-bit and Harbour 3.2.0dev; - MS VisualC 2017 32-bit and Harbour 3.2.0dev; В чём разница между ними ?

SergKis: gfilatov2002 Кое что набрал [pre2] добавить для window Cargo и _HMG_aFormMiscData1 Названия можно менять. FUNCTION _WindowCargo( cFormName, xValue ) Local i := GetFormIndex( cFormName ) Local RetVal If Pcount() == 2; RetVal := _HMG_aFormMiscData2 [ i ] Else ; _HMG_aFormMiscData2 [ i ] := xValue Endif RETURN RetValue #xtranslate _SetWindowCargo( <cFormName>, <xValue> ) ; => ; _WindowCargo( <cFormName>, <xValue> ) #xtranslate _GetWindowCargo( <cFormName> ) ; => ; _WindowCargo( <cFormName> ) #xtranslate SetWindowCargo( <cFormName>, <xValue> ) ; => ; _WindowCargo( <"cFormName">, <xValue> ) #xtranslate GetWindowCargo( <cFormName> ) ; => ; _WindowCargo( <"cFormName"> ) h_controlmisc.prg PROCEDURE SetProperty( Arg1 , Arg2 , Arg3 , Arg4 , Arg5 , Arg6 , Arg7 , Arg8 ) line 3607 CASE Arg2 == "CARGO" _WindowCargo ( Arg1, Arg3 ) FUNCTION GetProperty ( Arg1 , Arg2 , Arg3 , Arg4 , Arg5 , Arg6 , Arg7 ) line 4220 CASE Arg2 == "CARGO" RetVal := _WindowCargo ( Arg1 ) i_this.ch line 48 // WINDOWS (THIS) #xtranslate This . <p:Title,NotifyIcon,NotifyTooltip,FocusedControl,MinHeight,MinWidth,MaxHeight,MaxWidth,TitleBar,SysMenu,Sizable,MaxButton,MinButton,Topmost,HelpButton,Cargo> => GetProperty ( _HMG_THISFORMNAME , <"p"> ) #xtranslate This . <p:Title,NotifyIcon,NotifyTooltip,Cursor,MinHeight,MinWidth,MaxHeight,MaxWidth,TitleBar,SysMenu,Sizable,MaxButton,MinButton,Topmost,HelpButton,Cargo> := <arg> => SetProperty ( _HMG_THISFORMNAME , <"p"> , <arg> ) line 111 #xtranslate ThisWindow . <p:Title,NotifyIcon,NotifyTooltip,FocusedControl,BackColor,Name,Handle,Type,Index,Row,Col,Width,Height,MinHeight,MinWidth,MaxHeight,MaxWidth,TitleBar,SysMenu,Sizable,MaxButton,MinButton,Topmost,Cargo> => GetProperty ( _HMG_THISFORMNAME , <"p"> ) #xtranslate ThisWindow . <p:Title,NotifyIcon,NotifyTooltip,Cursor,BackColor,Row,Col,Width,Height,MinHeight,MinWidth,MaxHeight,MaxWidth,TitleBar,SysMenu,Sizable,MaxButton,MinButton,Topmost,Cargo> := <arg> => SetProperty ( _HMG_THISFORMNAME , <"p"> , <arg> ) i_windows.ch line 63 #xtranslate <w> . \<p:Name,Handle,Type,Index,Title,Height,Width,ClientHeight,ClientWidth,Col,Row,NotifyIcon,NotifyToolTip,FocusedControl,BackColor,MinHeight,MinWidth,MaxHeight,MaxWidth,TitleBar,SysMenu,Sizable,MaxButton,MinButton,Closable,Topmost,HelpButton,Cargo\> => GetProperty ( <"w">, \<"p"\> ) ;; #xtranslate <w> . \<p:Name,Title,Height,Width,Col,Row,NotifyIcon,NotifyToolTip,FocusedControl,Cursor,BackColor,MinHeight,MinWidth,MaxHeight,MaxWidth,TitleBar,SysMenu,Sizable,MaxButton,MinButton,Closable,Topmost,HelpButton,Cargo\> := \<n\> => SetProperty ( <"w">, \<"p"\> , \<n\> ) ;; // Класс для _HMMG_aFormMiscData1. #include "hbclass.ch" CLASS HmgWnd VAR cVar VAR cName VAR cType VAR nIndex VAR nHandle VAR nParent METHOD New( nIndex, cName, nHandle, nParent, cType, cVar ) INLINE ( ; ::nIndex := nIndex, ::cName := cName, ::nHandle := nHandle, ; ::nParent := nParent, ::cType := cType, ::cVar := cVar ) 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 ( ::nHandle ) ACCESS Col INLINE GetWindowCol ( ::nHandle ) ACCESS Width INLINE GetWindowWidth ( ::nHandle ) ACCESS Height INLINE GetWindowHeight( ::nHandle ) ACCESS ClientWidth INLINE _GetClientRect ( ::nHandle )[ 3 ] ACCESS ClientHeight INLINE _GetClientRect ( ::nHandle )[ 4 ] ENDCLASS FUNCTION _GetWindowObj( cFormName ) RETURN _HMG_aFormMiscData1 [ GetFormIndex( cFormName ) ][ 1 ] номера строк по последней версии. h_dialog.prg line 221 было ELSE Public &mVar. := Len( _HMG_aFormNames ) + 1 стало ELSE k := Len( _HMG_aFormNames ) + 1 Public &mVar. := k line 277 было ENDIF IF Len( _HMG_aDialogTemplate ) > 0 _HMG_aDialogTemplate[1] := &mVar. ENDIF стало ENDIF _SetThisFormInfo( k ) aAdd( _HMG_aFormMiscData1 [k], HmgWnd():New( k, ; _HMG_aFormNames [k], ; _HMG_aFormHandles [k], ; _HMG_aFormParentHandle [k], ; _HMG_aFormType [k], ; &mVar. ) ) IF Len( _HMG_aDialogTemplate ) > 0 _HMG_aDialogTemplate[1] := &mVar. ENDIF FUNCTION _EndDialog() line 395 _PopEventInfo() RETURN NIL h_folder.prg line 241 было ELSE Public &mVar. := Len( _HMG_aFormNames ) + 1 стало ELSE k := Len( _HMG_aFormNames ) + 1 Public &mVar. := k line 296 было ENDIF IF Len( _HMG_aFolderInfo[_HMG_FldID,FLD_FLT ] ) > 0 _HMG_aFolderInfo[_HMG_FldID,FLD_FLT ,1] := &mVar. ENDIF стало ENDIF _SetThisFormInfo( k ) aAdd( _HMG_aFormMiscData1 [k], HmgWnd():New( k, ; _HMG_aFormNames [k], ; _HMG_aFormHandles [k], ; _HMG_aFormParentHandle [k], ; _HMG_aFormType [k], ; &mVar. ) ) IF Len( _HMG_aFolderInfo[_HMG_FldID,FLD_FLT ] ) > 0 _HMG_aFolderInfo[_HMG_FldID,FLD_FLT ,1] := &mVar. ENDIF FUNCTION _EndFolder() line 390 было LOCAL Formhandle, k, ModalFolderReturn _HMG_aFolderInfo[_HMG_FldID,FLD_AFH] := 0 стало LOCAL Formhandle, k, ModalFolderReturn _PopEventInfo() _HMG_aFolderInfo[_HMG_FldID,FLD_AFH] := 0 line 487 было ELSE Public &mVar. := Len( _HMG_aFormNames ) + 1 стало ELSE k := Len( _HMG_aFormNames ) + 1 Public &mVar. := k line 542 было ENDIF RETURN Nil стало ENDIF _SetThisFormInfo( k ) aAdd( _HMG_aFormMiscData1 [k], HmgWnd():New( k, ; _HMG_aFormNames [k], ; _HMG_aFormHandles [k], ; _HMG_aFormParentHandle [k], ; _HMG_aFormType [k], ; &mVar. ) ) RETURN Nil h_windows.prg line 418 было ENDIF _SetThisFormInfo( k ) aAdd( _HMG_aFormMiscData1 [k], HmgWnd():New( k, ; _HMG_aFormNames [k], ; _HMG_aFormHandles [k], ; _HMG_aFormParentHandle [k], ; _HMG_aFormType [k], ; &mVar. ) ) IF !mdi // JP MDI стало ENDIF _SetThisFormInfo( k ) IF !mdi // JP MDI line 682 было ENDIF _SetThisFormInfo( k ) InitDummy( FormHandle ) стало ENDIF _SetThisFormInfo( k ) aAdd( _HMG_aFormMiscData1 [k], HmgWnd():New( k, ; _HMG_aFormNames [k], ; _HMG_aFormHandles [k], ; _HMG_aFormParentHandle [k], ; _HMG_aFormType [k], ; &mVar. ) ) InitDummy( FormHandle ) line 918 было ENDIF _HMG_ActiveSplitChildIndex := k _SetThisFormInfo( k ) InitDummy( FormHandle ) стало ENDIF _HMG_ActiveSplitChildIndex := k _SetThisFormInfo( k ) aAdd( _HMG_aFormMiscData1 [k], HmgWnd():New( k, ; _HMG_aFormNames [k], ; _HMG_aFormHandles [k], ; _HMG_aFormParentHandle [k], ; _HMG_aFormType [k], ; &mVar. ) ) InitDummy( FormHandle ) h_windowsMDI.prg line 487 было ENDIF _SetThisFormInfo( k ) RETURN ( FormHandle ) стало ENDIF _SetThisFormInfo( k ) aAdd( _HMG_aFormMiscData1 [k], HmgWnd():New( k, ; _HMG_aFormNames [k], ; _HMG_aFormHandles [k], ; _HMG_aFormParentHandle [k], ; _HMG_aFormType [k], ; &mVar. ) ) RETURN ( FormHandle ) h_PropSheet.prg line 380 было ELSE Public &mVar. := Len( _HMG_aFormNames ) + 1 стало ELSE k := Len( _HMG_aFormNames ) + 1 Public &mVar. := k line 432 было ENDIF IF Len( _HMG_aPropSheetTemplate ) > 0 _HMG_aPropSheetTemplate[ 1 ] := &mVar. ENDIF стало ENDIF _SetThisFormInfo( k ) // ????? aAdd( _HMG_aFormMiscData1 [k], HmgWnd():New( k, ; _HMG_aFormNames [k], ; _HMG_aFormHandles [k], ; _HMG_aFormParentHandle [k], ; _HMG_aFormType [k], ; &mVar. ) ) IF Len( _HMG_aPropSheetTemplate ) > 0 _HMG_aPropSheetTemplate[ 1 ] := &mVar. ENDIF line 614 было ELSE Public &mVar. := Len( _HMG_aFormNames ) + 1 стало ELSE k := Len( _HMG_aFormNames ) + 1 Public &mVar. := k line 666 было ENDIF RETURN NIL стало ENDIF _SetThisFormInfo( k ) // ????? aAdd( _HMG_aFormMiscData1 [k], HmgWnd():New( k, ; _HMG_aFormNames [k], ; _HMG_aFormHandles [k], ; _HMG_aFormParentHandle [k], ; _HMG_aFormType [k], ; &mVar. ) ) RETURN NIL // ????? это: Что то пропустил или не понял с h_PropSheet.prg и _SetThisFormInfo( k ) Если ставим _SetThisFormInfo( k ), то где снимать надо _PopEventInfo() ? Или убрать и не ставить _SetThisFormInfo( k ) ? Т.е. работать без команд This. ... . [/pre2]

gfilatov2002: SergKis пишет: Если ставим _SetThisFormInfo( k ), то где снимать надо _PopEventInfo() ? Вероятно, в функции _EndPropSheet() по аналогии с тем, как Вы это делаете в _EndDialog() SergKis пишет: Названия можно менять. Думаю назвать этот класс WndClass (видел, что это имя использует Микрософт для определения класса окна) P.S. Остановился на имени TWndData

gfilatov2002: Andrey пишет: В чём разница между ними ? MS VisualC 2017 вышла в марте этого года и содержит все последнии наработки MS в поддержке стандартов C++. Но, по-видимому, для Харбора это не принципиально...

Петр: SergKis пишет: CLASS HmgWnd Что даст применение этого класса? Кроме возможности самовыразиться

gfilatov2002: SergKis пишет: Кое что набрал Сделал следующие записи в текущий changelog файл: [pre2] * New: Added the TWndData class for storing of form's data. There are the following access variables in the above class now: - Index, Name, Handle, ParentHandle, Type, VarName; - Title, Row, Col, Width, Height, ClientWidth, ClientHeight. Usage: oWin := _GetWindowObj( ThisWindow.Name ) MsgInfo( oWin:Title ) Suggested and contributed by SergKis. * New: Added read/write the user defined property 'Cargo' for the Forms. You can set/get this property at runtime: - function syntax: SetProperty ( Form, 'Cargo', xUserData ) GetProperty ( Form, 'Cargo' ) --> xUserData - pseudo-OOP syntax: Form.Cargo := xUserData Form.Cargo --> xUserData Sample code: ThisWindow.Cargo := InputBox( 'Enter a form's title', 'New Title' ) ThisWindow.Title := ( ThisWindow.Cargo ) It was a postponed user's request. Suggested and contributed by SergKis. [/pre2] Вероятно, потребуется еще добавить пример использования Вашего класса.

SergKis: Петр пишет Что даст применение этого класса? 1. На его базе сделается аналог :UserKeys + возможно, удастся реализовать работу через Post\SendMessage 2. Получив объект, сразу имею доступ (без макросов) к его свойствам (короче писать), не i := GetFormIndex(...) _HMG_aFormNames[ i ] _HMG_aFormHandles[ i ] ... 3. Класс в наборе (пока не рабочий как надо), просто застолбил 1 элемент - HMG_aFormMiscData1 [k] 4. Когда продолжу - не знаю, какое то время буду занят, т.е. его наличие в new версии не мешает, а территория помечена (это по поводу "самовыражения")

SergKis: gfilatov2002 пишет Вероятно, потребуется еще добавить пример использования Вашего класса. Дополнится пример с :UserKes, когда будет готово. Пока ездил сегодня туда сюда, подумалось подправить [pre2] FUNCTION _GetWindowObj( cFormName ) Local i, o If HB_ISCHAR( cFormName ) i := GetFormIndex( cFormName ) Else i := Ascan( _HMG_aFormHandles, cFormName ) EndIf If i > 0 o := _HMG_aFormMiscData1 [ i ][ 1 ] EndIf RETURN o [/pre2]

gfilatov2002: SergKis пишет: Дополнится пример с :UserKes Понял, спасибо SergKis пишет: FUNCTION _GetWindowObj( cFormName ) У меня сейчас эта функция выглядит так: [pre2] *-----------------------------------------------------------------------------* FUNCTION _GetWindowObj( cFormName ) *-----------------------------------------------------------------------------* LOCAL i := GetFormIndex( cFormName ) IF i > 0 RETURN _HMG_aFormMiscData1 [ i ][ 1 ] ENDIF RETURN NIL [/pre2]

Петр: SergKis пишет: На его базе сделается аналог :UserKeys + возможно, удастся реализовать работу через Post\SendMessage Это можно организовать и без ООП. Был уже в истории такой период "hmg objects", чем закончился - не знаю SergKis пишет: просто застолбил 1 элемент - HMG_aFormMiscData1 [k] Это можно сделать и изящнее, см.BASIC\WindowProperty Тогда у вас будет быстрый доступ к данным как на C, так и на PRG уровнях. Вы можете модифицировать стандартную оконную процедуру MiniGUI - WndProc. К примеру, если message входит в диапазон WM_USER.., оконная процедура с помощью GetProp получает связанный обьект и выполняет нужный метод или просто вызывает процедуру/выполняет блок кода, функция Events в этом случае не вызывается. И т.п. было бы желание разгуляться.



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