Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Notification не вызывается. 
V
    Опции темы
Beltar
Дата 27.12.2006, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 3
Всего: 7



Делаю компонент, содержащий формочку для показа справочников баз данных, чтобы не делать одно и то же в разных проектах. Таблицы содержаться в коллекции, точнее включены в элемент коллекции типа TListTable (всего 4 класса):

Код

  TListTable=class(TCollectionItem)
  private
    FTable:TADOTable;
    procedure SetTable(Value:TADOTable);
  published
    property Table:TADOTable read FTable write SetTable;
  end;

  TTables=class(TCollection)
  private
    FOwner:TAvgClassifierForm;
    function GetItem(Index: Integer): TListTable;
    procedure SetItem(Index: Integer; const Value: TListTable);
    function Add:TListTable;
    procedure Delete(Index:Integer);
    function Insert(Index:Integer):TListTable;
  protected
    function GetOwner: TComponent;
  public
    property Items[Index: Integer]: TListTable read GetItem write SetItem; default;
    constructor Create(AOwner:TAvgClassifierForm);
  published
  end;


У TListTable

Код

procedure TListTable.SetTable(Value: TADOTable);
var NC:TAvgClassifierForm;
begin
if FTable<>Value then
  begin
  FTable:=Value;
  NC:=TAvgClassifierForm((Self.Collection as TTables).GetOwner);
  Value.FreeNotification(NC);
  end;
end;


Т. е. получаю владельца коллекции (сам компонент) и прошу таблицу уведомлять его о своей смерти.

Сам Notification:

Код

procedure TAvgClassifierForm.Notification(AComponent: TComponent;
  Operation: TOperation);
var i:Integer;
begin
inherited Notification(AComponent,Operation);
if (Operation=opRemove) then
  begin
  for i := 0 to FTables.Count - 1 do
    if FTables[i].FTable=AComponent then
      begin
      Delete(i);
      Break;
      end;
  end;
end;


Метод GetOwner просто:
Код

function TTables.GetOwner: TComponent;
begin
Result:=FOwner;
end;


Проблема в том, что при удалении таблицы Notification не вызывается, таблица остается на месте и при попытке обращения AV. Что не так?

Это сообщение отредактировал(а) Beltar - 27.12.2006, 21:09


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Fedia
Дата 28.12.2006, 02:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 465
Регистрация: 2.8.2006
Где: первым встречаю р ассвет

Репутация: 8
Всего: 13



Есть подозрение, что (Self.Collection as TTables).GetOwner у тебя не является объектом типа TAvgClassifierForm. В этом случае на строчке:
Код

NC:=TAvgClassifierForm((Self.Collection as TTables).GetOwner);
 AV может не появиться, но и соответственно TAvgClassifierForm.Notification не сработает.
Цитата(Beltar @  27.12.2006,  21:08 Найти цитируемый пост)
Проблема в том, что при удалении таблицы Notification не вызывается, таблица остается на месте и при попытке обращения AV. Что не так?

Таблица уничтожается, но поскольку TAvgClassifierForm.Notification не сработал и соответственно из коллекции элемент, ссылающийся на уничтоженную таблицу не был удален, то при обращении к этому элементу и получается AV.

Может тебе пример и не нужен, но вот простой вариант, в котором Notification срабатывает: 
Код

type
  TForm1 = class(TForm)
    Button3: TButton;
    ADOTable1: TADOTable;
    Memo1: TMemo;
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button3Click(Sender: TObject);
begin
  ADOTable1.FreeNotification(Form1);
  ADOTable1.Free;
end;

procedure TForm1.Notification(AComponent: TComponent;
  Operation: TOperation);
begin
  inherited;
  if Operation = opRemove then
  Memo1.Lines.Add(AComponent.Name);
end;

end.



--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
Beltar
Дата 28.12.2006, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 3
Всего: 7



Оказывается я забыл указать, что Notification у моего компонента д/б перекрытым. Если честно, попадаюсь на этом 2-й раз. Как-то раз я забыл перекрыть у компонента деструктор и потом только после проверки на утечки увидел, что код деструктора просто не генерировался.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0460 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.