Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 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.012 c
14-1124036317
SoftX
2005-08-14 20:18
2005.09.11
Коммунизм тоже религия.


1-1123735709
afanasic
2005-08-11 08:48
2005.09.11
Освобождение памяти при Destroy


8-1115128652
ArtKil
2005-05-03 17:57
2005.09.11
Мультимедиа


3-1122783260
makzn
2005-07-31 08:14
2005.09.11
DBF -> TextFile


1-1124560588
SpyBoy
2005-08-20 21:56
2005.09.11
Listbox_&_ProgressBar





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский