程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi 日歷實現教程+代碼分析

Delphi 日歷實現教程+代碼分析

編輯:Delphi

這是一個具有查找日期、星期和推算功能的程序。當點擊“開始查詢”按鈕後,在右邊的文本編輯框中可以輸入年份、月份和日期,左邊的日歷中就會顯示出這一天在日歷上所對應的部位,並且可以查出這一天是星期幾。窗體右邊的年份、月份和日期文本編輯框中的數字可以通過按鈕進行調整。

設計思想:
本程序主要利用Delphi 6.0 的Calendar 控件實現日歷顯示功能。這是一個很常用的控件,它可以計算出從公元1 年到公元9999 年當中的任何一年的任何一天是星期幾。同時該程序還利用到了一個重要的控件SpinButton,該控件有兩個微調按鈕,一個是帶有向上箭頭的按鈕,另一個是帶有向下箭頭的按鈕,它能夠對整型數值進行加1 和減1 的方便處理。在該程序中,我們還將學習到如何利用MainMenu 控件為程序添加菜單。

設計步驟:

本Delphi日歷中首先為窗體添加各種合適的控件。然後通過編寫年份、月份和日期文本編輯框的Change 事件代碼,實現靈活改變窗體左邊日歷的功能。然後編寫SpinButton 控件的兩個微調按鈕的向上移動OnUpClick 和向下移動OnDownClick 兩個事件的代碼。最後添加窗體的菜單,並為菜單添加相應代碼。

1.新建工程
(1)啟動Delphi 6.0 程序。選擇“文件”菜單下的“新建”命令,從彈出的子菜單中選擇Application 選項,則出現新建工程的Form1 窗口。
(2)選擇“文件”菜單下的“工程另存為”命令,彈出Save Unit1 As 對話框。在“保存在”列表框中選擇需要存放該窗口文件所在的目錄名;在“文件名”編輯框中填寫文件名,這裡填寫“Unit1”,點擊“保存”按鈕,保存上面的選項。
(3)執行上一步後,將彈出“工程另存為”對話框。在“保存在”列表框中選擇需要存放該工程的目錄名,最好和第(2)步選取相同的目錄;在“文件名”編輯框中填寫保存處理該工程的源代碼的文件名,這裡填寫“Project1”,點擊“保存”按鈕,保存上面的選項。

2.修改窗口
(1)激活Form1 窗口,在“屬性”中設置該窗體的Caption 屬性為“萬年歷”,Color屬性設置為“clBtnFace”。
(2)在構件選項板上選擇Samples 頁上的Calendar 選項,將鼠標移到窗口中點擊,生成Calendar 控件,用鼠標調整其合適的大小和在窗體上的位置。在“屬性”中設置其Color 屬性為ClYellow,用鼠標點擊Font 屬性,從其選項列表中設置Color 屬性為clBlue,Name 為Calendar。Samples 頁上的構件是Delphi 中自定義組件的樣本,包括計量表、顏色、網格和日歷網格等,並提供源代碼供參考。
(3)選擇“標准”頁上的Edit 選項,在窗體中添加三個Edit 文本編輯框,調整其合適的大小和位置。選擇“編輯”菜單下的“對齊”命令,選擇合適的選項對齊這些控件。在“屬性”中設置Color 屬性為ClYellow,用鼠標點擊Font 屬性,從其選項列表中設置Color 屬性為clBlue,Name 分別為Edit1、Edit2 和Edit3。
(4)在構件選項板上選擇Samples 頁上的SpinButton 選項,將鼠標移到窗口中點擊,生成SpinButton 控件,本例共添加三個SpinButton 控件,分別將其放置在Edit 控件的右邊合適的位置。
(5)選擇“標准”頁上的Button 選項,在窗體中合適的位置添加Button 控件,在“屬性”中設置其Caption 屬性為“開始查詢”。
(6)選擇“標准”頁上的MainMenu 選項,在窗體中點擊添加MainMenu 控件,雙擊該控件,進入菜單編輯窗口,如下圖(左圖)所示,設計合適的菜單。添加控件後的窗體如圖(右圖)所示。

 Delphi日歷實現教程

代碼分析:

(1)在程序中,計算某天是星期幾的過程都是在Calendar 控件內部完成的,所以在編寫代碼時,該部分計算不予考慮,關鍵是把文本框中的年份、月份和日期數字傳遞給Calendar 即可。

