小心使用可修改的常量。

简介: procedure TFDBForm_EditForm_MD.EnableDataSetEvent(AEnalbed: Boolean);{$J+}const  CDetailBeforeEditEvent: TDataSetNotifyEvent = nil;  CDetailBeforeDele...
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 是常量,还记录了前次的地址,但前次的地址中所指的事件已经销毁了,所以会引发错误。
目录
相关文章
|
8月前
|
存储 C++
C++的变量和常量
C++的变量和常量
44 1
|
8月前
|
存储 C++
C++系列三:变量、常量
C++系列三:变量、常量
|
8月前
|
存储 Unix 编译器
变量和常量
这篇内容介绍了编程中的变量概念和使用。变量是可变的存储单元,用于存放数据,其值在程序运行期间可以改变。变量需先定义后使用,声明时指定类型,如`类型关键字 变量名;`。变量可分为局部变量(在代码块内定义)和全局变量(代码块外),全局变量在整个程序中可见,局部变量只在定义它的代码块内有效。初始化变量时,未赋值的变量值可能是随机的。编程最佳实践建议使用有意义的标识符,并遵循特定平台的风格。此外,常量是不可变的,可以通过宏常量(`#define`)或`const`关键字定义,常量有助于提高代码可读性和维护性。不同数据类型支持不同的运算操作。
47 0
|
8月前
|
存储 算法 Java
常量和变量
常量和变量
48 1
|
7月前
|
C++
C++之变量与常量
C++之变量与常量
|
8月前
1-5 运算量 变量 和 常量
1-5 运算量 变量 和 常量
38 0
|
8月前
变量与常量
变量与常量
40 0
|
8月前
|
存储 C++ 容器
【C/C++】C/C++编程——变量和常量
【C/C++】C/C++编程——变量和常量
102 0
|
编译器 C语言
【常量与变量的一些基本理解】
【常量与变量的一些基本理解】
85 0
变量、常量
c语言学习的第二弹