Форум » 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: gfilatov2002 пишет Принимается Не отключенным оказалось WM_MOUSEWHEEL, можно делать[pre2] METHOD HandleEvent( nMsg, nWParam, nLParam ) CLASS TSBrowse ... ElseIf nMsg == WM_MOUSEWHEEL If ::hWnd != 0 .and. ! ::lDontChange .and. :lEnabled nDelta := Bin2I( I2Bin( HiWord( nWParam ) ) ) / 120 ::MouseWheel( nMsg, nDelta, LoWord( nLParam ), HiWord( nLParam ) ) EndIf Return 0 ... посмотрев, думаю лучше будет METHOD HandleEvent( nMsg, nWParam, nLParam ) CLASS TSBrowse Local nDelta, ix Default ::lNoPaint := .F., ; //V90 ::lDontChange := .F. //V90 If ! ::lEnabled Return 0 EndIf If hb_IsBlock( ::bEvents ) ... [/pre2] но может упускаю что то ?

SergKis: SergKis пишет но может упускаю что то ? В таком виде работу метода :Enabled. Поковырял, получилось так[pre2] METHOD DrawLine( xRow ) CLASS TSBrowse ... // IF !::lEnabled // RETURN SELF // endif ... METHOD DrawSelect( xRow, lFoot ) CLASS TSBrowse ... // IF !::lEnabled // RETURN SELF // endif ... METHOD Enabled( lEnab ) CLASS TSBrowse ... IF ValType( lEnab ) == "L" ... ENDIF ::Refresh() ENDIF RETURN 0 ... METHOD HandleEvent( nMsg, nWParam, nLParam ) CLASS TSBrowse ... // If ! ::lEnabled // Return 0 // EndIf ... ElseIf nMsg == WM_VSCROLL If ::lDontchange Return Nil EndIf if nLParam == 0 .and. ::Enabled Return ::VScroll( Loword( nWParam ), HiWord( nWParam ) ) endif Elseif nMsg == WM_HSCROLL If ! ::lEnabled Return 0 ElseIf ::lDontchange //V90 Return Nil //V90 EndIf //V90 Return ::HScroll( Loword( nWParam ), HiWord( nWParam ) ) ... ElseIf nMsg == WM_LBUTTONDBLCLK .and. _GetKeyState( VK_SHIFT ) If ! ::lEnabled Return 0 ElseIf ::lCanSelect .and. !::lEditable ::Selection() Endif ElseIf nMsg == WM_MOUSEWHEEL If ::hWnd != 0 .and. ::lEnabled .and. ! ::lDontChange nDelta := Bin2I( I2Bin( HiWord( nWParam ) ) ) / 120 ... METHOD KeyUp( nKey, nFlags ) CLASS TSBrowse If ! ::lEnabled Return 0 EndIf ... METHOD Selection() CLASS TSBrowse ... [/pre2] Заработал метод :Enabled(.F.\.T.) с раскраской (над цветами, возможно, еще надо поработать)

gfilatov2002: SergKis пишет: Заработал метод :Enabled(.F.\.T.) с раскраской Благодарю за помощь: все правки приняты


