Текущий архив: 2005.11.06;
Скачать: CL | DM;
Вниз
Внезапно вызывается OnCanResize для формы Найти похожие ветки
← →
stef (2005-10-17 04:10) [0]Здравствуйте гуру. У меня такой глупый вопрос: почему при выполнении одной из строк кода
form1.label1.caption:=...
form1.label1.Top:=...
form1.label1.left:=...
начинает обрабатываться событие OnCanResize формы form1.
В книгах про это ничего не сказано. Возможно, так и должно быть? Странно это как-то. Только не надо смеяться - я серьезно.
← →
ЮЮ © (2005-10-17 04:38) [1]А в исходники заглянуть религия не позволяет?
procedure TControl.SetLeft(Value: Integer);
begin
SetBounds(Value, FTop, FWidth, FHeight);
Include(FScalingFlags, sfLeft);
end;
procedure TControl.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
begin
...
if not (csLoading in ComponentState) thenБ Resize;
end;
procedure TControl.Resize;
begin
if Assigned(FOnResize) then FOnResize(Self);
end;
← →
stef © (2005-10-17 04:55) [2]Во, блин, ПАСИБА. Это, чтож получается - любой производный от TControl объект, при попытке обращения к его определенным свойствам будет вызывать OnResize? Классно!
← →
ЮЮ © (2005-10-17 05:00) [3]по поводу OnCanResize, аналогично:
procedure TControl.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
begin
if CheckNewSize(AWidth, AHeight) and ...
end
function TControl.CheckNewSize(var NewWidth, NewHeight: Integer): Boolean;
begin
...
Result := not AutoSize or (DoCanAutoSize(W2, H2) and (W2 = W) and (H2 =
...
end
← →
ЮЮ © (2005-10-17 05:08) [4]Ну почему же любой.
Т.к.
TControl = class(TComponent)
procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); virtual;
то SetBounds( можно перекрыть в наследнике так, как пожелаешь, только тогда приватные методы типа CheckNewSize будут недоступны и часть кода придется писать самому
← →
stef © (2005-10-17 05:21) [5]Ну ведь это же можно просто переопределить указанные методы, только оставить в них (в переопределенных) части кода из исходников TControl, которые (части) не вызывают OnResize или OnCanResize. Глючить будет!!! Но все равно спасибо.
← →
ЮЮ © (2005-10-17 07:35) [6]А ещё проше, дабы отключить вызов обработчкика, вызванного кодом в программе, но оставить его при манипуляциях пользователя, использовать в коде такую конструкцию:
<объект>.OnXXX := nil;
try
изменеие св-в объекта, могущих вызвать обработчик OnXXX
finally
<объект>.OnXXX := <обработчик события>;
end;
Страницы: 1 вся ветка
Текущий архив: 2005.11.06;
Скачать: CL | DM;
Память: 0.45 MB
Время: 0.04 c