Форум: "Потрепаться";
Текущий архив: 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.pasfunction _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.039 c