《數(shù)據(jù)庫基礎(chǔ)與Visual FoxPro9.0程序設(shè)計》課件第10章_第1頁
《數(shù)據(jù)庫基礎(chǔ)與Visual FoxPro9.0程序設(shè)計》課件第10章_第2頁
《數(shù)據(jù)庫基礎(chǔ)與Visual FoxPro9.0程序設(shè)計》課件第10章_第3頁
《數(shù)據(jù)庫基礎(chǔ)與Visual FoxPro9.0程序設(shè)計》課件第10章_第4頁
《數(shù)據(jù)庫基礎(chǔ)與Visual FoxPro9.0程序設(shè)計》課件第10章_第5頁
已閱讀5頁,還剩76頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第10章面向?qū)ο蟪绦蛟O(shè)計基礎(chǔ)10.1面向?qū)ο蟪绦蛟O(shè)計10.2類和對象的基本操作練習(xí)十

10.1面向?qū)ο蟪绦蛟O(shè)計

面向?qū)ο笫且环N解決問題的思維方式,它將觀察焦點放在構(gòu)成客觀世界的元素——對象上,將對象作為需求分析和系統(tǒng)設(shè)計的主體,將對象間有意義的相互作用作為通信,即把整個問題集合抽象為相互通信的一組對象集合。將相似或相近的一組對象聚合為類,采用各種手段將相似的類組織起來,實現(xiàn)問題空間到解空間的映射。這種方法描述的現(xiàn)實世界模型貼切合理,更符合人們認識世界的思維方法。10.1.1基本概念

VFP9.0既支持面向過程的結(jié)構(gòu)化程序設(shè)計,也支持由事件驅(qū)動的面向?qū)ο蟮某绦蛟O(shè)計方法。在面向?qū)ο蟮某绦蛟O(shè)計中,有一系列在面向過程的程序設(shè)計中沒有接觸過的新概念,如對象和類等,下面進行介紹。

1.對象

對象(Object)是對客觀存在的一個實體(Entity)屬性及行為特征的描述。每個對象都有描述其特征的屬性及其附屬于它的行為。在面向?qū)ο蟪绦蛟O(shè)計中,對象是基本運行的實體,每一個對象都具有如下的一些基本特征。

1)名稱(Name)

每一個實體對象都有一個名稱,以區(qū)別于其它的對象,并在引用該對象時使用。

2)屬性(Property)

對象的屬性標識了對象的性質(zhì),是區(qū)別不同對象的重要標志。例如,每個人除名字外都應(yīng)有自己的性別、出生年月、身高、體重、視力、聽力、指紋、腳碼、血型、DNA等,從而使我們能夠在蕓蕓眾生的大千世界中準確地區(qū)分開每一個人。

屬性有的僅可以在設(shè)計階段設(shè)置,有的則僅可以在程序運行階段進行修改,而有的則既可以在設(shè)計階段設(shè)置又可以在程序運行階段予以修改。

3)方法(Method)

對象的行為特征指附屬于對象的所能執(zhí)行的行為動作,它分為方法和事件。

方法指對象所固有的能完成某種任務(wù)的功能,是對象所能夠執(zhí)行的某個操作。例如,嬰兒一出生就會啼哭和吃奶。

同類對象具有相同的方法,當對象執(zhí)行方法時,事實上是在執(zhí)行這個方法的方法程序。VFP中的方法程序是指在VFP系統(tǒng)內(nèi)部定義的一系列通用的過程程序,其代碼是由系統(tǒng)事先定義好的,用戶不可看見,使用它就能使對象執(zhí)行某個指定的操作。例如:Cls方法程序的功能是用來清除表單中的文本和圖形;AddClass()方法的功能是把一個類從類庫(.vcx)中復(fù)制到另一個類庫。當然,用戶也可根據(jù)需要自定義自己的方法程序。

4)事件(Event)

在現(xiàn)實客觀世界中,各個對象之間存在著千絲萬縷的聯(lián)系和相互作用。正是由于對象之間的相互作用和相互聯(lián)系,才構(gòu)成了世界上各種不同的系統(tǒng)。

面向?qū)ο蟮某绦蛟O(shè)計中,把對象之間所進行的各種聯(lián)系,稱之為對象間的交互。例如,人們通過鍵盤、鼠標、屏幕可以和計算機進行聯(lián)系,我們就稱這是兩個對象——某人和某臺計算機之間進行著交互。

交互是通過對象之間的消息傳遞來實現(xiàn)的。例如,人通過鍵盤輸入了一條要求計算機執(zhí)行顯示的命令,計算機則將執(zhí)行的結(jié)果顯示在屏幕上。傳過去的是指令消息,傳回來的是顯示結(jié)果消息。從這里可以看出,當一個對象收到一個要它進行的某種操作時,將觸發(fā)對應(yīng)的事件,稱發(fā)生了某個事件。例如計算機收到了要它進行顯示結(jié)果的命令,就將觸發(fā)顯示事件。