SergKis: gfilatov2002 Еще правки:[pre2] METHOD Enabled( lEnab ) CLASS TSBrowse ... ::lEnabled := .F. ::SetColor( { 2 }, { CLR_HGRAY } ) ::SetColor( { 3, 4 }, { CLR_GRAY, CLR_HGRAY } ) ::SetColor( { 9, 10 }, { CLR_GRAY, CLR_HGRAY } ) ::SetColor( { 16, 17 }, { CLR_GRAY, CLR_HGRAY } ) ::SetColor( { 18, 19 }, { CLR_GRAY, CLR_HGRAY } ) ELSE ... CLASS TWndData ... VAR oName AS OBJECT VAR oHand AS OBJECT VAR lAction INIT .T. EXPORTED: ... ASSIGN Cargo( xVal ) INLINE _WindowCargo( Self, xVal ) ACCESS Action INLINE ::lAction ASSIGN Action( lAction ) INLINE ::lAction := ! empty(lAction) ACCESS StatusBar INLINE ::oStatusBar ... METHOD UserKeys( Key, Block, p2, p3 ) INLINE iif( HB_ISBLOCK( Block ), ::oUserKeys:Set( Key, Block ), ; iif( ::lAction, ::oUserKeys:Do ( Key, Block, p2, p3 ), Nil ) ) METHOD Event ( Key, Block, p2, p3 ) INLINE iif( HB_ISBLOCK( Block ), ::oEvent:Set( Key, Block ), ; iif( ::lAction, ::oEvent:Do ( Key, Block, p2, p3 ), Nil ) ) METHOD PostMsg( nKey, nHandle ) INLINE iif( ::lAction, ; PostMessage(::nHandle, ::WM_nMsgW, nKey, hb_defaultValue(nHandle, 0)), Nil ) METHOD SendMsg( nKey, nHandle ) INLINE iif( ::lAction, ; SendMessage(::nHandle, ::WM_nMsgW, nKey, hb_defaultValue(nHandle, 0)), Nil ) METHOD Release() INLINE iif( ::IsWindow, iif( ::lAction, PostMessage(::nHandle, WM_CLOSE, 0, 0), Nil ), Nil ) ... [/pre2] как это работает в готовом реал. примере (на своей lib) http://my-files.ru/dkcnbc жмем F9 ToServ и блокируется работа всех кнопок и дверь выхода с окна с раскраской Похожий пример потом можно сгородить

SergKis: PS Виноват, надо в article.ini PathUmz=C:\UCHET\MATERIAL\SPR указать, создать и переписать из DATA U02.dbf Прога под конкретного клиента, по изменению Артикула в базе.

