Главная страница
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.47 MB
Время: 0.048 c
4-1126693655
Still Swamp
2005-09-14 14:27
2005.11.13
Надо в CallBack API функции передать метод TObject


2-1129877717
TruthMan
2005-10-21 10:55
2005.11.13
Количество пикселей на микрон


14-1129919373
LordOfRock
2005-10-21 22:29
2005.11.13
Symantec Norton Antivirus 2004


1-1129826345
BobbyDigital
2005-10-20 20:39
2005.11.13
функция time


2-1129648328
VadimX
2005-10-18 19:12
2005.11.13
MaskEdit