事件是預(yù)先定義好的特定的動作,由用戶或系統(tǒng)來激活它。例如,用戶單擊了鼠標,將觸發(fā)Click事件,而雙擊了鼠標則將觸發(fā)DblClick事件。事件被觸發(fā)后,將執(zhí)行該事件所對應(yīng)的程序代碼,而這個代碼卻是要用戶自己動手編寫的。同一個事件名,由于代碼不同執(zhí)行的任務(wù)將不同。

一個對象可以有許多隸屬于它的事件,這些事件的名字卻事先都是由系統(tǒng)規(guī)定好的。事件的代碼稱之為事件程序。從面向?qū)ο蟮睦碚摽矗录头椒热煌菍ο蟮男袨楹蛣幼?,那么二者從本質(zhì)上講應(yīng)該是相同的,都是執(zhí)行某個程序。可以把事件看成系統(tǒng)事先定義的空方法(沒有代碼的方法),既可在事件中調(diào)用用戶自定義的方法,也可在用戶自定義的方法中激活特定的事件。

在VFP中,方法程序更為基本。因為在VFP中,系統(tǒng)事先已定義好了許多方法程序,供用戶直接使用;而對于事件,系統(tǒng)卻僅給出了它的名字,并未給出代碼,因而代碼必須由用戶自己編制。

2.類

面向?qū)ο蟪绦蛟O(shè)計另一個最重要的概念是類(Class)。類是對具有相同屬性結(jié)構(gòu)和操作行為的一組對象的抽象。

1)類的概念及類與對象的聯(lián)系

對象是類的實例,是客觀存在的事實。而類則是對客觀事實的抽象,是一個抽象出來的概念。例如作為每一個人,在世界上是實實在在存在的,因此每個人都是一個實例,即一個對象。而由于每一個人都具有如前所述的姓名、性別、出生年月、身高、體重、視力、聽力、指紋、腳碼、血型、DNA等相同的屬性結(jié)構(gòu)以及能制造和使用復(fù)雜工具的行為和動作,我們便從中抽象出了人類的概念。而人類絕不是指某一個具體的人。同樣,每一個具體的人,他們本身并不是類,也不能代表類。但正是由于這種科學(xué)的抽象,才使我們更能清楚地將人類與動物和其它的類區(qū)分開來。類是創(chuàng)建對象的模板,它包含了創(chuàng)建對象的屬性描述和方法、事件。

在現(xiàn)實生活中,人們認識世界的規(guī)律是從特殊到一般,從具體到抽象,即先有對象,后有類的概念。然而在面向?qū)ο蟮某绦蛟O(shè)計中,人們卻常常反其道而行之,先定義類,包括定義類的屬性、方法和事件,然后再去根據(jù)定義好的類來創(chuàng)建對象,這符合人們在認識世界的基礎(chǔ)上改造世界的規(guī)律。例如,人們總是先設(shè)計出圖紙,再根據(jù)圖紙建起一座座工廠。同一張設(shè)計圖紙,可以建成若干個相同的工廠。這里圖紙是類,每一個工廠都是對象實體。類要做的任何事情,都必須通過對具體的對象的操作才能實現(xiàn)。如同一張生產(chǎn)化肥的工廠設(shè)計圖紙若不建成工廠進行生產(chǎn),則連一?;室膊粫a(chǎn)出來。

2)子類(Subclass)和父類(ParentClass)

基于某個已存在的現(xiàn)有類而創(chuàng)建出的新類,稱為該現(xiàn)有類的子類,該現(xiàn)有類則稱為該子類的父類。

3)基類(BaseClass)

如果有一種類,所有其它的類都是由這種類直接或間接派生出來的,這種類就稱為基類。在VFP中,系統(tǒng)提供了幾十個基類供用戶編程使用,例如Form、Grid、Label等。

3.類的三大特性

1)繼承(Inheritance)

繼承是指根據(jù)父類所創(chuàng)建的子類繼承父類的一切屬性、方法和事件程序。而且子類還可以再增加自己的屬性、方法和事件程序。父類和子類之間的繼承關(guān)系有以下三個特征:

(1)父類和子類之間具有共享的特征,包括數(shù)據(jù)和程序代碼。

(2)父類和子類之間存在著差別和新增的部分,包括非共享數(shù)據(jù)和程序代碼。

(3)兩個類之間存在著層次結(jié)構(gòu)。對于一個子類而言,它的成員自然而然地應(yīng)該包括:

(1)從其父類繼承而來的成員,包括屬性、方法和事件。

