2017-04-10 17 views
1

두 객체/컨트롤 (TNewEditTNewComboBox)에 대해 OnKeyUp 키를 확인하는 이벤트 프로 시저가 있습니다. TNewButton을 사용하려면 두 개체를 모두 완료해야합니다.Inno Setup에서 이벤트 핸들러에서 TObject 타입/클래스를 얻습니다.

그러나 TNewEdit 또는 TNewComboBox 인 경우 Sender: TObject의 유형을 얻는 방법을 알 수있는 방법을 찾을 수 없습니다.

누구든지 도움을받을 수 있습니까?

+0

유형을 알아야 할 필요가있는 항목은 무엇입니까? –

+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; 
+1

정말 고마워요,이게 정말 도움이됩니다! –