我有一個事件過程,它檢查兩個對象/控件的OnKeyUp
按鍵(TNewEdit
和TNewComboBox
)。在啓用TNewButton
之前,兩個對象都需要完成。Inno Setup在事件處理程序中獲取TObject類型/類
但是,我找不到一種方法來知道如何獲得Sender: TObject
的類型,如果是TNewEdit
或TNewComboBox
。
任何人都可以幫忙嗎?
我有一個事件過程,它檢查兩個對象/控件的OnKeyUp
按鍵(TNewEdit
和TNewComboBox
)。在啓用TNewButton
之前,兩個對象都需要完成。Inno Setup在事件處理程序中獲取TObject類型/類
但是,我找不到一種方法來知道如何獲得Sender: TObject
的類型,如果是TNewEdit
或TNewComboBox
。
任何人都可以幫忙嗎?
你不需要知道任何類型/類。
這樣的需求是一個糟糕的設計的標誌。
如果每個類型/類的事件處理不同,請爲每個類型/類創建一個單獨的處理程序。
如果部分處理通用,請從特定處理程序中調用通用處理程序。
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;
非常感謝,這真的有幫助! –
你有什麼需要了解的類型? –
向我們展示一些代碼! –