(2)由子類自己所定義的成員,包括屬性、方法和事件。

繼承可以使在父類中所作的添加、修復(fù)、改動自動反映到它的所有子類上。這種自動更新可大大提高編程的效率。

2)封裝(Encapsulation)

在面向?qū)ο蟮某绦蛟O(shè)計中,一個重要的方法是將類的屬性、方法和事件程序包裝在一起,稱之為封裝。封裝使得用戶在使用VFP提供的基類時,不必關(guān)心這些基類的內(nèi)部是使用什么代碼和方法實現(xiàn)的,只要將其聲明一下,就可以調(diào)用其固有的功能。因此代碼的修改和維護將變得更加方便,因為對類的某個方法或?qū)傩赃M行修改時,只會在該類內(nèi)部起作用,并不會影響到其它類的正常操作。例如,當用戶為一個標簽對象(Label)設(shè)置標題Caption屬性時,并不需要了解標題字符串是如何存儲的。

3)多態(tài)性(Polymorphism)

類的繼承使得除用戶添加的方法程序或?qū)傩酝?,子類的方法程序或?qū)傩詫⑴c父類的方法程序或?qū)傩酝_@帶來的一個重要問題是,當調(diào)用子類所創(chuàng)建的對象的方法時,系統(tǒng)究竟調(diào)用的是父對象的方法程序還是子對象的方法程序?這就是類或?qū)ο蟮亩鄳B(tài)性。在面向?qū)ο蟮某绦蛟O(shè)計中,系統(tǒng)都將提供一套比較完善的機制,保證當程序未能明顯說明調(diào)用哪個類的方法時,系統(tǒng)按機制規(guī)則,自動調(diào)用相應(yīng)的方法程序,而保證不引起混淆錯誤。10.1.2面向?qū)ο蟪绦蛟O(shè)計的基本方法

在傳統(tǒng)的面向過程的程序設(shè)計中,應(yīng)用程序自身控制了執(zhí)行哪一部分代碼及其按什么順序執(zhí)行代碼。程序?qū)牡谝恍虚_始執(zhí)行,并按預(yù)先在應(yīng)用程序中規(guī)定好的路徑進行,必要時調(diào)用過程。

但在面向?qū)ο蟮某绦蛟O(shè)計中其基本思想已轉(zhuǎn)變?yōu)槭录?qū)動,這里代碼并不按預(yù)定的路徑執(zhí)行,而是在響應(yīng)不同的事件時執(zhí)行不同的代碼段。事件可以由用戶的操作、來自操作系統(tǒng)或其它應(yīng)用程序的消息觸發(fā),甚至由事件本身的代碼來觸發(fā)。這些事件的觸發(fā)順序決定了代碼的執(zhí)行順序。由于程序每次運行事件的觸發(fā)順序具有無法預(yù)測的隨機性,因此代碼的執(zhí)行順序也不確定,當然結(jié)果也就不確定。另外,面向?qū)ο蟮某绦蛟O(shè)計技術(shù)與可視化程序設(shè)計方法的密切結(jié)合,已成為當今程序設(shè)計的主流方法。所謂可視化(Visual),就是利用窗口和菜單等可見部件,來完成用戶的操作指令,并且在信息傳遞方面支持所見即所得(WhatYouSeeIsWhatYouGet,WYSIWYG)功能,而對象則是程序設(shè)計和運行的核心部件。在VFP中這種界面是通過表單來實現(xiàn)的。

事件應(yīng)用程序驅(qū)動最典型的次序是:

(1)啟動應(yīng)用程序,裝載和顯示表單。

(2)表單(或表單上的控件)接收事件。

(3)在相應(yīng)的事件過程中執(zhí)行其代碼,完成規(guī)定的操作。

(4)等待下一個事件的觸發(fā)。

由此看來,事件驅(qū)動機制是面向?qū)ο蟪绦蛟O(shè)計的靈魂。而如何設(shè)計表單、如何編制事件代碼則成了面向?qū)ο蟪绦蛟O(shè)計中最重要的工作。它總體來講大致可按如下步驟進行:

(1)根據(jù)要求創(chuàng)建類,包括類的屬性、事件和方法。

(2)根據(jù)類創(chuàng)建對應(yīng)的實例——對象。

(3)定義對象的屬性值和事件代碼。10.1.3VisualFoxPro9.0中的類

1.基類

基類分為容器類和控件類。在VFP9.0中共提供了29個

基類。

1)容器類基類

容器類(ContainerClass)指可以容納別的類的類。由容器類所創(chuàng)建的容器對象,可以包含其它的對象并且允許訪問所包含的對象。它提供了將多個對象進行組合的功能。例如,表單類是一個使用最廣泛的容器類,它可以將命令按鈕、文本框、標簽、編輯框、圖形框、復(fù)選框、表格等對象囊括其中,從而使功能變得十分強大。在VFP9.0的基類中,常用的容器類如表10.1所示。

