Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка DELPHI.DOC
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.73 Mб
Скачать

Задание начальных значений свойствам

Когда создаются свойства, они первоначально получают нулевые или неопределенные (в зависимости от типа свойства) значения. Если необходимо задать свойствам какие-либо значения по умолчанию, то используются следующие шесть команд:

  • Default

  • NoDefault

  • Default для свойств типа массив

  • Stored

  • Index

  • Dispid

Например,

Property NumberProp:integer

read FNumber write FNumber default 5;

Property EnumProp: TEnumProp Read FEnumProp

write FEnumProp default epOne;

Property SetProp:TsetProp read FsetProp

write FSetProp default [epOne];

Для свойства типа массив команда Default указывается после точки с запятой без использования какого-либо значения. Массив, если он задан при объявлении класса, представляет собой начальные значения элементов индексированного свойства.

Property ArrayPropInt[Index:integer]:

string read GetArrayPropInt; Default;

Команда NoDefault применяется обычно для унаследованных свойств при указании, что родительское значение не действует.

Команда Stored используется для того, чтобы указать, сохранять ли текущее значение, например,

Property NumberProp1:integer

read Fnum1 write FNum1 Stored true;

Property NumberProp2:integer

read FNum2 write FNum2 Stored false;

Property NumberProp3:integer

read Fnum3 write Fnum3 Stored Func3;

В первом случае указано, что необходимо сохранять текущее значение свойства, во втором случае – не сохранять, в третьем – сохранять, если функция Func3 возвращает True.

Команда Index позволяет обеспечить гибкость при объявлении методов доступа Read и Write к полям. Рассмотрим это на примере. Пусть два свойства IntProp1 и IntProp2 для доступа к полям FIntProp1 и FIntProp2 используют одни и те же подпрограммы:

Property IntProp1:integer Index 1

read GetIntProp write SetIntProp;

Property IntProp2:integer Index 2

read GetIntProp write SetIntProp;

Для указания того, что свойство IntProp1 работает с полем FIntProp1 а IntProp2 – с полем FIntProp2, используется команда Index. В данном случае число после слова Index указывает, какое поле следует использовать, например, подпрограммы GetIntProp и SetIntProp можно определить так:

Function <имя класса>.GetIntProp

(pIndex:integer):integer;

begin

case pIndex of

1:result:=FIntProp1;

2:result:=FIntProp2;

end;

end;

Procedure <имя класса>.SetIntProp

(pIndex:integer;pValue:integer);

begin

case pIndex of

1: FIntProp1:= pValue;

2: FIntProp2:= pValue;

end;

end;

Команда Dispid применяется при работе с объектами OLE.

Пример 16

Пусть требуется построить на форме три геометрические фигуры: круг, квадрат, эллипс (рис. 36).

Рис. 36 Форма с вариантом решения примера 16.

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

Для решения задачи построим четыре класса. Первый класс назовём TDrawArea. Включим в него следующие действия:

  1. Инициализация всех полей;

  2. Рисование фигуры;

Остальные три класса определяют конкретную реализацию рисования круга, квадрата и эллипса. Программа приводится ниже.

unit PRIM16;

interface

uses Windows, Messages, SysUtils, Classes, Graphics,

Controls, Forms, Dialogs, StdCtrls, ExtCtrls;

type

TForm1 = class(TForm)

Panel1: TPanel;

btnRedCircle: TButton;

btnBlueCircle: TButton;

btnBlackSquare: TButton;

btnWhiteSquare: TButton;

btnYellowEllipse: TButton;

btnGreenEllipse: TButton;

Button1: TButton;

procedure AllBtnClick(Sender: TObject);

procedure Button1Click(Sender: TObject);

end;

ArrayColor=array[1..6] of TColor;

TDrawArea = class(TPersistent)

private

x1,y1,x2,y2:integer;

FArrayBrushColor: ArrayColor;

FPenColor: TColor;

function GetBrushColor(pIndex:integer): TColor;

public

constructor InitColor;

constructor InitXY(NewX1,NewY1,NewX2,NewY2:

integer);

property PPenColor: TColor read FpenColor

write FpenColor Default clBlack;

property PBrushColor[pIndex:integer]: TColor

read GetBrushColor;

procedure DrawFig;virtual;abstract;

procedure DrawIt;

end;

TSquare = class(TDrawArea)

procedure DrawFig;override;

end;

TEllipse = class(TDrawArea)

procedure DrawFig;override;

end;

TCircle = class(TDrawArea)

procedure DrawFig;override;

end;

var Form1: TForm1;

