Форум: "Основная";
Текущий архив: 2004.01.13;
Скачать: [xml.tar.bz2];
ВнизКлассы и наследование Найти похожие ветки
← →
_юзер_ (2003-12-29 17:15) [0]Предположим есть 2 класса:
TClass1 = class(TComponent)
private
procedure Method1;
procedure Method2;
...
protected
Color: TColor read FColor write FColor;
end;
и
TClass2 = class(TComponent)
private
FClass1: TClass1;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
Class1: TClass1 read FClass1;
end;
implementation
constructor TClass2.Create(AOwner: TComponent);
begin
inherited;
Class1:=TClass1.Create(Self);
...
end;
destructor Destroy;
begin
Class1.Free;
inherited;
end;
как мне написать потомка от TClass2, чтобы свойство Color класса TClass1 можно было редактировать в Object Inspector?
← →
alex_*** (2003-12-29 17:20) [1]в классе TClass2 сделать свой Color, который будет вызывать Color у FClass1
← →
_юзер_ (2003-12-29 17:21) [2]не получится - Color у FClass1 находится в protected
← →
KSergey (2003-12-29 17:23) [3]в протектед - значит описать все это в одном юните ;)
← →
_юзер_ (2003-12-29 17:25) [4]компоненты не мои - я хочу наследника написать. так что описать всё в одном юните отпадает.
← →
Agent13 (2003-12-29 17:27) [5]>_юзер_ (29.12.03 17:21) [2]
>не получится - Color у FClass1 находится в protected
Почему не получится? Если я не путаю, декларация протектед позволяет вызывать свойство компонента из дочерних компонентов, где бы они ни были описаны.
← →
alex_*** (2003-12-29 17:28) [6]для Class1 написать своего наследника, у которого Color перейдет в public
← →
Amoeba (2003-12-29 17:28) [7]
> в протектед - значит описать все это в одном юните ;)
Неправда:
A protected member is visible anywhere in the module where its class is declared and from any descendant class, regardless of the module where the descendant class appears. In other words, a protected method can be called, and a protected field or property read or written to, from the definition of any method belonging to a class that descends from the one where the protected member is declared. Members that are intended for use only in the implementation of derived classes are usually protected.
← →
_юзер_ (2003-12-29 17:30) [8]2Agent13:
вот именно - из дочерних. а у меня пока никаких дочерних классов нету.
← →
KSergey (2003-12-29 17:31) [9]могу предложить такой "трюк"
type
TClass1Freind = class(TClass1)
...
TClass2_2 = class(TClass2)
...
published
Color:...
end;
....
TClass2_2.SetColor (AColor:...)
begin
...
TClass1Freind(Class1.Color) := AColor;
...
end;
аналогично с чтением
← →
_юзер_ (2003-12-29 17:31) [10]2alex_***:
перейдёт-то - перейдёт (только в published, если точнее). а дальше что?
← →
alex_*** (2003-12-29 17:32) [11]а что есть? Class2 есть в исходниках?
← →
KSergey (2003-12-29 17:32) [12]В самом начале читать:
type
TClass1Freind = class(TClass1) ;
А вообще я такие определения вставляю прямо перед соотв. методом (здесь, например, TClass2_2.SetColor). Хотя это уже по вкусу.
← →
KSergey (2003-12-29 17:33) [13]И еще
Вместо
TClass1Freind(Class1.Color) := AColor;
читать
TClass1Freind(Class1 ).Color := AColor;
сорри, торопился
← →
_юзер_ (2003-12-29 17:34) [14]в исходниках есть всё. только я чужие исходники править не хочу, потому как они чужие.
← →
alex_*** (2003-12-29 17:38) [15]тогда придется сделать своего наследника Class2, которого прописать Color.
← →
_юзер_ (2003-12-29 17:38) [16]2KSergey:
ok - сейчас попробую
← →
_юзер_ (2003-12-29 17:45) [17]2KSergey:
спасибо - работает.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.01.13;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c