2)控件類基類

控件類(ControlObjectClass)指不能包含其它類的類。它比容器類封裝得更加完整,因此使用起來更加方便靈活。對于由控件類而創(chuàng)建的對象,無論是在設(shè)計還是在運行時都是按一個單元來對待的,構(gòu)成控件對象的各個部分不能單獨地操作和修改。所有的控件類都沒有AddObject方法。在VFP中,控件對象只能包含在容器對象中。常見的VFP9.0控件類(包括容器類)都列在表單控件工具欄中,如圖10.1所示。圖10.1表單控件工具欄

2.基礎(chǔ)類

VFP9.0的基類中包含了近百個基礎(chǔ)類,它們?nèi)恳灶悗斓男问椒植荚?4個類庫中。系統(tǒng)的可視類庫保存在系統(tǒng)安裝目錄的“\Ffc\”文件夾中。用戶可以利用類設(shè)計器或類瀏覽器打開這些可視類中所包含的類,觀察其類的結(jié)構(gòu)、屬性和代碼。圖10.2給出了可視類庫“_Table2.vcx”中的類“_DialogButton”的結(jié)構(gòu)、屬性及其“dodialog”方法的代碼。圖10.2_DialogButton的結(jié)構(gòu)、屬性及其dodialog方法的代碼

3.向?qū)ь?/p>

VFP9.0的基類中還提供了許多具有向?qū)Чδ艿南驅(qū)ь悺_@些向?qū)ь惐4嬖谙到y(tǒng)安裝目錄的“\wizard\”目錄中。用戶可以在VFP9.0主菜單的“工具”菜單中選取“向?qū)А边x項,列出系統(tǒng)提供的所有向?qū)ь?,如圖10.3所示。圖10.3向?qū)ь?0.1.4屬性、事件與方法程序

1.常用的對象屬性

表10.2給出了VFP9.0中對象的常用屬性及其應(yīng)用范圍。

2.對象的常見事件

表10.3給出了VFP9.0中一些常見的事件。事件是要觸發(fā)才能執(zhí)行相應(yīng)的事件代碼的。事件的觸發(fā)方式有三種:

(1)由用戶觸發(fā)。例如單擊鼠標左鍵,將觸發(fā)Click事件。

(2)由系統(tǒng)觸發(fā)。例如定時器事件Timer,將會按設(shè)置的定時器時間間隔屬性“Interval”的值自動觸發(fā)。

(3)由代碼觸發(fā)。程序中由代碼觸發(fā)事件的格式為:

Object.Event

例如,若在某個程序代碼中有

Command1.Click

語句,則當程序執(zhí)行到該句時,命令按鈕Command1的Click事件將被觸發(fā)。

3.?VFP9.0中的方法程序

VFP9.0提供了100多個方法程序供用戶在編程時使用。

10.2類和對象的基本操作

10.2.1設(shè)計類

類是創(chuàng)建對象的模板,對象是類的實體,要創(chuàng)建對象在現(xiàn)有類不具備的情況下應(yīng)先創(chuàng)建類。用戶可根據(jù)工作的需要,利用VFP9.0提供的基類、基礎(chǔ)類和向?qū)ь悂韯?chuàng)建新類,從而為對象的創(chuàng)建奠定基礎(chǔ)。創(chuàng)建類的任務(wù)就是要完成對類的屬性和方法的定義。和面向過程的程序設(shè)計中過程的存儲相類似,類程序的設(shè)計按程序的存放位置,可以分為如下三種方式。

(1)內(nèi)存方式:在主程序的后面直接寫入類程序,當主程序執(zhí)行時,它將與主程序一塊同時調(diào)入內(nèi)存執(zhí)行。

(2)程序文件方式:類以一個獨立的文件形式存在于磁盤上,它可以通過“SETPROCEDURETO[ClassName]”命令來打開類文件或關(guān)閉類文件。

(3)類庫方式:將設(shè)計好的類放在指定的類庫中,供編程使用。這三種方式中,最常用的方式是類庫方式。因為類庫提供了專門的管理工具,使類的創(chuàng)建和使用變得非常方便。

創(chuàng)建用戶自定義類,一般應(yīng)分三步進行:首先創(chuàng)建一個空的可視類庫,然后創(chuàng)建類并將它添加到該類庫中,最后新建、編輯類的屬性和方法。

1.創(chuàng)建可視類庫

可視類庫的擴展名是“.vcx”,其備注文件的擴展名是“.vct”。創(chuàng)建類庫的命令是CREATECLASSLIB。

【命令格式】

