Форум: "Компоненты";
Текущий архив: 2005.09.11;
Скачать: [xml.tar.bz2];
ВнизПодскажите, как правильно переопределить свойство компонента! Найти похожие ветки
← →
Михель (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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.01 c