Форум: "Основная";
Текущий архив: 2002.12.19;
Скачать: [xml.tar.bz2];
ВнизNotification Найти похожие ветки
← →
D-NICKNAME (2002-12-09 09:21) [0]Привет всем!..
У меня проблема связывания компонентов, а точнее походу проблема с Notification. Сразу оговорюсь, что уведомлениями я пользуюсь первый раз. Есть 2 компонента TMDIControl и TDMDIContainer. TMDIControl привязывается к TDMDIContainer. После привязки в design-time удаляю TDMDIContainer. По идее TDMDIContainer должен уведомить TMDIControl о своём удалении. Вроде бы всё делаю как надо, но высвечивается Access violation. Скорее всего у меня ошибка. Вот код:
TMDIControl = class;
TDCustomMDIContainer = class(TCustomControl)
private
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
procedure Paint; override;
published
{ Published declarations }
end;
TDMDIContainer = class(TDCustomMDIContainer)
private
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
end;
TCustomMDIControl = class(TComponent)
private
FMDIContaier: TDMDIContainer;
procedure SetMDIContainer(const Value: TDMDIContainer);
procedure Notification(AComponent: TComponent; Operation: TOperation);
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
{ Published declarations }
property MDIContainer: TDMDIContainer read FMDIContaier write SetMDIContainer;
end;
TMDIControl = class(TCustomMDIControl)
private
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
end;
{ TDCustomMDIContainer }
constructor TDCustomMDIContainer.Create(AOwner: TComponent);
begin
inherited;
DoubleBuffered := True;
TabStop := False;
Height := 45;
Width := 185;
end;
procedure TDCustomMDIContainer.Paint;
var R: TRect;
begin
inherited;
with Canvas do begin
R := GetClientRect;
if (csDesigning in ComponentState) then DrawFocusRect(R);
end;
end;
{ TCustomMDIControl }
constructor TCustomMDIControl.Create(AOwner: TComponent);
begin
inherited;
FMDIContaier := nil;
end;
destructor TCustomMDIControl.Destroy;
begin
inherited;
end;
procedure TCustomMDIControl.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) and (AComponent = FMDIContaier) then FMDIContaier := nil;
end;
procedure TCustomMDIControl.SetMDIContainer(const Value: TDMDIContainer);
begin
if (Value <> FMDIContaier) then begin
// Здесь я пробывал разные модификации
if (Assigned(FMDIContaier)) then RemoveFreeNotification(FMDIContaier);
if (FMDIContaier <> nil) then FMDIContaier.FreeNotification(Self);
FMDIContaier := Value;
end;
end;
Заранее благодарю.
← →
icWasya (2002-12-09 09:36) [1]
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
← →
Юрий Зотов (2002-12-09 09:41) [2]procedure TCustomMDIControl.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited;
if (Operation = opRemove) and (AComponent = FMDIContaier) then SetMDIContaier(nil)
end;
procedure TCustomMDIControl.SetMDIContainer(const Value: TDMDIContainer);
begin
if Value <> FMDIContaier then
begin
// Разрываем старую связь
if FMDIContaier <> nil then RemoveFreeNotification(FMDIContaier);
// Меняем ссылку
FMDIContaier := Value;
// Устанавливаем новую связь
if FMDIContaier <> nil then FreeNotification(FMDIContaier)
end
end;
В TCustomMDIControl конструктор и деструктор не делают ничего полезного и могут быть удалены. Поле FMDIContaier будет равным nil и без этого.
← →
D-NICKNAME (2002-12-10 15:08) [3]2 icWasya
Краткость конечно же сестра таланта, но не в этой формулировке вопроса.
2 Юрий Зотов
Спасибо, теперь всё ясно.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.12.19;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c