CREATECLASSLIBClassLibraryName

【功能】

該命令用于創(chuàng)建一個新的空可視類庫(.vcx)文件。

【參數(shù)及子句說明】

ClassLibraryName:指定要創(chuàng)建的可視類庫的名字。

例10.1

創(chuàng)建新的空可視類庫“myclasslib.vcx”。

CREATECLASSLIBmyclasslib

和向數(shù)據(jù)庫中添加存儲過程類似,使用ADDCLASS和CREATECLASS命令,類的定義可以添加到可視類庫中。

2.創(chuàng)建可視類

1)使用菜單打開類設(shè)計器

例10.2

在例10.1創(chuàng)建的空類庫中添加一個命令按鈕類“mycommand”。

S1:打開“新建類”對話框?!邦悺薄拘陆ㄎ募俊?/p>

新建類。

在“新建類”對話框中:

●“類名”文本框:用來輸入新創(chuàng)建的類的名字,這里輸入“mycommand”。

●“派生于”組合框:提供了VFP9.0所有的基類的名字供選擇,這里選擇(或直接輸入)“CommandButton”?!瘛按鎯τ凇蔽谋究颍褐付ㄒ鎯Φ筋悗斓拿?,這里輸入(或通過右側(cè)的另存為按鈕…選擇)“myclasslib.vcx”。結(jié)果如圖10.4所示。

S2:打開類設(shè)計器?!敬_定】↓類設(shè)計器。此時經(jīng)常伴隨同時打開了表單控件工具欄和屬性設(shè)置對話框,如圖10.5所示。圖10.4“新建類”對話框圖10.5類設(shè)計器及表單控件工具欄和屬性設(shè)置對話框

2)使用命令方式打開類設(shè)計器

【命令格式】

CREATECLASSClassName[OFClassLibraryName1]

[AScBaseClassName[FROMClassLibraryName2]]

[NOWAIT]

【功能】

該命令用于打開類設(shè)計器,創(chuàng)建一個新類的定義。

【參數(shù)及子句說明】

●?ClassName:指定要創(chuàng)建的新類定義的名字。

●?OFClassLibraryName1:指定一個要生成的可視類庫的名字。如果該類庫已經(jīng)存在,則將類定義添加到它當中。●?AScBaseClassName:指定要創(chuàng)建類的父類。它可以是VFP9.0中除Column和Header外的基類,也可以是用戶自定義的類。如果缺省本子句,類定義將根據(jù)VFP9.0的FormSet基類而創(chuàng)建。

●?FROMClassLibraryName2:指定由cBaseClassName給出的用戶自定義類所在的可視類庫名。

例10.3

在例10.1創(chuàng)建的類庫中再添加一個命令按鈕類“MyCommand1”。

CREATECLASSMyCommand1OFmyclasslibAS“CommandButton”

執(zhí)行該命令后將打開類設(shè)計器,此時已新建了一個類“MyCommand1”。

3)

使用項目管理器打開類設(shè)計器

使用項目管理器也可以打開類設(shè)計器。其操作步驟如下:

S1:打開“新建類”對話框。在項目管理器中→“類”→【新建】。

S2:填入有關(guān)參數(shù),【確定】↓類設(shè)計器。

3.新建類的屬性

對于由父類剛創(chuàng)建的新類,盡管已繼承了父類的所有屬性,但用戶還可以根據(jù)需要,為其添加一些新的屬性。

例10.4

為在例10.2創(chuàng)建的命令按鈕類“mycommand”添加一個新建屬性“test”。

S1:打開類設(shè)計器對話框及類“mycommand”。

S2:打開“新建屬性”對話框?!邦悺薄靶陆▽傩浴薄?/p>

新建屬性。在“新建屬性”對話框中有以下幾項選項:

①名稱:指定要新建的屬性的名稱,例如輸入“test”。

②可視性:該列表框下有如下三個選項。

●公共(Public):類似于面向過程程序設(shè)計中的全局內(nèi)存變量,表示該屬性可以被其它類或過程所引用。

●保護(Protected):類似于面向過程程序設(shè)計中的私有內(nèi)存變量,表示該屬性只能被本類或子類的方法程序引用。●隱藏(Hidden):類似于面向過程程序設(shè)計中的局部內(nèi)存變量,表示該屬性僅能被本類的方法程序引用。

③Access方法程序:指定是否為新屬性創(chuàng)建Access方法程序。如果為該屬性創(chuàng)建了Access方法程序,則只要查詢該屬性,就可以執(zhí)行Access方法程序中的代碼。

④Assign方法程序:指定是否為新屬性創(chuàng)建Assign方法程序。如果為該屬性創(chuàng)建了Assign方法程序,則只要查詢該屬性,就可以執(zhí)行Assign方法程序中的代碼。

