Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.11;
Скачать: CL | DM;

Вниз

Подскажите, как правильно переопределить свойство компонента!   Найти похожие ветки 

 
Михель   (2004-10-19 01:35) [0]

Создаю свой компонент TMyPanel на базе TPanel.
В него входят еще два компонента, типа TImage и TMemo. При их создании высоту (Height) этих компонентов я рассчитываю относительно высоты первого компонента, на который они устанавливаются (TPanel).

Так вот, задача такая: нужно, чтобы, при изменении высоты этого моего компонента во время исполнения программы масштабировалась высота вложенных в него TImage и TMemo.

Для этого я переопределяю свойство Height родительского компонента, и в процедуре TMyPanel.SetHeight пытаюсь пересчитать высоту NewMemo. При этом возникает "Access Violation..."
Почему при упоминании в процедуре вложенных компонентов выдается ошибка?

И еще вопрос:
почему при создании компонента NewMemo на строку:
NewMemo.BorderStyle:=bsNone;
выдается ошибка: Incompatible types:"StdCtrls.TBorderStyle and MyPanel.TBorderstyle" ? Чем это свойство отличается от без проблем изменяемых Color, например?...

В общем, текст прилагается...

Извините за примитивные вопросы, но я себе уже голову сломал и весь интернет перерыл в поисках, как правильно переопределять свойства! Новичок... Помогите пожалуйста!

unit MyPanel;

interface

uses
 Windows, Messages, SysUtils, Classes, Controls, ExtCtrls,
 QControls, StdCtrls, Graphics;

type
 TMyPanel = class(TPanel)
 private
   { Private declarations }
   NewImage:TImage;
   NewMemo:TMemo;
   FHeight: integer;
   caima:Integer;
   procedure SetHeight(const Value: integer);
   function GetHeight: integer;

 protected
   { Protected declarations }
 public
   { Public declarations }
   constructor Create( AOwner: TComponent ); override;
   destructor Destroy;override;
   property Height:integer read GetHeight write SetHeight default 200;
 published
   { Published declarations }
 end;

procedure Register;

implementation

procedure Register;
begin
 RegisterComponents("Standard", [TMyPanel]);
end;

constructor TMyPanel.Create( AOwner: TComponent );
begin
inherited Create(AOwner);
caima:=5; //кайма по периметру, отступ
Width:=200;
Height:=200;

NewImage := TImage.Create( self );
NewImage.Parent := self;
NewImage.Height :=Height-caima*3-45;
NewImage.Width := Width-caima*2;
NewImage.Left := Left+caima ;
NewImage.top := Top+caima ;
NewImage.Visible := true;
NewImage.Picture.LoadFromFile(
"C:\Documents and Settings\Michael\Рабочий стол\1.bmp");

NewMemo := TMemo.Create( self );
NewMemo.Parent := self;
NewMemo.Height :=45;
NewMemo.Width := Width-caima*2;
NewMemo.Left := Left+caima ;
NewMemo.top := Height-caima-45;
NewMemo.Visible := true;
NewMemo.Alignment:=taCenter;
NewMemo.Color:=clBtnFace;
//NewMemo.BorderStyle:=bsNone; Почему ошибка в этой строке????

end;

destructor TMyPanel.destroy;
begin
   NewImage.Free;
   NewMemo.Free;
inherited destroy;
end;

function TMyPanel.GetHeight: integer;
begin
Result := inherited Height;
end;

procedure TMyPanel.SetHeight(const Value: integer);
begin
 inherited Height := Value;
NewMemo.top := Height-caima-45; //вот на это упоминание
//компилятор ругается!!!
end;

end.


 
jack128 ©   (2004-10-19 03:18) [1]

Михель   (19.10.04 1:35)
NewMemo.BorderStyle:=bsNone;
выдается ошибка: Incompatible types:"StdCtrls.TBorderStyle and MyPanel.TBorderstyle" ? Чем это свойство отличается от без проблем изменяемых Color, например?...


видимо в юните MyPanel ты объявил новый тип TBorderStyle.. Можешь написать NewMemo.BorderStyle:= StdCtrls.bsNone // Хотя в Дльфи5 этот тип  объявлен в Forms
Михель   (19.10.04 1:35)
NewMemo.top := Height-caima-45; //вот на это упоминание
//компилятор ругается!!!
Матом ругается?? У мя компилятор молчит как партизан..

> Для этого я переопределяю свойство Height
> родительского компонента, и в процедуре
> TMyPanel.SetHeight
ты не переопределяешь это свойство (свойства вообще нельзя переопределять) - ты создаешь новое свойство, которое скрывает старое. Cоответственно вот при таком вызове

procedure SetControlHeight(AControl: TControl; NewHeight: Integer);
begin
 AControl.Height := NewHeigth;
end;

SetControlHeight(MyPanel, 10); вызова твоего метода SetHeight не будет. В часности в дезин тайм при изменении размера твоей панели не будет пересчитываться размер Мемо и Имадж.  Тебе нужно переопределить метод SetBounds, к которому сводится метод TControl.SetHeight

procedure TControl.SetHeight(Value: Integer);
begin
 SetBounds(FLeft, FTop, FWidth, Value);
 Include(FScalingFlags, sfHeight);
end;


 
Михель   (2004-10-21 19:40) [2]

В общем, правильный ответ такой: (мне тут помогли разобраться)

По первому вопросу:
В конструкторе constructor TMyPanel.Create я устанавливал
Height:=200, а соответственно, и запускал процедуру
TMyPanel.SetHeight, которая обращалась к NewMemo.top, раньше,
чем эта NewMemo была создана. Отсюда ошибка.

По второму вопросу:
для того, чтобы bsNone не был неопределенным идентификатором,
я добавил QControls (где, я считал, и определен BorderStyle).
А нужно было добавить модуль Forms.



Страницы: 1 вся ветка

Текущий архив: 2005.09.11;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.027 c
1-1124527379
Kirill
2005-08-20 12:42
2005.09.11
Загрузить ресурс из моего приложения


1-1124202235
lox
2005-08-16 18:23
2005.09.11
Как узнать: окно поверх других или нет, если есть хендел?


14-1123713626
IncRed
2005-08-11 02:40
2005.09.11
Системные требования .NET


14-1124224030
Cheaterr
2005-08-17 00:27
2005.09.11
Вопрос к тем, кто работает на производстве или торговых компаниях


14-1124182069
Santrope
2005-08-16 12:47
2005.09.11
Что лучше RAID-5 или RAID-10 ?