Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.22;
Скачать: CL | DM;

Вниз

Как работать с as и is ?   Найти похожие ветки 

 
Первокласник вася   (2006-10-08 13:53) [0]

Всем привет!
Я начинающий, и как правило опыта почти нет.
У меня такой вот вопрос: Как и для чего пользоваться as и is. Кучу книг пересмотрел, а на такую элементарную вещь лишь один пример и нифига не пойму назначение :(
Ребята подскажите пожалуйста!


 
Kolan ©   (2006-10-08 13:58) [1]

Раз
> Я начинающий
, то все что не понятно ищи в справке.

as используется для приведения типов (typecasts), а is для их сравнения

Вот те примеры из справки:
AS
(Sender as TButton).Caption := "&Ok";

IS
if ActiveControl is TEdit then TEdit(ActiveControl).SelectAll;


 
Anatoly Podgoretsky ©   (2006-10-08 13:59) [2]

Работать просто Object as/is TYPE then
as безопасное приведение типа
is проверка на тип, включая потомков

Примеры
if Sender is TButton then (Sender as TButton).Enabled := False
Проверяем, что Sender типа TButton и устанавливаем значения свойства


 
Virgo_Style ©   (2006-10-08 14:00) [3]

if Sender is TButton ...
(Sender as TButton).Caption := ...


 
Первокласник вася   (2006-10-08 14:04) [4]

Просто и понятно! Спасибо!
Только эксперимента ради я использовал Tcheckbox. Не работает.

if Sender is TCheckBox then (sender as TCheckbox).Checked:= true;

И ещё: если предположим на форме 10 TCheckbox то нужно так копать?

for t:=1 to ComponentCount-1 do
if Sender is TCheckBox then (sender as TCheckbox).Checked:= true;


 
Palladin ©   (2006-10-08 14:06) [5]

с чего ты взял что не работает, и что такое Sender?


 
Anatoly Podgoretsky ©   (2006-10-08 14:07) [6]

А нет ли у тебя обрабочика OnClick


 
Первокласник вася   (2006-10-08 14:09) [7]

да.....

Скопируй сначала вот этот код
if Sender is TCheckBox then (sender as TCheckbox).Checked:= false;
а потом скопируй вот это:
if Sender is TButton then (Sender as TButton).Enabled := False
запусти прогу и нажми на кнопку и сравни рузельтат :)


 
Первокласник вася   (2006-10-08 14:10) [8]

Анатолий! Приветсвую Вас!

Что такое OnClick знают уже в школе :)

Мое вот так  выглядит.

procedure TForm1.Button1Click(Sender: TObject);
begin
 if Sender is TCheckBox then (sender as TCheckbox).Checked:= false;
 if Sender is TButton then (Sender as TButton).Enabled := False
end;


 
Kolan ©   (2006-10-08 14:12) [9]


> procedure TForm1.Button1Click(Sender: TObject);
> begin
>  if Sender is TCheckBox then (sender as TCheckbox).Checked:
> = false;
>  if Sender is TButton then (Sender as TButton).Enabled :
> = False
> end;
>

А ты этот обработчик навесил и на кнопку и на чекбокс?
А отладчиком пойтись?


 
Anatoly Podgoretsky ©   (2006-10-08 14:12) [10]

Зачем ты нам это предлагаешь?
Это твоя домашняя задача.
Что значит да со множеством точек.
Ты сюда зачем пришел, за помощью? Так будь добр отвечать на уточняющие вопрос и четко формулировать свои мысли.


 
Anatoly Podgoretsky ©   (2006-10-08 14:13) [11]

Первокласник вася   (08.10.06 14:10) [8]
И что, хочешь рецензию на код - он правильный.


 
Ученик чародея ©   (2006-10-08 14:18) [12]


> Anatoly Podgoretsky ©   (08.10.06 13:59) [2]
> Работать просто Object as/is TYPE then
> as безопасное приведение типа
> is проверка на тип, включая потомков
>
> Примеры
> if Sender is TButton then (Sender as TButton).Enabled :=
> False
> Проверяем, что Sender типа TButton и устанавливаем значения
> свойства


А чем хуже?

if Sender is TButton then TButton(Sender).Enabled := False;

Я всегда такое приведение типов использую.


 
Anatoly Podgoretsky ©   (2006-10-08 14:24) [13]


> А чем хуже?
>
> if Sender is TButton then TButton(Sender).Enabled := False;
>