⑤描述:可在該文本框中輸入對該屬性的說明。例如輸入“學(xué)習(xí)新建類的屬性”。

各項選擇結(jié)果如圖10.6所示。圖10.6類的“新建屬性”對話框

S3:將新建的屬性添加到屬性對話框。→【添加】。用戶還可使用同樣的方法,繼續(xù)添加新屬性。

S4:添加結(jié)束?!娟P(guān)閉】。

4.新建類的方法程序

新建類的方法程序的操作步驟與新添屬性的步驟相類似。

例10.5

為新建的命令按鈕類“mycommand”新建一個方法程序“mydisplay”。

S1:打開類設(shè)計器對話框。

S2:打開“新建方法程序”對話框?!邦悺薄靶陆ǚ椒ǔ绦颉薄陆ǚ椒ǔ绦颉T凇靶陆ǚ椒ǔ绦颉睂υ捒蛑杏幸韵聨醉椷x項:

①名稱:指定要新建的方法程序的名稱。例如輸入“mydisplay”。

②可視性:該列表框下有如下三個選項。

●公共(Public):表示該方法程序可以在應(yīng)用程序內(nèi)的任何位置訪問。

●保護(Protected):表示不能為對象實例所訪問,但可為子類所訪問。

●隱藏(Hidden):表示既不能為對象實例所訪問,也不能為子類所訪問。

③描述:為新添加的方法程序加上說明。

本例中選可視性為公共,在描述文本框輸入“顯示文件方法程序”,結(jié)果如圖10.7所示。圖10.7“新建方法程序”對話框

S3:將新建的方法程序添加到類的方法程序中?!咎砑印俊?/p>

S4:添加結(jié)束。→【關(guān)閉】。

5.編輯類的屬性和方法

創(chuàng)建類后,用戶還可以編輯它的屬性和方法程序。

例10.6

編輯類“mycommand”的新建屬性“test”和方法程序“mydisplay”。

S1:打開“編輯屬性/方法程序”對話框。→“類”→“編輯屬性/方法程序”↓編輯屬性方法程序,如圖10.8所示??梢钥吹剑懊嫣砑拥摹皌est”屬性和“mydisplay”方法程序已出現(xiàn)在對話框中了。圖10.8“編輯屬性/方法程序”對話框

S2:在該對話框中,可以修改用戶自定義的類的名稱、說明和可視性,也可新建屬性和方法程序,或移去它們。

注意,在類型欄中,“M”代表方法(Method)和“P”代表屬性(Property)。

用戶也可通過命令來打開類設(shè)計器,創(chuàng)建或修改類的定義。命令如下:

【命令格式】

MODIFYCLASSClassName[OFClassLibraryName1]

[AScBaseClassName[FROMClassLibraryName2]]

[NOWAIT][METHODMethodName][SAVE]

【功能】

該命令用于打開類設(shè)計器,修改已存在的類定義或創(chuàng)建一個新的類定義。

【參數(shù)及子句說明】

●?ClassName:指定要修改或生成的類定義的名稱。

●?OFClassLibraryName1:指定包含類定義的可視類庫的名字。如果用戶正在創(chuàng)建一個新的類定義并且可視類庫已經(jīng)存在,類定義將添加到該類庫中。

●?AScBaseClassName:指定派生新類的父類。

●?FROMClassLibraryName2:指定含有由cBaseClassName2給出的用戶自定義類的可視類庫名。●?METHODMethodName:為類設(shè)計器中打開的代碼窗口指定一個事件或方法。

例如,要為例10.6中的“myclasslib”可視類庫中“mycommand”類中的“mydisplay”方法立即編寫代碼,則應(yīng)給出下面的命令:

MODIFYCLASSmycommandOFmyclasslibMETHODmydisplay

此時,會出現(xiàn)如圖10.9所示的窗口,供為mycommand.my-

display方法編輯事件代碼。

●?NOWAIT:作用同于前面的各命令。

●?SAVE:如果有該關(guān)鍵字,則當別的窗口激活時類設(shè)計器仍然保持打開狀態(tài);如果缺省SAVE關(guān)鍵字,則當其窗口打開激活時類設(shè)計器被關(guān)閉。如果在命令窗口執(zhí)行時,SAVE無影響。

圖10.9代碼編輯窗口的打開及結(jié)果10.2.2創(chuàng)建對象

類是創(chuàng)建對象的模板,對象則是類的實例。但類不能被直接引用,只有通過類創(chuàng)建的相應(yīng)對象方可被引用。本節(jié)介紹對象的創(chuàng)建與使用。

1.打開可視類庫

創(chuàng)建對象必須根據(jù)某個類來進行,而類則隸屬于類庫。因此在創(chuàng)建對象前,應(yīng)先打開包含該類的可視類庫。打開類庫的命令如下:

