Есть ли альтернатива событию 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;