I use next code :
#include "FiveWin.ch"
# include "common.ch"
# include "dbinfo.ch"
GLOBAL EXTERNAL oWnd
# ifdef WITHMDIDLG
//----------------------------------------------------------------------------//
PROC InitMdiDlg()
*****************
IF ! __ObjHasData(oWnd,"aDlg")
__ObjAddData(oWnd,"aDlg")
END
oWnd:aDlg := {}
RETURN
//----------------------------------------------------------------------------//
//----------------------------------------------------------------------------//
FUNC DelDlg(oDlg , lValid) //, lValid)
**************************
LOCAL el , i := 0
LOCAL bValid := IIF(IsNil(oDlg:bValid) , {||.T.} , oDlg:bValid )
IF ! lValid
RETURN .F.
END
IF ! __ObjHasData(oWnd,"aDlg")
RETURN .T.
END
IF ! TestParent(oDlg)
RETURN .F.
END
FOR EACH el In oWnd:aDlg
IF oDlg==el
i := Hb_EnumIndex()
EXIT
END
NEXT
IF i > 0
aDel(oWnd:aDlg,i,.T.)
END
DlgCascade()
RETURN .T.
//----------------------------------------------------------------------------//
PROC DlgCascade()
*********************
LOCAL el , i , nrow := 48 , nRowStep := 28
LOCAL nCol := 5 , nColStep := 25
IF ! __ObjHasData(oWnd,"aDlg")
RETURN
END
FOR EACH el In oWnd:aDlg
IF IsIconic(el:hWnd)
//ShowWindow(el:hWnd , 1)
LOOP
//trace(nrow,ncol,IsIconic(el:hWnd),el:nBottom,GetSysMetrics(1) - 80)
ELSE
el:move(nrow,nCol, , ,.T.)
END
//el:move(nrow,nCol, , ,.T.)
# ifdef TESTFNT12
IF el:nBottom > GetSysMetrics(1) - 80 // 80 , willekeurig na enig testen
nRow -= (el:nBottom - GetSysMetrics(1) + 80)
//trace(nrow,ncol,IsIconic(el:hWnd),el:nBottom)
el:move(nrow,nCol, , ,.T.)
END
# else
IF el:nBottom > GetSysMetrics(1) - 80 // 80 , willekeurig na enig testen
nRow -= nRowStep
el:move(nrow,nCol, , ,.T.)
END
# endif
nrow += nRowStep
nCol += nColStep
NEXT
RETURN
***************************************************************************************************
PROC InitDlg(oDlg)
******************
LOCAL bValid := IIF(IsNil(oDlg:bValid) , {||.T.} , oDlg:bValid )
AADD(oWnd:aDlg , oDlg)
SetActiveWindow(oDlg:hWnd)
DlgCascade(oDlg)
oDlg:bValid := {||(DelDlg(oDlg , EVAL(bValid , oDlg)))}
SetActiveWindow(oDlg:hWnd)
RETURN
************************************************************************************
PROC AddMdiDlg(oMenu)
*********************
MENUITEM "Open &vensters"
MENU
MENUITEM "&Selecteer Dialog" ACTION SelDlg() ;
MESSAGE "Dialog kiezen uit Dialog titels" ;
//WHEN Len( oWnd:aDlg ) > 0
MENUITEM "&Cascade" ACTION DlgCascade() ;
MESSAGE "Overlappenede dialog's" ;
//WHEN Len( oWnd:aDlg ) > 0
SEPARATOR
MENUITEM "&Iconize All" ACTION DlgIconizeClosAll(.F.) ;
MESSAGE "Iconize all open dialog's" ;
//WHEN Len( oWnd:aDLg ) > 0
MENUITEM "C&lose All" ACTION DlgIconizeClosAll(.T.);
MESSAGE "Close all open windows" ;
//WHEN Len( oWnd:aDlg ) > 0
ENDMENU
return nil
**************************************************************************************************
PROC SelDlg(cTit , lExact )
***************************************
// met cTit , geeft oDlg terug !!!!!!!!!!!!!
LOCAL el , selrec , aDlg[0]
LOCAL Block , i
IF ! __ObjHasData(oWnd,"aDlg")
RETURN
END
IF IsNil(cTit)
FOR EACH el In oWnd:aDlg
AADD(aDlg,el:cCaption)
NEXT
IF LEN(oWnd:aDlg) > 1
selrec := eenselx(aDlg,"Selecteer dialog")
ELSE
selrec := 1
ENDIF
IF VALTYPE(selrec) == "N" .AND. (selrec > 0 .AND. Selrec <= LEN(oWnd:aDlg) )
IF IsIconic(oWnd:aDlg[Selrec]:hWnd)
ShowWindow(oWnd:aDlg[Selrec]:hWnd , 1)
END
SetActiveWindow(oWnd:aDlg[selrec]:hWnd)
END
ELSE
cTit := UPPER(cTit)
DEFAULT lExact := .F.
IF lExact
Block := {|j|UPPER(j:cCaption) == cTit }
ELSE
Block := {|j|UPPER(j:cCaption) = cTit}
END
FOR EACH el In oWnd:aDlg
IF EVAL(Block,el)
i := Hb_Enumindex()
EXIT
END
NEXT
IF IsNumber(i)
SetActiveWindow(oWnd:aDlg[i]:hWnd)
END
END
RETURN //nil
**************************************************************************************
PROC DlgIconizeClosAll(lMode)
*****************************
LOCAL el
DEFAULT lMode := .F. // Iconize else clos
IF ! __ObjHasData(oWnd,"aDlg")
RETURN
END
FOR EACH el In oWnd:aDlg
IF lMOde
el:bValid := {||.T.}
el:end()
ELSE
ShowWindow(el:hWnd , 6 ) // 6 : SW_MINIMIZED
end
NEXT
RETURN
**************************************************************************************
PROC DlgDisEnable(lMOde)
************************
LOCAL el
DEFAULT lMode := .F. // Disable
IF ! lMode
oWnd:oMenu:Disable()
ELSE
oWnd:oMenu:Enable()
END
IF ! __ObjHasData(oWnd,"aDlg")
RETURN
END
FOR EACH el In oWnd:aDlg
IF lMode
el:enable()
ELSE
el:Disable()
end
NEXT
RETURN
********************************************************************************************
Func CheckMdiDlg(cTit , nPos , lIn , nLen)
**********************
LOCAL el , lOk := .F.
IF ! IsNil(nLen)
lIn := .F.
END
DEFAULT lIn := .F. , nLen := LEN(cTit)
FOR EACH el IN (oWnd:aDlg)
IF IIF(lIn , (UPPER(cTit) IN UPPER(el:cCaption)) , UPPER(el:cCaption) = LEFT(UPPER(cTit),nLen))
lOk := .T.
nPos := HB_EnumIndex()
EXIT
END
NEXT
RETURN (lOk)
********************************************************************************************
Proc SetMdiDlg(cTit , lExact)
*****************************
LOCAL el , Block , i
cTit := UPPER(cTit)
DEFAULT lExact := .F.
IF lExact
Block := {|j|UPPER(j:cCaption) == cTit }
ELSE
Block := {|j|UPPER(j:cCaption) = cTit}
END
FOR EACH el In oWnd:aDlg
IF EVAL(Block,el)
i := Hb_Enumindex()
EXIT
END
NEXT
IF ! IsNil(i)
SetActiveWindow(oWnd:aDlg[i]:hWnd)
END
RETURN
****************************************************************************************
FUNCTION SeekDlgHandle(hWnd)
*****************************
LOCAL el , oDlg
FOR EACH el IN oWnd:aDlg
IF el:hWnd == hWnd
oDlg := el
EXIT
END
NEXT
RETURN oDlg
****************************************************************************************
PROCEDURE DlgParent(oDlg,hWnd)
*****************************
IF ! __ObjHasData(oDlg,"DlgParent")
__ObjAddData(oDlg,"DlgParent")
END
oDlg:DlgParent := SeekDlgHandle(hWnd)
RETURN
****************************************************************************************
FUNCTION TestParent(oDlg)
*************************
LOCAL el , lOk := .T.
FOR EACH el IN oWnd:aDlg
IF __ObjHasData(el,"DlgParent") .AND. ! IsNil(el:DlgParent)
IF el:DlgParent == oDlg
lOk := .F.
SetActiveWindow(el:hWnd)
//oDlg:SetFocus()
EXIT
END
END
NEXT
RETURN lOk
# endif
In the main module , before activating the MDI window :
InitMdiDlg(oWnd)
In buildmenu
AddMdiDlg(@oMenu)
Then opening and activating a dialog :
DEFINE DIALOG oDlg RESOURCE "TESTXbrowse" OF oWnd TITLE cTit
...
ACTIVATE DIALOG oDlg NOMODAL;
ON INIT InitDlg(oDlg , .T. )) ;
cTit must be unique , dialog's are recognised by cTit
Frank