VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

程序定義類的運用(轉貼)

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
Ruey



註冊時間: 2003-03-12
文章: 1698
來自: tunglo

第 1 樓

發表發表於: 星期二 三月 30, 2004 1:04 pm    文章主題: 程序定義類的運用(轉貼) 引言回覆

程序定義類的運用(一)
第一講:類的定義
用戶除了可以在「類設計器」或「表單設計器」中可視地定義類,也可以在.prg文件中以編程方式定義類或子類,並且定義其屬性、方法、事件。
用戶定義類如同一個過程程序,是將一組命令放在一個程序文件裡。它的命令是基於類或子類定義來定義類或子類的屬性、事件和方法的。
在類定義.prg程序裡,常規命令只能包含於類定義的方法和事件裡。
1、語法:
DEFINE CLASS ClassName1 AS ParentClass [OLEPUBLIC] &&①
[[PROTECTED | HIDDEN PropertyName1, PropertyName2 ...] &&②
[Object.]PropertyName = eExpression ...]
[ADD OBJECT [PROTECTED] ObjectName AS ClassName2 [NOINIT]&&③
[WITH cPropertylist]]...                &&④
[[PROTECTED | HIDDEN] FUNCTION | PROCEDURE Name[_ACCESS | _ASSIGN]&&⑤
| HIS_TACCESS [NODEFAULT]
cStatements&&⑥
[ENDFUNC | ENDPROC]]...
ENDDEFINE
2、說明:④
參數,說明
① ClassName1,指定創建類的名稱。
AS ParentClass,指定創建類的基類,可以是vf的一個基類(如form、CommandButton類),也可以是已經存在的一個用戶定義的類。
OLEPUBLIC,指定一個能通過用戶訪問的在Automation服務器的類
② PROTECTED,將屬性設置為保護類型,可以防止用戶在類的外部訪問和改變屬性的值,它只能被該類定義內的方法程序或該類的子類所訪問。
HIDDEN,將屬性設置為「隱藏」類型,只能被該類的定義內成員所訪問,該類的子類無法「看到」或引用它們。同樣,用戶也不能訪問和修改此類屬性。
[Object.]PropertyName = eExpression
創建一個類或子類屬性並且指派一個值。其屬性是命名類屬性,給類定義特徵和行為的。類或子類可以具有多個屬性。
③ ADD OBJECT,增加一個來自於基類、用戶定義類、子類或ActiveX定制控件的對象到類或子類。當然,你也可以在類的Load、Init和其他方法程序中使用CREATEOBJECT()函數創建對象。
PROTECTED,防止從該類或其子類外部定義訪問和改變對象的屬性。該關鍵字必須放置於對像名稱(ObjectName)之前。
ObjectName,指定對象的名稱,便於對像創建後在類或子類定義中調用。
AS ClassName2,指定創建對象的父類。
NOINIT,指定添加對像時,不執行對象的初始方法。
④WITH cPropertyList,指定添加到類或子類的對象的屬性和屬性的值。
⑤FUNCTION | PROCEDURE Name.....ENDFUNC | ENDPROC....,在類定義中通過創建過程或函數缶類中添加方法程序。function與endfunc,procedure與endproc是對應出現的,它們不能像其他關鍵字一樣縮寫。
在可執行自定義事件或方法程序內的可執行的第一行,可包含PARAMETERS 或 LPARAMETERS來接收外部實參。
注意:每個類都可識別固定的默認事件集合,最小事件集包括Init、Destroy和Error事件;若類中創建的方法程序與某個類所能識別的事件重名,則當該事件發生時,同名方法程序被執行。
_ACCESS | _ASSIGN,通過創建與類的某一屬性同名的過程或函數,然後在過程或函數名後面追加這兩個參數,可以為類創建Access和Assign方法程序。Access,當你訪問與Access方法程序同名屬性時執行;Assign,當你試圖改變與Assign方法程序同名屬性的值時執行。
NODEFAULT,防止父類中的方法或事件發生。它可以放在包括表單在內的任何對象的任何事件的任何位置。
⑥cStatements,當一個方法或事件執行時,執行的vf命令。 

3、範例:
DEFINE CLASS MyForm AS Form &&定義一個基於表單類的用戶表單
PROTECTED mypro &&保護類型屬性mypro
mypro=.f. &&定義屬性並賦值
caption="測試表單"
ADD OBJECT CB1 AS CommandButton &&於MyForm表單內添加一個命令按鈕
PROCEDURE CB1.INIT
WITH THISFORM.cb1
.CAPTION="退出"
.WIDTH=80
.Left=thisform.width-90
.Top=20
ENDWITH
ENDPROC
PROCEDURE CB1.Click &&定義命令按鈕的Click事件
IF MESSAGEBOX('你按下了關閉按鈕;'+chr(13)+'你要關閉表單嗎?',4+32,"提示")=6
Release thisform
ENDIF
ENDPROC
PROCEDURE Click &&定義表單的click事件
= MESSAGEBOX('您點擊的表單!')
ENDPROC
PROCEDURE DESTROY &&釋放事件
CLEAR EVENTS
ENDPROC
ENDDEFINE 


程序定義類的運用(二)
第二講:類在程序中的使用 

1、函數說明:
[oObjName=]CREATEOBJECT(ClassName [, eParameter1, eParameter2, ...])
使用類定義創建一個對象,返回對象。
oObjName,為將對像存儲於一個內存變量,以便於在程序中引用該對象。
ClassName,為字符型表達式,用來創建對象的類。
eParameter,為傳遞的實參。 

2、具體運用方法:
根據父類不同和使用情況不同有不同的運用方法,一般有以下幾種情況:
一、使用vf的基類。CreateObject()函數的參數ClassName直接設置為每個指定基類即可。如創建一以基本表單為父類的子表單:
myform=CreateObject("Format")
myform.show
二、使用VF提供的類編輯器創建的可視類庫(.VCX)。
使用 SET CLASSLIB 命令打開類庫
創建完畢,不再使用該類庫時,要及時使用Set ClassLib To命令關閉釋放該類庫。
三、程序代碼與類定義在同一程序文件中。
正如程序代碼不能在程序中的過程之後一樣,程序代碼只能出現在類定義之前,而不能在類定義之後。如,第一講中的事例若包含於程序文件中,要顯示類所創建的表單,則必須將下列代碼放於首位:
TestForm=createobject(" MyForm") &&創建以自定義表單為父類的表單對像
TestForm.show &&顯示表單
Read EVENTS &&避免表單一閃即逝,可選。
提示:使用createobject()函數創建一個對像後,必須使用show方法來顯示。
四、若定義類代碼在一個程序文件內,而調用在另一個程序文件或在一個方法、事件程序內。
這種情況,需要使用SET PROCEDURE命令首先打開包含類定義代碼的程序文件。其語法如下:
SET PROCEDURE TO [FileName1 [, FileName2, ...]]
[ADDITIVE]
其中:FileName為過程文件名;Additive為在附加該過程文件時,不關閉當前已經打開的過程文件。
註釋:當前過程文件不使用時要及時關閉以釋放內存。
SET PROCEDURE TO 關閉所有已打開過程文件;
RELEASE PROCEDURE FileName1 [, FileName2 …]關閉指定過程文件
如上例:
SET PROCEDURE to Test additive
TestForm=createobject("MyForm") &&創建以自定義表單為父類的表單對像
TestForm.show &&顯示表單
READ EVENTS
五、調用一個已經註冊了的OLe控件創建對象。
首先指定搜尋OLE註冊信息,執行命令SET OLEOBJECT ON
然後使用CREATEOBJECT()函數創建對像或使用GETOBJECT( )激活ole對象。
事例:創建一個Excel工作薄
OLEAPP=CREATEOBJECT("EXCEL.Application") &&創建EXCEL事例
OLEAPP.WORKBOOKS.ADD &&創建一個工作薄
oCurrentSheet=OleApp.Worksheets("Sheet1") &&當前使用電了表
六、在一個已經存在的容器類對像內添加或移去對象。
這種情況可直接調用容器對象的AddObject和RemoveObject方法,語法如下:
Object.AddObject(cName, cClass [, cOLEClass] [, aInit1, aInit2 ...])
Object.RemoveObject(cObjectName)
事例:在表單內添加對像Txt1
myform=CreateObject("form")
myform.AddObject("txt1","Textbox")
myform.Txt1.vlaue="看到你了!" 

myform.RemoveObject(Txt1) &&如果對象是在程序內添加的,釋放容器前先釋放該對像 

_________________
#############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!

學會VFP使用者社區的搜尋,Code才會更有趣~
#############################
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作