Есть ли альтернатива событию OnChange, которое возникает при любом действии в Delphi?

из документации Delphi XE: -

Примечание: OnChange возникает только в ответ на действия пользователя. Изменение свойства Text программным способом не вызывает событие OnChange.

существуют ли другие события, доступные для TComboBox, которые возникают при любом изменении (пользователем или программно)? При изменении свойства ItemIndex TComboBox событие не вызывается.

3 ответов


элемент управления со списком отправляется CM_TEXTCHANGED при изменении текста. Элемент управления VCL выбирает не отображать событие здесь, но вы можете. Есть много способов сделать это. Здесь я иллюстрирую быстрый и грязный класс 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;

естественно, вы хотели бы сделать это в менее хакерским способом в производственном коде.


вы всегда можете запустить onchange-метод самостоятельно, если это то, что вы хотите.

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

Edit: Дэвид прав, TEdit вызывает OnChange во всех обновлениях. Если это combobox, который вы хотите вызвать, используйте что-то вроде: Combobox1.OnChange, После Чего(Поле Combobox1);


создайте новый компонент из TComboBox

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;