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

Вниз

FreeNotification(Self) принцип работы ?   Найти похожие ветки 

 
Аюс   (2005-03-02 08:53) [0]

Можете пояснить , когда это нужно использовать
ну и вообще принцип работы этого .

хотя прочитал про нее на Королевстве ..

Посылает определенному компоненту сообщение о том, что данный компонент хочет знать, когда тот будет разрушаться. Это необходимо в тех случаях, когда компонент использует другие (например, связки TDataSet-TDataSource), и не хочет потерять ссылку в воздухе, когда связанный компонент разрушается.


 
Юрий Зотов ©   (2005-03-02 10:10) [1]

Ну, положим, никаких сообщений там не посылается...

Этот метод взаимно включает 2 компонента в список FreeNotifies друг друга. При удалении любого компонента он проходит по этому своему списку и для каждого находящегося в нем компонента вызывает метод Notification(Self, opRemove), уведомляя тем самым о своем уничтожении.

Применяется для очистки межкомпонентских ссылок при разных владельцах (например, когда DBGrid лежит на форме, а DataSource - на модуле данных).


 
Аюс   (2005-03-02 12:56) [2]

то есть, пердположим есть такой код , он будет правильным ?

TMyComponent = class(TParent)
 private
  FOtherComponent:TOtherComponent;
  ...
  procedure SetComponent(Value:TOtherComponent);
 protected
  procedure Notification(AComponent: TComponent; Operation: TOperation); override;
 public
  property Component:TOtherComponent read FOtherComponent write SetComponent;
  ...
end;

procedure TMyComponent.SetComponent(Value:TOtherComponent);
begin
 if FOtherComponent <> Value then
  begin
    FOtherComponent := Value;
    if Value <> nil then
      Value.FreeNotification(Self);
  end;
end;  

// И правильно ли будет так ?
procedure TMyComponent.Notification(AComponent: TComponent;
 Operation: TOperation);
begin
 inherited Notification(AComponent, Operation);
 if (Operation = opRemove) and (FOtherComponent <> nil) and (AComponent = OtherComponent) then
  begin
     FOtherComponent.Free;
     FOtherComponent := nil;
  end;
end;


ЗЫ. А где тут у вас предварительный просмотр ?
А то в маленьком окошке "Написать ответ",
визуально плохо просмотреть свой пост , и как он будет выглядеть.


 
Юрий Зотов ©   (2005-03-02 13:28) [3]

Код близок к правильному, но есть одна серьезная ошибка. Зачем удалять внешний компонент в Notification, если он и так уже удаляется? Да и вряд ли правильно это - чужие компоненты грохать. Да и зацикливание может получиться - ведь он снова вызовет наш Notification.

procedure TMyComponent.Notification(AComponent: TComponent;
Operation: TOperation);
begin
 inherited;
 if (Operation = opRemove) and (AComponent = FOtherComponent) then
   FOtherComponent := nil
end;

Кроме того, бывает полезно в SetOtherComponent использовать RemoveFreeNotification (удаление себя из списка FreeNotifies прежнего компонента, если в уведомлениях от него мы более не нуждаемся).


 
Аюс   (2005-03-02 14:06) [4]

Да зациклится , как то попробовал на своей шкуре :)
Спасибо , вроде попонятнее стало .



Страницы: 1 вся ветка

Текущий архив: 2005.11.13;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.047 c
2-1129816409
проходил_мимо_решил_зайти
2005-10-20 17:53
2005.11.13
Мемо и печать


4-1126611784
S@shka
2005-09-13 15:43
2005.11.13
Как заставить Windows не подключать мышь на Com-порте


5-1109098399
olookin
2005-02-22 21:53
2005.11.13
Свойства self-made компонента - ничего не понимаю!


2-1129842524
Dmitrich
2005-10-21 01:08
2005.11.13
Наследование Self


1-1129878710
zorik
2005-10-21 11:11
2005.11.13
Как реализовать обычное математическое округление