형식/클래스를 알 필요가 없어야합니다.
이러한 필요성은 잘못된 디자인의 표시입니다.
이벤트의 처리가 유형/클래스마다 다르면 각각에 대해 별도의 처리기를 만듭니다.
처리 부분이 공통된 경우 특정 처리기에서 공통 처리기를 호출하십시오. 실제로 두 개의 컨트롤을 가지고
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;
유형을 알아야 할 필요가있는 항목은 무엇입니까? –
몇 가지 코드를 보여주세요! –