Форум: "Начинающим";
Текущий архив: 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";
ISif 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