Главная страница
    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.013 c
14-1133573594
Копир
2005-12-03 04:33
2005.12.25
Русская и азиатская поэзия.


5-1118821158
Anatoly
2005-06-15 11:39
2005.12.25
Форма c компонентом при ткрытии в design дает "Error creating"


14-1133348890
syte_ser78
2005-11-30 14:08
2005.12.25
Оцените доменное имя


2-1134023604
MAXHO
2005-12-08 09:33
2005.12.25
Перезагрузка с принудительным закрытием всех приложений


2-1133963050
cp.Silver
2005-12-07 16:44
2005.12.25
THandle





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