![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как работать с as и is ? [D7, XP]
Первокласник вася © (2006-10-08 13:53:00)Всем привет!
Я начинающий, и как правило опыта почти нет.
У меня такой вот вопрос: Как и для чего пользоваться asи is. Кучу книг пересмотрел, а на такую элементарную вещь лишь один пример и нифига не пойму назначение :(
Ребята подскажите пожалуйста!
Плохиш (2006-10-09 18:29:00) [1]
> Barloggg (09.10.06 15:42) [40]
> о. похоже стоит однако прочитывать весь топик
Прочитать лучше документацию.
Kolan (2006-10-09 16:13:00) [2]
> кстати, а вы сказали ему, что as также применим и к предкам,
> пришедшего к нам объекта?
Топик читать не надо. И AS тут не причем. А то что вы сказали справидливо потому, что потомок - это предок + еще что-то(опционально).
Barloggg (2006-10-09 15:42:00) [3]о. похоже стоит однако прочитывать весь топик не смотря на флейм в конце и в начале... спасибо.
RASkov (2006-10-09 14:19:00) [4]> кстати, а IS работает с предками?
> С помощью IS можно проверять принадлежность не конкретному
> классу а к общему. Например:
>
> if Sender is TWinControl then
>
> Сюда попадут все компаненты предком которых был TWinControl
> TPanel, TStaticText, TScrollBox и другие оконные контролы
> А вот TLabel, TPaintBox, TTimer - они пролетят.
RASkov (2006-10-09 14:18:00) [5]> if sender is tobject
Вернет True ко всем классам.
Barloggg (2006-10-09 14:15:00) [6]кстати, а вы сказали ему, что as также применим и к предкам, пришедшего к нам объекта?
Это тоже можно иногда использовать. если есть перекрытые функции например и надо использовать более ранний вариант...
кстати, а IS работает с предками?
т.е.
if sender is Tbutton
if sender is tobject
оба выдадут true если пришел Button1 с формы?
RASkov (2006-10-09 14:07:00) [7]> [35] Kolan © (09.10.06 09:55)
Лучше постом [25] поправил бы меня, а не этот офтоп раводить:)
Я догадывался что из-за этих строк и словлю:)
Я про интерфэйсы и всякие COM и мало ли чего там еще есть - "знаю 0",
поэтому так и написал и далее подписал ведь не зря " если не любым".
Надеюсь, что автор вкурил по полной про ис и ас:)
ЗЫ а любят здесь придераться:) это нормально.
Kolan (2006-10-09 09:55:00) [8]Кста про буквоедство.
Просто постом [25] хотелRASkov (08.10.06 16:58) [24]напомнить что в VCL всеклассы потомки TObject, а то он явно сомневается..
Kolan (2006-10-09 09:53:00) [9]
>
> Sender = nil
И шо? Объект(инстанцированный класс) сравнили с nil. Дальше то что?
Loginov Dmitry (2006-10-09 07:29:00) [10]Германн © (09.10.06 1:37) [28]
А в обработчике события Sender не может быть nil! imho
Это с какого такого ... "в обработчике события Sender не может быть nil". И почему Button1Click(nil) для Вас является извращением?
Вполне нормальный вызов процедуры с вполне нормальными параметрами.
Германн (2006-10-09 02:49:00) [11]
> Шпиён (09.10.06 01:56) [31]
>
> Мой ответ - только к этому:
>
> > А в обработчике события Sender не может быть nil! imho.
>
>
Термин "буквоедство" на сём форуме видел? :-)
Шпиён (2006-10-09 01:56:00) [12]Мой ответ - только к этому:
> А в обработчике события Sender не может быть nil! imho.
Германн (2006-10-09 01:51:00) [13]
> Шпиён (09.10.06 01:46) [29]
>
>
> > Германн © (09.10.06 01:37) [28]
>
>
>
> procedure TForm1.Button1Click(Sender: TObject);
> begin
> if Sender = nil then
> ShowMessage('AAA')
> else showMessage(Sender.ClassName);
> end;
>
> procedure TForm1.Button2Click(Sender: TObject);
> begin
> Button1Click(nil);
> end;
>
>
Извращения - не мой стиль!
Тем более, что к сути
> Kolan © (08.10.06 19:24) [25]
>
>
> > так как он TObject то он может быть практически любым
> классом
>
> :)
> Пример класса НЕ наследника TObject :)?
сей ответ никак не подходит!
Шпиён (2006-10-09 01:46:00) [14]
> Германн © (09.10.06 01:37) [28]
procedure TForm1.Button1Click(Sender: TObject);
begin
if Sender = nil then
ShowMessage('AAA')
else showMessage(Sender.ClassName);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Button1Click(nil);
end;
Германн (2006-10-09 01:37:00) [15]
> Anatoly Podgoretsky © (09.10.06 00:53) [27]
>
>
> > Пример класса НЕ наследника TObject :)?
>
> Sender = nil
>
Мимо. Имхо.
В Вашем примере Sender это не класс, но экземпляр класса.
А в обработчике события Sender не может быть nil! imho.
Anatoly Podgoretsky (2006-10-09 00:53:00) [16]
> Пример класса НЕ наследника TObject :)?
Sender = nil
Ketmar (2006-10-08 23:55:00) [17]Удалено модератором
Kolan (2006-10-08 19:24:00) [18]
> так как он TObject то он может быть практическилюбым классом
:)
Пример класса НЕ наследника TObject :)?
RASkov (2006-10-08 16:58:00) [19]Если чесно то я вот вооще ничего не понял...
Sender: TObject
в обработчиках событий - Sender - это тот компанент который вызвал данное событие и так как он TObject то он может быть практически любым классом если не любым, вот обработчик OnClick кнопки
procedure TForm1.ButtonClick(Sender: TObject);
begin
end;
... но данный обработчик может вызвать и другой компанент, и что бы узнать кто его сгенерил - помогает Sender. Например так:
procedure TForm1.Button1Click(Sender: TObject);
begin
if Sender is TButton then Form1.Caption:='Sender класса TButton';
if Sender is TPanel then (Sender as TPanel).Caption:='Sender класса TPanel';
// Можно также сравнить и с конкретным объектом,
if Sender=Edit1 then Edit1.SetFocus;
end;
вызываем т.е. генерим событие Button1Click;
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
if CheckBox1.Checked then Button1Click(Panel1)
else Button1Click(Edit1);
Button1Click(Button1);
end;
Ну и по теме, ответ уже был... повторюсь
IS- проверяет левый операнд(объект) к принадлежности классу в правом операнде
AS- Прведение к типу т.е. попытка привести левый операнд к типу - в правом операнде.
С помощью IS можно проверять принадлежность не конкретному классу а к общему. Например:
if Sender is TWinControl then
Сюда попадут все компаненты предком которых был TWinControl
TPanel, TStaticText, TScrollBox и другие оконные контролы
А вот TLabel, TPaintBox, TTimer - они пролетят.
Ну а с помощью AS приводим к типу если прошла проверка IS
Вот. Может и не в тему написал, нифика не понял о чем в этой ветке:)
Возможны орф ошибки... Синтаксис вроде верен.
Первокласник вася (2006-10-08 15:18:00) [20]Не ребят! тут вы действительно круче авторов книг по компьютерной тематике! Объяснили - показали - не понятно - ещё раз показали и объяснили. Все доходит! Спасиба большое всем!
Ребят мне для самопроверки:
if sender is TPanel then (sender as TPanel).Color:=clblue;
Если зендер есть панель, то приводим к панели и присваиваем значения свойств. Т.е. все зависит от самих компонентов?