18.5. Свойства класса

Свойства, как и поля, являются атрибутами класса. Свойства объявляются с помощью слов property, read и write. Слова read и write конкретизируют назначение свойства. Синтаксис свойства таков:

property propertyName[indexes]: type index integerConstant specifiers;

где propertyName – имя свойства; [indexes] – параметры-имена в форме имя1, имя2, ... , имяN: type; index – целая константа; read, write, stored, default (или nodefault) и implements – спецификации. Всякое объявление свойства должно иметь одну из спецификаций read или write или обе вместе.

Примеры:

property Objects[Index: Integer]: TObject read GetObject write SetObject;

property Pixels[X, Y: Integer]: TColor read GetPixel write SetPixel;

property Values[const Name: string]: string read GetValue write SetValue;

property ErrorCount: Integer read GetErrorCount;

property NativeError: Longint read FNativeError;

Неиндексированные свойства похожи на обычные поля, а индексированные свойства напоминают поля-массивы. В программе свойства ведут себя почти так же, как обычные поля. Разница в том, что свойство имеет более ответственное назначение. Например, оно может активизировать некоторые методы для придания объектам требуемого свойства. Так если изменено свойство шрифта какого-либо визуального класса, то смена свойства шрифта повлечет за собой перерисовку текста и выполнение ряда сопутствующих операций, которые обеспечат классу именно такое свойство.

Каждое свойство может иметь спецификацию read или write или оба вместе в форме

read fieldOrMethod

write fieldOrMethod

где fieldOrMethod – имя поля или метода, объявленного в классе, или свойство класса-предка.

Если fieldOrMethod объявлено в классе, то оно должно быть определено в том же классе. Если оно объявлено в классе-предке, то оно должно быть видимо из потомка, т. е. не должно быть частным полем или методом класса-предка. Если свойство есть поле, то оно должно иметь тип. Если fieldOrMethod есть read-спецификация, то оно должно быть функцией без параметров, тип которой совпадает с типом свойства. Если fieldOrMethod есть write-спецификация и метод, то оно должно быть процедурой, возвращающей простое значение или константу того же типа, что тип свойства. Например, если свойство объявлено:

property Color: TColor read GetColor write SetColor;

тогда метод GetColor должен быть описан как

function GetColor: TColor;

и метод SetColor должен быть описан как

procedure SetColor(Value: TColor);

или

procedure SetColor(const Value: TColor);

Если свойство имеет спецификацию read, то оно имеет атрибут "read only" (только для чтения). Если свойство имеет спецификацию write, то оно имеет атрибут "write only" (только для чтения).

18.6. Структура класса

Всякий класс имеет структуру, которая состоит из секций. Каждая секция объявляется специальным зарезервированным словом. К их числу относятся: published (декларированные), private (частные), protected (защищенные), public (доступные), automated (автоматизированные). Внутри каждой секции сначала объявляются поля, затем – свойства и методы.

Пример:

type

TMyClass = class(TControl)

private

... { частные объявления здесь}

protected

... { защищенные объявления здесь }

public

... { доступные объявления здесь }

published

... { декларированные объявления здесь }

end;

Секции определяют области видимости компонент класса:

Private – компоненты класса доступны только внутри этого класса;

Public – компоненты класса доступны в текущем и любом другом модуле, который содержит ссылку в списке uses на модуль, в котором объявлен класс;

Published – то же, что Public, однако в ней должны быть перечислены свойства, которые доступны не только на этапе выполнения программы, но и на этапе ее визуального конструирования средствами Delphi;

Protected – cекция доступна только методам текущего класса и методам классов-предков;

Automated – секция используется для объявления свойств и методов обработки OLE-контейнеров в рамках OLE-технологии.

Порядок следования секций произволен. Любая из секций может быть как пустой, так и объявлена несколько раз в рамках одного класса.

18.7. Операции над классами

Над классами разрешено выполнять две операции – is и as.

1. Операция is. Синтаксис выражения, содержащего операцию is, имеет вид

object is class

Это выражение имеет логический тип (boolean) и возвращает True, если переменная object имеет тип class класса, иначе – False.

Пример:

if ActiveControl is TEdit then TEdit(ActiveControl).SelectAll;

В этом примере: если класс ActiveControl имеет тип TEdit, то будет выполнен метод TEdit(ActiveControl).SelectAll.

2. Операция as. Синтаксис выражения, содержащего операцию as:

