細心的讀者可能會發現,在前面的幾個MDI子窗體中,相同的部分是非常多的。例如各個窗體標題欄下面的工具欄以及查詢功能等。對於布局非常相似的窗體,在程序設計過程中可以先設計一個父窗體,其他窗體從父窗體繼承,對應有類繼承概念的開發工具這是非常方便的。這一方法的使用我們留在下一章中再介紹,這裡我們用一種更簡易的方法來實現主生產計劃維護窗體。
(1) 在前面的主需求計劃維護窗體設計好後,選擇File | Save As...菜單命令,將這個窗體另存為MainProduceForm.pas,並將窗體改名為MainProduce,再將它加入工程並從自動創建列表中刪除。然後再根據需要對窗體上的控件設置進行修改,例如移動一些控件的位置,增加一些新的控件等等,如圖3.38。
圖3.38 主生產計劃維護窗體
(2) 在修改好各個控件的布置之後,應該進一步修改各控件的屬性設置,新的屬性設置如表3.9所示。
圖片看不清楚?請點擊這裡查看原圖(大圖)。
表3.9 主生產計劃維護窗體控件屬性設置
主需求計劃和主生產計劃窗體相似之處非常多,它們的很多代碼都是非常相似的,只不過所操作的數據表由主需求計劃改為了主生產計劃,這樣只需要對主需求計劃維護窗體的時間處理代碼做少許修改即可達到目的。
(3) 下面給出主生產計劃窗體事件處理程序的代碼,請讀者參考主需求計劃窗體時間處理程序的代碼加以理解,並特別注意其中的不同之處。
uses MainForm,ChooseForm;
{$R *.dfm}
//--------------下一條記錄------------
procedure TMainProduce.BitBtn3Click(Sender: TObject);
begin
datasource2.DataSet.Next;
end;
//--------------上一條記錄------------
procedure TMainProduce.BitBtn2Click(Sender: TObject);
begin
datasource2.DataSet.Prior;
end;
//--------------首條記錄------------
procedure TMainProduce.BitBtn1Click(Sender: TObject);
begin
datasource2.DataSet.First;
end;
//--------------末條記錄------------
procedure TMainProduce.BitBtn4Click(Sender: TObject);
begin
datasource2.DataSet.Last;
end;
//--------------關閉窗體------------
procedure TMainProduce.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
action:=cafree;
end;
procedure TMainProduce.BitBtn10Click(Sender: TObject);
begin
close;
end;
//--------------查詢數據------------
procedure TMainProduce.BitBtn12Click(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;
edit1.Clear;
edit2.Clear;
edit3.Clear;
end;
procedure TMainProduce.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if key=#13 then
bitbtn12.Click;
end;
procedure TMainProduce.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
if key=#13 then
bitbtn12.Click;
end;
procedure TMainProduce.Edit3KeyPress(Sender: TObject; var Key: Char);
begin
if key=#13 then
bitbtn12.Click;
end;
//--------------新增記錄------------
procedure TMainProduce.ForMactivate(Sender: TObject);
begin
//如果是新增按鈕被按下,則將從物料主文件中選取得零件的編號
//名稱等信息送到主需求窗口中,並初始化一些數據
if insflag=1 then
begin
dbedit1.Text:=main.str;
dbedit2.Text:=main.str2;
end;
if insflag=2 then
begin
dbedit3.Text:=main.str;
dbedit4.Text:=main.str2;
dbedit5.Text:=main.str3;
dbedit6.Text:=main.str4;
end;
end;
procedure TMainProduce.BitBtn5Click(Sender: TObject);
begin
datasource2.DataSet.Insert;
//將插入、刪除、修改和移動按鈕關閉,防止錯誤操作
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;
//將兩個浏覽按鈕使能打開
bitbtn11.Enabled:=true;
bitbtn13.Enabled:=true;
//必須用保存按鈕才能提交
dbgrid2.Enabled:=false;
//允許對需求數量和備注進行修改
dbedit7.ReadOnly:=false;
dbedit7.Text:='0';
dbedit9.ReadOnly:=false;
dbedit9.Text:='0';
dbedit8.ReadOnly:=false;
dbedit10.ReadOnly:=false;
dbedit11.ReadOnly:=false;
dbmemo1.ReadOnly:=false;
end;
//--------------調用choose窗體,從物料主文件中選擇數據------------
procedure TMainProduce.BitBtn13Click(Sender: TObject);
var
newform:Tchoose;
begin
//標識從主需求窗體調用物料主文件窗口
main.bomflag:=4;
newform:=Tchoose.Create(application);
//將本窗口灰化
self.Enabled:=false;
//標識為第一個檢索按鈕按下
insflag:=1;
end;
//--------------從工廠日歷表中選擇數據------------
procedure TMainProduce.BitBtn11Click(Sender: TObject);
begin
main.bomflag:=5;
main.N5.Click;
//將本窗口灰化
self.Enabled:=false;
//標識為第一個檢索按鈕按下
insflag:=2;
end;
//--------------修改記錄------------
procedure TMainProduce.BitBtn6Click(Sender: TObject);
begin
datasource2.DataSet.Edit;
//將插入、刪除、修改和移動按鈕關閉,防止錯誤操作
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;
//將兩個浏覽按鈕使能打開
bitbtn11.Enabled:=true;
bitbtn13.Enabled:=true;
//必須用保存按鈕才能提交
dbgrid2.Enabled:=false;
//允許對需求數量和備注進行修改
dbedit7.ReadOnly:=false;
dbedit9.ReadOnly:=false;
dbedit8.ReadOnly:=false;
dbedit10.ReadOnly:=false;
dbedit11.ReadOnly:=false;
dbmemo1.ReadOnly:=false;
end;
//--------------保存記錄----------------
procedure TMainProduce.BitBtn8Click(Sender: TObject);
begin
datasource2.DataSet.Post;
//將插入、刪除、修改和移動按鈕打開
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;
//將兩個浏覽按鈕使能關閉
bitbtn11.Enabled:=false;
bitbtn13.Enabled:=false;
//恢復dbgrid的選取功能
dbgrid2.Enabled:=true;
//恢復dbedit的只讀屬性
dbedit7.ReadOnly:=true;
dbedit9.ReadOnly:=true;
dbedit8.ReadOnly:=true;
dbedit10.ReadOnly:=true;
dbedit11.ReadOnly:=true;
dbmemo1.ReadOnly:=true;
dbmemo1.ReadOnly:=true;
//刷新數據
adoquery2.Active:=false;
adoquery2.Active:=true;
end;
//--------------取消操作----------------
procedure TMainProduce.BitBtn9Click(Sender: TObject);
begin
datasource2.DataSet.Cancel;
//將插入、刪除、修改和移動按鈕打開
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;
//將兩個浏覽按鈕使能關閉
bitbtn11.Enabled:=false;
bitbtn13.Enabled:=false;
//恢復dbgrid的選取功能
dbgrid2.Enabled:=true;
//恢復dbedit的只讀屬性
dbedit7.ReadOnly:=true;
dbedit9.ReadOnly:=true;
dbedit8.ReadOnly:=true;
dbedit10.ReadOnly:=true;
dbedit11.ReadOnly:=true;
dbmemo1.ReadOnly:=true;
dbmemo1.ReadOnly:=true;
//刷新數據
adoquery2.Active:=false;
adoquery2.Active:=true;
end;
//--------------刪除記錄----------------
procedure TMainProduce.BitBtn7Click(Sender: TObject);
begin
if application.MessageBox('確實刪除該數據?','刪除',MB_OKCANCEL)=ID_OK then
datasource2.dataset.delete;
end;
procedure TMainProduce.DataSource1DataChange(Sender: TObject;Field: TFIEld);
begin
//設置列的寬度
dbgrid1.Columns[0].Width:=64;
dbgrid1.Columns[1].Width:=64;
dbgrid1.Columns[2].Width:=64;
dbgrid1.Columns[3].Width:=64;
dbgrid1.Columns[4].Width:=64;
end;
//-------為產品名稱文本框查詢產品名稱------------
procedure TMainProduce.DataSource2DataChange(Sender: TObject;
Field: TFIEld);
begin
adoquery3.Close;
adoquery3.SQL.Clear;
adoquery3.SQL.Add('select 物料名稱 from 物料主文件 where 物料編號='''+dbedit1.Text+'''');
adoquery3.Open;
dbedit2.Text:=adoquery3.FIEldByName('物料名稱').AsString;
end;
procedure TMainProduce.BitBtn14Click(Sender: TObject);
var
order,num:string;
begin
//選中的數據的計劃期和物料編號
order:=dbgrid1.FIElds[3].AsString;
num:=dbgrid1.FIElds[0].AsString;
//將主需求計劃表中的數據送入主生產計劃表
adocommand1.CommandText:='insert into 主生產計劃([物料編號], [年份], [計劃期],
[開始日期], [結束日期], [需求數量], [MPS數量], [狀態], [備注]) select 物料編號,
年份,計劃期, 開始日期,結束日期,需求數量,需求數量,狀態,備注 from 主需求計劃 where
(物料編號='''+num+''')and(計劃期='''+order+''')';
adocommand1.Execute;
//保存到主需求計劃歷史
adocommand1.CommandText:='insert into 主需求計劃歷史 select * from 主需求計劃 where (物料編號='''+num+''')and(計劃期='''+order+''')';
adocommand1.Execute;
//刪除在主需求計劃表中的已被插入到主生產計劃表中的數據
adocommand1.CommandText:='delete from 主需求計劃 where (物料編號='''+num+''')
and(計劃期='''+order+''')';
adocommand1.Execute;
//刷新數據
adoquery2.Active:=false;
adoquery2.Active:=true;
adoquery1.Active:=false;
adoquery1.Active:=true;
end;
到此,我們就完成了主生產計劃維護的功能,其效果如圖3.38所示。