Inno Setup在事件处理程序中获取TObject类型/类

时间:2017-04-10 10:19:36

标签: class object inno-setup pascalscript tobject

我有一个事件过程,可以检查OnKeyUp按键是否有两个对象/控件(TNewEditTNewComboBox)。在TNewButton启用之前,需要完成这两个对象。

但是,我无法找到如何获取Sender: TObject类型的方法,如果是TNewEditTNewComboBox

任何人都可以提供帮助吗?

1 个答案:

答案 0 :(得分: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;