摘要:本文用Delphi實現一個經典程序,著重于對編程設計思想的分析和討論,并詳細介紹了整個編程過程及代碼實現步驟,對Delphi程序的編程設計思想和教學中應強調的若干問題進行了探討。
關鍵詞:Delphi;經典程序;編程思想;教學探討
中圖分類號:TP311文獻標識碼:A 文章編號:1009-3044(2008)20-30289-03
Teaching Research in Using Delphi to Complete A Classical Program
JIAN Yun
(Computer Science Department, Guizhou Police Officer Vocational College, Guiyang 550005, China)
Abstract: This paper makes use of Delphi to complete a classical program, analyses mosetly the principle of program design, and provides a detailed explanation of the whole procedures of program design and code compilation, also discusses the principle of program design of Delphi and the important problems of Delphi in teaching.
Key words: Delphi; Classical program; Principle of program design; Teaching research
1 程序界面設計
該程序只使用了一個窗體,如圖1所示。
在Delphi集成開發環境中創建一個窗體,并將該窗體的Name屬性設置為frmInterface(即將該窗體命名為frmInterface),同時將其Caption屬性設置為Interface。
接下來在窗體中添加兩個ListBox控件,分別設置其Name屬性為lstLeft和lstRight,并將lstLeft的Items屬性設置為{1,2,3,4,5,6,7};添加一個Button控件,設置其Name屬性為btnExit,并設置其Caption屬性為“退出”;添加四個SpeedButton控件,分別設置其Name屬性為spbRight、spbLeft、spbAllRight、spbAllLeft,并將其Glyph屬性分別設置為不同的箭頭圖片,且將其Caption屬性全部清空。
這里將lstLeft的Items屬性(項目列表屬性)設置為{1,2,3,4,5,6,7},其設計思想,是想先對列表框lstLeft的Items屬性進行靜態設置,然后在程序代碼中再對另一個列表框lstRight的Items屬性進行動態設置。
需要注意的是,對控件和變量的命名,必須遵循一定的命名規則[1-3]。從上面可以看出,我們對以上每個控件的命名都是嚴格按照命名規則進行的。這是程序開發中最基本的要求,然而也是課堂教學中經常容易被忽略的問題,對此應當引起必要的重視,要讓學生養成良好的命名習慣。
2 程序功能設計
(1)程序啟動時自動將lstRight的Items屬性動態設置為{8,9,10,11,12,13,14,15,16},并將spbRight和spbLeft的初始狀態設置為不可用;(2)將左列表框中的所有項目移到右列表框中;(3)將右列表框中的所有項目移到左列表框中;(4)當左列表框中有項目被選中時,spbRight按鈕變為可用;當右列表框中有項目被選中時,spbLeft按鈕變為可用;(5)將左列表框中選中的項目移到右列表框中;(6)將右列表框中選中的項目移到左列表框中;(7)將左列表框中選中的項目移到右列表框中之后,spbRight變為不可用;(8)將右列表框中選中的項目移到左列表框中之后,spbLeft變為不可用;(9)當左列表框中有項目時spbAllRight可用,否則spbAllRight不可用;(10)當右列表框中有項目時spbAllLeft可用,否則spbAllLeft不可用;(11)點擊“退出”按鈕btnExit時,結束整個程序。
3 程序的代碼實現
3.1 實現第一項功能
這項功能要求程序啟動時自動實現lstRight的Items屬性的動態設置,并同時設置spbRight和spbLeft的初始狀態為不可用。
實際上,當程序啟動時,程序首先要做的,就是創建frmInterface窗體并將它顯示出來。因此,我們可以在frmInterface窗體的創建事件中實現這一功能。即在frmInterface窗體的OnCreate事件中,添加如下代碼:
var
i : integer;
begin//將lstRight的Items屬性動態設置為{8,9,10,11,12,13,14,15,16}
for i := 0 to 8 do
begin
lstRight.Items[i] := inttostr(i+8);
end;
spbRight.Enabled := 1;//將spbRight和spbLeft按鈕設置為不可用
spbLeft.Enabled := 1;
end;
這里的編程思路是使用一個循環,給lstRight的Items屬性循環賦值,從而實現該項功能。實現該功能后程序的運行結果如圖2所示。
3.2 實現第二項功能
編程思路是,當點擊spbAllRight按鈕時,程序通過一個循環將左列表框中的項目逐項循環添加到右列表框中,每當添加一項到右列表框中之后,馬上將左列表框中的該項刪除。
因此,在spbAllRight按鈕的OnClick事件中添加如下代碼,即可實現這項功能:
var
i : integer;
begin
for i:=0 to lstLeft.Items.Count-1 do
begin //將lstLeft第1項添至lstRight
lstRight.Items.Add(lstLeft.Items[0]);
lstLeft.Items.Delete(0);
end;
end;
3.3 實現第三項功能
該功能的實現與第二項功能完全相似,其編程思路是,當點擊spbAllLeft按鈕時,使右列表框中的所有項目逐項循環添加到左列表框中,每添加一項到左列表框中之后,立即刪除右列表框中已被添加到左列表框中去的項目。即在spbAllLeft按鈕的OnClick事件中,添加類似第二項功能的代碼即可。
3.4 實現第四項功能
這項功能應該分別放在左列表框lstLeft和右列表框lstRight的鼠標單擊事件中加以實現。方法如下:
在左列表框lstLeft的OnClick事件中,添加如下代碼:
spbRight.Enabled := true;//將spbRight按鈕設置為可用
在右列表框lstRight的OnClick事件中,添加如下代碼:
spbLeft.Enabled := true;//將spbLeft按鈕設置為可用
3.5 實現第五項功能
該功能僅要求將左列表框中已被選中的項目移到右列表框中,沒有選中的項目不移動。其編程思路是,當點擊spbRight按鈕時,將左列表框中已被選中的項目逐個循環添加到右列表框中,然后將左列表框中所有已被選中的項目刪除。
在spbRight按鈕的OnClick事件中,添加如下代碼,即可實現該功能:
var
i : integer;
begin
IF lstLeft.ItemIndex <> -1 then //如果lstLeft中存在有項目
Begin//將lstLeft中已被選中的所有項目循環添加到lstRight中
for i := 0 to lstLeft.Items.Count-1 do
begin//如果lstLeft的第i項被選中,則將它添加到lstRight中
if lstLeft.Selected[i] = true then
lstRight.Items.Add(lstLeft.Items[i]);
end;
lstLeft.DeleteSelected; //刪除lstLeft中已被選中的所有項目
end;
end;
3.6 實現第六項功能
該功能的實現與第五項功能完全相似,其編程思路是,當點擊spbLeft按鈕時,將右列表框中已被選中的項目逐個循環添加到左列表框中,然后將右列表框中所有已被選中的項目刪除。即在spbLeft按鈕的OnClick事件中,添加類似第五項功能的代碼即可。
3.7 實現第七項功能
這項功能要求,當點擊spbRight按鈕將左列表框中選中的項目移到右列表框中去之后,要將spbRight按鈕設置為不可用。要實現該功能,只需在spbRight按鈕的OnClick事件中添加如下代碼即可:
spbRight.Enabled := 1; //將spbRight按鈕設置為不可用
3.8 實現第八項功能
這項功能的實現與第七項功能完全相似,只需在spbLeft按鈕的OnClick事件中,添加如下代碼即可:
spbLeft.Enabled := 1;//將spbLeft按鈕設置為不可用
3.9 實現第九、十項功能
實現這兩項功能的關鍵,是要正確判斷在左列表框lstLeft和右列表框lstRight中是否有項目存在。若lstLeft中沒有項目,則spbAllRight應設置為不可用,反之應設置為可用;若lstRight中沒有項目,則spbAllLeft應設置為不可用,反之應設置為可用。
仔細分析可發現,左列表框中沒有項目存在的情況,只可能出現在以下事件發生之后:
①frmInterface窗體的OnCreate事件;
②spbRight按鈕的OnClick事件;
③spbAllRight按鈕的OnClick事件。
而右列表框中沒有項目存在的情況,則只可能出現在以下事件發生之后:
①frmInterface窗體的OnCreate事件;
②spbLeft按鈕的OnClick事件;
③spbAllLeft按鈕的OnClick事件。
其中,frmInterface窗體的OnCreate事件是兩種情況共有的。因此只要分別在上述五個事件中添加如下代碼,即可實現第九、第十這兩項功能:
if lstLeft.Items.Count = 0 then//若lstLeft中無項目,則spbRight和spbAllRight不可用,否則spbAllRight可用
begin
spbAllRight.Enabled := 1;
spbRight.Enabled := 1;
end
else
begin
spbAllRight.Enabled := true;
end;
if lstRight.Items.Count = 0 then//若lstRight中無項目,則spbLeft和spbAllLeft不可用,否則spbAllLeft可用
begin
spbAllLeft.Enabled := 1;
spbLeft.Enabled := 1;
end
else
begin
spbAllLeft.Enabled := true;
end;
3.10 實現第十一項功能
在“退出”按鈕btnExit的OnClick事件中,添加如下代碼即可:
application.Terminate;//退出應用程序
4 應強調的幾個問題
除前面已強調的對變量和控件的命名必須遵循命名規則,以使學生養成良好的命名習慣外,在教學中還應強調以下幾個問題:
4.1 源代碼的書寫必須要求符合規范[2]
Delphi源代碼的書寫規則,主要有二點要求:一是分級縮進,下一級代碼相對于上一級代碼應該縮進二個空格的位置。二是begin…end配對,begin和end應該配對輸入,并且相應的end子句必須縮進到與相應的begin子句相對應的位置。
在編寫程序代碼時,要求學生必須嚴格遵守代碼書寫規則,否則會使代碼書寫混亂,可讀性差,且容易出錯。本文所寫的源代碼格式,可供學生參考。
4.2 必須給源代碼加注釋
在課堂教學中,必須讓學生養成給源代碼加注釋的良好習慣,這應該作為一個教學原則來要求,不可忽視。這樣可使編寫的源代碼容易讀懂,易于維護。
4.3 對于幾個模塊共用的代碼段,應該寫成一個通用過程或函數,在各模塊中只需調用這個通用過程或函數即可
比如本文實現第九、十項功能的代碼段,就是由frmInterface窗體的OnCreate事件,以及spbRight、spbAllRight、spbLeft、spbAllLeft四個按鈕的OnClick事件等五個模塊共用的。因此,該代碼段就應該寫成一個通用過程,供五個模塊共同調用。這樣就能精簡代碼,減小程序的代碼量。
5 結束語
實踐證明,學生在編程開發中經常出現的問題,主要集中在三個方面:一是編程思想不明確,思路模糊不清,提不出解決問題的設想和方案;二是編程格式混亂,包括不遵循命名規則,源代碼書寫不符合規范,代碼不加注釋等;三是在不同模塊中大量編寫重復代碼段,使得所編程序的代碼量過大,沒有養成使用通用過程或函數來精簡代碼的良好習慣。
在教學中,以上這些問題應該從一開始就嚴格要求和訓練,并將其作為教學原則,貫穿于整個教學過程之中。這樣做,對于訓練學生的編程設計思想,提高學生的編程開發能力,增強學生的就業競爭力,具有不可低估的作用。
參考文獻:
[1] [美]Bob Reselman,Richard Peasley. 實用Visual Basic 6教程[M]. 何健輝 等,譯. 北京: 清華大學出版社,2001. 47-49.78-81.
[2] 王惠剛,唐晨光,彭為. Delphi7/8程序設計基礎教程與上機指導[M]. 北京: 清華大學出版社,2004. 86-93.
[3] 劉宏昆,等. Delphi應用技巧與常見問題你問我答[M]. 北京: 機械工業出版社, 2003. 11.
注:“本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文。”