Не хуже и также безопасно, но вопрос был про AS и ответ поэтому тоже.
А вот если ты будешь делать это без IS тогда сразу почувствуешь разницу.
А такой подход тоже правомочен
(Sender as TButton).Enabled := False;
и
TButton(Sender).Enabled := False;
Второй код опасен


 
Первокласник вася   (2006-10-08 14:55) [14]

Ребят, я конечно приношу свои извенения, но учиться нужно не только писать код и думать головой, но и правильно "разговаривать", стараться нгайти что-то другое. вот и все... а вы меня отругали :(

И все же, почему этот кусок кода не срабатывает?
if Sender is TCheckBox then (sender as TCheckbox).Checked:= false;


 
Virgo_Style ©   (2006-10-08 15:02) [15]

Первокласник вася   (08.10.06 14:55) [14]
И все же, почему этот кусок кода не срабатывает?


срабатывает.


 
Первокласник вася   (2006-10-08 15:05) [16]

Не понимаю..... чего то я.....

вот кусок

procedure TForm1.Button1Click(Sender: TObject);
begin
 if Sender is TCheckBox then (Sender as TCheckBox).Checked:= false;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 if Sender is TCheckBox then (Sender as TCheckBox).Checked:= true;
end;

чета нич его не происходит....


 
Iamdanil ©   (2006-10-08 15:06) [17]

Если ты поставишь этот код в checkbox1.onclick
То при щелчке по нему он сработает. Если ты вставишь этот код в щелчок кнопки не будет работать, потому что сендер это тот компонент событие которого обрабатывается.


 
Первокласник вася   (2006-10-08 15:08) [18]

опа! все ясно кажется. Т.е. работать будет там, на что сослаться?


 
Плохиш ©   (2006-10-08 15:09) [19]


> Первокласник вася   (08.10.06 15:05) [16]
> чета нич его не происходит

А что должно происходить?

> Первокласник вася   (08.10.06 14:55) [14]
>  а вы меня отругали

Ты про [10]? Так там тебя не оптругали. Вот здесь http://delphimaster.net/view/2-1160167184/ аФФтора отругали, хотя ты уже тоже приближаешься.


 
Kolan ©   (2006-10-08 15:10) [20]


> procedure TForm1.Button2Click(Sender: TObject);
> begin
>  if Sender is TCheckBox then (Sender as TCheckBox).Checked:
> = true;
> end;

Ты проверил отладчиком условие выполняется?

procedure TForm1.Button2Click(Sender: TObject);
begin
if Sender is TCheckBox then
  (Sender as TCheckBox).Checked:= true; // Точку сюда поставь...
end;


<Телепатирую>
Просто в ты в обработчике кнопки наисал
if Sender is TCheckBox then (Sender as TCheckBox).Checked:= true;

Раз это обработчик нажатия на кнопку то Sender всегда будет типа TButton, следовательно условие Sender is TCheckBox будет всегда ложно...
</Телепатирую>


 
Iamdanil ©   (2006-10-08 15:11) [21]

У тебя сендер - кнопка поэтому код и не работает


 
Первокласник вася   (2006-10-08 15:12) [22]

да.... тут аффтора действительно отругали, но я не навязываюсь и стараюсь не ругаться с вами.
Господа прогарммеры, я дальше с вопросом.
Предположим, что компонент создан, его приведения в таком духе также возможно?


 
Первокласник вася   (2006-10-08 15:18) [23]

Не ребят! тут вы действительно круче авторов книг по компьютерной тематике! Объяснили - показали - не понятно - ещё раз показали и объяснили. Все доходит! Спасиба большое всем!

Ребят мне для самопроверки:

if sender is TPanel then (sender as TPanel).Color:=clblue;

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


 
RASkov   (2006-10-08 16:58) [24]

Если чесно то я вот вооще ничего не понял...
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
Вот. Может и не в тему написал, нифика не понял о чем в этой ветке:)
Возможны орф ошибки... Синтаксис вроде верен.


 
Kolan ©   (2006-10-08 19:24) [25]


> так как он TObject то он может быть практически любым классом

:)
Пример класса НЕ наследника TObject :)?


 
Ketmar ©   (2006-10-08 23:55) [26]

Удалено модератором


 
Anatoly Podgoretsky ©   (2006-10-09 00:53) [27]


> Пример класса НЕ наследника TObject :)?

Sender  = nil


 
Германн ©   (2006-10-09 01:37) [28]


