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

Вниз

Ковырялся я тут в VCL...   Найти похожие ветки 

 
Piter ©   (2005-09-26 22:49) [0]

В модуле ComCtrls, в функции TToolBar.WndProc увидел:

Result := (Control <> nil) and (Control is TToolButton) and
     not Control.Dragging;


Вопрос - зачем здесь условие Control <> nil?


 
Gero ©   (2005-09-26 22:55) [1]

Например, чтобы AV при Control.Dragging не вылезло.


 
Piter ©   (2005-09-26 23:46) [2]

Gero ©   (26.09.05 22:55) [1]

см. внимательнее


 
Gero ©   (2005-09-26 23:50) [3]

Хм, я наверное чего-то не вижу или не понимаю.


 
Piter ©   (2005-09-26 23:59) [4]

Ладно, может это я что не понимаю.

Ты говоришь - "чтобы AV при Control.Dragging не вылезло".

В каком случае вылезет AV при Control.Dragging?


 
Lamer@fools.ua ©   (2005-09-27 00:02) [5]

>>Gero

System.pas
function _IsClass(Child: TObject; Parent: TClass): Boolean;
begin
 Result := (Child <> nil) and Child.InheritsFrom(Parent);
end;

class function TObject.InheritsFrom(AClass: TClass): Boolean;
var
 ClassPtr: TClass;
begin
 ClassPtr := Self;
 while (ClassPtr <> nil) and (ClassPtr <> AClass) do
   ClassPtr := PPointer(Integer(ClassPtr) + vmtParent)^;
 Result := ClassPtr = AClass;
end;


>>Piter

Лучше перебдеть, чем недобдеть :-)


 
Мексиканец ©   (2005-09-27 00:02) [6]

Я что-то тоже не вижу...
По умолчанию используется сокращенный режим вычисления если Control <> true то результат будет ясен и остальные условия проверятся не будут.
Может это имели ввиду… А что собственно смущает?


 
Gero ©   (2005-09-27 00:02) [7]

var
 Control: TToolButton;
begin
 Control := nil;
 Result := (Control is TToolButton) and not Control.Dragging;
end;


 
Мексиканец ©   (2005-09-27 00:02) [8]

Я что-то тоже не вижу...
По умолчанию используется сокращенный режим вычисления если Control <> true то результат будет ясен и остальные условия проверятся не будут.
Может это имели ввиду… А что собственно смущает?


 
Gero ©   (2005-09-27 00:06) [9]


> Lamer@fools.ua ©   (27.09.05 00:02)

Не знал, спасибо :)


 
Piter ©   (2005-09-27 00:18) [10]

Gero ©   (27.09.05 0:06) [9]
Не знал, спасибо


ничего себе... ты правда считал, что:

(nil is TSomeClass) = True всегда ? :)

Это было бы несколько не логично :)


 
Gero ©   (2005-09-27 00:25) [11]


> ничего себе... ты правда считал, что:
>
> (nil is TSomeClass) = True всегда ?

Нет, только если переменная имеет тип TSomeClass.


 
Lamer@fools.ua ©   (2005-09-27 00:31) [12]

>>Gero ©   (27.09.05 00:25) [11]

Тогда _IsClass даже вызываться не будет.


 
Мексиканец ©   (2005-09-27 00:47) [13]

Piter ©  (27.09.05 00:18) [10]
А что быстрее по скорости выполнения:
Control <> nil или Control is TToolButton?


 
jack128 ©   (2005-09-27 06:25) [14]

Мексиканец ©   (27.09.05 0:47) [13]
ты как пишешь:
FreeAndNil(SomeObj) или if SomeObj <> nil then FreeAndNil(SomeObj) ?? тут тоже самое..

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


 
Piter ©   (2005-09-27 16:59) [15]

Gero ©   (27.09.05 0:25) [11]
Нет, только если переменная имеет тип TSomeClass.


а какой тогда смысл проверки?


 
kaif ©   (2005-09-27 18:42) [16]

В ComCtrls в том, что касается TToolBar есть гораздо более ощутимые проблемы. Если хочешь их поискать, попытайся взлянуть на то, как выглядит ToolBar в режиме крупного шрифта экрана. Так что я в проектах юзаю "подправленный" ComCtrls.pas.  Еще мне как-то пришлось исправлять ошибку в db.pas. А проверка Control <> nil в данном случае есть нормальная предосторожность. Возможно код раньше выглядел так:

Result := (Control <> nil) and not Control.Dragging;

а потом уже в него зачем-то добавили условие

and (Control is TToolButton)

В любом случае такими вещами как  Control <> nil кашу маслом не испортишь. Это за ошибку считать нельзя. Это можно считать за правильный педантизм.


 
Anatoly Podgoretsky ©   (2005-09-27 19:04) [17]

Gero ©   (27.09.05 00:25) [11]
С этим сложенне, в ранних версиях nil = любой класс, от туда и пошла проверка <> nil. В более поздних версия это изменили.


 
Мексиканец ©   (2005-09-27 22:20) [18]

jack128 ©  (27.09.05 06:25) [14]
>...ну написал кто то так, ну и что теперь, переделовать?
И то верно...



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

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

Наверх




Память: 0.48 MB
Время: 0.033 c
9-1118217775
lex(x)
2005-06-08 12:02
2005.10.16
Передвижение камеры!


14-1127734001
Megabyte
2005-09-26 15:26
2005.10.16
Письмо от Кобальта, часть 2-я


2-1127214444
FBI Agent
2005-09-20 15:07
2005.10.16
Print DBGrid


3-1125475563
DmitryNekl
2005-08-31 12:06
2005.10.16
Неверная фильтрация, ADO, доступ к текстовым файлам через Jet


14-1127469588
ilya39
2005-09-23 13:59
2005.10.16
VS .Net 2002





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