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

Вниз

Удаление свойства-компонента.   Найти похожие ветки 

 
Чайник ©   (2005-06-15 16:51) [0]

Всем здравствуйте.
Делаю: компонент TCustomGraphOpenGL3D и производный от него TGraphOpenGL3D, который имеет внутреннее свойство того же типа FInnerGraph : TCustomGraphOpenGL3D. Когда назначаю FInnerGraph.Parent := Self все работаео нормально. Но я хочу иметь возможность назначать внутреннему компоненту других владельцев, например панель (что бы при работе TGraphOpenGL3D отрисовывал дополнительную информацию на сторонней поверхности).
Когда тестирую - т.е. создаю объект TGraphOpenGL3D динамически - все работает. Когда регистрирую в Delphi и бросаю на форму, все работает, но при выходе получаю AV. Что бы это?

type
 TCustomGraphOpenGL3D = class(TCustomControl)
   ...
 end;

type
 TGraphOpenGL3D = class(TCustomGraphOpenGL3D)
 private
   FInnerGraph : TCustomGraphOpenGL3D;
   ...
   function GetInnerGraphOwner: TWinControl;
   procedure SetInnerGraphOwner(const Value: TWinControl);

 public
   constructor Create(aOwner : TComponent); override;
   destructor Destroy; override;
   ...
 published
   property InnerGraphOwner : TWinControl read GetInnerGraphOwner write SetInnerGraphOwner;
   ...
 end;
 
 
....

constructor TGraphOpenGL3D.Create(aOwner: TComponent);
begin
 inherited;
 FInnerGraph := TCustomGraphOpenGL3D.Create(Self);
 FInnerGraph.Parent := Self;
end;

destructor TGraphOpenGL3D.Destroy;
begin
 FInnerGraph.Parent := Self;
 FInnerGraph.Free;
 FInnerGraph := nil;
 inherited;
end;

function TGraphOpenGL3D.GetInnerGraphOwner: TWinControl;
begin
 Result := FInnerGraph.Parent;
end;

procedure TGraphOpenGL3D.SetInnerGraphOwner(const Value: TWinControl);
begin
 IF Assigned(Value) Then
  FInnerGraph.Parent := (Value as TWinControl)
 Else
  FInnerGraph.Parent := Self;
 FInnerGraph.OpenGLDisconnect;
 FInnerGraph.OpenGLConnect(FInnerGraph.Parent.Handle);
 Invalidate;
end;


 
Чайник ©   (2005-06-15 16:53) [1]

Посмотрел, что пишет в форму - вроде все что надо...

 object GraphOpenGL3D1: TGraphOpenGL3D
   Left = 432
   Top = 8
   Width = 425
   Height = 417
   BorderWidth = 3
   InnerGraphVisible = True
   InnerGraphOwner = Panel1
 end


 
Юрий Зотов ©   (2005-06-15 17:01) [2]

Зачем такие извраты? Сделайте это свойство ссылкой на внешний компонент и тогда его можно будет связывать с чем угодно, а сам связанный компонент может находиться на любом Parent"е.


 
Чайник ©   (2005-06-15 17:07) [3]

> Юрий Зотов ©   (15.06.05 17:01) [2]
А можно попросить чуть поподробнее? Буду очень благодарен


 
Юрий Зотов ©   (2005-06-15 18:08) [4]

Вот стандартный способ создания свойства - ссылки на внешний компонент. Если этот компонент удаляется, ссылка автоматически очищается.

type
 TCustomGraphOpenGL3D = class(TCustomControl)
   ...
 end;

 TGraphOpenGL3D = class(TCustomGraphOpenGL3D)
 private
   FInnerGraph: TCustomGraphOpenGL3D;
   procedure SetInnerGraph(const Value: TCustomGraphOpenGL3D);
 protected
   procedure Notification(AComponent: TComponent; Operation: TOperation);
 published
   property InnerGraph: TCustomGraphOpenGL3D read FInnerGraph write SetInnerGraph;
 end;

procedure TGraphOpenGL3D.Notification(AComponent: TComponent; Operation: TOperation);
begin
 inherited;
 if (Operation = opRemove) and (AComponent = FInnerGraph) then
   SetInnerGraph(nil)
end;

procedure TGraphOpenGL3D.SetInnerGraph(const Value: TCustomGraphOpenGL3D);
begin
 if FInnerGraph <> Value then
 begin
   if FInnerGraph <> nil then
     RemoveFreeNotification(FInnerGraph);
   FInnerGraph := Value;
   if FInnerGraph <> nil then
     FreeNotification(FInnerGraph)
 end
end;


 
Чайник ©   (2005-06-16 10:44) [5]

Большое спасибо



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

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

Наверх




Память: 0.48 MB
Время: 0.045 c
4-1130414953
Rentgen
2005-10-27 16:09
2005.12.25
Как можно сменить программно пароль учетной записи (текущей)


6-1126542746
pr0t0n
2005-09-12 20:32
2005.12.25
pochemu ne rabotaet????


1-1133161766
MadGhost
2005-11-28 10:09
2005.12.25
Как завершить второй поток, работая с СОМ портом.


2-1134145546
FormJonh
2005-12-09 19:25
2005.12.25
Запуск процедуры в другом unit^е


14-1133388997
crazycorpse
2005-12-01 01:16
2005.12.25
Интерпритатор формул