Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.16;
Скачать: CL | DM;

Вниз

Ковырялся я тут в 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.03 c
2-1125550789
Diller
2005-09-01 08:59
2005.10.16
Копирование файлов


1-1127867033
Димыч
2005-09-28 04:23
2005.10.16
Контейнер с файлами


4-1124002284
GreySkil
2005-08-14 10:51
2005.10.16
Права доступа


8-1116755107
MACTEP'oK
2005-05-22 13:45
2005.10.16
DirectSound. Проблема с записью длительного звукового потока .


3-1125404241
geidarka
2005-08-30 16:17
2005.10.16
Регистро-независимый поиск