Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.10.22;
Скачать: [xml.tar.bz2];

Вниз

Как работать с 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]

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



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

Форум: "Начинающим";
Текущий архив: 2006.10.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.041 c
15-1159513567
C@N
2006-09-29 11:06
2006.10.22
интересно КАК такое получилось!!!


3-1156618095
Deather
2006-08-26 22:48
2006.10.22
База Paradox 7


1-1158218607
MegaVolt
2006-09-14 11:23
2006.10.22
Как получить название языка на родном для него языке?


2-1160321477
TitAn
2006-10-08 19:31
2006.10.22
По StringGridу


2-1159798459
Fostr
2006-10-02 18:14
2006.10.22
Вставка картинки в Excel





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский