gpt4 book ai didi

delphi - 如何将程序地址保存在数组中,然后在Delphi中使用它们

转载 作者:行者123 更新时间:2023-12-03 18:09:31 25 4
gpt4 key购买 nike

我有大多数字段使用事件 Onchange 的 Tsqlquery。我需要在运行时动态关闭它们而无需硬编码(例如 Table.fieldbyname('ABC').Onchange:=Nil;)之后我还需要打开它们(例如 Table.fieldbyname('ABC')。 onchange:=TableABCChange;)我确实尝试使用指针数组并像下面这样使用它:

var P:array [1..100] of Pointer;
begin
for i:=0 to Table.fields.count-1 do
begin
{save and switch them off}
P[i]:=@Table.fields[i].Onchange;
@Table.fields[i].Onchange:=Nil;
end;

但是我不知道怎么打开它们

for i:=0 to Table.fields.count-1 do
begin
{restore and switch them on}
Table.fields[i].Onchange:=P[i]; <---- ERROR
end;

我应该怎么做?

最佳答案

这些事件处理程序是方法指针,因此不能由单个指针表示。它们实际上由两个指针表示:一个指向数据(即对象实例),一个指向代码。

您也在访问数组边界之外。您定义了一个索引为 1 的数组,并立即访问了索引 0。您还对 100 的上限进行了硬编码,这有点冒险。这里需要一个动态数组。

此外,通过将 @ 与禁用类型检查指针的默认编译器选项一起使用,您将抑制编译器对代码进行类型检查的某些能力。

OnChange 事件实际上是一个TFieldNotifyEvent 方法指针。有了这些知识,您的代码应该这样写:

var 
SavedChangeEvents: array of TFieldNotifyEvent;
....
// save and set event handler to nil
SetLength(SavedChangeEvents, Table.Fields.Count);
for i := 0 to Table.Fields.Count-1 do
begin
SavedChangeEvents[i] := Table.Fields[i].OnChange;
Table.Fields[i].OnChange := nil;
end;
....
// restore
for i := 0 to Table.Fields.Count-1 do
begin
Table.Fields[i].OnChange := SavedChangeEvents[i];
end;

请注意,我在任何时候都没有使用 @ 运算符。将永远不要将该运算符与过程类型一起使用作为您的目标。避免这种使用允许您让编译器检查类型安全。同时启用typed checked pointers .

关于delphi - 如何将程序地址保存在数组中,然后在Delphi中使用它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39334414/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com