這是一個園長學習VFP(Visual Foxpro)的Blog歡迎同好一起來參與

星期一, 3月 15, 2010

VFP 功能表攻略(一)

1143680380_1

功能表在應用程式中算是很重要的一個Function
因為它可讓使用者有系統的找到所要的功能(不能說是快速)
但也要看您的功能表分類是否適當

VFP當然也有提供功能表
但我們不討論內建功能表建立的方法
我們要做的是
DBF->MENU (其實VFP內部也是這樣運作,不過無法讓使用者控制)
現在我們要將它實作出來,以做為日後之應用
首先:建立兩個table(DBF檔)
smenu.dbf -記錄功能表所有項次及其要顯示之文字,圖片,執行程式....等
menustru.dbf - 記錄各功能表項次之間的關係
其結構如下:
smenu.dbf

1143679513_1

menustru.dbf

1143678598_2

其關係為:以morder 為一對多之關係 smenu.morder (1) -----------(n) menustru.morder

如下圖:
1143678598_3

設計好相關的資料表後,我們就可以填入功能表的資料囉,也可以設計一個表單
如下圖:
1143678598_6

寫入之資料應為:
smenu.dbf

1143678598_4

說明:
morder: 我設計為自動編碼----系統函式SYS(2015)
p_name:表單名稱
p_cname:會顯示在功能表上之項目名稱
p_type:功能項目之型態,我分為三種,即功能表/表單/報表
p_note:功能說明
menustru.dbf

1143678598_5

即是指出功能表項次之間的關係 mparent 代表為父項
mparent+------morder
+-----morder
+----...........
建好了資料表,填好資料後,我們即可使用以下程式碼從dbf中產生功能表
*green's menu create
Local _Pad,nparent
Push Menu _Msysmenu
Hide Menu _Msysmenu
Set Sysmenu To
Set Sysmenu Automatic
&& 開啟儲存功能表之資料庫
******************* 載入功能表
use smenu in 0 shar
use menustru in 0 shar
SELECT menustru
Set Order To mparent
Go Top
*
Do While !Eof()
=Seek(morder,"smenu","morder")
*
If Empty(mparent) && 主功能表
_Pad=Alltrim(morder)
_prompt=Alltrim(smenu.p_cname)
Define Pad &_Pad Of _Msysmenu Prompt _prompt Color Scheme 1 ;
KEY Alt+C, ''
On Pad &_Pad Of _Msysmenu Activate Popup &_Pad
Define Popup &_Pad Margin Relative Color Scheme 1
Else
itemno=Alltrim(Str(smenu.seq))
_Pad=Alltrim(mparent)
_picture=""
DO case
CASE "功能表"$smenu.p_type
_picture="menu.bmp"
CASE "表單"$smenu.p_type
_picture="form.bmp"
CASE "報表"$smenu.p_type
_picture="report.bmp"
endcase
Define Bar &itemno Of &_Pad Prompt Alltrim(smenu.p_cname) Picture _picture && SKIP FOR .T. && 執行時期會檢查此條件!!
If "功能表"$smenu.p_type
_Pads=Alltrim(morder)
Define Popup &_Pads Margin Relative Color Scheme 1
On Bar &itemno Of &_Pad Activate Popup &_Pads
Endif
*
On Selection Popup &_Pad;
DO defimenu With Prompt( ), Popup( ),Bar()
Endif
Select menustru
Skip
Enddo
Select menustru
Use
Select smenu
Use
*
Return
將上面之程式碼存為menu.prg,在程式開始執行時去執行它,即可得到以下結果

1143680380_1

這樣,以後我們只要維護dbf檔即可產生相對應的功能表了,是不是很方便呢?
下次我們再來討論進階之應用-[ 依使用者權限不同而載入之功能表 ]

發表於 2006/03/30 08:29 AM

沒有留言: