  | 
				VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.   
				 | 
			 
		 
		 
	
		| 上一篇主題 :: 下一篇主題   | 
	 
	
	
		| 發表人 | 
		內容 | 
	 
	
		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才會更有趣~
 
############################# | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
  	 
	    
  	   | 
 	
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
  | 
   
  
		 |