《Delphi程序設(shè)計(jì)實(shí)訓(xùn)教程》課件第9章_第1頁(yè)
《Delphi程序設(shè)計(jì)實(shí)訓(xùn)教程》課件第9章_第2頁(yè)
《Delphi程序設(shè)計(jì)實(shí)訓(xùn)教程》課件第9章_第3頁(yè)
《Delphi程序設(shè)計(jì)實(shí)訓(xùn)教程》課件第9章_第4頁(yè)
《Delphi程序設(shè)計(jì)實(shí)訓(xùn)教程》課件第9章_第5頁(yè)
已閱讀5頁(yè),還剩141頁(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)介

第9章系教工參考書(shū)借閱管理系統(tǒng)

—MDI窗體、菜單及工具欄

9.1系教工參考書(shū)借閱管理系統(tǒng)案例分析

9.2相關(guān)知識(shí)點(diǎn)

9.3系統(tǒng)實(shí)現(xiàn)

9.4案例總結(jié)

9.1系教工參考書(shū)借閱管理系統(tǒng)案例分析

在前面的開(kāi)發(fā)中,我們將數(shù)據(jù)庫(kù)連接、數(shù)據(jù)表和數(shù)據(jù)源等運(yùn)行期不可見(jiàn)的組件都放在了窗體設(shè)計(jì)界面中。這樣做,雖然調(diào)用比較直觀,但是卻為窗體布局設(shè)計(jì)帶來(lái)了麻煩,并且也不利于數(shù)據(jù)的統(tǒng)一管理,而且前面的應(yīng)用程序每一個(gè)功能都是一個(gè)單獨(dú)的窗體,不像我們平時(shí)使用的軟件,沒(méi)有菜單的統(tǒng)一控制,也沒(méi)有工具欄的快捷操作,使用起來(lái)不是很方便。在本章中,我們將引入數(shù)據(jù)模塊窗體、菜單、工具欄、狀態(tài)欄以及MDI的結(jié)構(gòu)來(lái)完善系教工參考書(shū)借閱管理系統(tǒng)。

9.2相關(guān)知識(shí)點(diǎn)

本章案例涉及的主要知識(shí)點(diǎn)有:

●數(shù)據(jù)模塊;

●MDI窗體;

●操作列表與圖像列表;

●菜單設(shè)計(jì);

●工具欄;

狀態(tài)欄。

9.2.1數(shù)據(jù)模塊

在編寫(xiě)數(shù)據(jù)應(yīng)用程序時(shí),有時(shí)很多組件、窗體同時(shí)訪問(wèn)相同的數(shù)據(jù)源,如果為每一個(gè)組件或者窗體都設(shè)置一個(gè)數(shù)據(jù)源將十分浪費(fèi)時(shí)間;而且將數(shù)據(jù)源等運(yùn)行期不可見(jiàn)的組件和運(yùn)行期的可視組件放在一起,往往顯得比較雜亂,給設(shè)計(jì)窗體工作帶來(lái)了不必要的麻煩。因此,我們引入了數(shù)據(jù)模塊的概念,可以方便地對(duì)數(shù)據(jù)源進(jìn)行管理。數(shù)據(jù)模塊是用來(lái)集中管理數(shù)據(jù)源的一個(gè)窗體,該窗體可在需要的地方隨時(shí)引入。

創(chuàng)建數(shù)據(jù)模塊的常用方法:?jiǎn)螕簟癋ile”→“New”→“DataModule”,如圖9.1所示。

此時(shí)將創(chuàng)建一個(gè)新的數(shù)據(jù)模塊,如圖9.2所示。數(shù)據(jù)模塊窗體名為“DataModule1”,保存文件名為“DataModule.pas”。在以后的設(shè)計(jì)中都將通過(guò)數(shù)據(jù)模塊窗體名來(lái)引用其中的數(shù)據(jù)組件。從外觀上看,數(shù)據(jù)模塊就是一個(gè)窗體,在它上面可以放置非可視組件,在模塊窗體中創(chuàng)建數(shù)據(jù)組件對(duì)象的方法與在其他窗體中的創(chuàng)建方法相同,可用對(duì)象監(jiān)視器設(shè)定這些組件和窗體本身的屬性,也可以響應(yīng)一些事件。

圖9.1創(chuàng)建數(shù)據(jù)模塊

圖9.2新建的數(shù)據(jù)模塊

圖9.3數(shù)據(jù)模塊上單擊鼠標(biāo)右鍵后彈出的菜單

表9-1各常用菜單項(xiàng)的含義

圖9.4數(shù)據(jù)模塊及其上面的組件

了解了數(shù)據(jù)模塊,我們就可以使用數(shù)據(jù)模塊存放非可視組件了。例如,我們?cè)谛陆⒌臄?shù)據(jù)模塊DataModule1上面放置一個(gè)Database組件、兩個(gè)Table組件以及兩個(gè)DataSource組件。

數(shù)據(jù)模塊DataModule1如圖9.4所示。

五個(gè)組件的屬性設(shè)置如表9-2所示(表格是示意性的,與我們要開(kāi)發(fā)的管理系統(tǒng)無(wú)關(guān))。

表9-2數(shù)據(jù)模塊上五個(gè)組件的屬性

圖9.5數(shù)據(jù)模塊的對(duì)象樹(shù)狀圖

在數(shù)據(jù)模塊上單擊鼠標(biāo)右鍵,選擇“ViewasText”項(xiàng),就會(huì)自動(dòng)調(diào)出該模塊的單元文件:

objectDataModule1:TDataModule1

OldCreateOrder=False

Left=382

Top=383

Height=331

Width=334

objectDatabase1:TDatabase

AliasName='MYMSSQL1'

Connected=True

DatabaseName='testdb'

SessionName='Default'

Left=16

Top=16

end

objectTable1:TTable

DatabaseName='testdb'

TableName='authors'

Left=16

Top=72

end

objectTable2:TTable

DatabaseName='testdb'

TableName='jobs'

Left=16

Top=128

end

objectDataSource1:TDataSource

DataSet=Table1

Left=80

Top=72

end

objectDataSource2:TDataSource

DataSet=Table2

Left=80

Top=128

end

end9.2.2

MDI窗體

MDI是英文MultipleDocumentInterface的縮寫(xiě),表示多文檔的界面。MDI結(jié)構(gòu)包括一個(gè)主窗體和若干個(gè)子窗體。可以方便地在各個(gè)子窗體之間切換,并且共用一套菜單。最典型的應(yīng)用MDI結(jié)構(gòu)的軟件是Microsoft的Office系列軟件。

