Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.037 c
2-1130125812
SamProf
2005-10-24 07:50
2005.11.13
работа с БД без установки BDE


2-1129105418
psa247
2005-10-12 12:23
2005.11.13
Application.OnMinimize


14-1129960960
Starcom
2005-10-22 10:02
2005.11.13
Софтина для печати фотографий размером 3,5 на 4,5 мм!


14-1130154592
Del_programmer
2005-10-24 15:49
2005.11.13
Другая жизнь...


4-1126241076
Фагот
2005-09-09 08:44
2005.11.13
Перехват клавиш в консольном приложении





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский