Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于Delphi中的任何操作引发的OnChange事件,是否有其他替代方法?_Delphi_Combobox_Controls_Delphi Xe - Fatal编程技术网

对于Delphi中的任何操作引发的OnChange事件,是否有其他替代方法?

对于Delphi中的任何操作引发的OnChange事件,是否有其他替代方法?,delphi,combobox,controls,delphi-xe,Delphi,Combobox,Controls,Delphi Xe,从Delphi XE文档中:- 注意:OnChange仅在响应用户操作时发生。以编程方式更改Text属性不会触发OnChange事件 当发生任何更改(由用户或以编程方式)时,是否有任何其他事件可用于TComboBox?更改TComboBox的ItemIndex属性时,不会引发任何事件。如果需要,您可以自己触发onchange方法 Edit1.Text := 'hello'; //Set a value Edit1.OnChange(Edit1); //..then trigger event

从Delphi XE文档中:-

注意:OnChange仅在响应用户操作时发生。以编程方式更改Text属性不会触发OnChange事件


当发生任何更改(由用户或以编程方式)时,是否有任何其他事件可用于TComboBox?更改TComboBox的ItemIndex属性时,不会引发任何事件。

如果需要,您可以自己触发onchange方法

Edit1.Text := 'hello';  //Set a value
Edit1.OnChange(Edit1);  //..then trigger event

编辑:David是对的,TEdit会在所有更新中调用OnChange。如果它是您想要触发的组合框,那么使用类似于:Combobox1.OnChange(Combobox1)

当文本被修改时,组合框控件将被发送一个
CM\u TEXTCHANGED
。VCL控件选择不在此处显示事件,但您可以。有很多方法可以做到这一点。在这里,我演示了quick and dirty interposer类:

TComboBox = class(Vcl.StdCtrls.TComboBox)
  procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
end;

procedure TComboBox.CMTextChanged(var Message: TMessage);
begin
  inherited;
  Beep;
end;

当然,您希望在生产代码中以一种不太粗糙的方式来实现这一点。

从Tcombox创建一个新组件

TMyCombo= class(TComboBox)
private
  procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
end;

{ TMyCombo }
procedure TMyCombo.CMTextChanged(var Message: TMessage);
begin
 inherited;
 Change;
end;

TForm1 = class(TForm)
  procedure MyChange(sender: TObject);
...
private
 FCombo: TMyCombo;
...

procedure TForm1.FormCreate(Sender: TObject);
begin
 FCombo:= TMyCombo.Create(self);
 FCombo.Parent:= self;
 FCombo.OnChange:=  MyChange;
end;

procedure TForm1.MyChange(Sender: TObject);
begin
  self.Edit1.Text:= FCombo.Text;
end;

destructor TForm1.Destroy;
begin
  FreeAndNil(FCombo);
  inherited;
end;

很抱歉造成混淆,我已经更新了问题,以便更清楚地说明我指的是TComboBox。如果您想将消息传递给后代进行默认处理,请不要忘记调用
继承的
。这当然取决于你的意图。