因此,一個(gè)MDI結(jié)構(gòu)至少應(yīng)包括兩種類(lèi)型的窗體:一個(gè)是“父窗體”,其FormStyle屬性為fsMDIForm;另一個(gè)是“子窗體”,其FormStyle屬性為fsMDIChild。

在Delphi中實(shí)現(xiàn)MDI并不復(fù)雜,因?yàn)镈elphi已經(jīng)把所有與實(shí)現(xiàn)MDI有關(guān)的特性集成于TForm類(lèi)中,通過(guò)對(duì)TForm類(lèi)的屬性和方法的設(shè)置及調(diào)用可開(kāi)發(fā)功能強(qiáng)大的MDI程序。

1.建立MDI父窗體

每個(gè)MDI結(jié)構(gòu)都有其父窗體,子窗體只能顯示在父窗體中。父窗體還能控制子窗體的激活、排列和關(guān)閉等操作。一個(gè)MDI結(jié)構(gòu)只能有一個(gè)父窗體,但可以有多個(gè)子窗體,子窗體的類(lèi)型可以是不同的。

可以把項(xiàng)目中任意一個(gè)窗體的FormStyle屬性指定為fsMDIForm。但是,如果沒(méi)有同時(shí)把這個(gè)窗體指定為程序的主窗體,編譯時(shí)將出現(xiàn)錯(cuò)誤信息。默認(rèn)的主窗體是在程序中創(chuàng)建的第一個(gè)窗體。也就是說(shuō),如果不是在程序中創(chuàng)建的第一個(gè)窗體,則一定要先指定為主窗體。這里我們把Form2指定為主窗體,然后設(shè)置Form2的FormStyle屬性為fsMDIForm,如圖9.6所示。這樣我們就設(shè)定父窗體為Form2。

圖9.6設(shè)置主窗體的FormStyle屬性

2.建立子窗體

首先要在項(xiàng)目中創(chuàng)建一個(gè)新的窗體,單擊“File”→“NewForm”或直接在工具欄上單擊“NewForm”按鈕。然后將對(duì)象監(jiān)視器中新窗體的FormStyle屬性指定為fsMDIChild。

MDI子窗體都有一些公共的屬性和功能。有時(shí),為了簡(jiǎn)化設(shè)置,所有其他的MDI子窗體都從一個(gè)共同的MDI子窗體繼承而來(lái)。

如MDI子窗體的的關(guān)閉方式默認(rèn)為縮小而非關(guān)閉,即單擊子窗體右上角的關(guān)閉按鈕時(shí)是最小化而非被關(guān)閉。在此我們希望所有的子窗體的關(guān)閉方式是真正關(guān)閉而非最小化,所以我們可以創(chuàng)建一個(gè)共同的MDI子窗體,來(lái)實(shí)現(xiàn)這種關(guān)閉方式。

首先新建一個(gè)窗體,并設(shè)置其“Name”屬性為“MDIChild”,對(duì)應(yīng)文件名為“childwin.pas”,然后設(shè)置其FormStyle屬性為fsMDIChild。接著在該窗體的Close事件處理代碼中加入如下代碼:

procedureTMDIChild.FormClose(Sender:TObject);

begin

Action:=caFree;//關(guān)閉窗體并釋放空間

end;

由于其他的子窗體是從“MDIChild”窗體繼承而來(lái)的,因此要將在其他子窗體代碼中(假設(shè)該子窗體名為Form1)的定義類(lèi)型下的TForm1=class(TForm)語(yǔ)句修改為:

TForm1=class(TMDIChild)

3.Form中有關(guān)MDI窗體的其他屬性和方法

ActiveMDIChild屬性

該屬性記錄當(dāng)前聚焦的子窗體。它是只讀的屬性,因而不能通過(guò)對(duì)它賦值的方法改變當(dāng)前的聚焦子窗體。

MDIChildCount屬性

該屬性記錄子窗體的個(gè)數(shù)。

MDIChildren屬性

該屬性保存了父窗體中的所有子窗體類(lèi),它是一個(gè)數(shù)組屬性,其下標(biāo)為整數(shù)類(lèi)型,表示各子窗體的索引,元素類(lèi)型為T(mén)Form,記錄著子窗體的類(lèi)實(shí)例。在MDIChildren數(shù)組中,子窗體的順序與其生成的順序正好相反,即MDIChildren[0]返回最后生成的子窗體類(lèi),而MDIChildren[MDIChildCount-1]則返回第一個(gè)生成的子窗體類(lèi)。

ArrangeIcons方法

該方法用于排列最小化的子窗體圖標(biāo),使得它們整齊排列且不互相重疊,如圖9.7所示。

圖9.7MDI窗體的ArrangeIcons方法

Cascade方法

該方法用于排列MDI子窗體,讓所有的子窗體重疊顯示,后面的窗體都只能見(jiàn)到其標(biāo)題欄,如圖9.8所示。

圖9.8MDI窗體的Cascade方法

9.2.3操作列表與圖像列表

1.操作列表(ActionList)

我們使用的大多數(shù)軟件都具有下拉菜單、彈出菜單、工具欄和快捷鍵。通過(guò)下拉菜單、彈出菜單、工具欄和快捷鍵可以執(zhí)行同一個(gè)功能。如在MicrosoftWord中對(duì)文本的復(fù)制,可以在下拉菜單上單擊“編輯”→“復(fù)制”命令;可以單擊鼠標(biāo)右鍵,在彈出的菜單中單擊“復(fù)制”命令;可以在工具欄上單擊“復(fù)制”按鈕;還可以使用快捷鍵“Ctrl+C”等。它們都是執(zhí)行同一個(gè)操作,只是我們選擇的操作方式不同而已。在這種情況下,如果我們?yōu)槊恳环N操作方式都編寫(xiě)一段程序,只會(huì)增加程序響應(yīng)事件的代碼,且沒(méi)有太大的必要。

因此,我們引入了操作列表的概念。操作列表(ActionList)類(lèi)似于一個(gè)個(gè)子程序的有序組合,可以將菜單和按鈕的Action屬性綁定到操作列表中的某個(gè)操作。當(dāng)單擊菜單或按鈕時(shí)就執(zhí)行該操作。

Delphi為我們提供了多類(lèi)標(biāo)準(zhǔn)的操作,使用這些操作可以大大簡(jiǎn)化編程。操作列表位于組件面板Standard選項(xiàng)卡上,如圖9.9所示。

圖9.9操作列表

在窗體上創(chuàng)建一個(gè)操作列表對(duì)象,然后雙擊該對(duì)象,會(huì)出現(xiàn)如圖9.10所示的對(duì)話框。

