Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.008 c
7-61852
3asys
2002-10-16 15:23
2002.12.19
Как программно запретить PrintScreen во время работы программы


14-61823
SiJack
2002-11-29 16:37
2002.12.19
Алиас?


1-61630
DJ_Sedoy2
2002-12-07 11:14
2002.12.19
Второе дело. Картинку в popup menu или как?


14-61815
Ixion
2002-11-26 23:14
2002.12.19
Тестирование памяти


1-61645
_dmitry
2002-12-05 15:40
2002.12.19
Полупрозрачность на Canvas





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский