************************************************** *-- Class: _gede (c:\gasybali\akhirbln.vcx) *-- ParentClass: custom *-- BaseClass: custom *-- Time Stamp: 03/15/04 05:35:06 AM * oGasyLah=NEWOBJECT('_gede') oGasyLah.AturForm DEFINE CLASS _gede AS custom Width = 17 Name = "_gede" PROCEDURE aturform * to stagger existing forms with current frame. * Returns number of forms arranged. LPARAMETERS tcFormName,tlOmitAutoCenteredForms,tnStartTop, tnStartLeft, tnStartColumn #DEFINE WINDOW_STAGGER_FACTOR SYSMETRIC(9) * window title height ASSERT EMPTY(tcFormName) OR (VARTYPE(tcFormName) = "C" AND WEXIST(tcFormName)) LOCAL lnArranged, lnColumn, lnTop, lnLeft, loFormRef, ; lnParentHeight, lnScaleMode, lnIndex, llAllForms, loFrame, llInScreen, ; llRightFrame, llMoreTopForms loFrame = THIS.GetCurrentTopFormRef() llInScreen = (loFrame.ShowWindow = 0) lnScaleMode = loFrame.ScaleMode loFrame.ScaleMode = 3 lnArranged = 0 lnTop = IIF(VARTYPE(tnStartTop) = "N", tnStartTop, 0) lnLeft = IIF(VARTYPE(tnStartLeft) = "N", tnStartLeft,0) lnColumn = IIF(VARTYPE(tnStartColumn) = "N" AND tnStartColumn > 0, ; tnStartColumn, 1) lnParentHeight = loFrame.Height llAllForms = EMPTY(tcFormName) FOR lnIndex = _SCREEN.FormCount TO 1 STEP -1 loFormRef = _SCREEN.Forms(lnIndex) IF UPPER(loFormRef.BaseClass) == "TOOLBAR" LOOP ENDIF DO CASE CASE llInScreen AND ; lnIndex = _SCREEN.FormCount AND ; INLIST(loFormRef.ShowWindow,0,1) llRightFrame = .T. * go right ahead and process these windows CASE llInScreen AND ; loFormRef.ShowWindow = 0 llRightFrame = .T. CASE llInScreen AND ; loFormRef.ShowWindow = 2 LOOP * the real problem is ShowWindow = 1 * where you are mixing them some in Screen * and some in top forms. This has to be * taken care of separately in 5, but in 6 * apparently these windows show up with ShowWindow = 0!! CASE INLIST(loFormRef.ShowWindow,0,1) AND ; NOT llRightFrame * we haven't gotten to the right group of windows yet LOOP CASE llRightFrame AND loFormRef.ShowWindow = 2 * we've reached another frame EXIT CASE loFormRef.ShowWindow = 2 AND loFormRef # loFrame * still wrong group LOOP CASE loFormRef.ShowWindow = 2 llRightFrame = .T. LOOP * now we can work on the window group * we'll see next in the stack... OTHERWISE * we're in an appropriate window, cascade it ENDCASE IF (llAllForms OR UPPER(loFormRef.Name) == UPPER(tcFormName)) AND ; loFormRef.WindowState = 0 AND loFormRef.Visible AND ; (NOT (tlOmitAutoCenteredForms AND loFormRef.AutoCenter)) lnArranged = lnArranged + 1 loFormRef.Top = lnTop loFormRef.Left = (lnLeft * lnColumn) loFormRef.AutoCenter = .F. IF lnTop > lnParentHeight - WINDOW_STAGGER_FACTOR STORE WINDOW_STAGGER_FACTOR TO lnTop, lnLeft lnColumn = lnColumn + 1 ENDIF lnTop = lnTop + WINDOW_STAGGER_FACTOR lnLeft = lnLeft + WINDOW_STAGGER_FACTOR ELSE * do nothing ENDIF ENDFOR loFrame.ScaleMode = lnScaleMode RETURN lnArranged ENDPROC PROCEDURE getcurrenttopformref LOCAL loForm, loTopForm * first top form in the list * will be the current top form. * DON"T USE THIS METHOD in VFP 5 IF YOU MIX * _SCREEN-owned forms with topform-Owned * forms unless you use ShowWindow = 0 for * all _screen-owned forms! In 6 it appears okay ASSERT TYPE("_SCREEN.ActiveForm") # "O" OR ; INLIST(_SCREEN.ActiveForm.ShowWindow, 0,1,2) DO CASE CASE _SCREEN.FormCount = 0 OR ; (TYPE("_SCREEN.ActiveForm") = "O" AND ; _SCREEN.ActiveForm.ShowWindow = 0 ) && ShowWindow In Screen loTopForm = _SCREEN CASE (TYPE("_SCREEN.ActiveForm") = "O" AND ; _SCREEN.ActiveForm.ShowWindow = 2 ) && ShowWindow As Top Form loTopForm = _SCREEN.ActiveForm OTHERWISE FOR EACH loForm IN _SCREEN.Forms && note: these may be toolbars && if undocked, but that's okay -- && they are only ShowWIndow 0 or 1. IF loForm.ShowWindow = 2 && the first one in the collection will && be "active top form" loTopForm = loForm EXIT ENDIF ENDFOR IF VARTYPE(loTopForm) # "O" loTopForm = _SCREEN ENDIF ENDCASE RETURN loTopForm ENDPROC ENDDEFINE * *-- EndDefine: _gede **************************************************