【命令格式】

SETCLASSLIBTOClassLibraryName

[INAPPFileName|EXEFileName][ADDITIVE][ALIASAliasName]

【命令功能】

該命令用于打開包含有類定義的可視類庫。

【參數(shù)和子句說明】

●?ClassLibraryName:指定要打開的可視類庫的名字。當執(zhí)行不帶ClassLibraryName的SETCLASSLIB命令時,將關(guān)閉所有打開的可視類庫。使用RELEASECLASSLIB也可以關(guān)閉一個可視類庫?!?INAPPFileName|EXEFileName:指定類庫所在的應(yīng)用程序文件名(.app)或可執(zhí)行文件名(.exe)。

●?ADDITIVE:在打開可視類庫時不關(guān)閉任何先前已打開的可視類庫。若缺省該子句,則所有先前打開的可視類將被關(guān)閉。

●?ALIASAliasName:為可視類庫指定一個別名,通過別名可以引用該可視類庫。例如,下面的命令將打開“myclasslib”的可視類庫,并為它指定一個別名“MyCntrls”:

SETCLASSLIBTOmyclasslibALIASMyCntrls

2.生成對象實例

在命令方式下,對象變量的創(chuàng)建是利用對象創(chuàng)建函數(shù)CREATEOBJECT()來進行的。

【函數(shù)格式】

CREATEOBJECT(cClassName[,eParameter1,eParameter2,...])

【函數(shù)功能】

該函數(shù)用于從一個類定義或一個自動激活的應(yīng)用程序中創(chuàng)建一個對象。

【參數(shù)說明】

●?cClassName:指定一個要創(chuàng)建新對象的類或OLE對象。●?eParameter1,eParameter2,…:這些可選擇參數(shù)用來將值傳遞到類的初始事件過程。當用戶執(zhí)行CREATEOBJECT()時,將執(zhí)行初始化事件以使對象初始化。

注意:通常將該函數(shù)返回的對象引用賦給某個變量,然后通過這個變量來標識對象、訪問對象屬性及調(diào)用對象方法。

例10.7

為按鈕類“myCommand”創(chuàng)建一個按鈕控件對象“myButton”。

myButton=CREATEOBJECT(“myCommand”)

在實際工作中,只要不是在程序中創(chuàng)建對象,一般都使用表單設(shè)計器來交互式創(chuàng)建對象。表單類本身是一種容器類,由它創(chuàng)建的表單對象是一種容器類對象。在表單中添加的對象既可以是容器類對象,又可以是控件類對象。關(guān)于表單我們將在第11章中詳細講解。

3.設(shè)置對象屬性種類

屬性是對象的特征。在VFP9.0中,對象的屬性值有的僅可以在對象的設(shè)計或?qū)ο蟮倪\行中設(shè)置,有的則既可以在對象的設(shè)計又可以在對象的運行中設(shè)置。在VFP9.0中,根據(jù)對象屬性的設(shè)置方法,將屬性分為如下三類。

1)可擦寫類屬性

將在設(shè)計和運行期間均可設(shè)置的屬性稱為可擦寫類屬性。其類型是Public型的,在屬性窗口中表現(xiàn)為正常字型的屬性均為可擦寫屬性。例如BackColor屬性就是可擦寫屬性。

2)

保護類屬性

所謂保護類屬性,是指在設(shè)計與運行期間均不能重新定義的屬性。這類屬性只能引用它在設(shè)計期間所默認的值,即只能在運行期間讀取而不能重新設(shè)置。這類屬性一般在屬性窗口中以斜體字顯示出來。例如BaseClass屬性就是保護類屬性。

3)

隱藏性屬性

隱藏性屬性指這樣一類屬性:若用戶只在定義的類中添加了若干新的屬性,但它們卻并未被立即使用,就可以將這些屬性設(shè)置為隱藏,從而使得在設(shè)計和運行期間均無法獲取或設(shè)置這些屬性。

上述三種屬性的設(shè)置可通過下面的步驟進行:

S1:打開“類設(shè)計器”。

S2:打開“編輯屬性/方法程序”對話框,如圖10.8所示。

S3:在“屬性/方法信息”列表框中選取某個屬性或方法,在對話框右側(cè)的可視性列表框中選公共、保護、隱藏之一。

S4:→【應(yīng)用】→【關(guān)閉】,完成設(shè)置。

4.設(shè)置對象屬性值

對象屬性值既可通過屬性窗口直接賦值設(shè)置,又可利用命令來設(shè)置。前者最常用于表單的設(shè)計。

1)

使用屬性窗口設(shè)置屬性值

在表單設(shè)計期間,最常用的方式是使用屬性窗口來設(shè)置對象的屬性。其操作步驟如下:

