![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Классы!
WondeRu © (2004-08-12 12:42:00)Здравствуйте!
Чем отличается следующий код? и где, что лучше применять?
1.
(Sender as TPanel).Handle
2.
TPanel(Sender).Handle
Код Делфа генерит разный!!!
Заранее спасибо!
Anatoly Podgoretsky (2004-08-12 16:49:00) [1]_student (12.08.04 16:08) [19]
Бредятина у тебя ты явно попросил компидятор не беспокоиться насчет проверки, что TButton это TButton
s999 (2004-08-12 16:39:00) [2]
> если объявлен как class procedure
Совсем не обязательно. Например:
TMyObject = class(TObject)
public
Str: string;
procedure Proc1;
procedure Proc2;
end;
procedure TMyObject.Proc1;
begin
ShowMessage('Ляля');
end;
procedure TMyObject.Proc2;
begin
ShowMessage(Str);
end;
А теперь:
TMyObject(nil).Proc1;
TMyObject(nil).Proc2;
Первый вызов работает, второй нет. Первому просто ничего от объекта не надо.
KSergey (2004-08-12 16:36:00) [3]Обещанные ссылки:
Увы, та ветка уже в архиве, кому интересно можно взять тут (спасибо клиенту форума!)
FTP://217.70.127.139/incoming/Forum/1.html
так же не плохая была
http://delphimaster.ru/cgi-bin/forum.pl?id=1091522317&n=3
WondeRu (2004-08-12 16:26:00) [4]>s999 (12.08.04 16:20) [22]
>А вообще, нормально отработают методы, которым конкретный экземпляр класса "по барабану".
если объявлен как class procedure, то м.б.! или я не прав?
2ALS © (12.08.04 16:05) [18]
интерфейсы только через ass должны браться ;-)
WondeRu (2004-08-12 16:21:00) [5]>_student (12.08.04 16:08) [19]
хороший код - хорошо работает! мне понравилось! ;-)
s999 (2004-08-12 16:20:00) [6]
> Боюсь фокусы с ShowMessage(TLabel(nil).Caption - частный
> случай
Конечно.
> Боюсь фокусы с ShowMessage(TLabel(nil).Caption - частный
> случай, т.к в конце концов ShowMessage отрисовывается DrawText,
> в которую передается не строка, а указатель на нее (PChar)
> в данном случае nil!
Не совсем так, просто у TControl метод GetText любопытно реализован.
А вообще, нормально отработают методы, которым конкретный экземпляр класса "по барабану".
KSergey (2004-08-12 16:15:00) [7]> [20] WondeRu © (12.08.04 16:09)
> Боюсь фокусы с ShowMessage(TLabel(nil).Caption - частный
> случай, т.к в конце концов ShowMessage отрисовывается DrawText,
> в которую передается не строка, а указатель на нее (PChar)
> в данном случае nil!
Нет, он не nil (ну так вот уж, гарантированно), но, вероятно, попадаем в допустимую область памяти.
Впрочем, на самом деле это очень зависит от положения луны относительно созвездия псов. Совершенно серьезно.
> [19] _student (12.08.04 16:08)
> p:=Label1;
> if TButton(p) is TButton then
> ShowMessage('sdfg')
> else
> ShowMessage('11111');
>
> Выдает что p TButton. Да, это все надуманная бредятина.
В упомянуой мной ветке это подробнейше обсуждалось.
Было в потрепаться.
сейчас попробую поискать
WondeRu (2004-08-12 16:09:00) [8]2s999 (12.08.04 15:54) [17]
а такой код
TLabel(nil).Canvas.Lock;
????
Боюсь фокусы с ShowMessage(TLabel(nil).Caption - частный случай, т.к в конце концов ShowMessage отрисовывается DrawText, в которую передается не строка, а указатель на нее (PChar) в данном случае nil!
_student (2004-08-12 16:08:00) [9]
p:=Label1;
if TButton(p) is TButton then
ShowMessage('sdfg')
else
ShowMessage('11111');
Выдает что p TButton. Да, это все надуманная бредятина.
ALS (2004-08-12 16:05:00) [10]Похоже, разница не только в выполнении проверки и исключительной ситуации.
При работе с интерфейсами TSomeType(Var) почему-то не всегда срабатывает :(
s999 (2004-08-12 15:54:00) [11]
> а если p=nil , будет ли работать код TObject(p) ?
Вполне. Порой даже без ошибок, например:
ShowMessage(TLabel(nil).Caption);
Anatoly Podgoretsky (2004-08-12 15:53:00) [12]Приведение типа не делает никакого предположения об содержимом переменной
WondeRu (2004-08-12 15:46:00) [13][14]
а если p=nil , будет ли работать код TObject(p) ?
_student (2004-08-12 15:40:00) [14]Не спорю
if TObject(p) is TButton then
ShowMessage('sdfg')
else
ShowMessage('11111');
WondeRu (2004-08-12 15:26:00) [15]2 _student
is работает только с потомками TObject!!!
Если Sender - указатель, то работает только 2-й вариант(((
GrayFace (2004-08-12 15:26:00) [16]KSergey © (12.08.04 13:17) [4]
> Да и недавно отгремела огромная вполне любопытная
> ветка по is.
Можно ссылку или название?
_student (2004-08-12 15:11:00) [17]is не помогает?
WondeRu (2004-08-12 15:03:00) [18]Ну да, а если Sender объявлен как Pointer?
Anatoly Podgoretsky (2004-08-12 14:01:00) [19]Все зависит от того, хочешь ли ты катастрофическое окончание или можно отделаться исключением.
WondeRu (2004-08-12 13:38:00) [20]Вроде разъяснилось! Спасибо!