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

尼古拉斯·埃帕米农达

我有一个事件过程,用于检查OnKeyUp两个对象/控件(TNewEditTNewComboBox按键两个对象都需要TNewButton在启用之前完成

但是,我找不到一种方法来知道如何获取 的类型Sender: TObject,如果是TNewEditTNewComboBox

任何人都可以帮忙吗?

马丁·普里克里尔

您不需要知道任何东西的类型/类。

这种需求是糟糕设计的标志。


如果每个类型/类的事件处理不同,则为每个类型/类创建一个单独的处理程序。

如果部分处理是公共的,则从特定的处理程序中调用公共处理程序。

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;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章