MySquare:TSquare;

MyEllipse:TEllipse;

MyCircle:TCircle;

implementation

{$R *.DFM}

Constructor TDrawArea.InitColor;

begin

FArrayBrushColor[1]:=clRed;

FArrayBrushColor[2]:=clBlue;

FArrayBrushColor[3]:=clBlack;

FArrayBrushColor[4]:=clWhite;

FArrayBrushColor[5]:=clYellow;

FArrayBrushColor[6]:=clGreen;

End;

Constructor TDrawArea.InitXY(NewX1,NewY1,NewX2,NewY2:

integer);

begin

x1:=NewX1;

y1:=NewY1;

x2:=NewX2;

y2:=NewY2;

end;

Function TDrawArea.GetBrushColor(pIndex:integer):

TColor ;

begin

result:=-1;

if pIndex in [1..6] then

result:=FArrayBrushColor[pIndex];

end;

procedure TDrawArea.DrawIt;

begin

DrawFig;

end;

procedure TSquare.DrawFig;

begin

Form1.Canvas.Rectangle(x1,y1,x2,y2);

end;

procedure TCircle.DrawFig;

var Nx1,Ny1,Nx2,Ny2:integer;

begin

Nx1:=x1-x2;

Ny1:=y1-x2;

Nx2:=x1+x2;

Ny2:=y1+x2;

Form1.Canvas.Ellipse(Nx1,Ny1,Nx2,Ny2);

end;

procedure TEllipse.DrawFig;

begin

Form1.Canvas.Ellipse(x1,y1,x2,y2);

end;

procedure TForm1.AllBtnClick(Sender: TObject);

begin

if (Sender as Tbutton=btnRedCircle) or

(Sender as Tbutton=btnBlueCircle) then begin

if not assigned(MyCircle) then begin

MyCircle:=TCircle.Create;

MyCircle.InitColor;

MyCircle.InitXY(50,50,40,0);

Form1.Canvas.Pen.Color:=MyCircle.PPenColor;

end;

if Sender as Tbutton = btnRedCircle then begin

Form1.Canvas.Brush.Color:=MyCircle.PBrushColor[1];

MyCircle.DrawIt;

end;

if Sender as Tbutton = btnBlueCircle then begin

Form1.Canvas.Brush.Color:=MyCircle.PBrushColor[2];

MyCircle.DrawIt;

end;

end;

if (Sender as Tbutton=btnBlackSquare) or

(Sender as Tbutton=btnWhiteSquare) then begin

if not assigned(MySquare) then begin

MySquare:=TSquare.Create;

MySquare.InitColor;

MySquare.InitXY(110,10,190,90);

Form1.Canvas.Pen.Color:=MySquare.PPenColor;

end;

if Sender as Tbutton = btnBlackSquare then begin

Form1.Canvas.Brush.Color:=MySquare.PBrushColor[3];

MySquare.DrawIt;

end;

if Sender as Tbutton = btnWhiteSquare then begin

Form1.Canvas.Brush.Color:=MySquare.PBrushColor[4];

MySquare.DrawIt;

end;

end;

if (Sender as Tbutton=btnYellowEllipse) or

(Sender as Tbutton=btnGreenEllipse) then begin

if not assigned(MyEllipse) then begin

MyEllipse:=TEllipse.Create;

MyEllipse.InitColor;

MyEllipse.InitXY(220,10,280,90);

Form1.Canvas.Pen.Color:=MyEllipse.PPenColor;

end;

if Sender as Tbutton = btnYellowEllipse then begin

Form1.Canvas.Brush.Color:=MyEllipse.PBrushColor[5];

MyEllipse.DrawIt;

end;

if Sender as Tbutton = btnGreenEllipse then begin

Form1.Canvas.Brush.Color:=MyEllipse.PBrushColor[6];

MyEllipse.DrawIt;

end;

end;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

if assigned(MyCircle) then MyCircle.Free;

if assigned(MySquare) then MySquare.Free;

if assigned(MyEllipse) then MyEllipse.Free;

close;

end;

end.

В данном примере показано, как работать со свойствами типа Array. Следует обратить внимание, что каждый из трех используемых объектов должен строиться один раз. Для проверки существования объекта используется функция Assigned. При выходе из программы (Button1Click) все объекты разрушаются. В данной программе показано, как использовать один обработчик событий (AllBtnClick) для всех шести кнопок построения геометрических фигур. Используемые конструкторы InitColor и InitXY созданы не для построения объектов, а для инициализации данных, поэтому в их описании отсутствует вызов Inherited.