比如下面的代码: begin Label1.Caption := aaa. BeginTrans. try Label1.Caption := bbb. //....... raise Exception.Create(Error). CommitTrans. except RollbackTrans. end. end. 如果执行后,Label1.Caption的值能返回aaa就好了:D 当然,实际中应用远不止这么简单~ 只有这么多分了,呵呵这个想法还有点意思笨方法 var temp:string. begin Label1.Caption := aaa. BeginTrans. try Temp:=Label1.Caption. Label1.Caption := bbb. //....... raise Exception.Create(Error). CommitTrans. except RollbackTrans. Label1.Caption:=temp. end. end. 在try后面写Label1.Caption := bbb,出现异常自然不会赋值,没必要跟自己过不去,如果要记录数据库列信息可以用中间变量。我覺得用異常一般可以的了。數據庫與程序語言有點不同。它主要是新增修改刪除一些東西。程序語言邏輯那可沒那麼簡單了。我觉得:真的有必要的话,可以自己改写。或者用笨办法判断啊。毕竟,需要返回信息的地方并不太多的。否则,就是浪费了计算机的资源,返回了一大堆可有可无的无用的东西。估计编译器的开发者是这么考虑的。效率才是根本嘛。轻舞肥羊,可以用 Assert(False,这是一个测试程序 IntToStr(iInCount)). 连程序在那行出错都告诉你to 轻舞肥羊 看了你的程序真熟悉呀,我也是这么干的,^_^ 这个想法有意思。实际上我们也会碰到这种需要还原数据的情况。我想能否借用数据库的日志概念,把数据的变动情况用某个结构记录下来,然后按这些记录进行回滚。nullx所说,实际上是记录了一个变动。这也有点类似于Undo。大家看清楚了,并不是那么简单的,只是突然有这个想法,讨论讨论罢了如果仅仅是一个Caption,相信我不会笨到提这种问题的地步吧 如果我在try后做了很多操作,当然与数据库无关,例如对我程序的界面上很多元素进行修改,但是在中途出现一个错误,我要界面返回其原始状态怎么办? 回答,用try包起来,这谁都知道,好,我每个操作界面的语句都用try包起来,出错就跳出, 但还是不能返回原值,而且也不知道哪些已经改变,不会要我用结构/对象把界面上所有的信息记录起来再操作一个try块,然后出错还原吧...呵,想都累死 TO delp: 断言对这个问题好象没什么帮助 TO nullx: 不仅仅是返回信息,而是要还原所有改动 首先,我可以说,在我所知道的编程语言里(数据库不算)此题无解 可能我脑子里哪根筋错位了吧,呵呵to 轻舞肥羊 不好意思,没理解题意 等我仔细想想to 轻舞肥羊 如果你指保存部分,你自己定义的数据是可以做到的,但是如果你什么都想保存,那难。 to 轻舞肥羊 我完成了部分,是否可以结一点分..... 有意思[:)] 我覺得如果非要那樣做的話,也許隻有用結構或數組把那些信息記錄下來,不過要是修改很多的話,那效果肯定很差肥羊:欢迎你只消失半个月就回来啊。大概是用数据库实现事务处理比语言要方便。因为编程语言远远比数据库语句灵活,你应该在事务失败的时候,调用部分代码来恢复原状。 数据库的事务是由一个程序来控制的,你不能指望自己的程序受到别的什么的保护!这个想法很有创意!! 如果能实现的话,就可以把一系列事件放在一个“事务”里管理起来,这样在一系列有关联的操作中有一步错误的话可以回滚到开始,如果再和数据库的事务回滚结合起来使用,那我们的很多管理信息系统的维护量就可以大大减轻了,支持支持!!参不透你的意思[:D][:D]to 轻舞肥羊 你到底出不出现呀,你出现了,我好贴代码呀......急呀 to 轻舞肥羊 程序写完了,等你出来,这 288 分我急需.......... 你去那里了,盼望呀....TO delp 贴吧,不要担心分数了,我用不完~目前可以保证 TLabel TEdit TMemo 属性赋值的事务机制,你可以扩展增加对其他控件的事务支持,留下 Email 我发测试代码给你..... TUnSafeTrans = class private FSavePoint : TComponent. FSaveName : TStringList. FSaveType : TList. FBinStream : TMemoryStream. function GetType(ptSavePoint : TComponent) : TComponentClass. function Restore(i : Integer) : TComponent. public Constructor BeginTrans(ptSavePoint : TComponent). Destructor Destroy. override. procedure Rollback. procedure Commit. end. constructor TUnSafeTrans.BeginTrans(ptSavePoint: TComponent). var I : Integer. P : Pointer. begin FSavePoint := ptSavePoint. FBinStream := TMemoryStream.Create. FSaveName := TStringList.Create. FSaveType := TList.Create. for I := 0 to FSavePoint.ComponentCount - 1 do begin P := GetType(FSavePoint.Components[i]). if nil