SergKis: PS по текстам так выглядит [pre2] FUNCTION MAIN( Base ) // MAIN function ... DEFINE WINDOW wMain ; AT 0, 0 ; WIDTH nWidth ; HEIGHT nHeight ; MINWIDTH nWdth ; MINHEIGHT nHeig ; MAXWIDTH nWdth ; MAXHEIGHT nHeig ; TITLE oApp:Title + ". " ; ICON oApp:Icon ; MAIN MDI TOPMOST ; ON INIT wMainInit() ; ON RELEASE wMainClose() ; ON INTERACTIVECLOSE wMainIsClose() ; BACKCOLOR oApp:BColor PUBL oMain := ThisWindow.Object WITH OBJECT ThisWindow.Object // ---- Window events :Event( 101, {|ow,ky| Artikul_Child (ow, ky) } ) :Event( 102, {|ow,ky| ow:Release() } ) END WITH // ---- Window events ... * ----------------------------------------------------------------------------------- * STATIC FUNC wMainInit() * ----------------------------------------------------------------------------------- * This.Topmost := .F. (ThisWindow.Object):PostMsg(101) RETURN NIL * ------------------------------------------------------------------------------------ * FUNC Artikul_Child( oWn, nKy ) * ------------------------------------------------------------------------------------ * ... DEFINE WINDOW &cWnd ; TITLE ' '+cCapt+' ' ; MDICHILD FOCUSED NOMINIMIZE ; ON RELEASE ( iif( select(cAls) > 0, (cAls)->( dbCloseArea() ), Nil ) ) cThisForm := cWnd oThisForm := Thiswindow.Object DEFINE SPLITBOX HANDLE hSpl DEFINE TOOLBAR ToolBar_1 BUTTONSIZE 24,24 FLAT BUTTON BEDIT PICTURE 'Edit' ACTION (ThisWindow.Object):PostMsg(4) ; TOOLTIP ' ' + gTxt(RedLine) + '. ' + gTxt(Art) +'.' + space(8) + 'F4' ; SEPARATOR BUTTON BENTR PICTURE 'Vibor' ACTION (ThisWindow.Object):PostMsg(5) ; TOOLTIP ' ' + gTxt(Nam) + ' => ' + gTxt(Art) + space(8) + 'F5' ; SEPARATOR BUTTON BEMP1 PICTURE 'br_empty' ACTION NIL ; SEPARATOR BUTTON BKODS PICTURE 'p_ind' ACTION (ThisWindow.Object):PostMsg(6) ; TOOLTIP ' ' + gTxt(Sort ) + space(8) + 'F6' ; SEPARATOR BUTTON BFIND PICTURE 'p_find' ACTION (ThisWindow.Object):PostMsg(7) ; TOOLTIP ' ' + gTxt(Find ) + space(8) + 'F7' ; SEPARATOR BUTTON BEMP2 PICTURE 'br_empty' ACTION NIL ; SEPARATOR BUTTON BSERV PICTURE 'srv_to' ACTION (ThisWindow.Object):PostMsg(9) ; TOOLTIP ' ' + gTxt(ToServ) + space(8) + 'F9' ; SEPARATOR END TOOLBAR DEFINE TOOLBAR ToolBar_2 BUTTONSIZE 24,24 FLAT BUTTON BEXIT PICTURE 'exit' ACTION (ThisWindow.Object):PostMsg(10) ; TOOLTIP ' ' + gTxt(Exit) END TOOLBAR END SPLITBOX nW := ThisWindow.ClientWidth nY := GetWindowHeight(hSpl) nX := 0 nH := ThisWindow.ClientHeight - nY DEFINE TBRW &cBrw TO oTbr AT nY,nX WIDTH nW HEIGHT nH ALIAS cAls CELL :aColSel := aColumn :hFontHead := aFont[ 1 ] :hFontFoot := aFont[ 2 ] :LoadFields(.T.) :nWheelLines := 1 :nClrLine := COLOR_GRID :nHeightCell += nDcell :nHeightHead += nDcell :nHeightFoot := :nHeightCell :lNoGrayBar := .F. :lDrawFooters := .T. :lFooting := .T. :lNoVScroll := .F. :lNoHScroll := .T. :nFireKey := VK_F4 // default Edit :nLineStyle := LINES_ALL // LINES_NONE LINES_ALL LINES_VERT LINES_HORZ LINES_3D LINES_DOTTED :SetColor( { CLR_FOCUSB }, { { |a,b,c| If( c:nCell == b, {Rgb( 66, 255, 236), Rgb(209, 227, 248)}, ; {Rgb(220, 220, 220), Rgb(220, 220, 220)} ) } } ) For nI := 1 To nK oCol := :aColumns [ nI ] oCol:cName := aName [ nI ] oCol:cField := aColumn [ nI ] oCol:cHeading := aHeader [ nI ] oCol:nWidth := aWidth [ nI ] oCol:lEdit := aEdit [ nI ] oCol:nAlign := aAlign [ nI ] oCol:nFAlign := aFAlign [ nI ] oCol:lFixLite := aFixLite [ nI ] oCol:lOnGotFocusSelect := aOnGotFocusSelect[ nI ] oCol:lEmptyValToChar := aEmptyValToChar [ nI ] oCol:nEditMove := aEditMove [ nI ] If ! empty(aPicture [ nI ]) oCol:cPicture := aPicture [ nI ] EndIf If ! empty(aOrder[ nI ]) oCol:cOrder := aOrder [ nI ] EndIf If oCol:cName == "NMP" oCol:cFooting := { |nc,obr| nc := (obr:cAlias)->( OrdKeyNo() ), ; iif( empty(nc), '', hb_ntos(nc) ) } ElseIf oCol:cName == "EAN" oCol:cFooting := { |nc,obr| nc := (obr:cAlias)->( OrdKeyCount() ), ; ' '+iif( empty(nc), '', hb_ntos(nc) ) } EndIf If ! empty(aBlockData[ nI ]) If HB_ISCHAR(aBlockData[ nI ]) oCol:bData := AliasBlock(aBlockData[ nI ], cAls, .T.) Else oCol:bData := aBlockData[ nI ] EndIf EndIf If ! empty(aFields [ nI ]) oCol:cField := aFields [ nI ] EndIf Next :nFreeze := :nColumn('EAN') :lLockFreeze := .T. :nCell := :nColumn('NAM') :aSortBmp := { LoadImage("br_up"), LoadImage("br_dn") } :bChange := {|obr| obr:DrawFooters() } :bLDblClick := {|p1,p2,p3,obr| p1:=p2:=p3:=Nil, Do_Obj(obr:hWndParent):PostMsg(4) } :SetIndexCols( :nColumn('KOD'), :nColumn('NAM') ) :SetOrder( :nColumn('NAM') ) if :nLen > :nRowCount() :ResetVScroll( .T. ) :oHScroll:SetRange(0,0) EndIf :UserKeys(VK_F5 , {|obr,nky,cky| cky := (obr:cAlias)->( mGet('R_3') ), ; (obr:cAlias)->( mPut('R_34', cky) ), ; obr:DrawSelect() }) :UserKeys(VK_F6 , {|obr,nky,cky| Order_Set (obr,nky,cky) }) :UserKeys(VK_F7 , {|obr | Press_Key (obr ) }) :UserKeys(VK_F9 , {|obr | Modify_Srv(obr ) }) :UserKeys(VK_RETURN, {|obr | Do_Obj(obr:hWndParent):PostMsg(4) }) :UserKeys( , {|obr,nky,cky| Press_Key(obr,nky,cky)}) :GoPos(1, :nFreeze + 1) END TBRW oTbr:SetNoHoles() oTbr:SetFocus() cPic := StrTran( oTbr:GetColumn('KOD'):cPicture, '@K ', '' ) oCel := oTbr:GetCellInfo( 1, oTbr:nColumn('KOD') ) nY := This.ClientHeight - oTbr:nHeightFoot nX := 2 nW := oCel:nWidth - 5 nH := oTbr:nHeightCell @ nY, nX GETBOX KOD OBJ oGet HEIGHT nH WIDTH nW VALUE space(len(cPic)) ; BACKCOLOR oApp:BColorGet PICTURE cPic ; ON CHANGE Seek__Set(oTbr) ; INVISIBLE NOTABSTOP oGet:lOnGotFocusSelect := .F. oGet:OnEscape := {|og| og:GetObj():Hide(), oTbr:SetFocus(), .T. } oGet:OnEnter := {|og| og:GetObj():Hide(), oTbr:SetFocus() } oGet:OnDown := {|og| og:GetObj():Hide(), oTbr:SetFocus() } oGet:OnUp := {|og| og:GetObj():Hide(), oTbr:SetFocus() } cPic := StrTran( oTbr:GetColumn('NAM'):cPicture, '@K ', '' ) oCel := oTbr:GetCellInfo( 1, oTbr:nColumn('NAM') ) nX := oCel:nCol + 2 nW := oCel:nWidth - 10 @ nY, nX GETBOX NAM OBJ oGet HEIGHT nH WIDTH nW VALUE space(len(cPic)) ; BACKCOLOR oApp:BColorGet PICTURE cPic ; ON CHANGE Seek__Set(oTbr) ; INVISIBLE NOTABSTOP oGet:lOnGotFocusSelect := .F. oGet:OnEscape := {|og| og:GetObj():Hide(), oTbr:SetFocus(), .T. } oGet:OnEnter := {|og| og:GetObj():Hide(), oTbr:SetFocus() } oGet:OnDown := {|og| og:GetObj():Hide(), oTbr:SetFocus() } oGet:OnUp := {|og| og:GetObj():Hide(), oTbr:SetFocus() } WITH OBJECT This.Object // ---- Window events :Event( 4, {|| oTbr:PostMsg( WM_KEYDOWN, VK_F4, 0 ) } ) :Event( 5, {|| oTbr:PostMsg( WM_KEYDOWN, VK_F5, 0 ) } ) :Event( 6, {|| oTbr:PostMsg( WM_KEYDOWN, VK_F6, 0 ) } ) :Event( 7, {|| oTbr:PostMsg( WM_KEYDOWN, VK_F7, 0 ) } ) :Event( 9, {|| oTbr:PostMsg( WM_KEYDOWN, VK_F9, 0 ) } ) :Event(10, {|ow| ow:Release(), oMain:PostMsg(102) } ) END WITH // ---- Window events END WINDOW RETURN Nil ... * ------------------------------------------------------------------------------------ * STATIC FUNC Modify_Srv( oBrw ) * ------------------------------------------------------------------------------------ * LOCAL i, n LOCAL oWnd := Do_Obj(oBrw:hWndParent) LOCAL cWnd := oBrw:cParentWnd LOCAL cBrw := oBrw:cControlName If oWnd:Action oBrw:Enabled(.F.) oWnd:Action := .F. DoEvents() oMain:StatusBar:Say(gTxt(Wait)) For i := 1 To 20 oMain:StatusBar:Say(hb_ntos(i), 2) For n := 1 To 10 wApi_Sleep(100) DoEvents() Next Next oMain:StatusBar:Say('', 2) oMain:StatusBar:Say('') oBrw:Enabled(.T.) oWnd:Action := .T. DoEvents() EndIf oBrw:SetFocus() RETURN Nil ... [/pre2]

