Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.23;
Скачать: CL | DM;

Вниз

TControl.Parent   Найти похожие ветки 

 
klyonov   (2004-05-04 15:42) [0]

всем привет
вот какой вопрос: есть Comp: TComponent. у него есть свойство Control: TWinControl - ссылка на контрол. еще у него есть несколько контролов (FRects: array [0..7] of TWinControl), для которых он Owner. при установке свойства Control я делаю FRects[i].Parent := Control.Parent
также я устанавливаю FreeNotification для Control (чтобы при своем разрушении он уведомил мой Comp). в обработке этого уведомления я разрушаю FRects.Free
теперь вот получается странная вещь:
1. код вида
Comp.Control := Button1;
Button1.Free;
все работает нормально - FRects разрушаются без проблем и все ок
2. при попытке закрыть форму, на которой Comp и Button1 при попытке разрушить FRects (FRects[i].Free) вылезает "Control "Button1" has no parent window"
интересно, почему это вылезает, ведь при таком коде:
FRects[i].Parent := Control.Parent
передается ссылка на Control.Parent и с Control уже ничего FRects связывать не должно. или я не прав? подскажите, плиз
заранее спасибо


 
klyonov   (2004-05-04 16:54) [1]

ну не может быть чтобы никто не знал похожей ситуации
или я непонятно описал?


 
Mim1 ©   (2004-05-04 21:14) [2]

klyonov   (04.05.04 16:54) [1]

> или я непонятно описал?

Попробуй убрать из вопроса все лишнее, имхо воды слишком много. Может понятнее станет.


 
klyonov   (2004-05-04 21:50) [3]

в общем, вот код:

TResizeRect = class (TCustomControl)
protected
 procedure Paint; override;
end;

TResizer = class(TComponent)
private
 FRects: array [0..7] of TResizeRect;
 FFrameRect: TFrameRect;
 FControl: TWinControl;
 FPropInspector: TPropertyInspector;
 procedure CreateFrameRect(ARect: TRect);
 procedure DestroyFrameRect;
 procedure CreateResizeRects;
 procedure SetResizeRects;
 procedure ShowResizeRects(AShow: Boolean);
 procedure DestroyResizeRects;
 procedure CreateHook;
 procedure SetControl(const Value: TWinControl);
 procedure SetPropInspector(const Value: TPropertyInspector);
protected
 procedure Notification(AComponent: TComponent; Operation: TOperation); override;
public
 constructor Create(AOwner: TComponent); override;
 destructor Destroy; override;
 property Control: TWinControl read FControl write SetControl;
published
 property PropInspector: TPropertyInspector read FPropInspector write SetPropInspector;
end;

procedure TResizer.SetControl(const Value: TWinControl);
begin
 if FControl = Value then
   Exit;
 if Value = nil then
 begin
   DestroyResizeRects;
   FControl.RemoveFreeNotification(Self);
   FControl := Value;
 end
 else
 begin
   FControl := Value;
   if FPropInspector <> nil then
     FPropInspector.Component := FControl;
   FControl.FreeNotification(Self);
   CreateResizeRects;
   CreateHook;
 end;
end;

procedure TResizer.Notification(AComponent: TComponent; Operation: TOperation);
begin
 inherited;
 if (Operation = opRemove) then
 begin
   if (AComponent = FControl) then
   begin
     DestroyResizeRects; // !!! НЕХОРОШЕЕ МЕСТО
     FControl := nil;
   end;
   if (AComponent = FPropInspector) then
     FPropInspector := nil;
 end;
end;

procedure TResizer.DestroyResizeRects;
var i: Integer;
begin
 for i := 0 to 7 do
   FreeAndNil(FRects[i]);
end;

в общем, дело такое: есть R: TResizer
делаем
R.Control := Button1;
далее, делаем
Button1.Free;
все обрабатывается нормально (в "нехорошем месте")
а если делаем
Form.Close;
или
Application.Terminate;
в "нехорошем месте" вылезает: "Control "Button1" has no parent window"
вот в чем тут дело, понять не могу.


 
klyonov   (2004-05-05 20:45) [4]

никто не знает в чем дело?
очень нужно
заранее спасибо еще раз


 
Jack128 ©   (2004-05-05 21:21) [5]

Так я так и не понял кто владелец FRects[i]?

И вообще троссировка кода VCL обычно помогает понять где ошибка...


 
klyonov   (2004-05-05 22:21) [6]

владелец FRects[i] - TResizer
а трассировка помогает... с ней я понял где вылетает исключение и почему - потому что в деструкторе FRects зачем то лезет в Button1.Parent (через своего Parent"а походу каким то шаманским способом) и пытается там сделать RemoveControl(Self), а он (Parent) уже nil, отсюда и лезет исключение
я вот только не понимаю зачем он это делает и как это предотвратить



Страницы: 1 вся ветка

Текущий архив: 2004.05.23;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.064 c
1-1084310707
ivan999
2004-05-12 01:25
2004.05.23
обработка сообщений


3-1083238617
IBNovice
2004-04-29 15:36
2004.05.23
Filter


7-1081861291
Pavel
2004-04-13 17:01
2004.05.23
Inetd в Win 2000


8-1078680622
Mihey
2004-03-07 20:30
2004.05.23
Про SpriteUtils


1-1084359481
Николай
2004-05-12 14:58
2004.05.23
Сохранение в компоненте Edit