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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

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

1.對(duì)象

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

1)名稱(Name)

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

2)屬性(Property)

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

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

3)方法(Method)

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

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

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

4)事件(Event)

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

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

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

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

一個(gè)對(duì)象可以有許多隸屬于它的事件,這些事件的名字卻事先都是由系統(tǒng)規(guī)定好的。事件的代碼稱之為事件程序。從面向?qū)ο蟮睦碚摽?,事件和方法既然同是?duì)象的行為和動(dòng)作,那么二者從本質(zhì)上講應(yīng)該是相同的,都是執(zhí)行某個(gè)程序??梢园咽录闯上到y(tǒng)事先定義的空方法(沒(méi)有代碼的方法),既可在事件中調(diào)用用戶自定義的方法,也可在用戶自定義的方法中激活特定的事件。

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

2.類

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

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

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

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

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

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

3)基類(BaseClass)

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

3.類的三大特性

1)繼承(Inheritance)

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

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

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

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

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

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

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

2)封裝(Encapsulation)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1.基類

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

基類。

1)容器類基類

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

2)控件類基類

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

2.基礎(chǔ)類

VFP9.0的基類中包含了近百個(gè)基礎(chǔ)類,它們?nèi)恳灶悗?kù)的形式分布在14個(gè)類庫(kù)中。系統(tǒng)的可視類庫(kù)保存在系統(tǒng)安裝目錄的“\Ffc\”文件夾中。用戶可以利用類設(shè)計(jì)器或類瀏覽器打開這些可視類中所包含的類,觀察其類的結(jié)構(gòu)、屬性和代碼。圖10.2給出了可視類庫(kù)“_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項(xiàng),列出系統(tǒng)提供的所有向?qū)ь悾鐖D10.3所示。圖10.3向?qū)ь?0.1.4屬性、事件與方法程序

1.常用的對(duì)象屬性

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

2.對(duì)象的常見(jiàn)事件

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

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

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

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

Object.Event

例如,若在某個(gè)程序代碼中有

Command1.Click

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

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

VFP9.0提供了100多個(gè)方法程序供用戶在編程時(shí)使用。

10.2類和對(duì)象的基本操作

10.2.1設(shè)計(jì)類

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

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

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

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

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

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

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

【命令格式】

CREATECLASSLIBClassLibraryName

【功能】

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

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

ClassLibraryName:指定要?jiǎng)?chuàng)建的可視類庫(kù)的名字。

例10.1

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

CREATECLASSLIBmyclasslib

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

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

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

例10.2

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

S1:打開“新建類”對(duì)話框。→→“類”→【新建文件】↓

新建類。

在“新建類”對(duì)話框中:

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

●“派生于”組合框:提供了VFP9.0所有的基類的名字供選擇,這里選擇(或直接輸入)“CommandButton”?!瘛按鎯?chǔ)于”文本框:指定要存儲(chǔ)到類庫(kù)的名字,這里輸入(或通過(guò)右側(cè)的另存為按鈕…選擇)“myclasslib.vcx”。結(jié)果如圖10.4所示。

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

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

【命令格式】

CREATECLASSClassName[OFClassLibraryName1]

[AScBaseClassName[FROMClassLibraryName2]]

[NOWAIT]

【功能】

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

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

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

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

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

例10.3

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

CREATECLASSMyCommand1OFmyclasslibAS“CommandButton”

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

3)

使用項(xiàng)目管理器打開類設(shè)計(jì)器

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

S1:打開“新建類”對(duì)話框。在項(xiàng)目管理器中→“類”→【新建】。

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

3.新建類的屬性

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

例10.4

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

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

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

新建屬性。在“新建屬性”對(duì)話框中有以下幾項(xiàng)選項(xiàng):

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

②可視性:該列表框下有如下三個(gè)選項(xiàng)。

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

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

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

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

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

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

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

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

4.新建類的方法程序

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

例10.5

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

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

S2:打開“新建方法程序”對(duì)話框?!邦悺薄靶陆ǚ椒ǔ绦颉薄陆ǚ椒ǔ绦颉T凇靶陆ǚ椒ǔ绦颉睂?duì)話框中有以下幾項(xiàng)選項(xiàng):

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

