Есть ли альтернатива событию OnChange, которое возникает при любом действии в Delphi? - PullRequest
7 голосов
/ 30 ноября 2011

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

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

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

Ответы [ 3 ]

8 голосов
/ 30 ноября 2011

Элемент управления поля со списком отправляется CM_TEXTCHANGED при изменении текста.Элемент управления VCL выбирает не отображать событие здесь, но вы можете.Есть много способов сделать это.Здесь я проиллюстрирую класс быстрой и грязной вставки:

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

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

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

4 голосов
/ 30 ноября 2011

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

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

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

1 голос
/ 30 ноября 2011

Создание нового компонента из 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;
...