Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.48 MB
Время: 0.042 c
1-1129182769
Andruid
2005-10-13 09:52
2005.11.06
Алгоритм простейшего элемента нейросетей - компаратора


14-1129228843
ArtemESC
2005-10-13 22:40
2005.11.06
Выражение


1-1129093521
Ветер в голове
2005-10-12 09:05
2005.11.06
Как заменить слово в Richedit


14-1129122903
Антоний
2005-10-12 17:15
2005.11.06
Для печати проспектов


6-1122031924
Profik
2005-07-22 15:32
2005.11.06
ClientSocket