object as class

Результатом вычисления этого выражения является ссылка на объект того же типа, что и тип класса class. При выполнении программы object может иметь тот же тип, или тип класса-потомка, или nil.

Примеры:

with Sender as TButton do // если Sender имеет тип TButton

begin // или тип-потомок от TButton

Caption := '&Ok';

OnClick := OkClick;

end;

(Sender as TButton).Caption := '&Ok'; //свойству Caption переменной

// Sender типа TButton или его потомка присваивается значение '&Ok'

Приложение

Перечень

отлаженных процедур и функций,

написанных автором

Ниже использованы глобальные типы и переменные:

Type

CompareType = (Less, Equal, Greater);

Var

Lon, Lon2: LongInt;

Serv: String[255];

Procedure Delay(MilliSec: LongInt);

{задержка времени на MilliSec миллисекунд}

Var k: LongInt;

begin

k:=GetTickCount; {в модуле Windows.pas}

While GetTickCount<(MilliSec+k) do ;

end;

Function Ctrl_ Shift_Down(i: byte): boolean;

{Нажата ли одна из этих клавиш Ctrl – 1, Shift – 2}

var

ShiftState: TShiftState;

j: LongInt;

begin

Result:=false;

Case i of

1: j:= VK_CONTROL;

2: j:= VK_SHIFT;

end;

ShiftState := KeyDataToShiftState(j);

Case i of

1: Result:= (ssCtrl in ShiftState);

2: Result:= (ssShift in ShiftState);

end;

end;

Function CtrlDown: boolean;

{нажата ли клавиша Ctrl}

begin

Result:=Ctrl_ Shift_Down(1);

end;

Function ShiftDown: boolean;

{нажата ли клавиша Shift}

begin

Result:=Ctrl_Shift_Down(2);

end;

Function Profit(Expend, Price: Real): Real;

{рентабельность=(цена - затраты)/затраты*100}

begin

if (Expend<>0) then Result:= (Price/Expend-1.0)*100.0

else Result:= 1.e5;

end;

Procedure Warn1(S: Variant);

{Окно с Variant-значением, например Warn1('Процесс закончен')}

begin

MessageDlg(S, mtInformation, [mbOk], 0);

Screen.ActiveForm.Refresh;

End;

Procedure Warn4(s1,s2,s3,s4: String);

{то же , что Warn1, но в 4 строки}

var i,j: byte;

begin

i:=Length(s1); j:=i;

i:=Length(s2);

if (i>j) then j:=i;

i:=Length(s3);

if (i>j) then j:=i;

i:=Length(s4);

if (i>j) then j:=i;

