更改代码中的ItemIndex属性时发生ComboBox OnChange事件

时间:2017-07-31 19:10:55

标签: delphi events combobox firemonkey

我在Delphi 10.1 Berlin上使用FMX。

我读过这个(这是我想要的行为):

https://stackoverflow.com/a/42933567/1343976

  

以编程方式更改ItemIndex不会导致OnChange事件被触发。它仅在响应用户交互时触发。

这仅适用于VCL吗?

我要求这样做,因为不幸的是,我可以测试,修改代码中的ItemIndex属性触发 OnChange事件。

如果是这样,我怎样才能在FireMonkey中实现与VCL相同的行为?

2 个答案:

答案 0 :(得分:2)

  

这仅适用于VCL吗?

在FMX中,许多事情都以不同的方式处理。

  

如果是这样,我怎样才能在FireMonkey中实现与VCL相同的行为?

一个简单的解决方法是在更改OnChange之前以及之后恢复事件之前使ItemIndex事件属性为零。

执行此操作的简单例程就像这样(如@Remy所述):

procedure SetItemIndex(ix : Integer; cb: TComboBox);
var
  original : TNotifyEvent;
begin
  original := cb.OnChange;
  cb.OnChange := nil;
  try
    cb.ItemIndex := ix;
  finally
    cb.OnChange := original;
  end;
end;  

答案 1 :(得分:0)

处理此问题的正确方法是首先找出调用DoChange()处理程序的位置。这是在OnChange方法中完成的。

所以,你需要做的是:

  1. 覆盖默认的ItemIndex方法,不会触发DoChange()事件方法。

  2. 覆盖ComboBox属性设置器,使用不同的逻辑,不会调用varchar(10)方法。

  3. 这两种方法都要求您为修改后的="javascript:void(window.open('http://www.report.utm.com/Reports/Pages/Report.aspx?ItemPath=%2fTechn+Info%2fConst_Tel&**ConstID=" & Fields!CONSTITUENTID.Value** & "','_blank'))" 创建新类。