Форум: "Основная";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.06 c