フォークがお互いに継承できる方法を見るために、他のフォームの祖先として使用されるフォームを作成します。祖先のフォームには、ファイルメニューとステータス・バーがあります。
Ancestor フォームのソースをコピーし、フォームに貼り付けてコンパイルできます。この例では、祖先のフォームをEOEXAM01とします。
EOEXAM01を実行すると、3つのオプションがあるファイルメニューと、現在のユーザー、日付、および時間が表示されるステータス・バーが表示されます。
フォームには、5秒ごとに時間を更新するタイマーが含まれます。
メッセージ・ボックスを表示するファイルメニュー・オプションのイベント・ルーチンも含まれます。例えば終了オプションが選択されると、以下のメッセージ・ボックスでアクションを確認します。
祖先のフォームのソース
**************************************************** * COMPONENT:STD_FORM * ***************************************************FUNCTION OPTIONS(*DIRECT)BEGIN_COM LEFT(340) MENUBAR(#MBAR_1) TOP(132) VISUALSTYLE(#VS_NORM)DEFINE_COM CLASS(#PRIM_STBR) NAME(#STBR_1) DISPLAYPOSITION(1) HEIGHT(24) LEFT(0) MESSAGEPOSITION(1) PARENT(#COM_OWNER) TABPOSITION(1) TABSTOP(False) TOP(270) WIDTH(492)DEFINE_COM CLASS(#USER.Visual) NAME(#USER) DISPLAYPOSITION(1) HEIGHT(18) LEFT(285) MARGINLEFT(0) PARENT(#STBR_1) READONLY(True) TABPOSITION(1) TABSTOP(False) TOP(4) WIDTH(71)DEFINE_COM CLASS(#DATE.Visual) NAME(#DATE) DISPLAYPOSITION(2) HEIGHT(18) LEFT(358) MARGINLEFT(0) PARENT(#STBR_1) READONLY(True) TABPOSITION(2) TABSTOP(False) TOP(4) WIDTH(61)DEFINE_COM CLASS(#TIME.Visual) NAME(#TIME) DISPLAYPOSITION(3) HEIGHT(18) LEFT(421) MARGINLEFT(0) PARENT(#STBR_1) READONLY(True) TABPOSITION(3) TABSTOP(False) TOP(4) WIDTH(54)DEFINE_COM CLASS(#PRIM_TIMR) NAME(#TIMER) INTERVAL(5000)DEFINE_COM CLASS(#PRIM_MBAR) NAME(#MBAR_1) PARENT(#COM_OWNER)DEFINE_COM CLASS(#PRIM_MITM) NAME(#MITM_1) CAPTION('File') DISPLAYPOSITION(1) PARENT(#MBAR_1)DEFINE_COM CLASS(#PRIM_SMNU) NAME(#SMNU_1) PARENT(#MITM_1)DEFINE_COM CLASS(#PRIM_MITM) NAME(#MITM_FILE_OPEN) CAPTION('Open') DISPLAYPOSITION(1) PARENT(#SMNU_1)DEFINE_COM CLASS(#PRIM_MITM) NAME(#MITM_FILE_CLOSE) CAPTION('Close') DISPLAYPOSITION(2) PARENT(#SMNU_1)DEFINE_COM CLASS(#PRIM_MITM) NAME(#MITM_EXIT) CAPTION('Exit') DISPLAYPOSITION(3) PARENT(#SMNU_1) * Initialize the details on th status bar EVTROUTINE HANDLING(#Com_Owner.Initialize) OPTIONS(*NOCLEARMESSAGES *NOCLEARERRORS)Change #User *UserChange #Date *DateChange #Time *TimeENDROUTINE * Update the time on the status bar every 5 seconds (5000 milliseconds) EVTROUTINE HANDLING(#TIMER.Tick) OPTIONS(*NOCLEARMESSAGES *NOCLEARERRORS)Change #Time *TimeENDROUTINE * Handle Exit request by attempting to close the form EVTROUTINE HANDLING(#MITM_EXIT.Click) OPTIONS(*NOCLEARMESSAGES *NOCLEARERRORS)Invoke #Com_Self.CloseFormENDROUTINE * Handle file open menu item by invoking the "HandleFileOpen" method EVTROUTINE HANDLING(#MITM_File_Open.Click) OPTIONS(*NOCLEARMESSAGES *NOCLEARERRORS)Invoke #Com_Self.HandleFileOpenENDROUTINE * Handle file close menu item by invoking the "HandleFileClose" method EVTROUTINE HANDLING(#MITM_File_Close.Click) OPTIONS(*NOCLEARMESSAGES *NOCLEARERRORS)Invoke #Com_Self.HandleFileCloseENDROUTINE * Handle a request to close the form by getting a confirmation EVTROUTINE HANDLING(#Com_Owner.Closing) OPTIONS(*NOCLEARMESSAGES *NOCLEARERRORS) Action(#AfterCloseAction)Use Message_Box_Show (okCancel Ok Info #Com_Self.Name 'Are you sure you want to close the form?')(#Std_Obj)If '#Std_Obj = Cancel'Set #AfterCloseAction Value(None)EndifENDROUTINE * Default method "HandleFileOpen".Typically this is redefined by a descendant Mthroutine HandleFileOpenUse Message_Box_Show (ok Ok Info #Com_Owner.Name 'Ancestor HandleFileOpen method invoked') (#Std_Obj)Endroutine * Default method "HandleFileClose".Typically this is redefined by a descendant Mthroutine HandleFileCloseUse Message_Box_Show (ok Ok Info #Com_Owner.Name 'Ancestor HandleFileClose method invoked') (#Std_Obj)Endroutine END_COM


