Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ как использовать Sender

Автор: priboltik 23.02.2007 21:26

полазил по FAQу - не нашел..
как я могу использовать Sender и где я могу его использовать???
если я правильно понимаю, то его можно использовать для одинаковых действий над объектами одного и того же класса.. это так??

вот напимер, как с помощью Sender мне в 3 checkbox - ах поменять свойство Visible???
пишу: (Sender as TCheckBox).Enabled:=true; - компиллирует но выдает ошибку...
подскажите пожалуйста..

Автор: xds 23.02.2007 22:18

А ты где это пишешь? Sender as TCheckBox будет работать без ошибки только в обработчике событий TCheckBox (т. е., когда Sender is TCheckBox = True). Параметр Sender указывает объект-источник события. Например, в обработчике события TButton.OnClick параметр Sender будет указывать на объект типа TButton, сгенерировавший событие по щелчку мышкой.

Автор: мисс_граффити 23.02.2007 22:58

priboltik, приведи, пожалуйста, полностью обработчик события...
и поконкретнее, что в каком случае должно происходить...
при щелчке на CheckBox 3 CheckBox'а должны становиться невидимыми? Или только один, на который кликнули?
и описание ошибки, которая у тебя выдается.

hint: Enabled и Visible - это разные свойства ;)
хочешь менять видимость - с ней и работай.

Автор: priboltik 24.02.2007 17:37

Цитата
hint: Enabled и Visible - это разные свойства ;)
хочешь менять видимость - с ней и работай.



сорри. погнал blink.gif мне нужен вообще в обработчик кнопки вставить... это реально???.. вот фрагмент кода:

procedure TForm1.Button1Click(Sender: TObject);
begin
if edit1.Text='' then
begin
if opendialog1.Execute then
begin
AssignFile(f,opendialog1.FileName);
reset(f);
Edit1.Text:=opendialog1.FileName;
(Sender as TCheckBox).Enabled:=true;
end;
end
else begin
try
Assignfile(f,edit1.text);
reset(f);
except
showMessage('Файл не найден');
edit1.Text:='';
end;
end;
end;




сегодня в универе посоветовали сначала сделать проверку: if (Sender is TCheckbox) then
(sender as TCheckbox).enabled;
.. еще правда не пробовал..

Автор: мисс_граффити 24.02.2007 21:19

Смотри: Sender - это то, что, собственно, вызвало событие.
В данном случае, насколько я вижу, это кнопка Button1.
НО! Если ты привешиваешь обработчик Button1Click на, например, событие CheckBox1 OnClick и щелкаешь по CheckBox1 - Sender'ом будет CheckBox1. Не все CheckBox'ы, а он один.
Тогда можно работать так, например:

procedure TForm1.Button1Click(Sender: TObject);
begin
if Sender is TCheckBox then
begin
(Sender as TCheckBox).Visible:=false;
ShowMessage('Спрятали CheckBox');
end;
if Sender is TButton then
begin
(Sender as TButton).Visible:=false;
ShowMessage('Спрятали Button');
end;
end;

Но тут надо быть осторожным: если фактически Sender - BitBtn (TBitBtn - наследник TButton), то Sender is TButton вернет истину.

Если же тебе надо поменять видимость у всех CheckBox'ов, а не у одного, вызвавшего событие (или CheckBox'ы вообще не имеют отношения к событию) - работай с массивом Components, а не с Sender'ом

Автор: priboltik 25.02.2007 1:59

А вообще реально одной строкой поменять некот. свойства у объектов одного и того же класса????
если да, то как это сделать???

Автор: klem4 25.02.2007 2:16

procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
for i := 0 to ComponentCount - 1 do
if (Components[i] is TLabel) then
(Components[i] as TLabel).Caption := 'I''m Tlabel component !';
end;

Автор: priboltik 25.02.2007 22:25

ок. спасибо.. собственно это и хотелось узнать.. good.gif