下面我們將演示如何利用Delphi完成物料主文件維護的功能。在該子窗體中,可以實現對【物料主文件】數據表中數據的插入、編輯、刪除和浏覽、查詢等各項操作。
(1) 選擇New | Form菜單命令,新建一個窗體,將其Name屬性改為“materials”,並為其添加如圖3.34所示的控件。選擇Project | Options...菜單命令,將materials窗體從自動創建的窗體列表中刪除。
圖3.34 物料主文件維護窗體
(2) 各控件的屬性設置如表3.5所示。
圖片看不清楚?請點擊這裡查看原圖(大圖)。
表3.5 物料主文件維護窗體控件屬性設置
為確保數據的安全性和完整性,面板中的所有數據集控件(主要是指面板中顯示數據的文本框)都只有在編輯、新增等按鈕按下時才能進行修改,其他情況下都保持只讀狀態,在編寫程序時就將所有的DBEdit控件和Edit控件以及Memo控件的的ReadOnly屬性設置為True,在需要編輯數據時才在代碼中將其只讀去掉,後面的控件屬性表格中不再就此一一說明,請讀者特別注意。
(3) 另外,為使界面更加美觀,可以在窗體上放置一個ToolBar控件和兩個Pannel控件,將BitBtn控件放置在ToolBar上,並右擊ToolBar控件,在彈出的快捷菜單中選擇New Separator,添加分隔符,並將分割符的Style屬性設置為tbsDivider。將DataEdit控件和相應的標簽放在Pannel上。以上這些操作都不影響程序的功能,讀者可以參考配書光盤中提供的代碼自行設置。
(4) 為【物料主文件維護】窗體添加事件處理代碼,如下。
//-----------窗體顯示時,設置表中的列寬並初始化下拉列表框-----
procedure Tmaterials.FormShow(Sender: TObject);
begin
//設置列的寬度
dbgrid1.Columns[0].Width:=64;
dbgrid1.Columns[1].width:=80;
//設置計量單位下拉列表框中的內容
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('select distinct 計量單位 from 物料主文件');
adoquery1.Open;
while not adoquery1.Eof do
begin
dbcombobox1.Items.Add(adoquery1.fIEldbyname('計量單位').AsString);
adoquery1.Next;
end;
//設置計劃類別下拉列表框中的內容
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('select 類別名稱,類別代碼 from 物料計劃類別');
adoquery1.Open;
while not adoquery1.Eof do
begin
dbcombobox2.Items.Add(adoquery1.fIEldbyname('類別名稱').AsString);
dbcombobox3.Items.Add(adoquery1.fIEldbyname('類別代碼').AsString);
adoquery1.Next;
end;
end;
//-----------------顯示物料主文件中的物料類別的名稱--------------------
//-----------該事件在datasource1的events屬性中添加--------
procedure Tmaterials.DataSource1DataChange(Sender: TObject; Field: TFIEld);
var
num,temp:string;
begin
//showmessage(dbgrid1.FIElds[0].AsString);
//根據選取的數據記錄,查詢出它的詳細數據
num:=dbgrid1.FIElds[0].AsString;
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('select * from 物料主文件 where 物料編號='''+num+'''');
adoquery1.Open;
//顯示計劃類別的名稱(物料主文件中存儲的是其拼音編碼)
temp:=adoquery1.fIEldbyname('計劃類別').AsString;
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('select 類別名稱 from 物料計劃類別 where 類別代碼='''+temp+'''');
adoquery1.Open;
dbcombobox2.Text:=adoquery1.fIEldbyname('類別名稱').AsString;
end;
//--------------下一條記錄------------
procedure Tmaterials.BitBtn3Click(Sender: TObject);
begin
datasource1.DataSet.Next;
end;
//--------------上一條記錄------------
procedure Tmaterials.BitBtn2Click(Sender: TObject);
begin
datasource1.DataSet.Prior;
end;
//--------------首條記錄------------
procedure Tmaterials.BitBtn1Click(Sender: TObject);
begin
datasource1.DataSet.First;
end;
//--------------末條記錄------------
procedure Tmaterials.BitBtn4Click(Sender: TObject);
begin
datasource1.DataSet.Last;
end;
//---------點擊窗體的X形圖標時關閉窗體而不是最小化---------
procedure Tmaterials.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//當點擊子窗體的關閉按鈕時釋放關閉窗體,如果不設置這條代碼,將是最小化窗體而不是關閉
action:=cafree;
end;
//----------查詢表中的數據並顯示--------------------
procedure Tmaterials.BitBtn11Click(Sender: TObject);
begin
//查詢數據
adoquery2.Close;
adoquery2.SQL.Clear;
adoquery2.SQL.Add('select * from 物料主文件 where (物料編號 like ''%'+edit1.Text+'%'')and');
adoquery2.SQL.Add('(物料名稱 like ''%'+edit2.Text+'%'')and(拼音編碼 like ''%'+edit3.Text+'%'')');
adoquery2.Open;
//將查詢得到的數據通過clone命令復制到adotable中去
adotable1.Clone(adoquery2,ltUnspecifIEd);
end;
//---------在任何一個文本框上按enter鍵都能執行查詢---------
procedure Tmaterials.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if key=#13 then
bitbtn11.Click;
end;
procedure Tmaterials.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
if key=#13 then
bitbtn11.Click;
end;
procedure Tmaterials.Edit3KeyPress(Sender: TObject; var Key: Char);
begin
if key=#13 then
bitbtn11.Click;
end;
//------------新增一條記錄-----------------
procedure Tmaterials.BitBtn5Click(Sender: TObject);
begin
//在dbgrid中插入一行新的數據,並提示用戶在右邊文本框中修改
datasource1.DataSet.Insert;
showmessage('請在右邊的文本框中輸入新數據的詳細內容');
//為數據文本框設置默認值,防止用戶輸入錯誤數值類型或者對不能為空的列輸入空值
dbedit1.Text:='0000';
dbedit2.Text:='在此輸入物料名,該項不能為空';
dbedit9.Text:='0.00';
dbedit10.Text:='0.00';
dbedit11.Text:='0.00';
dbedit12.Text:='0.00';
dbedit19.Text:='0.00';
dbedit20.Text:='0.00';
dbedit21.Text:='0.00';
dbedit16.Text:='0';
dbedit17.Text:='0';
dbedit18.Text:='0';
dbedit23.Text:='10';
dbcombobox1.SelText:=dbcombobox1.Items.Strings[0];
dbcombobox3.SelText:=dbcombobox3.Items.Strings[0];
//物料主文件中存儲的是類別的拼音,而不是名稱,因此插入時需要輸入拼音而不是名稱
dbcombobox2.Visible:=false;
dbcombobox3.Visible:=true;
dbedit26.Text:='20040101';
//將插入、刪除、修改和移動按鈕關閉,防止錯誤操作
bitbtn6.Enabled:=false;
bitbtn7.Enabled:=false;
bitbtn1.Enabled:=false;
bitbtn2.Enabled:=false;
bitbtn3.Enabled:=false;
bitbtn4.Enabled:=false;
bitbtn5.Enabled:=false;
//允許保存或取消對數據所作的操作
bitbtn8.Enabled:=true;
bitbtn9.Enabled:=true;
//允許修改文本框中的內容
dbedit1.ReadOnly:=false;
dbedit2.ReadOnly:=false;
dbedit3.ReadOnly:=false;
dbedit4.ReadOnly:=false;
dbedit5.ReadOnly:=false;
dbedit6.ReadOnly:=false;
dbedit7.ReadOnly:=false;
dbedit8.ReadOnly:=false;
dbedit9.ReadOnly:=false;
dbedit10.ReadOnly:=false;
dbedit11.ReadOnly:=false;
dbedit12.ReadOnly:=false;
dbedit13.ReadOnly:=false;
dbedit14.ReadOnly:=false;
dbedit15.ReadOnly:=false;
dbedit16.ReadOnly:=false;
dbedit17.ReadOnly:=false;
dbedit18.ReadOnly:=false;
dbedit19.ReadOnly:=false;
dbedit20.ReadOnly:=false;
dbedit21.ReadOnly:=false;
dbedit22.ReadOnly:=false;
dbedit23.ReadOnly:=false;
dbedit24.ReadOnly:=false;
dbedit25.ReadOnly:=false;
dbedit26.ReadOnly:=false;
end;
//----------編輯一條已有的記錄--------------
procedure Tmaterials.BitBtn6Click(Sender: TObject);
begin
datasource1.DataSet.Edit;
//物料主文件中存儲的是類別的拼音,而不是名稱,因此插入時需要輸入拼音而不是名稱
dbcombobox2.Visible:=false;
dbcombobox3.Visible:=true;
//將插入、刪除、修改和移動按鈕關閉,防止錯誤操作
bitbtn6.Enabled:=false;
bitbtn7.Enabled:=false;
bitbtn1.Enabled:=false;
bitbtn2.Enabled:=false;
bitbtn3.Enabled:=false;
bitbtn4.Enabled:=false;
bitbtn5.Enabled:=false;
//允許保存或取消對數據所作的操作
bitbtn8.Enabled:=true;
bitbtn9.Enabled:=true;
//允許修改文本框中的內容
dbedit1.ReadOnly:=false;
dbedit2.ReadOnly:=false;
dbedit3.ReadOnly:=false;
dbedit4.ReadOnly:=false;
dbedit5.ReadOnly:=false;
dbedit6.ReadOnly:=false;
dbedit7.ReadOnly:=false;
dbedit8.ReadOnly:=false;
dbedit9.ReadOnly:=false;
dbedit10.ReadOnly:=false;
dbedit11.ReadOnly:=false;
dbedit12.ReadOnly:=false;
dbedit13.ReadOnly:=false;
dbedit14.ReadOnly:=false;
dbedit15.ReadOnly:=false;
dbedit16.ReadOnly:=false;
dbedit17.ReadOnly:=false;
dbedit18.ReadOnly:=false;
dbedit19.ReadOnly:=false;
dbedit20.ReadOnly:=false;
dbedit21.ReadOnly:=false;
dbedit22.ReadOnly:=false;
dbedit23.ReadOnly:=false;
dbedit24.ReadOnly:=false;
dbedit25.ReadOnly:=false;
dbedit26.ReadOnly:=false;
end;
//-----------刪除一條記錄------------------------
procedure Tmaterials.BitBtn7Click(Sender: TObject);
begin
if application.MessageBox('確實刪除記錄?該命令不可取消!','刪除記錄',MB_OKCANCEL)=IDOK then
datasource1.DataSet.Delete
else
abort;
end;
//--------取消操作--------------
procedure Tmaterials.BitBtn9Click(Sender: TObject);
begin
datasource1.DataSet.Cancel;
//在浏覽狀態下,顯示的是類別的名稱
dbcombobox3.Visible:=false;
dbcombobox2.Visible:=true;
//將插入、刪除、修改和移動按鈕打開
bitbtn6.Enabled:=true;
bitbtn7.Enabled:=true;
bitbtn1.Enabled:=true;
bitbtn2.Enabled:=true;
bitbtn3.Enabled:=true;
bitbtn4.Enabled:=true;
bitbtn5.Enabled:=true;
bitbtn8.Enabled:=false;
bitbtn9.Enabled:=false;
//不允許修改文本框中的內容
dbedit1.ReadOnly:=true;
dbedit2.ReadOnly:=true;
dbedit3.ReadOnly:=true;
dbedit4.ReadOnly:=true;
dbedit5.ReadOnly:=true;
dbedit6.ReadOnly:=true;
dbedit7.ReadOnly:=true;
dbedit8.ReadOnly:=true;
dbedit9.ReadOnly:=true;
dbedit10.ReadOnly:=true;
dbedit11.ReadOnly:=true;
dbedit12.ReadOnly:=true;
dbedit13.ReadOnly:=true;
dbedit14.ReadOnly:=true;
dbedit15.ReadOnly:=true;
dbedit16.ReadOnly:=true;
dbedit17.ReadOnly:=true;
dbedit18.ReadOnly:=true;
dbedit19.ReadOnly:=true;
dbedit20.ReadOnly:=true;
dbedit21.ReadOnly:=true;
dbedit22.ReadOnly:=true;
dbedit23.ReadOnly:=true;
dbedit24.ReadOnly:=true;
dbedit25.ReadOnly:=true;
dbedit26.ReadOnly:=true;
end;
//----------------提交對數據表所作的修改----------------
procedure Tmaterials.BitBtn8Click(Sender: TObject);
begin
if application.MessageBox('確定執行對數據所作的操作?','確定',MB_OKCANCEL)=IDOK then
datasource1.DataSet.Post
else
abort;
//在浏覽狀態下,顯示的是類別的名稱
dbcombobox3.Visible:=false;
dbcombobox2.Visible:=true;
//將插入、刪除、修改和移動按鈕打開
bitbtn6.Enabled:=true;
bitbtn7.Enabled:=true;
bitbtn1.Enabled:=true;
bitbtn2.Enabled:=true;
bitbtn3.Enabled:=true;
bitbtn4.Enabled:=true;
bitbtn5.Enabled:=true;
bitbtn8.Enabled:=false;
bitbtn9.Enabled:=false;
end;
//不允許修改文本框中的內容
dbedit1.ReadOnly:=true;
dbedit2.ReadOnly:=true;
dbedit3.ReadOnly:=true;
dbedit4.ReadOnly:=true;
dbedit5.ReadOnly:=true;
dbedit6.ReadOnly:=true;
dbedit7.ReadOnly:=true;
dbedit8.ReadOnly:=true;
dbedit9.ReadOnly:=true;
dbedit10.ReadOnly:=true;
dbedit11.ReadOnly:=true;
dbedit12.ReadOnly:=true;
dbedit13.ReadOnly:=true;
dbedit14.ReadOnly:=true;
dbedit15.ReadOnly:=true;
dbedit16.ReadOnly:=true;
dbedit17.ReadOnly:=true;
dbedit18.ReadOnly:=true;
dbedit19.ReadOnly:=true;
dbedit20.ReadOnly:=true;
dbedit21.ReadOnly:=true;
dbedit22.ReadOnly:=true;
dbedit23.ReadOnly:=true;
dbedit24.ReadOnly:=true;
dbedit25.ReadOnly:=true;
dbedit26.ReadOnly:=true;
//------------------關閉窗體----------------------
procedure Tmaterials.BitBtn10Click(Sender: TObject);
begin
close;
end;
小知識 MDI程序中子窗體關閉方式的設置方法
在Delphi中,MDI子窗口的關閉方式默認為縮小而不是關閉,故當您單擊子窗口右上角的關閉按鈕時會發覺該子窗口只是最小化,而不是如您所預期的那樣被關閉。解決辦法是在子窗口的OnClose事件處理過程中加入如下代碼。
procedure ChildForm.OnClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
Delphi為一個窗體的關閉行為指定了4種方式,分別是:
caNone 禁止子窗體被關閉。
caHide 子窗體不被關閉,但是被隱藏。被隱藏的窗體仍然可以被程序訪問。
caFree 子窗體被關閉,並且釋放其占用的資源。
caMinimize 子窗體被最小化而不是被關閉,這是MDI子窗口的默認關閉行為。
至此我們完成了物料主文件維護的功能,其效果如圖3.34所示。