SergKis: gfilatov2002 Что то в TsBrowse не оказалось Cargo, может стоит добавить, для удобства ? oBrw:Cargo := 123 nVal := oBrw:Cargo

gfilatov2002: SergKis пишет: может стоит добавить Добавил, конечно, как и все Ваши предыдущие предложения. Благодарю за Ваше внимание

Andrey: Присоединяюсь к добавлениям ... Если конечно это не сложно и не помешает логике. [pre2] ? GetProperty(oBrw:cParentWnd, oBrw:cControlName, "Row") ? GetProperty(oBrw:cParentWnd, oBrw:cControlName, "Col") ? GetProperty(oBrw:cParentWnd, oBrw:cControlName, "Width") ? GetProperty(oBrw:cParentWnd, oBrw:cControlName, "Height")[/pre2] Добавить [pre2] ? oBrw:nRowWnd ? oBrw:nColWnd ? oBrw:nWidthWnd ? oBrw:nHeightWnd[/pre2]

SergKis: Andrey This.Row This.Col This.Width This.Height ThisWindow.Row ThisWindow.Col ThisWindow.Width ThisWindow.Height Form_1.Row Form_1.Col Form_1.Width Form_1.Height GetWindowRow(oBrw:hWndParent) GetWindowCol(oBrw:hWndParent) GetWindowWidth(oBrw:hWndParent) GetWindowHeight(oBrw:hWndParent) SET OOP ON oWnd := Do_Obj(oBrw:hWndParent) oWnd:Row oWnd:Col oWnd:Width oWnd:Height oTsb := Do_Obj(oBrw:hWnd) oTsb:Window:Row oTsb:Window:Col oTsb:Window:Width oTsb:Window:Height маловато будет ?

