【问题标题】:Stackoverflow error (infinite loop) while using Devexpress VCL 13.1.2使用 Devexpress VCL 13.1.2 时出现 Stackoverflow 错误(无限循环)
【发布时间】:2014-02-18 09:20:48
【问题描述】:

我正在使用TcxGridDBBandedTableView,并且有两列TcxGridDBBandedColumn

vwABC : TcxGridDBBandedTableView
vwABCField1 : TcxGridDBBandedColumn
vwABCField2 : TcxGridDBBandedColumn

当我更改 vwABCField1 中的任何内容时,应清除 vwABCField2 值。为此,我正在使用 vwABCField1 的 OnEditValueChanged 属性,如下所示:

procedure TMyForm.vwABCField1PropertiesEditValueChanged(Sender: TObject);
begin
  vwABCField2.EditValue := '';
end;

在调试时,当我来到 vwABCField2.EditValue := ''; 语句时,我再也没有返回并陷入 infine 循环,一段时间后我得到 stackoverflow 错误。

vwABCField2.EditValue := ''; 无限次递归调用vwABCField1PropertiesEditValueChanged 过程。我不知道为什么。我没有在vwABCField2OnEditValueChanged 事件上声明任何内容。

更新

如果我在上面的函数中写了其他东西而不是vwABCField2.EditValue := '';,它只会被调用一次。例如

procedure TMyForm.vwABCField1PropertiesEditValueChanged(Sender:TObject); 
begin   
  ShowMessage("hi"); 
end;

工作正常。所以我怀疑罪魁祸首是vwABCField2.EditValue := ''; 声明。

【问题讨论】:

  • @StefanGlienke - 是的,我查过了。 vwABCField1PropertiesEditValueChanged 方法被一次又一次地调用。
  • 你应该看到它来自第二次,因为你说不应该发生
  • Stackoverflow 错误震惊
  • 也许对 vwABCField2 的更改会强制对数据库进行某种更新,然后遍历所有字段并触发另一个 Change()。查看调用堆栈,跟踪 DevEx 代码,制作可重现的案例以在 DevEx 论坛上发布。
  • 您是否在 DevEx 论坛中搜索过“堆栈溢出”?这是否相关:devexpress.com/Support/Center/Question/Details/Q523958

标签: delphi devexpress vcl


【解决方案1】:

正如官方文档所述:

不要更改 OnEditValueChanged 事件处理程序中的编辑值,因为这会导致堆栈溢出。使用此事件来获取编辑值已更改的通知。

因为当您在此事件中更改编辑值时,您的编辑值当然会更改,因此会一次又一次地调用 OnEditValueChanged 事件...

【讨论】:

  • 那么我应该在哪里更改该行中其他单元格的编辑值?在我的情况下我应该怎么做?另外,您能否提供此文档的链接?
  • 此文档应该在您的 IDE 帮助中可用,甚至是上下文相关的。转到您的 Delphi 帮助并在内容选项卡中查找“ExpressQuantumGrid Suite”主题。
  • 关于在哪里更改其他值的问题:您最好在数据集方面这样做,例如数据集的“onchange”或“beforepost”事件。
  • 当我在 dsABCBeforePost 中添加 editvalue 代码时,我再次陷入无限循环,导致 stackoverflow。
  • 我将所有的 editvalue 代码添加到 dsABCField1OnChange 事件中并且它起作用了。感谢您的建议副驾驶:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-20
  • 2021-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多