S1:打開表單及屬性窗口。

S2:在表單窗口選中某個對象作為當前對象。

S3:在屬性窗口選中該對象的某個屬性,為之設(shè)置屬性值。

有關(guān)的設(shè)置細節(jié)將在第11章中介紹。

2)

使用命令設(shè)置屬性值

對象屬性值的設(shè)置命令,分為設(shè)置單個屬性和設(shè)置多個

屬性。為對象的某個屬性賦值的格式為:

ParentObject.Object.Property=Value

例10.8

將例10.7所創(chuàng)建的按鈕對象的標題屬性“Caption”設(shè)置為“顯示”。

myButton.Caption=“顯示”

顯然,用設(shè)置單個屬性值的方法來設(shè)置對象的多個屬性值是不方便的。因此,對于同一個對象的多個屬性值的設(shè)置VFP9.0提供了另一種快捷的方法即WITH…ENDWITH語句,它的語法格式為:

WITHParentObject.Object

.Property1=Valie1

.Property2=Valie2

ENDWITH

例10.9

設(shè)標簽對象“Label1”是表單“Welcome.scx”中的一個控件對象,請用WITH…ENDWITH命令為“l(fā)abel1”設(shè)置多個屬性。

WITHWelcome.label1

.Width=600

.height=40

.top=60

.left=.Width/2

.FontName=“華文新魏”

.ForeColor=RGB(255,0,0)

.BackStyle=0

ENDWITH10.2.3引用對象

在面向?qū)ο蟮某绦蛟O(shè)計中,常常需要引用對象,或引用對象的屬性、事件及方法程序。引用時,根據(jù)路徑的書寫格式,將引用分為相對引用和絕對引用。

1.對象的相對引用規(guī)則

對象的相對引用常用表示對象的三個關(guān)鍵詞來進行。這些關(guān)鍵詞及其所表示的意義如下:

●?ThisFormSet:當前表單集。

●?ThisForm:當前表單。

●?This:當前對象。引用的格式為:

KeyWord.Object.Property|.Event|.Method

例如,如果表單“Welcom.scx”是當前表單對象,則下面的語句表示設(shè)置該表單的標簽控件Label1的標題Caption屬性。

ThisForm.Label1.Caption=“奧運連五洲,四海皆朋友!”

如果標簽控件Label1是當前控件,則上句也可簡寫為:

This.Caption="奧運連五洲,四海皆朋友!"

2.對象的絕對引用規(guī)則

所謂對象的絕對引用,是指引用路徑不采用上述表示對象的關(guān)鍵字,而是直接給出各層次的對象名的引用方式。其格式為:

Parent.Object.Property|.Event|.Method

例如,若上面的例子用絕對引用給出,則應(yīng)寫為:

Welcome.Label1.Caption=“奧運連五洲,四海皆朋友!”

3.對象方法程序的調(diào)用

前面已經(jīng)給出了無返回值的對象的方法程序的調(diào)用格式。對于有返回值的對象方法程序調(diào)用,應(yīng)按函數(shù)調(diào)用格式進行——只要在對象的方法程序名字之后加上一對圓括號即可,如果方法程序系帶參數(shù)調(diào)用,則參數(shù)應(yīng)寫在圓括號內(nèi)。例如,下面的語句將把用戶自定義的GetNewCaption方法程序的返回值設(shè)置成表單的標題:

ThisForm.Caption=ThisForm.GetNewCaption()

又如,下面的語句將把實參n傳遞給方法程序Show的代碼:

ThisForm.Show(n)

例10.10

顯示表單“Welcome”,并將焦點設(shè)置在文本框text1上。

Welcome.show

ThisForm.Text1.SetFocus練習(xí)十

一、選擇題

1.下面關(guān)于面向?qū)ο蟮臄⑹鲋?,錯誤的是()。

A)每個對象在系統(tǒng)中都有唯一的對象標識

B)事件作用于對象,對象識別事件并做出相應(yīng)反應(yīng)

C)一個子類能夠繼承其父類所有的屬性、方法和事件

D)一個父類包括其所有子類的屬性、方法和事件

2.對于創(chuàng)建新類,VFP提供的工具有()。

A)類設(shè)計器和報表設(shè)計器

B)類設(shè)計器和表單設(shè)計器

C)類設(shè)計器和查詢設(shè)計器

D)類設(shè)計器

3.在VFP中,當對象方法或事件代碼在運行過程中產(chǎn)生錯誤時將引發(fā)的事件是()。

A)?Load

B)?Init

C)?Destroy

D)?Error

4.“類”是面向?qū)ο蟪绦蛟O(shè)計的關(guān)鍵部分,創(chuàng)建新類不正確的方法是()。

A)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論