Warn1(Center(s1,j)+''#13#10+''+Center(s2,j)

+''#13#10''+Center(s3,j)+''#13#10+''+Center(s4,j));

end;

Function DaNet(S: String): boolean;

{Окно. Предназначено для вопроса, на который можно ответить, щелкнув по одной из кнопок "Да" или "Нет"}

begin

DaNet:=MessageDlg(S, mtConfirmation, [mbYes, mbNo], 0)=mrYes;

Screen.ActiveForm.Refresh;

end;

Function DaNet4(s1,s2,s3,s4: String): boolean;

{Окно. То же, что DaNet, только в 4 строки}

begin

DaNet4:=MessageDlg(Trim(s1)+''#13#10+''+Trim(s2)+''#13#10''+Trim(s3)

+''#13#10+''+Trim(s4),mtConfirmation,[mbYes, mbNo], 0)=mrYes;

Screen.ActiveForm.Refresh;

end;

Function InOtrReal(i,a,b: real): boolean;

{Если i в орезке [a, b], то возвращает True}

begin

Result:=(i>=a) and (i<=b);

end;

Function ExitK: boolean;

{стандартный вопрос о выходе}

begin

ExitK:=DaNet('Выход ?');

end;

Function Pos2(SubS, S: String; StartPos: byte): boolean;

{входит ли SubS в S начиная с StartPos}

begin

Lon:=Pos(SubS,S);

Result:= (Lon > 0) and (StartPos = Lon);

end;

Function ChStr(Ch: Char; d: Word): String;

{создает строку из символа Ch, повторенного d раз}

begin

if d>0 then

begin

SetLength(Result,d);

FillChar(Result[1],d,Ch);

end;

end;

Function Prop(d: Word): String;

{создает строку из d пробелов}

begin

Result:=ChStr(' ',d);

end;

Function Pad(s: String; d: Word): String;

{вставляет справа от строки пробелы, добирая ее до длины d}

begin

Serv:=s;

Lon:=Length(s);

If (d>Lon) then Serv:=s+Prop(d-Lon);

Result:=Serv;

end;

Function PadCopy(s: String; n,d: Word): String;

{копирует из s начиная с позиции n строку длины d. В случае меньшей строки добирает ее до длины d}

begin

Serv:=Copy(s,n,d);

if Length(Serv) < d then Serv:=Pad(Serv,d);

Result:=Serv;

end;

Function LeftPad(s: String; d: Word): String;

{вставляет слева от строки пробелы, добирая ее до длины d}

begin

Serv:=s;

Lon:=Length(s);

if (d>Lon) then Serv:=Prop(d-Lon)+s;

Result:=Serv;

end;

Function Center(s: String; d: Word): String;

{вставляет слева и справа от строки поровну пробелы, добирая ее до длины d}

begin

Serv:=s;

Lon:=Length(s);

Lon2:=Round(0.5*(d-Lon));

if (d>Lon) then Serv:=Prop(Lon2)+s+Prop(d-Lon2);

Result:=Serv;

end;

Function CompStrings(s1,s2: String): CompareType;

{сравнение строк: s1<s2 - Less, s1=s2 - Equal, s1>s2 - Greater}

begin

if (s1<s2) then CompStrings:=Less

else

if (s1>s2) then CompStrings:=Greater

else

CompStrings:=Equal;

end;

Function CompReal(r1,r2: Real): CompareType;

{сравнение вещественных чисел}

begin

if (r1<r2) then Result:=Less

else

if (r1>r2) then Result:=Greater

else

Result:=Equal;

end;

Procedure IncRe(Var r: Real; h: real);

begin

r:=r+h;

end;

Function LongToStr(L: LongInt; d: byte): String;

{конвертирует целое в строку длины d}

begin

Str(L,Serv);

Result:=LPad(Serv,d);

end;

Function Long2Str(L: LongInt): String;

{конвертирует целое в строку}

begin

Str(L,Serv);

Result:=Serv;

end;

Function StrLong(st: String): LongInt;

{конвертирует строку в целое }

begin

Val(Trim(st),Lon,Code);

Result:=Lon; end;

Function Str2Long(st: String; Var L: LongInt): boolean;

{конвертирует строку в целое. Возвращает True в случае успеха}

begin

Val(Trim(st),L,Code);

Result:=(Code=0);

end;

Function RealToStr(R: Real; Posle: byte): String;

{Конвертирует Real в строку, Posle – количество символов в дробной части R}

begin

Str(R:20:Posle,Serv);

RealToStr:=Trim(Serv);

end;

 

Function Slash(Dir: String): String;

{ставит в конец пути символ '\'}

begin

Serv:=Trim(Dir);

if (Serv[Length(Serv)]<>'\') then Result:=Serv+'\'

else Result:=Serv;

end;

Function ChWinDos(Ch: Char): Char;

{преобразует русский Windows-символ в русский DOS-символ}

Var i,j: byte;

begin

i:=Ord(Ch);

Case i of

168: {Ё} j:=240;

184: {ё} j:=241;

192..255: if (i>239) then j:=i-16 else j:=i-64

else j:=i;

end;

Result:=Char(j);

end;

Function ChDosWin(Ch: Char): Char;

{преобразует русский DOS-символ в русский Windows-символ}

Var i,j: byte;

begin

i:=Ord(Ch);

Case i of

240: {Ё} j:=168;

241: {ё} j:=184;

128..175: j:=i+64;

224..239: j:=i+16

else j:=i;

end;

Result:=Char(j);

end;

Function StrWinDos(st: String): String;

{преобразует русскую Windows-строку в русскую DOS-строку}

Var

n, i: byte;

s: ^String;

begin

New(s);

n:=Length(st);

s^:= '';

if (n>0) then

for i:=1 to n do

s^:= s^+ChWinDos(st[i]);

Result:=s^;

Dispose(s);

end;

Function StrDosWin(s: String): String;

{преобразует русскую DOS-строку в русскую Windows-строку}

Var

n,i: byte;

s: ^String;

begin

New(s);

n:=Length(st);

s^:= '';

if (n>0) then

for i:=1 to n do

s^:= s^+ChDosWin(st[i]);

Result:=s^;

end;

Function InputStr(const Prompt: String; Var s: String; IsParol: byte): boolean;

{ввод строки. Prompt – пояснение, s – вводимая строка,

isParol=1, если засекреченный ввод, иначе видимый}

begin

Result:=

KdnInputQuery('Ввод строки', Prompt, s, clBlack, (IsParol=1));

end;

Function ParolControl(RealParol: String): boolean;

{возвращает True, если введенная строка совпадает с RealParol}

var

b,h: boolean;

i: byte;

begin

St:='';

i:=0;

b:=false;

Repeat

Inc(i);

h:=InputStr('Введите пароль ...',St,1);

if h then b:= (St=RealParol);

if not b and h then Warn1('Ошибка');

Until b or (i=3) or (not h);

Result:=b;

end;

Function ExistSubDir(SubDir:String; Dir: tPathStr):boolean;

{устанавливает наличие субдиректории SubDir внутри директории Dir. Например, в D:\DIR0001 субдиректории BAR }

begin

Result:=DirectoryExists(Slash(SubDir)+Dir);

end;

Function GetFileSize(const FileName: string): LongInt;

{размер файла}

var Sr: TSearchRec;

begin

if FindFirst(ExpandFileName(FileName), faAnyFile, Sr) = 0 then

Result := Sr.Size

else Result := -1;

end;

Function FileDateTime(const FileName: string): System.TDateTime;

{время создания файла FileName, например:

s:= DateTimeToStr(FileDateTime('c:\KdnBread\Bread.exe'))}

begin

Result := FileDateToDateTime(FileAge(FileName));

end;

Function HasAttr(const FileName: string; Attr: Word): Boolean;

{имеет ли файл FileName атрибут Attr}

begin

Result := (FileGetAttr(FileName) and Attr) = Attr;

end;

Procedure AppendText(Var f: Text; nF: String);

{открывает текстовой файл для добавления строк}

begin

Assign(f,nF);

if KdnFS(nF,1)>0 then Append(f) else Rewrite(f);

end;

Procedure AppendToText(nF,s: String);

{добавляет строку в конец текстового файла}

Var f: TextFile;

begin

AppendText(f, nF);

Writeln(f,s);

CloseFile(f);

end;

Procedure KdnExec(Command: String);

{запуск другого приложения, например 'c:\KdnBreadDir\KdnBread.exe'}

begin

Serv:=Command+#0;

If WinExec(@Serv[1], SW_SHOWNORMAL)<32

then Warn2('Ошибочное завершение WinExec');

end;


Информация о работе «Object Pascal»
Раздел: Информатика, программирование
Количество знаков с пробелами: 162712
Количество таблиц: 21
Количество изображений: 0

Похожие работы

Скачать
49877
5
0

... в среде Delphi). Задачи использовались как с данного сайта, так и из других источников – книг и семинарских занятиях по информатике в МГОУ. Курс завершается разработкой игры. Программное обеспечение: свободно распространяемая версия объектно-ориентированной среды программирования Delphi. Методы обучения: метод проектов, лекции, проблемный метод, частично-поисковый метод. Контроль знаний и умений ...

Скачать
17314
1
5

... // ... if(condition1) { j = 4; goto label1; } // ... for(j = 0; j < 10; j++) { // ... label1: // ... if(condition2) { i = 6; goto label2; } } // ... label2: // ... } 2.2       Разработка программы В среде программирования Borland Delphi создадим новое приложение (пункт меню File New Application). ...

Скачать
27554
2
0

... так называемые указатели. Указатель - это переменная, которая в качестве своего значения содержит адрес байта памяти. С помощью указателей можно размещать в динамической памяти любой из известных в Object Pascal типов данных. Лишь некоторые из них (Byte, Char, ShortInt, Boolean) занимают во внутреннем представлении один байт, остальные - несколько смежных. Поэтому на самом деле указатель адресует ...

Скачать
62207
3
0

... групп нулей и единиц. Каждая группа отделяется друг от друга одним или несколькими пробелами. Найти и вывести на экран группы с четным количеством символов. Лабораторная работа №6 Программирование АЛГОРИТМОВ с использованием записей Цель лабораторной работы: создать приложение, в котором используются данные типа запись. 6.1.Пример создания приложения Задание: создать Windows-приложение для ...

0 комментариев


Наверх