Хотя пример в вашем вопросе на самом деле не имеет смысла (он неверно предполагает, что TLabel
имеет событие OnEdit
), очень возможно использовать параметр Sender
для получения информации об отправителе.
Создайте новое приложение VCL и поместите в форму несколько TLabel
элементов управления. Дайте им разные подписи (например, Dog
, Cat
, Rabbit
, Horse
et c.).
Теперь выберите их все в конструкторе форм и затем используйте объект Инспектор , чтобы создать для них общий обработчик OnClick
. Вы можете назвать его LabelClick
(напишите LabelClick
в поле редактирования рядом с OnClick
и нажмите Введите ).
Это создаст следующий пустой метод:
procedure TForm1.LabelClick(Sender: TObject);
begin
end;
Имеет параметр Sender
типа TObject
. Теперь, в зависимости от того, как вызывается этот метод, Sender
может быть любым TObject
(кнопка, форма, растровое изображение, ...) или nil
(вообще без объекта).
Но в нашем случае мы ожидаем, что этот метод в основном будет вызываться в ответ на нажатие меток, и в этих случаях Sender
будет соответствующим объектом TLabel
.
Попробуем отображать заголовок нажатой метки в окне сообщения!
Мы пробуем
procedure TForm1.LabelClick(Sender: TObject);
begin
ShowMessage(Sender.Caption); // won't compile!
end;
Но это даже не компилируется! Проблема в том, что TObject
не имеет участника publi c Caption
. Но TLabel
делает, поэтому мы можем написать
procedure TForm1.LabelClick(Sender: TObject);
begin
ShowMessage(TLabel(Sender).Caption);
end;
Здесь мы говорим компилятору, что знаем, что Sender
всегда будет TLabel
, и мы просим его Предположим, что это так.
Но это вызовет sh или сделает другие плохие вещи, если каким-то образом этот метод будет вызван с не- TLabel
Sender
. Так что безопаснее сделать
procedure TForm1.LabelClick(Sender: TObject);
begin
ShowMessage((Sender as TLabel).Caption);
end;
. Это будет то же самое, за исключением того, что теперь компилятор создаст код, который проверяет во время выполнения, что Sender
действительно является объектом TLabel
. Если нет, код вызовет исключение. Это намного лучше, чем проблемы с повреждением памяти / AV, которые могут возникнуть с небезопасным приведением выше. во время выполнения. Если это метка, мы отображаем ее заголовок. В противном случае мы предпочитаем ничего не делать. Обратите внимание, что здесь нет смысла использовать безопасный (и немного, немного медленнее) as
cast.