
- •Основы программирования
- •Введение
- •Основы delphi
- •Общая технология программирования
- •Язык программирования
- •Объектно-ориентированное программирование
- •Визуальное программирование
- •Событийно управляемое программирование
- •Windows-приложение
- •Среда программирования
- •Первоначальные сведения о проекте приложения
- •Встроенный отладчик
- •Использование встроенных классов
- •Иерархия классов
- •Использование палитры компонентов и инспектора объектов
- •Использование графики
- •Основные инструменты
- •Основные характеристики шрифтов
- •Графические данные и палитра
- •Некоторые общие свойства компонентов
- •Сохранение проекта
- •Построение простейшего проекта
- •Понятие исключительной ситуации
- •Введение в object pascal
- •Структура приложения
- •Структура программы-проекта
- •Структура модуля
- •Пример 1
- •Описания программных элементов
- •Программные элементы и адреса памяти
- •Области видимости
- •Правила записи имен
- •Время жизни идентификаторов
- •Использование локальных переменных в примере 1
- •Использование глобальных переменных в примере 1
- •Простые типы
- •Целые типы
- •Целые типы
- •Некоторые операции с целым типом
- •Символьные типы
- •Логические типы
- •Тип перечень
- •Интервальный тип
- •Вещественный тип
- •Вещественные типы
- •Некоторые операции с вещественным типом
- •Тип дата-время
- •Выражения
- •Константы
- •Типизированные константы.
- •Переменные
- •Операции
- •Унарная операция not (отрицание)
- •Логические операции and, or, xor
- •Функции
- •Порядок вычисления выражений
- •Виды операторов
- •Простые операторы
- •Составной оператор
- •Операторы условного перехода
- •Оператор if
- •Пример 2
- •Оператор case
- •Пример 3
- •Использование enter в примере 3
- •Операторы цикла
- •Оператор цикла for
- •Пример 4
- •Оператор цикла while
- •Пример 5
- •Оператор цикла repeat
- •Пример 6
- •Использование процедур break и continue
- •Пример 7
- •Массивы
- •Статические массивы
- •Динамические массивы
- •Пример 8
- •Пример 9
- •Записи (объединения)
- •Оператор with
- •Пример 10
- •Совместимость и преобразование типов данных
- •Идентичность типов
- •Совместимость типов
- •Совместимость по присваиванию
- •Преобразование типов
- •Операторы обработки исключительных ситуаций
- •Пример 11
- •Множества
- •Операции над множествами
- •Пример 12
- •Вариантный тип данных
- •Процедуры и функции
- •Процедура
- •Функция
- •Рекурсия
- •Формальные и фактические параметры
- •Параметры-значения
- •Параметры-переменные
- •Параметры-константы
- •Параметры без типа
- •Массивы открытого типа
- •Парамеры по умолчанию
- •Процедура exit
- •Директивы подпрограммы
- •Соглашения по передаче данных
- •Директива forward
- •Директива external
- •Директива assembler
- •Перегруженные подпрограммы
- •Пример 13
- •Инкапсуляция
- •Класс как объектный тип
- •Наследование
- •Области видимости
- •Операции is и as
- •Виды методов
- •Методы virtual и полиморфизм
- •Методы dynamic
- •Методы message
- •Методы abstract
- •Методы override
- •Методы class
- •Пример 14
- •Динамическое создание компонентов
- •Использование класса со счетчиком объектов
- •Отслеживание разрушения объектов
- •События
- •Указатели на методы
- •Пример 15
- •Типы ссылки на класс
- •Свойства
- •Свойства simple
- •Свойства enumerated
- •Свойства set
- •Свойства object
- •Свойства array
- •Задание начальных значений свойствам
- •Пример 16
- •Файловые типы
- •Текстовые файлы
- •Типизированные файлы
- •Файлы без типа
- •Дополнительные процедуры и функции
- •Пример 17
- •Компонент tmainmenu
- •Указатели
- •Пример 18
- •Динамические структуры данных
- •Однонаправленные списки
- •Двунаправленные списки
- •Стеки, очереди
- •Бинарные деревья
- •Пример 19
- •Процедурный тип
- •Программные единицы dll
- •Пример 20
- •Технологии программирования
- •Потоки данных
- •Пример 21
- •Пример 22
- •Интерфейс drag and drop
- •Пример 23
- •Технология drag and dock
- •Пример 24
- •Использование функций windows api при работе с файлами
- •Пример 25
- •Использование отображаемых файлов
- •Пример 26
- •Программные потоки
- •Приоритеты потоков
- •Класс tthread
- •Пример 27
- •Использование блокировки в примере 27
- •Многопоточное приложение в примере 28
- •Проблемы синхронизации потоков
- •Список используемых в примерах компонентов
- •Список используемых компонентов и других классов
- •Библиографический список
- •Оглавление
Задание начальных значений свойствам
Когда создаются свойства, они первоначально получают нулевые или неопределенные (в зависимости от типа свойства) значения. Если необходимо задать свойствам какие-либо значения по умолчанию, то используются следующие шесть команд:
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. Включим в него следующие действия:
Инициализация всех полей;
Рисование фигуры;
Остальные три класса определяют конкретную реализацию рисования круга, квадрата и эллипса. Программа приводится ниже.
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.