> Anatoly Podgoretsky ©   (09.10.06 00:53) [27]
>
>
> > Пример класса НЕ наследника TObject :)?
>
> Sender  = nil
>

Мимо. Имхо.
В Вашем примере Sender это не класс, но экземпляр класса.
А в обработчике события Sender не может быть nil! imho.


 
Шпиён   (2006-10-09 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;



 
Германн ©   (2006-10-09 01:51) [30]


> Шпиён   (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:56) [31]

Мой ответ - только к этому:

> А в обработчике события Sender не может быть nil! imho.


 
Германн ©   (2006-10-09 02:49) [32]


> Шпиён   (09.10.06 01:56) [31]
>
> Мой ответ - только к этому:
>
> > А в обработчике события Sender не может быть nil! imho.
>
>

Термин "буквоедство" на сём форуме видел? :-)


 
Loginov Dmitry ©   (2006-10-09 07:29) [33]

Германн ©   (09.10.06 1:37) [28]
А в обработчике события Sender не может быть nil! imho


Это с какого такого ... "в обработчике события Sender не может быть nil". И почему Button1Click(nil) для Вас является извращением?

Вполне нормальный вызов процедуры с вполне нормальными параметрами.


 
Kolan ©   (2006-10-09 09:53) [34]


>
> Sender  = nil


И шо? Объект(инстанцированный класс)  сравнили с nil. Дальше то что?


 
Kolan ©   (2006-10-09 09:55) [35]

Кста про буквоедство.
Просто постом [25] хотел RASkov   (08.10.06 16:58) [24] напомнить что в VCL все классы потомки TObject, а то он явно сомневается..


 
RASkov   (2006-10-09 14:07) [36]

> [35] Kolan ©   (09.10.06 09:55)

Лучше постом [25] поправил бы меня, а не этот офтоп раводить:)
Я догадывался что из-за этих строк и словлю:)
Я про интерфэйсы и всякие COM и мало ли чего там еще есть - "знаю 0",
поэтому так и написал и далее подписал ведь не зря "если не любым".
Надеюсь, что автор вкурил по полной про ис и ас:)
ЗЫ а любят здесь придераться:) это нормально.


 
Barloggg   (2006-10-09 14:15) [37]

кстати, а вы сказали ему, что as также применим и к предкам, пришедшего к нам объекта?
Это тоже можно иногда использовать. если есть перекрытые функции например и надо использовать более ранний вариант...

кстати, а IS работает с предками?
т.е.
if sender is Tbutton
if sender is tobject
оба выдадут true если пришел Button1 с формы?


 
RASkov   (2006-10-09 14:18) [38]

> if sender is tobject

Вернет True ко всем классам.


 
RASkov   (2006-10-09 14:19) [39]

> кстати, а IS работает с предками?


> С помощью IS можно проверять принадлежность не конкретному
> классу а к общему. Например:
>
> if Sender is TWinControl then
>
> Сюда попадут все компаненты предком которых был TWinControl
> TPanel, TStaticText, TScrollBox и другие оконные контролы
> А вот TLabel, TPaintBox, TTimer - они пролетят.


 
Barloggg   (2006-10-09 15:42) [40]

о. похоже стоит однако прочитывать весь топик не смотря на флейм в конце и в начале... спасибо.


 
Kolan ©   (2006-10-09 16:13) [41]


> кстати, а вы сказали ему, что as также применим и к предкам,
>  пришедшего к нам объекта?

Топик читать не надо. И AS тут не причем. А то что вы сказали справидливо потому, что потомок - это предок + еще что-то(опционально).


 
Плохиш ©   (2006-10-09 18:29) [42]


> Barloggg   (09.10.06 15:42) [40]
> о. похоже стоит однако прочитывать весь топик

Прочитать лучше документацию.



Страницы: 1 2 вся ветка

Текущий архив: 2006.10.22;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.058 c
3-1156023966
Lexander
2006-08-20 01:46
2006.10.22
Как правильно сделать копию БД?


2-1159429147
Megabyte
2006-09-28 11:39
2006.10.22
Изменяемые сложные запросы


2-1159730321
Master_Of_Puppets
2006-10-01 23:18
2006.10.22
Скрытое приложение


2-1159509009
balepa
2006-09-29 09:50
2006.10.22
Есть две проги одна складывает данные в...


2-1159717062
Footballer
2006-10-01 19:37
2006.10.22
Добавление вложенных папок