在空白處單擊鼠標(biāo)右鍵,在彈出菜單中有兩項(xiàng),即“NewAction”和“NewStandardAction...”。前一項(xiàng)用于用戶自定義操作,后一項(xiàng)用于引用標(biāo)準(zhǔn)操作。在此,我們要引用標(biāo)準(zhǔn)操作,所以選擇“NewStandardAction...”,則出現(xiàn)如圖9.11所示的對(duì)話框。

圖9.10操作列表編輯對(duì)話框

圖9.11標(biāo)準(zhǔn)操作對(duì)話框

2.圖像列表(ImageList)

圖像列表用于管理菜單項(xiàng)和工具欄的圖標(biāo)。圖像列表是一些圖像的集合,可以通過(guò)索引或者關(guān)鍵字引用該集合中的每個(gè)對(duì)象。圖像列表不能獨(dú)立使用,它只是向其他組件提供圖像的容器。圖像列表組件位于組件面板Win32選項(xiàng)卡上,如圖9.12所示。

圖9.12圖像列表

圖9.13圖像列表對(duì)話框

9.2.4菜單

1.菜單的概念

面向用戶的應(yīng)用程序一般都少不了菜單,在菜單中幾乎集合了軟件的所有功能,并能按照類(lèi)型將其系統(tǒng)組織起來(lái),呈現(xiàn)在用戶面前,使用起來(lái)非常方便。

菜單是應(yīng)用程序?yàn)橛脩粼L問(wèn)程序提供的快捷方式,是不可缺少的組件。在Delphi中,菜單被封裝在TMainMenu(主菜單)與TPopupMenu(彈出式菜單)類(lèi)中。合理地設(shè)計(jì)菜單,可以將應(yīng)用程序中的各種命令進(jìn)行分類(lèi)組織,從而避免將多個(gè)命令放置在窗體上造成操作界面雜亂。

一般菜單分為兩級(jí)結(jié)構(gòu)。窗體標(biāo)題欄下顯示的是菜單欄,菜單欄包含若干主菜單選項(xiàng),單擊每一個(gè)主菜單選項(xiàng)可打開(kāi)一個(gè)下拉菜單,其中包含若干菜單命令。有些菜單命令還有級(jí)聯(lián)菜單,以級(jí)聯(lián)的方式顯示在該菜單命令的右邊,依次排列,直至最后一級(jí)級(jí)聯(lián)菜單。帶有級(jí)聯(lián)菜單的菜單命令通常在命令最右邊有一個(gè)向右的三角符號(hào)。Windows資源管理器的“查看”菜單結(jié)構(gòu)如圖9.14所示。

圖9.14主菜單結(jié)構(gòu)

圖9.15彈出式菜單結(jié)構(gòu)

在我們?cè)O(shè)計(jì)菜單時(shí),級(jí)聯(lián)菜單級(jí)聯(lián)的級(jí)數(shù)最好不要超過(guò)4級(jí)。如果不愿使用級(jí)聯(lián)菜單,可將菜單中一些菜單命令歸納為一組,并在菜單命令組之間用分隔線來(lái)分隔。

當(dāng)某個(gè)菜單命令項(xiàng)被選中后,一般來(lái)說(shuō)其作用有如下3種:

(1)執(zhí)行命令:用于執(zhí)行某操作的菜單命令,它們沒(méi)有特殊的指示符號(hào)。

(2)設(shè)置狀態(tài):用于設(shè)置或取消設(shè)置的菜單命令,通常用來(lái)改變某特殊選項(xiàng)的狀態(tài),這些命令常用復(fù)選標(biāo)記“√”或單選標(biāo)記“●”來(lái)表明該選項(xiàng)是否處于選中狀態(tài)。在選中狀態(tài)下,再次選中該命令將產(chǎn)生相反的效果。

(3)打開(kāi)對(duì)話框:用于打開(kāi)某個(gè)對(duì)話框。這些命令的右邊有一個(gè)省略號(hào),表示選中該命令將會(huì)彈出一個(gè)對(duì)話框。

2.主菜單設(shè)計(jì)

主菜單MainMenu組件的類(lèi)型為T(mén)MainMenu,用于設(shè)計(jì)下拉式主菜單,它管理整個(gè)主菜單的運(yùn)行和一些公共事件,這種類(lèi)型的菜單最為常見(jiàn)。MainMenu組件位于組件面板Standard選項(xiàng)卡上,如圖9.16所示。

圖9.16MainMenu組件

1)打開(kāi)主菜單設(shè)計(jì)器

設(shè)計(jì)主菜單首先要打開(kāi)主菜單設(shè)計(jì)器,其操作如下:

(1)在組件板的Standard選項(xiàng)卡中選擇MainMenu組件,把它添加到窗體上,此時(shí)窗體上將出現(xiàn)一個(gè)MainMenu圖標(biāo)。

(2)執(zhí)行如下操作之一,將打開(kāi)主菜單設(shè)計(jì)器:

●雙擊窗體中的MainMenu組件圖標(biāo)。

●右擊MainMenu組件,打開(kāi)一個(gè)快捷菜單,再?gòu)闹羞x擇MenuDesigner命令。

選定MainMenu組件,再在對(duì)象查看器中單擊Items屬性值編輯框右邊的省略號(hào)按鈕。

圖9.17主菜單設(shè)計(jì)器

2)菜單命令項(xiàng)的添加

首先添加菜單,選中主菜單設(shè)計(jì)器中的空白菜單,然后直接輸入菜單名或利用對(duì)象查看器中的Caption屬性設(shè)置菜單名。例如,要添加“系統(tǒng)”菜單,可輸入“&S系統(tǒng)”,如圖9.18所示?!?”用于設(shè)置菜單的快捷鍵,“&”后的字符就是快捷鍵名,可用“Alt+快捷鍵名”組合鍵來(lái)打開(kāi)菜單或執(zhí)行菜單命令。例如按下“Alt+S”組合鍵即可打開(kāi)“系統(tǒng)”菜單。

添加菜單項(xiàng)后,我們將看到所添加的菜單的底部和右側(cè)各有一個(gè)虛框,表示可以在這些位置增加菜單項(xiàng)。

單擊新添加的菜單底部或右側(cè)的虛框,此時(shí)該虛框?qū)⒓恿?,表示獲得輸入焦點(diǎn),即可利用對(duì)象查看器設(shè)置菜單命令項(xiàng)名和快捷鍵。

圖9.18設(shè)置Caption屬性

圖9.19主菜單項(xiàng)

3)為菜單添加分隔線

如果一個(gè)菜單中的菜單命令過(guò)多,可以按功能將菜單命令分為若干組,組與組之間用分隔線隔開(kāi)。在Delphi中,可以通過(guò)菜單設(shè)計(jì)器來(lái)為菜單添加分隔線,菜單分隔線也是一項(xiàng)菜單命令,在對(duì)象查看器中設(shè)置Caption屬性為“-”(減號(hào)),就可以在菜單中顯示一條分隔線了。效果如圖9.20所示。

注意:菜單分隔線的Caption屬性只能為一個(gè)“-”(減號(hào))。

4)創(chuàng)建級(jí)聯(lián)菜單

級(jí)聯(lián)菜單是指菜單項(xiàng)中還有下一級(jí)子菜單。一個(gè)菜單可以有多級(jí)級(jí)聯(lián)菜單。

要?jiǎng)?chuàng)建級(jí)聯(lián)菜單,可以先在菜單設(shè)計(jì)器中選中一個(gè)菜單項(xiàng),然后單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇CreateSubMenu命令(或直接按下Ctrl+→鍵)。此時(shí),該菜單命令旁就會(huì)出現(xiàn)一個(gè)右向三角形和一個(gè)空白的級(jí)聯(lián)菜單。向級(jí)聯(lián)菜單的各菜單命令的Caption屬性中輸入標(biāo)題,就創(chuàng)建了一個(gè)級(jí)聯(lián)菜單,如圖9.21所示。

圖9.21創(chuàng)建級(jí)聯(lián)菜單

5)調(diào)整菜單命令項(xiàng)

創(chuàng)建完菜單后,經(jīng)常會(huì)在已有菜單命令項(xiàng)之間插入新的菜單命令項(xiàng),刪除不需要的菜單命令項(xiàng),調(diào)整菜單命令項(xiàng)的排列等情況,這就是下面要介紹的菜單命令調(diào)整。

(1)如果要在現(xiàn)有菜單命令項(xiàng)之前插入新的菜單命令項(xiàng),可在該菜單命令項(xiàng)上單擊鼠標(biāo)右鍵,打開(kāi)一個(gè)快捷菜單,從中選擇“Insert”命令。

(2)如果要?jiǎng)h除現(xiàn)有菜單命令項(xiàng),可在該菜單命令項(xiàng)上單擊鼠標(biāo)右鍵,打開(kāi)一個(gè)快捷菜單,從中選擇“Delete”命令。

(3)如果要調(diào)整現(xiàn)有菜單命令項(xiàng)的排列情況,可選擇要調(diào)整的菜單命令項(xiàng),按住并拖動(dòng)鼠標(biāo)到所需位置再釋放鼠標(biāo)。

注意:刪除一個(gè)菜單后,該菜單下的所有級(jí)聯(lián)菜單命令將同時(shí)被刪除;移動(dòng)一個(gè)菜單后,該菜單下的所有級(jí)聯(lián)菜單命令隨之移動(dòng)。

6)為菜單命令項(xiàng)添加熱鍵

在大部分應(yīng)用程序中我們都使用過(guò)像Ctrl+C(復(fù)制)、Ctrl+X(剪切)和Ctrl+V(粘貼)之類(lèi)的熱鍵。熱鍵和快捷鍵不同,快捷鍵必須在打開(kāi)當(dāng)前的菜單后才能執(zhí)行,而熱鍵可以不打開(kāi)當(dāng)前的菜單。而且,菜單欄中的主菜單項(xiàng)只能有快捷鍵,不能有熱鍵。所謂熱鍵,就是指在不打開(kāi)菜單的情況下,直接使用預(yù)先設(shè)置的組合鍵,執(zhí)行某個(gè)菜單命令。設(shè)置菜單命令的熱鍵,只要在對(duì)象查看器中單擊該菜單命令的ShortCut屬性,打開(kāi)一個(gè)下拉列表框,從中選擇想要設(shè)定的熱鍵名稱即可。

圖9.22設(shè)置熱鍵后的菜單項(xiàng)

注意:雖然Delphi菜單的熱鍵可以任意設(shè)置,但真正的商業(yè)軟件必須謹(jǐn)慎考慮其熱鍵的設(shè)置。首先,許多軟件共有的常用命令一般都有固定的熱鍵,如F1是幫助,Ctrl+S是保存,Ctrl+Z是撤消等,這些功能的熱鍵不宜隨便設(shè)置成其他功能熱鍵,否則使用起來(lái)會(huì)很不習(xí)慣。其次,如果是一些使用非常頻繁的熱鍵,不應(yīng)該設(shè)置為較難操作的熱鍵,如

Ctrl+Alt+…或Shift+Alt+…等。另外,熱鍵中的字母最好與功能所對(duì)應(yīng)的英文單詞有聯(lián)系,例如是其中的某個(gè)字母等,這樣有助于記憶。

7)單選菜單和復(fù)選菜單

單選菜單是指在程序中一次只能選中一組菜單項(xiàng)中的一個(gè)菜單。要想將菜單設(shè)置為單選菜單樣式,只需在菜單設(shè)計(jì)器中選中一個(gè)菜單項(xiàng),然后在對(duì)象查看器中設(shè)置RadioItem屬性和Checked屬性為T(mén)rue即可,如圖9.23所示。

復(fù)選菜單是指可以有多個(gè)菜單項(xiàng)同時(shí)被選中,可以先在菜單設(shè)計(jì)器中選中一個(gè)菜單項(xiàng),然后再設(shè)置對(duì)象查看器中的Checked屬性為T(mén)rue,RadioItem屬性為False,如圖9.24所示。

圖9.23單選菜單

圖9.24復(fù)選菜單

8)為菜單添加圖標(biāo)

為菜單添加圖標(biāo),可以通過(guò)圖像列表進(jìn)行添加。首先在圖像列表中添加圖標(biāo)。添加完畢后在對(duì)象查看器中將主菜單圖標(biāo)的Images屬性設(shè)置為該圖像列表對(duì)象,然后選擇一個(gè)要添加圖標(biāo)的菜單項(xiàng),如“連接”和“斷開(kāi)連接”菜單,通過(guò)ImageIndex屬性為該菜單項(xiàng)指定一個(gè)圖標(biāo)索引,如圖9.25所示。

圖9.25為菜單添加圖標(biāo)

3.彈出式菜單設(shè)計(jì)

彈出式菜單PopupMenu組件實(shí)際上是窗體的快捷菜單,其顯示的位置不受菜單欄的約束,可以自由地定義。彈出式菜單是指在窗體或組件上單擊鼠標(biāo)右鍵時(shí)在該位置上彈出的以待選擇的菜單。彈出式菜單可以更方便地操作和便于某些命令的選取,在此將介紹如何創(chuàng)建和設(shè)計(jì)彈出式菜單。