procedure TForm1.Edit1Change(Sender: TObject);//改變年份
begin
Form1.Calendar1.Year:=strtoint(Form1.Edit1.Text);
end;
procedure TForm1.Edit2Change(Sender: TObject);//改變月份
begin
Form1.Calendar1.Month:=strtoint(Form1.Edit2.Text);
end;
procedure TForm1.Edit3Change(Sender: TObject); //改變日期
begin
Form1.Calendar1.Day:=strtoint(Form1.Edit3.Text);
end;

(2)接著編寫SpinButton 的微調按鈕的響應事件,SpinButton 控件有兩個微調按鈕,一個是帶有向上箭頭的按鈕,另外一個是帶有向下箭頭的按鈕,在編寫程序代碼時需要對它們分別進行處理。值得注意的是,在文本框中顯示的數值為String 類型,而SpinButton控件能夠處理的僅為整型數值,所以先要用strtoint()函數將Edit 控件中的文本轉換為整型數值,然後再用inttostr()函數將整型數值轉換為文本才能夠在文本框中顯示。下面以年份的SpinButton 控件為例說明:

procedure TForm1.SpinButton1DownClick(Sender: TObject);//年份減1
begin
if(strtoint(Form1.Edit1.Text)>1) then
Form1.Edit1.Text:=inttostr(strtoint(Form1.Edit1.Text)-1);
Form1.Calendar1.PrevYear;
end;
procedure TForm1.SpinButton1UpClick(Sender: TObject);//年份加1
begin
if(strtoint(Form1.Edit1.Text)<9999) then
Form1.Edit1.Text:=inttostr(strtoint(Form1.Edit1.Text)+1);
Form1.Calendar1.NextYear;
end;

(3)下面為菜單添加相關代碼,當選擇“開始查詢”菜單時,程序中各個控件都處於激活狀態,同時給出一個初值,賦值給日歷:

procedure TForm1.B1Click(Sender: TObject);
begin
Form1.Calendar1.Enabled:=true; //查詢初始化
Form1.Edit1.Enabled:=true;
Form1.Edit2.Enabled:=true;
Form1.Edit3.Enabled:=true;
Form1.spinButton1.Enabled:=true;
Form1.spinButton2.Enabled:=true;
Form1.spinButton3.Enabled:=true;
Edit1.Text:=’1979’;//賦值初始日期
Edit2.Text:=’5’;
Edit3.Text:=’1’;
Form1.Calendar1.year:=strtoint(Form1.Edit1.Text);//初始日期查詢
Form1.Calendar1.month:=strtoint(Form1.Edit2.Text);
Form1.Calendar1.day:=strtoint(Form1.Edit3.Text);
end;

(4)當點擊菜單中的“退出”時,程序自動關閉退出,這只需要一個Close 即可實現:

procedure TForm1.E1Click(Sender: TObject); //退出
begin
close;
end;

(5)當點擊菜單中的“關於”時,程序給出相關信息,這裡用Messagedlg()函數來實現:

procedure TForm1.N1Click(Sender: TObject);
begin
messagedlg(’歡迎使用李氏萬年歷※愛媛工作室※ 2011 年’,mtinFormation,
[mbok],0);
end;

(6)窗體中Button 的點擊事件和菜單中“開始查詢”功能相同,不需為該Button 控件添加代碼,只需在“屬性”面板中“事件”頁中設置Onclick 事件為“開始查詢”菜單的點擊事件即可,本例中為B1Click。

