我在 Delphi 10.3.3 的 OnClick 事件中遇到堆栈溢出错误
I got Stack overflow error in an OnClick event in Delphi 10.3.3
好的...我有这个表格,里面有 toggleSwitch
,用户必须点击它们,其他什么都不会发生...稍后我会 UPDATE 中的每个查询,但绝对什么都不做,我得到一个堆栈溢出错误。我只是这样做
它必须检查 Switch 是否处于 OFF 模式然后它必须打开它否则......
请帮我解决这个问题
注意:我有类似的应用程序可以与 ToggleSwitches
一起正常工作,但这个很有趣
procedure TUserAccess_.ToggleSwitch1Click(Sender: TObject);
begin
if ToggleSwitch1.State = tssOff then
ToggleSwitch1.State:= tssOn
else
ToggleSwitch1.State:= tssOff
end;
这是非常令人期待的。
如果您有一个无条件调用自身的函数,那么理论上您将得到一个无限的函数调用序列。实际上,您会遇到堆栈溢出。
(要对此有一个感觉,请尝试 运行
procedure TForm1.Button1Click(Sender: TObject);
begin
Button1Click(Sender);
end;
或类似的东西。)
在这种情况下,用户单击切换开关。因此,它的 OnClick
处理程序被调用。但是这个改变了拨动开关的状态,这也触发了 OnClick
处理程序,因为这就是控件传达其状态已更改的方式。所以这段代码又是运行,状态又被你的代码改变了,OnClick
处理程序又被调用了。以此类推了一段时间。
因此,您会遇到堆栈溢出。 (而且,如果您没有使用过某些理论计算机,那么您将在应用程序的剩余生命周期中进一步深入递归。)
你知道当你点击开关时它会自动切换吗?
因此,根本不需要您的代码。
好的...我有这个表格,里面有 toggleSwitch
,用户必须点击它们,其他什么都不会发生...稍后我会 UPDATE 中的每个查询,但绝对什么都不做,我得到一个堆栈溢出错误。我只是这样做
它必须检查 Switch 是否处于 OFF 模式然后它必须打开它否则......
请帮我解决这个问题
注意:我有类似的应用程序可以与 ToggleSwitches
一起正常工作,但这个很有趣
procedure TUserAccess_.ToggleSwitch1Click(Sender: TObject);
begin
if ToggleSwitch1.State = tssOff then
ToggleSwitch1.State:= tssOn
else
ToggleSwitch1.State:= tssOff
end;
这是非常令人期待的。
如果您有一个无条件调用自身的函数,那么理论上您将得到一个无限的函数调用序列。实际上,您会遇到堆栈溢出。
(要对此有一个感觉,请尝试 运行
procedure TForm1.Button1Click(Sender: TObject);
begin
Button1Click(Sender);
end;
或类似的东西。)
在这种情况下,用户单击切换开关。因此,它的 OnClick
处理程序被调用。但是这个改变了拨动开关的状态,这也触发了 OnClick
处理程序,因为这就是控件传达其状态已更改的方式。所以这段代码又是运行,状态又被你的代码改变了,OnClick
处理程序又被调用了。以此类推了一段时间。
因此,您会遇到堆栈溢出。 (而且,如果您没有使用过某些理论计算机,那么您将在应用程序的剩余生命周期中进一步深入递归。)
你知道当你点击开关时它会自动切换吗?
因此,根本不需要您的代码。