代碼說話:1.先定義一個全局變量isSave:Boolean; 2.窗體在create時先isSave:=False; 3.保存時: procedure TRes_Cq_HrQj_F.btnSB_SaveClick(Sender: TObject); begin inherited; if not btnSB_New.Enabled then begin if (Trim(cx_jb.Text)='') and //這裡條件改成你表格單元格所對應的字段值+判斷 (Trim(cx_gh.Text)='') and //這裡條件改成你表格單元格所對應的字段值+判斷 (Trim(cx_qjlb.Text)='') and //這裡條件改成你表格單元格所對應的字段值+判斷 (Trim(cx_sqrq.Text)='') and //這裡條件改成你表格單元格所對應的字段值+判斷 (Trim(cx_ksrq.Text)='') and //這裡條件改成你表格單元格所對應的字段值+判斷 (Trim(cx_jsrq.Text)='') and //這裡條件改成你表格單元格所對應的字段值+判斷 (Trim(cx_qjyy.Text)='') then //這裡條件改成你表格單元格所對應的字段值+判斷 begin MessageDlg('操作提示:數據不完整,如果不保存請點擊“取消”終止操作!',mtWarning,[mbOK],0); exit; end; if qry_hrqj.State in [dsedit,dsinsert] then begin try isSave:=true; qry_hrqj.Post; finally ChangeStatus(sBrowse);//數據為瀏覽模式,自定義的過程 end; end; end; end; 4.在ado的BeforePost事件中: procedure TRes_Cq_HrQj_F.qry_hrqjBeforePost(DataSet: TDataSet); begin inherited; if not isSave then begin MessageDlg('操作提示:當前數據還未“保存”!請點擊“保存”來保存數據,如果不保存請點“取消”終止操作!',mtWarning,[mbOK],0); Abort; end; isSave:=False; end; 5.問題解決
这个好说,按照下面方法,既可以在输入完后,回车即可,失去焦点也可以保存自定义一个SetText过程procedure FieldSetText(Sender: TField; const Text: string);代码为(假如使用的 ADOQuery1) begin ADOQuery1.Edit; ADOQuery1.FieldByName(Sender.FieldName).AsString := Text; ADOQuery1ata.Post; end;然后在ADOQuery1的AfterOpen事件中写入var i: Integer; begin for i := 0 to ADataSet.FieldCount - 1 do begin ADataSet.Fields[i].OnSetText := Self.FieldSetText; end; end;
if ado.state in [dsInsert,dsEdit] then ado.Post; // 加个保存按钮
我太菜了,看了还是不明白。 我想实现的功能是焦点不在cxgrid时,就保存。比如一个属性为checkbox的字段,我点选后即保存修改,而不需要其它确实。 我在 onEditchanged事件中加入如下代码,问题解决了,但不知是否会有什么不良影响。procedure TCreateBarCodeF.cxGridDB_BarCodeEditChanged( Sender: TcxCustomGridTableView; AItem: TcxCustomGridTableItem); begin if ADOQuery1.Active=true then ADOQuery1.Post; end;
2.窗體在create時先isSave:=False;
3.保存時:
procedure TRes_Cq_HrQj_F.btnSB_SaveClick(Sender: TObject);
begin
inherited;
if not btnSB_New.Enabled then
begin
if (Trim(cx_jb.Text)='') and //這裡條件改成你表格單元格所對應的字段值+判斷
(Trim(cx_gh.Text)='') and //這裡條件改成你表格單元格所對應的字段值+判斷
(Trim(cx_qjlb.Text)='') and //這裡條件改成你表格單元格所對應的字段值+判斷
(Trim(cx_sqrq.Text)='') and //這裡條件改成你表格單元格所對應的字段值+判斷
(Trim(cx_ksrq.Text)='') and //這裡條件改成你表格單元格所對應的字段值+判斷
(Trim(cx_jsrq.Text)='') and //這裡條件改成你表格單元格所對應的字段值+判斷
(Trim(cx_qjyy.Text)='') then //這裡條件改成你表格單元格所對應的字段值+判斷
begin
MessageDlg('操作提示:數據不完整,如果不保存請點擊“取消”終止操作!',mtWarning,[mbOK],0);
exit;
end;
if qry_hrqj.State in [dsedit,dsinsert] then
begin
try
isSave:=true;
qry_hrqj.Post;
finally
ChangeStatus(sBrowse);//數據為瀏覽模式,自定義的過程
end;
end;
end;
end;
4.在ado的BeforePost事件中:
procedure TRes_Cq_HrQj_F.qry_hrqjBeforePost(DataSet: TDataSet);
begin
inherited;
if not isSave then
begin
MessageDlg('操作提示:當前數據還未“保存”!請點擊“保存”來保存數據,如果不保存請點“取消”終止操作!',mtWarning,[mbOK],0);
Abort;
end;
isSave:=False;
end;
5.問題解決
begin
ADOQuery1.Edit;
ADOQuery1.FieldByName(Sender.FieldName).AsString := Text;
ADOQuery1ata.Post;
end;然后在ADOQuery1的AfterOpen事件中写入var
i: Integer;
begin
for i := 0 to ADataSet.FieldCount - 1 do
begin
ADataSet.Fields[i].OnSetText := Self.FieldSetText;
end;
end;
声明过程的语句是怎么样呢?
然后为他写代码
procedure FieldSetText(Sender: TField; const Text: string);
begin
ADOQuery1.Edit;
ADOQuery1.FieldByName(Sender.FieldName).AsString := Text;
ADOQuery1ata.Post;
end;
是不是还缺点什么?
在type下面还要加procedure FieldSetText(Sender: TField);吗?
这样会提示:Parameter lists differ
ado.Post;
// 加个保存按钮
我想实现的功能是焦点不在cxgrid时,就保存。比如一个属性为checkbox的字段,我点选后即保存修改,而不需要其它确实。
我在 onEditchanged事件中加入如下代码,问题解决了,但不知是否会有什么不良影响。procedure TCreateBarCodeF.cxGridDB_BarCodeEditChanged(
Sender: TcxCustomGridTableView; AItem: TcxCustomGridTableItem);
begin
if ADOQuery1.Active=true then
ADOQuery1.Post;
end;