vIEw source print? 001 //完整代碼: 002 unit Unit1; 003 interface 004 uses 005 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 006 Grids, Calendar, Spin, ExtCtrls, StdCtrls, Menus; 007 type 008 TForm1 = class(TForm) 009 Button1: TButton; 010 SpinButton1: TSpinButton; 011 SpinButton2: TSpinButton; 012 SpinButton3: TSpinButton; 013 Calendar1: TCalendar; 014 MainMenu1: TMainMenu; 015 F1: TMenuItem; 016 B1: TMenuItem; 017 E1: TMenuItem; 018 Edit1: TEdit; 019 Edit2: TEdit; 020 Edit3: TEdit; 021 H1: TMenuItem; 022 N1: TMenuItem; 023 procedure Edit1Change(Sender: TObject); 024 procedure Edit2Change(Sender: TObject); 025 procedure Edit3Change(Sender: TObject); 026 procedure SpinButton1DownClick(Sender: TObject); 027 procedure SpinButton2DownClick(Sender: TObject); 028 procedure SpinButton1UpClick(Sender: TObject); 029 procedure SpinButton2UpClick(Sender: TObject); 030 procedure SpinButton3DownClick(Sender: TObject); 031 procedure SpinButton3UpClick(Sender: TObject); 032 procedure B1Click(Sender: TObject); 033 procedure E1Click(Sender: TObject); 034 procedure N1Click(Sender: TObject); 035 { Private declarations } 036 public 037 { Public declarations } 038 end; 039 var 040 Form1: TForm1; 041 implementation 042 {$R *.DFM} 043 procedure TForm1.Edit1Change(Sender: TObject);//改變年份 044 begin 045 Form1.Calendar1.Year:=strtoint(Form1.Edit1.Text); 046 end; 047 procedure TForm1.Edit2Change(Sender: TObject);//改變月份 048 begin 049 Form1.Calendar1.Month:=strtoint(Form1.Edit2.Text); 050 end; 051 procedure TForm1.Edit3Change(Sender: TObject); //改變日期 052 begin 053 Form1.Calendar1.Day:=strtoint(Form1.Edit3.Text); 054 end; 055 procedure TForm1.SpinButton1DownClick(Sender: TObject);//年份減1 056 begin 057 if(strtoint(Form1.Edit1.Text)>1then 058 Form1.Edit1.Text:=inttostr(strtoint(Form1.Edit1.Text)-1); 059 Form1.Calendar1.PrevYear; 060 end; 061 procedure TForm1.SpinButton1UpClick(Sender: TObject);//年份加1 062 begin 063 if(strtoint(Form1.Edit1.Text)<9999then 064 Form1.Edit1.Text:=inttostr(strtoint(Form1.Edit1.Text)+1); 065 Form1.Calendar1.NextYear; 066 end; 067 procedure TForm1.SpinButton2DownClick(Sender: TObject); //月份減1 068 begin 069 if(strtoint(Form1.Edit2.Text)>1then 070 Form1.Edit2.Text:=inttostr(strtoint(Form1.Edit2.Text)-1); 071 Form1.Calendar1.prevmonth; 072 end; 073 procedure TForm1.SpinButton2UpClick(Sender: TObject);//月份加1 074 begin 075 if(strtoint(Form1.Edit2.Text)<12then 076 Form1.Edit2.Text:=inttostr(strtoint(Form1.Edit2.Text)+1); 077 Form1.Calendar1.NextMonth; 078 end; 079 procedure TForm1.SpinButton3DownClick(Sender: TObject); //日期減1 080 begin 081 if(strtoint(Form1.Edit3.Text)>1then 082 Form1.Edit3.Text:=inttostr(strtoint(Form1.Edit3.Text)-1); 083 end; 084 procedure TForm1.SpinButton3UpClick(Sender: TObject);//日期加1 085 begin 086 if(strtoint(Form1.Edit3.Text)<31then 087 Form1.Edit3.Text:=inttostr(strtoint(Form1.Edit3.Text)+1); 088 end; 089 procedure TForm1.B1Click(Sender: TObject);//查詢初始化 090 begin 091 Form1.Calendar1.Enabled:=true; 092 Form1.Edit1.Enabled:=true; 093 Form1.Edit2.Enabled:=true; 094 Form1.Edit3.Enabled:=true; 095 Form1.spinButton1.Enabled:=true; 096 Form1.spinButton2.Enabled:=true; 097 Form1.spinButton3.Enabled:=true; 098 Edit1.Text:=’1979’;//賦值初始日期 099 Edit2.Text:=’5’; 100 Edit3.Text:=’1’; 101 Form1.Calendar1.year:=strtoint(Form1.Edit1.Text);//初始日期查詢 102 Form1.Calendar1.month:=strtoint(Form1.Edit2.Text); 103 Form1.Calendar1.day:=strtoint(Form1.Edit3.Text); 104 end; 105 procedure TForm1.E1Click(Sender: TObject); //退出 106 begin 107 close; 108 end; 109 procedure TForm1.N1Click(Sender: TObject); 110 begin 111 messagedlg(’歡迎使用李氏萬年歷※愛媛工作室※2011 年’,mtinFormation,[mbok],0); 112 end; 113 end.
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved