我正在使用 dbedit 组件编辑记录,我有一个取消按钮,但我不确定如何制作它,因此使用 dbedit 组件所做的所有更改都将被还原。
我正在考虑将记录复制到临时表或在同一个表中复制记录,如果保存更改,我可以删除旧记录,或者如果输入被取消,则删除复制的记录(保留原始记录)。
我只是想知道在不创建无用表、创建太多程序的情况下处理此问题的最佳方法。
如果我没记错的话,对悖论表的更改只会在post
命令之后写入数据库。如果您想取消更改,只需执行
TForm1.CancelButtonPresss(Sender: TObject);
begin
ParadoxTable.Cancel;
end;
TForm1.OKButtonPress(Sender: TObject);
begin
ParadoxTable.Post;
end;
顺便说一句,自从我使用悖论表以来已经很长时间了,所以我的回忆是不正确的,如果我弄错了,请随时投票否决这个答案。
我在mac上输入这个,所以我现在不能检查它。
稍后我会看看我是否可以为您提供更明智的答案。
为了称赞 Johan 的回答(使用TDataSet.Cancel
),如果您使用 a TCustomClientDataSet
,您也可以使用该RevertRecord
方法删除对当前记录的修改,前提是它们仍在更改日志中。
您还可以设置快照SavePoint
并恢复到该状态,同时取消所有修改。
约翰的回答很适合单曲。如果您正在使用 SQL 数据库(Oracle、MSSql、MySql、Firebird 等),还有一种可用于多条记录的附加方法:事务。以 ADO 为例
TForm1 = class(TForm)
ADOConnection: TADOConnection;
…
// start the transaction
ADOConnection.BeginTrans;
…
// create records and post them
…
// rollback removes the records posted
// since the transaction was started
ADOConnection.RollbackTrans;
… or …
// commit completes saving the records posted
// since the transaction was started
ADOConnection.CommitTrans;
如果您没有显式启动事务,则会在记录发布到数据库时自动启动并提交一个事务。
François 的回答类似于事务,但仅适用于 ClientDatasets。