Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как работать с as и is ? [D7, XP]


Страницы:   1 2 3

Первокласник вася ©   (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;

Если зендер есть панель, то приводим к панели и присваиваем значения свойств. Т.е. все зависит от самих компонентов?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо