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

Вниз

Классы!   Найти похожие ветки 

 
WondeRu ©   (2004-08-12 12:42) [0]

Здравствуйте!
Чем отличается следующий код? и где, что лучше применять?
1.
(Sender as TPanel).Handle


2.
 TPanel(Sender).Handle


Код Делфа генерит разный!!!

Заранее спасибо!


 
_student   (2004-08-12 12:57) [1]

"Разница между традиционными преобразованиями типов и использования операции as заключается в том, что последний вызывает исключительную ситуацию."
М.К.


 
wicked ©   (2004-08-12 12:59) [2]

1. выполняется проверка на то, является ли Sender экземпляром TPanel или её наследников... и если вдруг Sender окажется экземпляром TButton, наступит исключение...
2. ничего не проверяется, так что если Sender окажется экземпляром TButton, то и компилятор сгенерирует код, ведущий себя с Sender как с TButton...

на самом деле не так всё однозначно, поскольку в коде идёт обращение к свойству, общему и для TPanel, и для, скажем, TButton, поскольку обьявлено оно в общем предке - TWinControl... поэтому в данном случае катастрофы не будет...
но если вдруг в Sender окажется экземпляр, скажем, TList, то второй вариант уже чреват серьезными глюками...

в общем, совет: если нужно обратиться к свойству типа Handle или ClientRect, то кастить такой указатель лучше к классу, в котором это свойство и обьявлено... в данном случае это TWinControl...


 
QQ   (2004-08-12 13:14) [3]

В первом случае вызывается дополнительно процедура @AsClass,
которая проверяет, является ли Sender объектом класса TPanel или его наследника (если не является - генерируется исключение).
Первый вариант предпочтительнее, если речь не идёт о быстродействии. В любом случае лучше заранее проверить Sender на соответствие: if Sender is TPanel then ...


 
KSergey ©   (2004-08-12 13:17) [4]

> [2] wicked ©   (12.08.04 12:59)
> в общем, совет: если нужно обратиться к свойству типа Handle
> или ClientRect, то кастить такой указатель лучше к классу,
> в котором это свойство и обьявлено... в данном случае это
> TWinControl...

По поводу общности совета совершенно не согласен.

> _student   (12.08.04 12:57)

Извините - бред. Т.е. as всегда вызывает исключительную ситуацию, я правильно понял? (так написано!)
(традиционной и не традиционной бывает секссуальная ориентация)

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

А вообще - ну в книжках это все есть.
Да и недавно отгремела огромная вполне любопытная ветка по is. Думаю, к as это тоже относится.


 
_student   (2004-08-12 13:21) [5]


> KSergey ©   (12.08.04 13:17) [4]

если типы объектов ....


 
KSergey ©   (2004-08-12 13:22) [6]

> [4] KSergey ©   (12.08.04 13:17)
> - по-моему понятно: если есть полная уверенность, что некая
> переменная в данном месте программы точно указанного типа
> либо его наследник - то можно применять второе; если такой
> уверенности нет - первое (важно делать надежные программы).

Читать так:

если есть полная (гарантированная!) уверенность, что некая переменная содержит ссылку на объект того же класса, к котрому приводится или его наследника - то можно применять второе;

и далее по тексту.


 
KSergey ©   (2004-08-12 13:23) [7]

> [5] _student   (12.08.04 13:21)

Да, да
Запостил, потом подумал ;)


 
WondeRu ©   (2004-08-12 13:38) [8]

Вроде разъяснилось! Спасибо!


 
Anatoly Podgoretsky ©   (2004-08-12 14:01) [9]

Все зависит от того, хочешь ли ты катастрофическое окончание или можно отделаться исключением.


 
WondeRu ©   (2004-08-12 15:03) [10]

Ну да, а если Sender объявлен как Pointer?


 
_student   (2004-08-12 15:11) [11]

is не помогает?


 
GrayFace ©   (2004-08-12 15:26) [12]

KSergey ©   (12.08.04 13:17) [4]
> Да и недавно отгремела огромная вполне любопытная
> ветка по is.

Можно ссылку или название?


 
WondeRu ©   (2004-08-12 15:26) [13]

2 _student  
is работает только с потомками TObject!!!

Если Sender - указатель, то работает только 2-й вариант(((


 
_student   (2004-08-12 15:40) [14]

Не спорю

if TObject(p) is TButton then
    ShowMessage("sdfg")
   else
    ShowMessage("11111");


 
WondeRu ©   (2004-08-12 15:46) [15]

[14]
а если p=nil , будет ли работать код  TObject(p) ?


 
Anatoly Podgoretsky ©   (2004-08-12 15:53) [16]

Приведение типа не делает никакого предположения об содержимом переменной


 
s999   (2004-08-12 15:54) [17]


> а если p=nil , будет ли работать код  TObject(p) ?


Вполне. Порой даже без ошибок, например:

ShowMessage(TLabel(nil).Caption);


 
ALS ©   (2004-08-12 16:05) [18]

Похоже, разница не только в выполнении проверки и исключительной ситуации.
При работе с интерфейсами TSomeType(Var) почему-то не всегда срабатывает :(


 
_student   (2004-08-12 16:08) [19]

p:=Label1;
  if  TButton(p) is TButton  then
    ShowMessage("sdfg")
   else
    ShowMessage("11111");


Выдает что p TButton. Да, это все надуманная бредятина.


 
WondeRu ©   (2004-08-12 16:09) [20]

2s999   (12.08.04 15:54) [17]
а такой код

TLabel(nil).Canvas.Lock;

????

Боюсь фокусы с ShowMessage(TLabel(nil).Caption - частный случай, т.к в конце концов ShowMessage отрисовывается DrawText, в которую передается не строка, а указатель на нее (PChar) в данном случае nil!


 
KSergey ©   (2004-08-12 16:15) [21]

> [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. Да, это все надуманная бредятина.

В упомянуой мной ветке это подробнейше обсуждалось.
Было в потрепаться.
сейчас попробую поискать


 
s999   (2004-08-12 16:20) [22]


> Боюсь фокусы с ShowMessage(TLabel(nil).Caption - частный
> случай


Конечно.


> Боюсь фокусы с ShowMessage(TLabel(nil).Caption - частный
> случай, т.к в конце концов ShowMessage отрисовывается DrawText,
> в которую передается не строка, а указатель на нее (PChar)
> в данном случае nil!


Не совсем так, просто у TControl метод GetText любопытно реализован.

А вообще, нормально отработают методы, которым конкретный  экземпляр класса "по барабану".


 
WondeRu ©   (2004-08-12 16:21) [23]

>_student   (12.08.04 16:08) [19]
хороший код - хорошо работает! мне понравилось! ;-)


 
WondeRu ©   (2004-08-12 16:26) [24]

>s999   (12.08.04 16:20) [22]
>А вообще, нормально отработают методы, которым конкретный  экземпляр класса "по барабану".

если объявлен как  class procedure, то м.б.! или я не прав?

2ALS ©   (12.08.04 16:05) [18]
интерфейсы только через ass должны браться ;-)


 
KSergey ©   (2004-08-12 16:36) [25]

Обещанные ссылки:

Увы, та ветка уже в архиве, кому интересно можно взять тут (спасибо клиенту форума!)
FTP://217.70.127.139/incoming/Forum/1.html

так же не плохая была
http://delphimaster.net/view/15-1091522317/


 
s999   (2004-08-12 16:39) [26]


> если объявлен как  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;

Первый вызов работает, второй нет. Первому просто ничего от объекта не надо.


 
Anatoly Podgoretsky ©   (2004-08-12 16:49) [27]

_student   (12.08.04 16:08) [19]
Бредятина у тебя ты явно попросил компидятор не беспокоиться насчет проверки, что TButton это TButton



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

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

Наверх





Память: 0.55 MB
Время: 0.041 c
1-1092418819
Gnec
2004-08-13 21:40
2004.08.29
Как сделать чтобы в memo язык сразу делался английским


1-1092157520
new developer
2004-08-10 21:05
2004.08.29
Фокусы


14-1091764868
Думкин
2004-08-06 08:01
2004.08.29
Пятничные задачки. 6 августа 2004


1-1092643603
Diman
2004-08-16 12:06
2004.08.29
RichEdit


10-1033633458
Comwad
2002-10-03 12:24
2004.08.29
Опять про злосчастный "Assertion faild: _reply_message!=(..."





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский