Montag, 5. Dezember 2011

Zwei Forms gleichzeitig bewegen / Moving two forms simultaneously

Wer noch die alte Version von WinAMP(R) kennt weiß, dass dort insgesamt zwei zusätzliche, an die Hauptform andockbare Fenster zur Verfügung standen.

Einen solchen Effekt können wird in Visual FoxPro ebenfalls erzielen. Hierzu binden wir den 'Moved' Event der Hauptform einfach an die zugehörigen Unterforms.

Der für die Repositionierung benötigte Code befindet sich in der Prozedur 'MoveSubForm':

oFrmSub.Top = oFrmMain.Top
IF    ( oFrmMain.Left + oFrmMain.Width + 15 + oFrmSub.Width ) > _screen.Width
    oFrmSub.Left = oFrmMain.Left - oFrmSub.Width
ELSE 
    oFrmSub.Left = oFrmMain.Left + oFrmMain.Width + 15
ENDIF 

Da das MOVED() Event feuert, sobald wir die Hauptform verschieben, sorgt der o.a. Code für die Repositionierung der Unterform auf Basis der aktuellen Position der Hauptform.


Hier nun der vollständige Mustercode:

CLEAR ALL 
PUBLIC oFrmMain as Form, oFrmSub as Form, oHandler as Object 
* // Forms und Handler erzeugen                        
* // create forms and handler                        
oFrmMain            = CREATEOBJECT( [form] )
oFrmSub             = CREATEOBJECT( [form] )
oHandler            = CREATEOBJECT( [oHandlerObj] )
* // Hauptform positionieren und konfigurieren        
* // positioning and configureing the main form        
oFrmMain.Top        = 100 
oFrmMain.Left       = 100 
oFrmMain.AddObject([cmdReleaseAll],[commandbutton])
oFrmMain.cmdReleaseAll.Caption  = [Exit]
oFrmMain.cmdReleaseAll.Height   = 25
oFrmMain.cmdReleaseAll.Visible  = .T. 
oFrmMain.Visible                = .T.
* // Unterform konfigurieren                        
* // configureing the subform                        
oFrmSub.BorderStyle             = 0 
oFrmSub.TitleBar                = 0
oFrmSub.BackColor               = RGB( 128 , 128 , 128 )
oFrmSub.Visible                 = .T. 
* // Unterform direkt neben Hauptform platzieren    
* // place the subform right beside the main form    
oHandler.MoveSubForm() 
* // Handler an relevante Events binden                
* // bind the handler to essential events            
BINDEVENT( oFrmMain , [Moved] , oHandler , [MoveSubForm] )
BINDEVENT( oFrmMain.cmdReleaseAll , [Click] , oHandler , [CloseSubForm] )


DEFINE CLASS oHandlerObj AS custom

    Name = [ohandler]

    PROCEDURE MoveSubForm
        oFrmSub.Top = oFrmMain.Top
        IF    ( oFrmMain.Left + oFrmMain.Width + 15 + oFrmSub.Width ) > _screen.Width
            oFrmSub.Left = oFrmMain.Left - oFrmSub.Width
        ELSE 
            oFrmSub.Left = oFrmMain.Left + oFrmMain.Width + 15
        ENDIF 
    ENDPROC

    PROCEDURE CloseSubForm 
        UNBINDEVENT( oFrmMain , [Moved] , oHandler , [MoveSubForm] )
        UNBINDEVENT( oFrmMain.cmdReleaseAll , [Click] , oHandler , [CloseSubForm] )
        oFrmMain.Release
        oFrmSub.Release
        oFrmMain    = .Null.
        oFrmSub     = .Null.
        RELEASE oFrmMain, oFrmSub
    ENDPROC 
    
ENDDEFINE

Keine Kommentare:

Kommentar veröffentlichen