フォークがお互いに継承できる方法を見るために、他のフォームの祖先として使用されるフォームを作成します。祖先のフォームには、ファイルメニューとステータス・バーがあります。
You can copy the Source for the Ancestor Form and paste it to a form and compile it.この例では、祖先のフォームを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 *User
Change #Date *Date
Change #Time *Time
ENDROUTINE
* Update the time on the status bar every 5 seconds (5000 milliseconds)
EVTROUTINE HANDLING(#TIMER.Tick) OPTIONS(*NOCLEARMESSAGES *NOCLEARERRORS)
Change #Time *Time
ENDROUTINE
* Handle Exit request by attempting to close the form
EVTROUTINE HANDLING(#MITM_EXIT.Click) OPTIONS(*NOCLEARMESSAGES *NOCLEARERRORS)
Invoke #Com_Self.CloseForm
ENDROUTINE
* Handle file open menu item by invoking the "HandleFileOpen" method
EVTROUTINE HANDLING(#MITM_File_Open.Click) OPTIONS(*NOCLEARMESSAGES *NOCLEARERRORS)
Invoke #Com_Self.HandleFileOpen
ENDROUTINE
* Handle file close menu item by invoking the "HandleFileClose" method
EVTROUTINE HANDLING(#MITM_File_Close.Click) OPTIONS(*NOCLEARMESSAGES *NOCLEARERRORS)
Invoke #Com_Self.HandleFileClose
ENDROUTINE
* 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)
Endif
ENDROUTINE
* Default method "HandleFileOpen".Typically this is redefined by a descendant
Mthroutine HandleFileOpen
Use 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 HandleFileClose
Use Message_Box_Show (ok Ok Info #Com_Owner.Name 'Ancestor HandleFileClose method invoked') (#Std_Obj)
Endroutine
END_COM