【问题标题】:I got Stack overflow error in an OnClick event in Delphi 10.3.3我在 Delphi 10.3.3 的 OnClick 事件中遇到堆栈溢出错误
【发布时间】:2020-11-13 17:16:29
【问题描述】:

好的...我有一个包含toggleSwitch 的表单,用户必须单击它们,然后什么都没有发生...稍后我将有 UPDATE 查询在每一个但绝对什么都不做的情况下,我得到一个堆栈溢出错误。我只是这样做 它必须检查 Switch 是否处于 OFF 模式,然后必须将其打开,否则... 请帮我解决这个问题

注意:我有类似的应用程序可以在 ToggleSwitches 上正常工作,但这个很有趣

procedure TUserAccess_.ToggleSwitch1Click(Sender: TObject);
begin
 if ToggleSwitch1.State = tssOff then
  ToggleSwitch1.State:= tssOn
 else
  ToggleSwitch1.State:= tssOff
end;

【问题讨论】:

    标签: delphi stack-overflow toggleswitch


    【解决方案1】:

    这是非常值得期待的。

    如果您有一个无条件调用自身的函数,那么理论上您将获得无限的函数调用序列。在实践中,您会遇到堆栈溢出。

    (要感受一下,请尝试运行

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Button1Click(Sender);
    end;
    

    或类似的东西。)

    在这种情况下,用户单击切换开关。因此,它的OnClick 处理程序被调用。但是这个改变了拨动开关的状态,这也触发了OnClick 处理程序,因为这是控件传达其状态已更改的方式。因此,再次运行此代码,您的代码再次更改状态,并再次调用 OnClick 处理程序。等等相当长一段时间。

    因此,您会遇到堆栈溢出。 (如果您没有使用某种理论计算机,那么您将在应用程序的余生中进一步向下递归。)

    你知道当你点击它时开关会自动切换,对吗?

    因此,根本不需要您的代码。

    【讨论】:

    • 我太傻了,是的,你是对的,即使没有代码 TNQ,我的其他应用程序也能正常工作
    猜你喜欢
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 2019-02-16
    相关资源
    最近更新 更多