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;