SergKis: PS в дополнение создать среду _HMG_This... для блока кода (при работе с тсб, к примеру) 1. для окна xRet := Do_WindowEventProcedure ( bBlock, GetFormIndex('Form_1'), p1, p2, p3, p4 ) 2. для контрола xRet := Do_ControlEventProcedure ( bBlock, GetControlIndex('Имя_контрола', 'Form_1'), p1, p2, p3, p4 ) среда _HMG_This... для блока кода создается, потом восстанавливается предыдущая в продолжение SET OOP ON (без среды This) FUNC My( obj, par1, par2, par3 ) ... RETURN { par1,par2,par3, obj:IsWindow } 1. aRet := Do_Obj(oBrw:hWndParent, {|ow,p1,p2,p3| My(ow,p1,p2,p3) }, 'AAA', 'BBB', 'CCC') или aRet := Do_Obj(GetFormHandle('Form_1'), {|ow,p1,p2,p3| My(ow,p1,p2,p3) }, 'AAA', 'BBB', 'CCC') получим ? aRet[4] // .T. 2. aRet := Do_Obj(oBrw:hWnd, {|ob,p1,p2,p3| My(ob,p1,p2,p3) }, 'AAA', 'BBB', 'CCC') или aRet := Do_Obj(GetControlHandle('Имя_контрола', 'Form_1'), {|ow,p1,p2,p3| My(ow,p1,p2,p3) }, 'AAA', 'BBB', 'CCC') получим ? aRet[4] // .F. в первом случае блок получит объект окна во втором объект Tsb\ контрола

Andrey: SergKis пишет: маловато будет ? В самый раз !

