Trình xử lý sự kiện và người gửi
procedure TForm1.Button1Click(Sender: TObject) ; begin ... end;
Nút1Click
sự kiện OnClick
Tham số “Người gửi” đề cập đến điều khiển được sử dụng để gọi phương thức. Nếu bạn nhấp vào điều khiển Button1, điều này khiến phương thức Button1Click được gọi, thì một tham chiếu hoặc con trỏ tới đối tượng Button1 sẽ được chuyển đến Button1Click trong tham số có tên Người gửi.
Hãy chia sẻ một số mã
Ví dụ: giả sử chúng ta muốn một nút và một mục menu thực hiện cùng một việc. Sẽ thật ngớ ngẩn nếu phải viết cùng một trình xử lý sự kiện hai lần.
Để chia sẻ một trình xử lý sự kiện trong Delphi, hãy làm như sau:
- Viết event handler cho đối tượng đầu tiên (ví dụ button trên SpeedBar)
- Chọn (các) đối tượng mới – có, có thể chia sẻ nhiều hơn hai đối tượng (ví dụ: MenuItem1)
- Chuyển đến trang Sự kiện trong Trình kiểm tra đối tượng.
- Nhấp vào mũi tên xuống bên cạnh sự kiện để mở danh sách các trình xử lý sự kiện đã viết trước đó. (Delphi sẽ cung cấp cho bạn danh sách tất cả các trình xử lý sự kiện được hỗ trợ tồn tại trên biểu mẫu)
- Chọn sự kiện từ danh sách thả xuống. (ví dụ: Button1Click)
procedure TForm1.Button1Click(Sender: TObject) ; begin {code for both a button and a menu item} ... {some specific code:} if Sender = Button1 then ShowMessage('Button1 clicked!') else if Sender = MenuItem1 then ShowMessage('MenuItem1 clicked!') else ShowMessage('??? clicked!') ; end;
Lưu ý: Câu lệnh other thứ hai trong câu lệnh if-then-else xử lý tình huống khi cả Button1 và MenuItem1 đều không gây ra sự kiện. Nhưng ai khác có thể gọi cho bộ điều khiển, bạn có thể hỏi. Hãy thử điều này (bạn sẽ cần một nút thứ hai: Nút2):
procedure TForm1.Button2Click(Sender: TObject) ; begin Button1Click(Button2) ; {this will result in: '??? clicked!'} end;
LÀ và NHƯ THẾ NÀO
if Sender is TButton then DoSomething else DoSomethingElse;
procedure TForm1.Edit1Exit(Sender: TObject) ; begin Button1Click(Edit1) ; end;
{... else} begin if Sender is TButton then ShowMessage('Some other button triggered this event!') else if Sender is TEdit then with Sender as TEdit do begin Text := 'Edit1Exit has happened'; Width := Width * 2; Height := Height * 2; end {begin with} end;
Phần kết luận
Như chúng ta có thể thấy, tham số Người gửi có thể rất hữu ích khi được sử dụng đúng cách. Giả sử chúng ta có nhiều hộp chỉnh sửa và nhãn chia sẻ cùng một trình xử lý sự kiện. Nếu chúng ta muốn tìm ra ai đã kích hoạt sự kiện và thực hiện hành động, chúng ta sẽ phải xử lý các biến đối tượng. Nhưng chúng ta hãy để điều này cho một thời điểm khác.