
Про Sender: TObject я недавно рассказал. Согласись, что использовать Sender без таких операторов как is и as не очень кавайно. Конечно, для определенных целей они даже не требуются, а вот кое-где уже не обойтись.
Ты-то про них знаешь всё, а вот остальным сейчас расскажу.
1. As
Да, я в названии не опечатался. Когда я использую as и is, мне кажется, что я пишу сочинение на английском на свободную тему – даже получаются правильно построенные предложения ![]()
Оператор as – я бы его перевёл как «использовать как».
Примерчик: при нажатии на кнопку, написать на ней «нажато». Пускай мы не знаем, какая кнопка нажата, так как наше событие вызывают несколько кнопок.
procedure TForm1.Button1Click(Sender: TObject); begin (Sender as TButton).Caption:='нажато'; end;
Мы используем Sender типа TObject как TButton, потому что мы заранее знаем, что это кнопка. Почему бы просто не написать Sender.Caption? Вот если у вызвавшего события компонента не будет такого свойства, то не имеет смысла. Впрочем, ошибка появится уже на этапе компиляции.
Можно и так:
procedure TForm1.Button1Click(Sender: TObject); var vb: TButton; begin vb:=Sender as TButton; vb.Caption:='нажато'; end;
Подводя итог, после as пишем тип, за который мы хотим принимать объект.
2. Is
А как нам быть, если мы не знаем, какого типа объект вызвал наш метод? Допутим, мы поставили еще и Label1 (TLabel) и на OnDblClick присвоили наш Button1Click. Sender as TButton – так для TLabel не получится. В runtime появится ошибка «invalid class typecast».
Ну что,
procedure TForm1.Button1Click(Sender: TObject);
begin
if (Sender is TButton) then
(Sender as TButton).Caption:='нажато';
if (Sender is TLabel) then
(Sender as TLabel).Caption:='дважды нажато';
end;
Вот и всё, нет ошибки. Если говорить по матчасти, (Sender is TButton) возвращает true или false.
В ближайшем будущем хочется привести один замечательный пример, подпишись на rss ленту и узнаешь первым
А я сегодня сдал зачёт по экологии)
(c) crystalbit, http://parsers.info