Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.034 c
1-1084217733
killer
2004-05-10 23:35
2004.05.23
Вставка втроки в TStringList


1-1084342715
AngelSAI
2004-05-12 10:18
2004.05.23
Вывод вертикального текста


3-1083057992
}|{yk
2004-04-27 13:26
2004.05.23
Функции возвращающие набор данных в Оракле


14-1083470203
Думкин
2004-05-02 07:56
2004.05.23
С днем рождения! 2 мая.


7-1081412432
Stas
2004-04-08 12:20
2004.05.23
Изменения подписи чужой программы





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