DO WHILE lQuit = .F. READ EVENTS ENDDO... then you can have a "case" within the DO loop that tests a "message queue" for any pending events prior to doing the READ EVENTS. Any time you need to handle a particular event, you stuff the info into the "message queue" and do a CLEAR EVENTS. The "case" handles the events until the queue is "empty"; eg.
DO WHILE lQuit = .F. DO CASE CASE cEvent = "Report" ... CASE cEvent = "New Form" ... OTHERWISE READ EVENTS ENDCASE ENDDOIt's "sort of" the way Windows does "messaging" internally.