Форум: "Компоненты";
Текущий архив: 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