Текущий архив: 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.45 MB
Время: 0.029 c