Inno Setup 在事件处理程序中获取 TObject type/class
Inno Setup get TObject type/class in event handler
我有一个事件过程,用于检查两次 objects/controls(TNewEdit
和 TNewComboBox
)的 OnKeyUp
按键。两个对象都需要在 TNewButton
启用之前完成。
但是,如果是 TNewEdit
或 TNewComboBox
,我找不到知道如何获取 Sender: TObject
类型的方法。
有人可以帮忙吗?
你不需要知道 type/class 就可以了。
这样的需求是糟糕设计的标志。
如果每个 type/class 的事件处理不同,请为每个创建一个单独的处理程序。
如果部分处理是通用的,则从特定处理程序中调用通用处理程序。
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;
我有一个事件过程,用于检查两次 objects/controls(TNewEdit
和 TNewComboBox
)的 OnKeyUp
按键。两个对象都需要在 TNewButton
启用之前完成。
但是,如果是 TNewEdit
或 TNewComboBox
,我找不到知道如何获取 Sender: TObject
类型的方法。
有人可以帮忙吗?
你不需要知道 type/class 就可以了。
这样的需求是糟糕设计的标志。
如果每个 type/class 的事件处理不同,请为每个创建一个单独的处理程序。
如果部分处理是通用的,则从特定处理程序中调用通用处理程序。
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;