Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 2005.12.25;
Скачать: [xml.tar.bz2];

Вниз

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

 
Чайник ©   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.012 c
11-1112295083
Boguslaw Brandys
2005-03-31 22:51
2005.12.25
PIcon Draw problem in tray icon KOL program


14-1133352714
ANB
2005-11-30 15:11
2005.12.25
Нужен сишник.


2-1134237548
GrayFace
2005-12-10 20:59
2005.12.25
Ликбез по BDE


2-1133888031
Gala_l
2005-12-06 19:53
2005.12.25
kbmMW


14-1133804628
БарЛог
2005-12-05 20:43
2005.12.25
Вот... перевожу статью про ООП с английского...





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