Inno Setup получает тип / класс TObject в обработчике событий

У меня есть процедура события, которая проверяет OnKeyUp нажатие клавиши для двух объектов / элементов управления (TNewEdit а также TNewComboBox). Оба объекта должны быть завершены до TNewButton становится доступным.

Тем не менее, я не могу найти способ узнать, как получить тип Sender: TObjectесли это TNewEdit или же TNewComboBox,

Кто-нибудь может помочь?

1 ответ

Решение

Вам не нужно знать тип / класс для чего-либо.

Такая необходимость является признаком плохого дизайна.


Если обработка события отличается для каждого типа / класса, создайте отдельный обработчик для каждого.

Если часть обработки является общей, вызовите общий обработчик из определенных обработчиков.

var
  Edit: TNewEdit;
  ComboBox: TNewComboBox;

procedure CommonKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);  
begin
  Log('Common handling');
end;

procedure EditKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  Log('Edit key up');
  CommonKeyUp(Sender, Key, Shift);
end;

procedure ComboBoxKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  Log('Combo box key up');
  CommonKeyUp(Sender, Key, Shift);
end;

procedure InitializeWizard();
begin
  { ... }

  Edit.OnKeyUp := @EditKeyUp;
  Combobox.OnKeyUp := @ComboBoxKeyUp;
end;

Хотя, поскольку у вас фактически есть два элемента управления, вы, вероятно, хотите различить, какой элемент управления вызвал событие.

Вот что Sender аргумент для. Следующий код показывает, как его использовать. Но опять же, в общем, это не правильный путь.

var
  Edit: TNewEdit;
  ComboBox: TNewComboBox;

procedure ControlKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if Sender = Edit then
  begin
    Log('Edit key up');
  end
    else
  if Sender = ComboBox then
  begin
    Log('Combo box key up');
  end
    else
  begin
    Log('Other key up');
  end;
end;

procedure InitializeWizard();
begin
  { ... }

  Edit.OnKeyUp := @ControlKeyUp;
  Combobox.OnKeyUp := @ControlKeyUp;
end;

Хотя до сих пор не понимаю, для чего тебе это нужно.

Вы должны каждый раз проверять оба элемента управления, так зачем вам знать, какой элемент управления изменился?

Кроме того, чтобы обнаружить изменение, не используйте OnKeyUpиспользовать OnChange, Таким образом вы фиксируете все изменения (нажатие клавиш, перетаскивание, копирование и вставка, что угодно).

var
  Edit: TNewEdit;
  ComboBox: TNewComboBox;
  Button: TNewButton;

procedure ControlChange(Sender: TObject);
begin
  Button.Enabled := (Edit.Text <> '') and (ComboBox.Text <> '');
end;

procedure InitializeWizard();
begin
  { ... }

  Edit.OnChange := @ControlChange;
  Combobox.OnChange := @ControlChange;
end;
Другие вопросы по тегам