②可視性:該列表框下有如下三個(gè)選項(xiàng)。

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

●保護(hù)(Protected):表示不能為對(duì)象實(shí)例所訪問(wèn),但可為子類所訪問(wèn)。

●隱藏(Hidden):表示既不能為對(duì)象實(shí)例所訪問(wèn),也不能為子類所訪問(wèn)。

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

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

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

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

5.編輯類的屬性和方法

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

例10.6

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

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

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

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

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

【命令格式】

MODIFYCLASSClassName[OFClassLibraryName1]

[AScBaseClassName[FROMClassLibraryName2]]

[NOWAIT][METHODMethodName][SAVE]

【功能】

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

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

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

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

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

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

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

MODIFYCLASSmycommandOFmyclasslibMETHODmydisplay

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

display方法編輯事件代碼。

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

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

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

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

1.打開可視類庫(kù)

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

【命令格式】

SETCLASSLIBTOClassLibraryName

[INAPPFileName|EXEFileName][ADDITIVE][ALIASAliasName]

【命令功能】

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

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

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

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

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

SETCLASSLIBTOmyclasslibALIASMyCntrls

2.生成對(duì)象實(shí)例

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

【函數(shù)格式】

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

【函數(shù)功能】

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

【參數(shù)說(shuō)明】

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

注意:通常將該函數(shù)返回的對(duì)象引用賦給某個(gè)變量,然后通過(guò)這個(gè)變量來(lái)標(biāo)識(shí)對(duì)象、訪問(wèn)對(duì)象屬性及調(diào)用對(duì)象方法。

例10.7

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

myButton=CREATEOBJECT(“myCommand”)

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

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

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

1)可擦寫類屬性

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

2)

保護(hù)類屬性

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

3)

隱藏性屬性

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

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

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

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

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

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

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

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

1)

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

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

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

S2:在表單窗口選中某個(gè)對(duì)象作為當(dāng)前對(duì)象。

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

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

2)

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

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

屬性。為對(duì)象的某個(gè)屬性賦值的格式為:

ParentObject.Object.Property=Value

例10.8

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

myButton.Caption=“顯示”

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

WITHParentObject.Object

.Property1=Valie1

.Property2=Valie2

ENDWITH

例10.9

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

WITHWelcome.label1

.Width=600

.height=40

.top=60

.left=.Width/2

.FontName=“華文新魏”

.ForeColor=RGB(255,0,0)

.BackStyle=0

ENDWITH10.2.3引用對(duì)象

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

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

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

●?ThisFormSet:當(dāng)前表單集。

●?ThisForm:當(dāng)前表單。

●?This:當(dāng)前對(duì)象。引用的格式為:

KeyWord.Object.Property|.Event|.Method

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

ThisForm.Label1.Caption=“奧運(yùn)連五洲,四海皆朋友!”

如果標(biāo)簽控件Label1是當(dāng)前控件,則上句也可簡(jiǎn)寫為:

This.Caption="奧運(yùn)連五洲,四海皆朋友!"

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

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

Parent.Object.Property|.Event|.Method

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

Welcome.Label1.Caption=“奧運(yùn)連五洲,四海皆朋友!”

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

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

ThisForm.Caption=ThisForm.GetNewCaption()

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

ThisForm.Show(n)

例10.10

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

Welcome.show

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

一、選擇題

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

A)每個(gè)對(duì)象在系統(tǒng)中都有唯一的對(duì)象標(biāo)識(shí)

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

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

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

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

A)類設(shè)計(jì)器和報(bào)表設(shè)計(jì)器

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

C)類設(shè)計(jì)器和查詢?cè)O(shè)計(jì)器

D)類設(shè)計(jì)器

3.在VFP中,當(dāng)對(duì)象方法或事件代碼在運(yùn)行過(guò)程中產(chǎn)生錯(cuò)誤時(shí)將引發(fā)的事件是()。

A)?Load

B)?Init

C)?Destroy

D)?Error

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

A)

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論