![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Удаление свойства-компонента.
Чайник © (2005-06-15 16:51:00)Всем здравствуйте.
Делаю: компонент 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-16 10:44:00) [1]Большое спасибо
Юрий Зотов (2005-06-15 18:08:00) [2]Вот стандартный способ создания свойства - ссылки на внешний компонент. Если этот компонент удаляется, ссылка автоматически очищается.
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-15 17:07:00) [3]> Юрий Зотов © (15.06.05 17:01) [2]
А можно попросить чуть поподробнее? Буду очень благодарен
Юрий Зотов (2005-06-15 17:01:00) [4]Зачем такие извраты? Сделайте это свойство ссылкой на внешний компонент и тогда его можно будет связывать с чем угодно, а сам связанный компонент может находиться на любом Parent'е.
Чайник (2005-06-15 16:53:00) [5]Посмотрел, что пишет в форму - вроде все что надо...
object GraphOpenGL3D1: TGraphOpenGL3D
Left = 432
Top = 8
Width = 425
Height = 417
BorderWidth = 3
InnerGraphVisible = True
InnerGraphOwner = Panel1
end