彈出式菜單被封裝在TPopupMenu類(lèi)中。彈出式菜單的設(shè)置方法與主菜單基本相同,也是使用菜單設(shè)計(jì)器來(lái)完成的。彈出式菜單PopupMenu組件位于組件面板Standard選項(xiàng)卡上,如圖9.26所示。

圖9.26PopupMenu組件

設(shè)計(jì)彈出式菜單時(shí),先在組件面板的Standard選項(xiàng)卡中選取PopupMenu組件,將其添加到窗體中,然后雙擊PopupMenu組件,就可以打開(kāi)彈出式菜單設(shè)計(jì)器了。其設(shè)計(jì)過(guò)程與主菜單設(shè)計(jì)完全相同,這里不再重復(fù)。

注意:設(shè)計(jì)完彈出式菜單后,必須把彈出式菜單名稱(PopupMenu組件的Name屬性)賦給使用該彈出式菜單的組件的PopupMenu屬性;否則,Delphi不會(huì)自動(dòng)設(shè)置,運(yùn)行時(shí)也不能激活該菜單。這一點(diǎn)與MainMenu菜單不同。

如果有多個(gè)彈出式菜單,而且在不同的組件中打開(kāi),應(yīng)該在要打開(kāi)彈出式菜單的組件的PopupMenu屬性中指定要打開(kāi)的彈出式菜單名稱。例如:要在組件1(如Label1)中使用彈出式菜單1,應(yīng)在組件1的PopupMenu屬性中選擇要打開(kāi)的彈出式菜單1的名稱;在組件2(如Button1)中使用彈出式菜單2,應(yīng)在組件2的PopupMenu屬性中選擇要打開(kāi)的彈出式菜單2的名稱。

4.菜單命令的事件響應(yīng)

主菜單對(duì)應(yīng)于TMainMenu類(lèi),而每一項(xiàng)菜單和菜單命令都對(duì)應(yīng)于TMenuItem類(lèi)。這些TMenuItem類(lèi)都有自己的事件,用以響應(yīng)各菜單命令。比如需要菜單響應(yīng)單擊事件處理程序,可直接在菜單命令上單擊,將顯示代碼編輯窗口,在此窗口中輸入其單擊事件處理程序代碼。

彈出式菜單中菜單命令的響應(yīng),也是給菜單命令添加OnClick事件,通過(guò)事件響應(yīng)過(guò)程來(lái)實(shí)現(xiàn)菜單命令的功能。

5.運(yùn)行時(shí)設(shè)置菜單屬性

在應(yīng)用程序運(yùn)行時(shí),可以進(jìn)行一系列的操作來(lái)調(diào)整菜單結(jié)構(gòu)和外觀。如給菜單命令添加單選或復(fù)選標(biāo)記、使菜單命令灰色顯示、隱藏菜單命令等。

通常,有如下5種屬性可用于應(yīng)用程序運(yùn)行時(shí)設(shè)置菜單。

Checked屬性

該屬性可用于在運(yùn)行時(shí)給菜單命令添加復(fù)選標(biāo)記。

RadioItem屬性

該屬性可用于在運(yùn)行時(shí)給菜單命令添加單選標(biāo)記。

Enabled屬性

該屬性可用于在運(yùn)行時(shí)使菜單命令灰色顯示。

Caption屬性

該屬性可用于在運(yùn)行時(shí)調(diào)整菜單命令的文本。

Visible屬性

該屬性可用于在運(yùn)行時(shí)隱藏菜單命令。

9.2.5工具欄

工具欄ToolBar組件為用戶提供了應(yīng)用程序中最常用的菜單命令的快速訪問(wèn)方式,它位于菜單欄的下方,在工具欄上放置一些快捷按鈕,簡(jiǎn)單直觀,非常方便我們的使用。

工具欄被封裝在TToolBar類(lèi)中。工具欄ToolBar組件位于組件面板Win32選項(xiàng)卡上,如圖9.27所示。

圖9.27ToolBar組件

1.添加工具欄按鈕

添加工具欄按鈕的方法比較簡(jiǎn)單。首先在組件板的Win32選項(xiàng)卡中選擇ToolBar組件,把它添加到窗體上,此時(shí)窗體的菜單欄下方將出現(xiàn)一個(gè)空白工具欄。然后在空白工具欄上單擊鼠標(biāo)右鍵,此時(shí)將彈出一個(gè)快捷菜單,在快捷菜單中選擇“NewButton”或“NewSeparator”,可分別用于增加工具欄按鈕或分隔塊。添加完工具欄按鈕和分隔塊后的界面如圖9.28所示。

圖9.28添加工具欄按鈕和分隔塊

2.為工具欄按鈕添加圖標(biāo)

在Delphi中需要使用圖像列表為工具欄按鈕添加圖標(biāo)。雙擊ImageList1組件對(duì)象,在彈出的窗口中添加圖標(biāo),然后選擇ToolBar1組件對(duì)象,在對(duì)象查看器中設(shè)置Images屬性為ImageList1組件對(duì)象,選中某一個(gè)工具欄按鈕為其加入圖標(biāo)索引即可,如圖9.29所示。

圖9.29為工具欄按鈕添加圖標(biāo)

3.在工具欄按鈕上顯示標(biāo)題名稱

要設(shè)置并顯示工具欄按鈕上的標(biāo)題名稱,首先要選中工具欄,在對(duì)象查看器中設(shè)置工具欄組件的ShowCaption屬性為T(mén)rue,然后再單擊某個(gè)工具欄按鈕,設(shè)置其Caption屬性為按鈕標(biāo)題,如圖9.30所示。

圖9.30在工具欄按鈕上顯示標(biāo)題名稱

4.為工具欄設(shè)置提示信息

要為工具欄設(shè)置提示信息,首先要在工具欄中選中一個(gè)按鈕,在對(duì)象查看器中設(shè)置其ShowHint屬性為T(mén)rue,然后在Hint屬性中輸入所要提示的信息內(nèi)容。在最后運(yùn)行程序時(shí),只要鼠標(biāo)在該按鈕上停留片刻,在該工具欄按鈕上就會(huì)顯示提示信息。

5.調(diào)整工具欄風(fēng)格

每一個(gè)工具欄按鈕都有一個(gè)Style屬性,該屬性可以設(shè)置工具欄按鈕的風(fēng)格,其取值有如下五種:

●tbsButton:它的功能和SpeedButton組件類(lèi)似。

●tbsChekc:當(dāng)單擊按鈕時(shí),將顯示凹陷狀態(tài),再單擊一次即恢復(fù)原來(lái)的狀態(tài)。

