zoukankan      html  css  js  c++  java
  • 小心使用可修改的常量。

    procedure TFDBForm_EditForm_MD.EnableDataSetEvent(AEnalbed: Boolean);
    {$J+}
    const
      CDetailBeforeEditEvent: TDataSetNotifyEvent = nil;
      CDetailBeforeDeleteEvent: TDataSetNotifyEvent = nil;
    {$J-}
    begin
      inherited;
      if AEnalbed then
      begin
        if not Assigned(CDetailBeforeEditEvent) then CDetailBeforeEditEvent := OnDetailDataSetBeforeEdit;//
        if not Assigned(CDetailBeforeDeleteEvent) then CDetailBeforeDeleteEvent := OnDetailDataSetBeforeDelete;//
        DetailDataSet.BeforeEdit := CDetailBeforeEditEvent;
        DetailDataSet.BeforeDelete := CDetailBeforeDeleteEvent;
        DetailDataSet.BeforeInsert := OnDetailDataSetBeforeInsert;
      end else
      begin
        DetailDataSet.BeforeEdit := nil;
        DetailDataSet.BeforeDelete := nil;
        DetailDataSet.BeforeInsert := nil;
      end;
    end;

    上述代码似乎没有什么问题。
    但是在窗体关闭再打开之后就出现问题了
        if not Assigned(CDetailBeforeEditEvent) then CDetailBeforeEditEvent := OnDetailDataSetBeforeEdit;//
        if not Assigned(CDetailBeforeDeleteEvent) then CDetailBeforeDeleteEvent := OnDetailDataSetBeforeDelete;//
    注意这两句,在第一次被赋值以后,即使窗体关闭(Free),再次打开之后,因为CDetailBeforeEditEvent 是常量,还记录了前次的地址,但前次的地址中所指的事件已经销毁了,所以会引发错误。
  • 相关阅读:
    软工个人项目作业
    软工个人博客作业(2)
    软工第一次作业-热身
    OO第四单元
    OO第三单元
    OO第二单元总结
    面向对象UML单元总结及课程总结
    JML单元总结
    面向对象设计与构造第二单元总结
    OO第一单元小结
  • 原文地址:https://www.cnblogs.com/DKSoft/p/777283.html
Copyright © 2011-2022 走看看