![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Внезапно вызывается OnCanResize для формы
stef © (2005-10-17 04:10:00)Здравствуйте гуру. У меня такой глупый вопрос: почему при выполнении одной из строк кода
form1.label1.caption:=...
form1.label1.Top:=...
form1.label1.left:=...
начинает обрабатываться событие OnCanResize формы form1.
В книгах про это ничего не сказано. Возможно, так и должно быть? Странно это как-то. Только не надо смеяться - я серьезно.
ЮЮ (2005-10-17 07:35:00) [1]А ещё проше, дабы отключить вызов обработчкика, вызванного кодом в программе, но оставить его при манипуляциях пользователя, использовать в коде такую конструкцию:
<объект>.OnXXX := nil;
try
изменеие св-в объекта, могущих вызвать обработчик OnXXX
finally
<объект>.OnXXX := <обработчик события>;
end;
stef (2005-10-17 05:21:00) [2]Ну ведь это же можно просто переопределить указанные методы, только оставить в них (в переопределенных) части кода из исходников TControl, которые (части) не вызывают OnResize или OnCanResize. Глючить будет!!! Но все равно спасибо.
ЮЮ (2005-10-17 05:08:00) [3]Ну почему же любой.
Т.к.
TControl = class(TComponent)
procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); virtual;
то SetBounds( можно перекрыть в наследнике так, как пожелаешь, только тогда приватные методы типа CheckNewSize будут недоступны и часть кода придется писать самому
ЮЮ (2005-10-17 05:00:00) [4]по поводу On CanResize, аналогично:
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
stef (2005-10-17 04:55:00) [5]Во, блин, ПАСИБА. Это, чтож получается - любой производный от TControl объект, при попытке обращения к его определенным свойствам будет вызывать OnResize? Классно!
ЮЮ (2005-10-17 04:38:00) [6]А в исходники заглянуть религия не позволяет?
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;