![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с Height [WinXP]
Vetas © (2005-10-13 16:25:00)Здравствуйте. Проблема заключается в следующим.
В компоненте необходимо чтоб когда изменялось свойство Height изменялось и свойство HeightRoll. Для этого пишу:
(извините но на Builder_е)
class PACKAGE TInfoPanel : public TCustomPanel
{
private:
...
int FHeightRoll;
int __fastcall GetHeight(void);
void __fastcall SetHeight(int Value);
void __fastcall SetHeightRoll(int Value);
...
protected:
__published:
__property int HeightRoll = {read = FHeightRoll, write = SetHeightRoll};
__property int Height = {read = GetHeight, write = SetHeight};
};
//---------------------------------------------------------------------------
void __fastcall TInfoPanel::SetHeight(int Value){
if (FRollOut)
TControl::Height = Value;
FHeightRoll = Value;}
int __fastcall TInfoPanel::GetHeight(void){
return TControl::Height;}
void __fastcall TInfoPanel::SetHeightRoll(int Value){
if (FRollOut)
SetHeight(Value);
else
FHeightRoll = Value;}
Дело в том, что в DTime когда у компонента меняю Height (не в OI, а мышкой растягиваю) HeightRoll остается неизменным, в тоже время если менять в OI или RTime, то все работает. Я думаю, что когда изменяю высоту мышью, то вызывается TControl::SetHeight, а не TInfoPanel::SetHeight. Подскажите как сделать чтоб все работало, заранее спасибо.
Vetas (2005-10-13 22:58:00) [1]Большое спасибо. Как раз стал думать об этом
Юрий Зотов (2005-10-13 18:44:00) [2]> Vetas (13.10.05 16:25)
1. Метод SetHeight перекрыть не удастся, он и приватный, и статический. Перекрывать надо SetBounds.
2. Перекрыть свойство Height тоже не удастся, свойства невиртуальны (по крайней мере, в Delphi). Поэтому и возникла указанная Вами проблема - в design-time Ваш метод SetHeight просто не вызывается.
А решение очень простое:
type
TInfoPanel = class(TCustomPanel)
private
...
FHeightRoll: integer;
procedure SetHeightRoll(const Value: integer);
public
procedure SetBounds(ALeft: Integer; ATop: Integer; AWidth: Integer; AHeight: Integer); override;
published
property HeightRoll: integer read FHeightRoll write SetHeightRoll default 0;
end;
procedure TInfoPanel.SetBounds(ALeft: Integer; ATop: Integer; AWidth: Integer; AHeight: Integer);
begin
FHeightRoll := AHeight;
inherited
end;
procedure TInfoPanel.SetHeightRoll(const Value: integer);
begin
if FHeightRoll <> Value then
if FRollOut then
Height := Value
else
FHeightRoll := Value
end;
MBo (2005-10-13 18:11:00) [3]>написано!!!
>TControl::Height = Value;
Я не знаю, что это означает в Билдере.
Vetas (2005-10-13 18:05:00) [4]написано!!!
TControl::Height = Value;
MBo (2005-10-13 16:51:00) [5]нужно в твоем компоненте вызвать Inherited (или как там у вас в Билдере делается), чтобы сохранился вызов виртального метода SetBounds