●tbsDivider:出現(xiàn)一個(gè)垂直線顯示在工具欄上。

●tbsDropDown:出現(xiàn)一個(gè)下拉箭頭,用于下拉菜單。

tbsSeparator:出現(xiàn)一個(gè)空白區(qū)顯示在工具欄中,用于分隔按鈕。

6.工具欄的事件響應(yīng)

如果希望單擊工具欄時(shí)響應(yīng)某個(gè)命令,比如單擊“連接”按鈕時(shí)響應(yīng)“系統(tǒng)”菜單上的“連接”命令,這時(shí),我們就可以選中“連接”按鈕,在對(duì)象查看器中打開(kāi)Event選項(xiàng)卡,單擊該選項(xiàng)卡上的OnClick事件,然后在彈出的下拉列表中選擇“連接”菜單項(xiàng)的單擊事件,這樣可以使“連接”按鈕的單擊事件與“連接”菜單命令相關(guān)聯(lián)(即“連接”按鈕的單擊事件與“連接”菜單命令執(zhí)行相同的代碼)。如果希望“連接”按鈕與“連接”菜單命令執(zhí)行的代碼不同,則可以直接雙擊“連接”按鈕,在“連接”按鈕的OnClick事件處理過(guò)程中輸入需要執(zhí)行的代碼。

9.2.6狀態(tài)欄

在我們?cè)O(shè)計(jì)應(yīng)用軟件時(shí),狀態(tài)欄是必不可少的,比較典型的軟件如MicrosoftOffice,它一般出現(xiàn)在窗口的底部。狀態(tài)欄一般用來(lái)提示系統(tǒng)和對(duì)用戶有用的信息,如當(dāng)前系統(tǒng)日期、軟件版本、操作狀態(tài)等。在Delphi中可以利用StatusBar組件方便地創(chuàng)建狀態(tài)欄,StatusBar組件提供了一個(gè)長(zhǎng)方形的狀態(tài)欄,一般顯示在窗體的底部,也可以通過(guò)Align屬性決定使其顯示在其他位置。StatusBar組件位于組件面板的Win32選項(xiàng)卡上,如圖9.31所示。

圖9.31StatusBar組件

狀態(tài)欄的事件一般使用得較少,就不一一介紹了,在此主要說(shuō)明狀態(tài)欄的基本屬性。

Panels屬性

該屬性用于在狀態(tài)欄中添加、刪除和修改面板。

在對(duì)象查看器中單擊Panels屬性右側(cè)的省略號(hào)按鈕,將彈出“EditingStatusBar1.Panels”窗口,如圖9.32所示。單擊窗口中的“增加”按鈕,可在狀態(tài)欄中添加一個(gè)面板。

圖9.32Panels屬性的設(shè)置

SimplePanel屬性

該屬性為T(mén)rue時(shí),狀態(tài)欄只包含一個(gè)單面板;該屬性為False時(shí),將顯示多個(gè)面板。

SimpleText屬性

該屬性為T(mén)rue時(shí),該屬性中的字符串將顯示在狀態(tài)欄中。

AutoHint屬性

該屬性確定狀態(tài)欄的文本是否被自動(dòng)設(shè)置為當(dāng)前提示。首先在Hint屬性中輸入提示信息,如果AutoHint屬性設(shè)置為T(mén)rue,那么在系統(tǒng)運(yùn)行時(shí),只要鼠標(biāo)移到狀態(tài)欄上,狀態(tài)欄上就會(huì)自動(dòng)顯示Hint的屬性值;否則,當(dāng)鼠標(biāo)移到狀態(tài)欄上時(shí),狀態(tài)欄上不會(huì)有任何變化。

9.3系統(tǒng)實(shí)現(xiàn)

1.功能模塊的創(chuàng)建

在Delphi7中創(chuàng)建一個(gè)新的工程,工程名為“book1.dpr”。

1)數(shù)據(jù)模塊的創(chuàng)建

在菜單中單擊“File”→“New”→“DataModule”,這樣就在當(dāng)前工程中添加了一個(gè)數(shù)據(jù)模塊窗體,如圖9.33所示。修改數(shù)據(jù)模塊窗體的Name屬性為DM,保存文件名為“DM.pas”,在以后的設(shè)計(jì)中都將通過(guò)數(shù)據(jù)模塊窗體名“DM”來(lái)引用其中的數(shù)據(jù)組件。在模塊窗體中創(chuàng)建數(shù)據(jù)組件對(duì)象的方法與在其他窗體中創(chuàng)建的方法相同,組件對(duì)象必須放置在DM窗體中。本工程所要用到的數(shù)據(jù)組件如表9-3所示。

圖9.33數(shù)據(jù)模塊窗體

表9-3數(shù)據(jù)模塊窗體數(shù)據(jù)組件屬性表

表9-3數(shù)據(jù)模塊窗體數(shù)據(jù)組件屬性表表9-3數(shù)據(jù)模塊窗體數(shù)據(jù)組件屬性表表9-3數(shù)據(jù)模塊窗體數(shù)據(jù)組件屬性表

2)登錄窗體的創(chuàng)建

新建一個(gè)窗體,保存文件名為“f_login.pas”。本工程登錄窗體的布局和實(shí)現(xiàn)方式與第8章中的登錄窗體是差不多的,只是我們把相關(guān)的數(shù)據(jù)源ADOC1(ADOConnection)和t_user(ADOTable)等放在了數(shù)據(jù)模塊中,其屬性的設(shè)置見(jiàn)表9-3。用戶登錄的功能在“登錄”按鈕Button1的OnClick事件中完成,代碼如下:

procedureTf_login.Button1Click(Sender:TObject);

varpasswd,passwrd:string;

//用于保存密碼

begin

withDMdo //引用數(shù)據(jù)模塊

begin

try

adoc1.Open;