Vlad04: Примеры кода ... aRet := Do_Obj(GetControlHandle('Имя_контрола', 'Form_1'), или aRet := Do_Obj(GetControlHandle('Имя_контрола', 'Form_1'), {|ow,p1,p2,p3| My(ow,p1,p2,p3) }, 'AAA', 'BBB', 'CCC') ... и др. Это , конечно, круто, но совсем не наглядно. На мой взгляд, все сложности и хитрости должны быть за "бортом" прикладных программ - где-то в исходниках библиотеки, dLL и т.п. Мне больше по душе : This.Row This.Col This.Width This.Height This.Value This.Name .. А все остальные действия должны быть типа 2+3 и т.п

SergKis: Это , конечно, круто, но совсем не наглядно... Мне больше по душе Где среда This создается - удобно, где ее нет, this уже не работает, в той же тсб. Есть ф-ии для добывания объктов o := _WindowObj(FormName\FormHandle) o := _ControlObj(ControlHandle[\ControlName, FormName]) вместо них использую получить любой объект по handle o := Do_Obj(Handle[, block,....]) в основном, исп. без блока, но при наличии массива Handle AEval(aHandle, {|nh| Do_Obj(nh, {|obj| MyFun(obj) }) }) даже очень ничего, т.е. AEval(_HMG_aFormHandles, {|nh,nn| Do_Obj(nh, {|obj| MyFun(obj, nn) }) }) обработаем все окна, причем в MyFun(oWnd) работать с объектом окна, т.е. oWnd:Type oWnd:Name oWnd:Index oWnd:Row oWnd:Col oWnd:Width oWnd:Height oWnd:ClientWidth oWnd:ClientHeight oWnd:Value ... crazy пример, перебор всех контролов всех окон AEval(_HMG_aControlHandles, {|nh,nn| Do_Obj(nh, {|obj| MyFun(obj, nn) }) }) MyFun(oCtl) будет работать с обектами контролов oCtl:Type oCtl:Name oCtl:Index oCtl:Row oCtl:Col oCtl:Width oCtl:Height oCtl:ClientWidth oCtl:ClientHeight oCtl:Value ... не все контролы вкл. в SET OOP ON, где то будет Nil возврат.

Andrey: Andrey пишет: Присоединяюсь к добавлениям ... Если конечно это не сложно и не помешает логике. ? GetProperty(oBrw:cParentWnd, oBrw:cControlName, "Row") ? GetProperty(oBrw:cParentWnd, oBrw:cControlName, "Col") ? GetProperty(oBrw:cParentWnd, oBrw:cControlName, "Width") ? GetProperty(oBrw:cParentWnd, oBrw:cControlName, "Height") Добавить ? oBrw:nRowWnd ? oBrw:nColWnd ? oBrw:nWidthWnd ? oBrw:nHeightWnd SergKis пишет: Где среда This создается - удобно, где ее нет, this уже не работает, в той же тсб. Есть ф-ии для добывания объктов Так я и хочу короткого написания функций oBrw:nRowWnd вместо GetProperty(oBrw:cParentWnd, oBrw:cControlName, "Row") . Может и неправильно написал, надо наверное так: [pre2] ? oBrw:nRowBrw ? oBrw:nColBrw ? oBrw:nWidthBrw ? oBrw:nHeightBrw[/pre2]

SergKis: Andrey пишет Так я и хочу короткого написания функций Есть (METHOD New смотри) координаты, я понимаю oBrw:nTop oBrw:nLeft oBrw:nBottom oBrw:Right

Andrey: SergKis пишет: Есть (METHOD New смотри) координаты, я понимаю Пропустил ! Спасибо ! То что нужно.

SergKis: PS создавай this среду в своей функции, запускай через блок кода для тсб xRet := Do_ControlEventProcedure ( bBlock, GetControlIndex(oBrw:cControlName, oBrw:cParentWnd), p1, p2, p3, p4 )

Andrey: SergKis пишет: создавай this среду в своей функции, запускай через блок кода для тсб xRet := Do_ControlEventProcedure ( bBlock, GetControlIndex(oBrw:cControlName, oBrw:cParentWnd), p1, p2, p3, p4 ) Не всё сразу. Надо с более простым решением разобраться.

Vlad04: SergKis пример, перебор всех контролов всех окон Для чего ? Не могу даже представить , для чего мне бы это потребовалось. Окно - это визуальное представление данных, а данные в таблицах, которые везде видны, ну и переменных памяти. Обычно работа идет с одним активным основным окном и с несколькими вспомогательными.



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