t_user.Filter:='ID='''+edit1.Text+'''';

t_user.Filtered:=True;

t_user.Open;

except

application.MessageBox('請(qǐng)與系統(tǒng)管理員聯(lián)系。','數(shù)據(jù)庫(kù)連接錯(cuò)誤',MB_OK);

application.Terminate;

end;

ift_user.RecordCount=1then

begin

passwd:=edit2.Text;

//用戶輸入的密碼

passwrd:=t_user['PASSWD'];//獲取數(shù)據(jù)庫(kù)里的密碼

if(passwrd=passwd)and(t_user['AUTHORITY']='0')then

f_main.login:=True//設(shè)置登錄狀態(tài)變?yōu)門(mén)rue

else

application.MessageBox('請(qǐng)確認(rèn)密碼!','密碼錯(cuò)誤',MB_OK);

end

else

application.MessageBox('請(qǐng)確認(rèn)用戶名!','用戶名錯(cuò)誤',MB_OK);

t_user.close;

//關(guān)閉用戶信息表

end;

iff_main.loginthenf_login.close;//登錄成功,關(guān)閉登錄窗口

end;

3)MDI主窗口的創(chuàng)建

新建一個(gè)窗體,保存文件名為“f_main.pas”。主窗體的布局如圖9.34所示,其中包括菜單、工具欄、狀態(tài)欄等組件。

圖9.34主窗體布局

操作列表的創(chuàng)建

在主窗體上創(chuàng)建一個(gè)ActionList對(duì)象,然后雙擊,即會(huì)出現(xiàn)操作列表的編輯界面。在此界面空白處單擊鼠標(biāo)右鍵,在彈出的菜單中選擇“NewStandardAction...”,引用Window的4項(xiàng)標(biāo)準(zhǔn)操作,如圖9.35所示

圖9.35操作列表編輯界面

表9-4操

圖像列表的創(chuàng)建

圖像列表用于管理菜單項(xiàng)的圖標(biāo)。在主窗體上創(chuàng)建一個(gè)ImageList對(duì)象,然后雙擊該對(duì)象,會(huì)出現(xiàn)如圖9.36所示的管理界面,導(dǎo)入相關(guān)的圖像,圖像下方的數(shù)字即是在菜單項(xiàng)ImageIndex中設(shè)置的值。

圖9.36圖像列表管理界面

菜單的創(chuàng)建

按照9.2.3節(jié)所講述的菜單創(chuàng)建的方法,創(chuàng)建如圖9.37所示的菜單,菜單屬性設(shè)置如表9-5所示。

圖9.37菜單設(shè)置窗口

表9-5菜

表9-5菜

工具欄的創(chuàng)建

我們利用工具欄組件設(shè)計(jì)工具欄,操作步驟如下:

(1)向窗體中添加一個(gè)工具欄組件對(duì)象——ToolBar1。在窗體上添加ToolBar1對(duì)象,并設(shè)置其Flat屬性為T(mén)rue,Images屬性為ImageList1。

(2)向工具欄中添加按鈕。用鼠標(biāo)右鍵單擊ToolBar1對(duì)象,打開(kāi)其快捷菜單,選擇NewButton命令,在工具欄上添加按鈕。如果要添加分隔塊,則選擇NewSeparator命令。最后在工具欄上添加了11個(gè)按鈕和4個(gè)分隔塊。工具欄上按鈕的屬性如表9-6所示。

表9-6工具欄上按鈕的屬性表9-6工具欄上按鈕的屬性圖9.38添加工具欄之后的窗體

狀態(tài)欄的創(chuàng)建

(1)添加狀態(tài)欄組件。在窗體中添加一個(gè)狀態(tài)欄——StatusBar1,再在StatusBar1對(duì)象上定義兩個(gè)面板,如圖9.39所示。其中第1個(gè)面板的Width屬性為500,用于顯示當(dāng)前登錄信息;第2個(gè)面板的Width屬性為50,用于顯示當(dāng)前時(shí)間。

圖9.39添加狀態(tài)欄之后的窗體

(2)向窗體中添加一個(gè)時(shí)鐘(TTimer)組件對(duì)象——Timer1,添加的時(shí)鐘組件將控制刷新?tīng)顟B(tài)欄中的時(shí)間信息。

//Timer1對(duì)象的OnTimer事件處理程序

procedureTForm1.Timer1Timer(Sender:TObject);

begin

StatusBar1.Panels[1].Text:=TimeToStr(time);

end;

4)主窗體的屬性設(shè)置

表9-7主窗體屬性設(shè)置

5)主窗體的事件處理程序

主窗體需要調(diào)用其他各窗體,因此uses子句中需包含以下項(xiàng)目的文件名:

About(關(guān)于窗體),f_login(登錄窗體),DM(數(shù)據(jù)模塊),f_infm(參考書(shū)信息維護(hù)窗體),f_jsdji(借書(shū)登記窗體),f_hsdj(還書(shū)登記窗體),f_xxcx(參考書(shū)信息查詢窗體),f_jyxx(借閱信息查詢窗體)。

在Public下設(shè)置變量login,用來(lái)判斷登錄是否成功。

public

{Publicdeclarations}

login:BOOLEAN;

在窗體的OnCreate事件處理程序中完成窗體的初始化操作。

procedureTf_main.FormCreate(Sender:TObject);

begin

login:=False; //設(shè)置登錄判斷為未連接

lianjie.Enabled:=True; //激活“連接”菜單

b_lianjie.Enabled:=True; //激活“連接”按鈕

dklianjie.Enabled:=False; //禁止“斷開(kāi)連接”菜單

b_dklianjie.Enabled:=False;//禁止“斷開(kāi)連接”按鈕

cksinfm.Enabled:=False;

//禁止“參考書(shū)信息維護(hù)”菜單

jsdj.Enabled:=False;

//禁止“借書(shū)登記”菜單

b_jsdj.Enabled:=False; //禁止“借書(shū)登記”按鈕

hsdj.Enabled:=False; //禁止“還書(shū)登記”菜單

b_hsdj.Enabled:=False;

//禁止“還書(shū)登記”按鈕

cksseach.Enabled:=False;//禁止“參考書(shū)信息查詢”菜單

b_cksseach.Enabled:=False;//禁止“參考書(shū)信息查詢”按鈕

jyseach.Enabled:=False;

//禁止“借閱信息查詢”菜單

b_jyseach.Enabled:=False;//禁止“借閱信息查詢”按鈕

statusbar1.Panels[0].Text:='沒(méi)有登錄服務(wù)器!請(qǐng)按F2登錄';

statusbar1.Panels[1].Text:=TimeToStr(time);

end;

6)各菜單的OnClick事件處理程序

各菜單的OnClick事件處理程序代碼如下:

procedureTf_main.lianjieClick(Sender:TObject);//連接菜單項(xiàng)的OnClick事件

begin

f_login.ShowModal;

//顯示登錄窗口

ifloginthen

//判斷是否認(rèn)證通過(guò)

begin

//設(shè)置各菜單和按鈕狀態(tài)

lianjie.Enabled:=False;

b_lianjie.Enabled:=False;

dklianjie.Enabled:=True;

b_dklianjie.Enabled:=True;

cksinfm.Enabled:=True;

jsdj.Enabled:=True;

b_jsdj.Enabled:=True;

hsdj.Enabled:=True;

b_hsdj.Enabled:=True;

cksseach.Enabled:=True;

b_cksseach.Enabled:=True;

jyseach.Enabled:=True;

b_jyseach.Enabled:=True;//修改狀態(tài)欄內(nèi)容

statusbar1.Panels[0].Text:='已經(jīng)連接到服務(wù)器:'+f_login.Edit1.Text;

statusbar1.Panels[1].Text:=TimeToStr(time);

end;

end;登錄之后,各個(gè)菜單和按鈕處于可使用狀態(tài),這時(shí)通過(guò)菜單或按鈕顯示相應(yīng)的子窗口,代碼如下:

procedureTf_main.cksinfmClick(Sender:TObject); //顯示參考書(shū)信息維護(hù)窗口

begin

application.CreateForm(Tf_infom,f_inform);//創(chuàng)建參考書(shū)信息維護(hù)子窗口

end;

procedureTf_main.A1Click(Sender:TObject); //顯示關(guān)于窗口

begin

AboutBox.ShowModal; //創(chuàng)建“關(guān)于”子窗口

end;

procedureTf_main.jsdjClick(Sender:TObject); //顯示借書(shū)登記窗口

begin

application.CreateForm(Tjsdj,jsdj);//創(chuàng)建借書(shū)登記子窗口

end;

procedureTf_main.hsdjClick(Sender:TObject); //顯示還書(shū)登記窗口

begin

application.createForm(Ths,hs);//創(chuàng)建還書(shū)登記子窗口

end;

procedureTf_main.cksseachClick(Sender:TObject); //顯示參考書(shū)信息查詢窗口

begin

application.CreateForm(Txxcx,xxcx);//創(chuàng)建參考書(shū)信息查詢子窗口

end;

procedureTf_main.jyseachClick(Sender:TObject); //顯示借閱信息查詢窗口

begin

application.CreateForm(Tjyxx,jyxx); //創(chuàng)建借閱信息查詢子窗口

end;

procedureTf_main.A1Click(Sender:TObject); //顯示關(guān)于窗口

begin

AboutBox.ShowModal; //創(chuàng)建“關(guān)于”子窗口

end;若要斷開(kāi)連接,則所有的子窗口要關(guān)閉,代碼如下:

procedureTf_main.dklianjieClick(Sender:TObject); //斷開(kāi)連接

var

i:integer; //變量說(shuō)明,用于循環(huán)

begin

fori:=MDIChildCount-1downto0do

f_main.MDIChildren[i].Close;//遍歷MDI子窗口

DM.ADOC1.Connected:=False;//斷開(kāi)數(shù)據(jù)庫(kù)連接

FormCreate(nil);

end;

procedureTf_main.X1Click(Sender:TObject);//關(guān)閉主窗口

begin

close;

end;

7)MDI子窗體的創(chuàng)建

首先創(chuàng)建一個(gè)子窗體,這個(gè)子窗體名為“MDIChild”,對(duì)應(yīng)的文件名為“childwin.pas”。設(shè)置FormStyle為“fsMDIChild”,并且在OnClose事件處理代碼中加入以下代碼:

procedureTMDIChild.FormClose(Sender:TObject;varAction:TCloseAction);

begin

Action:=caFree;

end;

參考書(shū)信息維護(hù)窗體的創(chuàng)建

參考書(shū)信息維護(hù)的窗體是從MDIChild繼承而來(lái),保存文件名為“f_infm.pas”。其布局與第8章的參考書(shū)信息維護(hù)的窗體類(lèi)似,只是需要的數(shù)據(jù)源組件放在了數(shù)據(jù)模塊DM中,其屬性見(jiàn)表9-3。窗體的布局如圖9.40所示,窗體中各組件對(duì)象屬性如表9-8所示。

圖9.40參考書(shū)信息維護(hù)窗體布局

表9-8參考書(shū)信息維護(hù)界面主要組件對(duì)象及屬性表

因?yàn)閰⒖紩?shū)信息維護(hù)的窗體是從MDIChild繼承而來(lái)的,所以Type類(lèi)型說(shuō)明部分把Tf_infm=class(Tform)改為T(mén)f_infm=class(TMDIChild)。

窗體需要用到MDI主窗體、數(shù)據(jù)模塊窗體、繼承MDIChild窗體,因此在Uses子句中需加入三項(xiàng):DM,f_main,childwin。創(chuàng)建窗體時(shí)系統(tǒng)會(huì)設(shè)置窗體的標(biāo)準(zhǔn)大小,所以需要在OnCreate中指定窗體的大小。創(chuàng)建窗體時(shí)還要將數(shù)據(jù)集DM.t_book打開(kāi),以便顯示“參考書(shū)信息維護(hù)”頁(yè)時(shí)數(shù)據(jù)表格中有參考書(shū)數(shù)據(jù)。窗體的OnCreate事件代碼如下:

procedureTf_infm.FormCreate(Sender:TObject);

begin

inherited;

//表示此窗體是繼承來(lái)的

f_main.cksinfm.Enabled:=False;

//禁止主窗口的菜單項(xiàng)cksinfm,若有與菜單對(duì)應(yīng)的按鈕,要禁止按鈕的使用

Width:=272; //設(shè)置窗口寬度

Height:=469; //設(shè)置窗口高度

WithDMdo

begin

ifnott_book.Activethent_book.Open;//打開(kāi)book表

end;

end;點(diǎn)擊“添加”按鈕,添加一條空白記錄。

procedureTf_infm.SpeedButton1Click(Sender:TObject);

begin

DM.t_book.Append;

end;

點(diǎn)擊“刪除”按鈕,刪除當(dāng)前記錄。刪除前需確認(rèn)一下。

procedureTf_infm.SpeedButton2Click(Sender:TObject);

begin

withDMdo

begin

ift_book.RecordCount=0then

exit;

ifapplication.MessageBox('是否確認(rèn)刪除此記錄?','刪除確認(rèn)',

MB_OKCANCEL)=IDOKthen

begin

t_book.Delete;

t_book.UpdateBatch;

end;

end;

end;點(diǎn)擊“保存”按鈕,保存當(dāng)前對(duì)數(shù)據(jù)的修改。

procedureTf_infm.SpeedButton3Click(Sender:TObject);

begin

DM.t_book.UpdateBatch;

end;

點(diǎn)擊“取消”按鈕,取消當(dāng)前對(duì)數(shù)據(jù)的修改。

procedureTf_infm.SpeedButton4Click(Sender:TObject);

begin

DM.t_book.CancelBatch;

end;關(guān)閉窗口時(shí)需要進(jìn)行一定的狀態(tài)修改。

procedureTf_infom.FormClose(Sender:TObj

溫馨提示

  • 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)論