
- •1 Компоненты Delphi
- •1.1 Компонент класса TGroupBox
- •1.2 Компонент класса TRadioButton
- •1.3 Компонент класса TRadioGroup
- •1.4 Компонент класса TCheckBox
- •1.5 Компонент класса TListBox
- •1.6 Компонент класса TForm
- •1.7 Компонент класса TImage
- •1.8 Компонент класса TTimer
- •1.9 Компонент класса TImageList
- •1.10 Компоненты классов TActionList и TAction
- •1.11 Компонент класса TMainMenu
- •1.12 Компоненты классов TToolBar и TToolButton
- •1.13 Компоненты класса TStatusBar и TStatusPanel
- •1.14 Компоненты классов TOpenDialog и TSaveDialog
- •1.15 Компонент класса TTreeView
- •2 Примеры выполнения практических заданий
- •2.1 Стандартные алгоритмы
- •2.2 Элементы выбора
- •2.3 Простейшие классы
- •2.4 Графика
- •2.5 Диалоговые окна
- •2.6 Комплексное задание
- •2.7 Наследование
- •2.8 Древовидные структуры

он нулевой и пользователь выбрал учет нулевых элементов"}
if ((matr[i,j]>0) and (Count_RG.ItemIndex=0)) or ((matr[i,j]<0) and (Count_RG.ItemIndex=1)) or ((matr[i,j]=0) and (Count_RG.ItemIndex=2)) then inc(count);
{Замена элементов}
for i := 0 to Count_SE.Value-1 do for j := 0 to Count_SE.Value-1 do
{Элемент требует замены, если: "он ..."}
if ((matr[i,j] mod 2 = 0) and Div2_CB.Checked) or ((matr[i,j] mod 3 = 0) and Div3_CB.Checked) or ((matr[i,j] mod 4 = 0) and Div4_CB.Checked) then matr[i,j] := count;
{Вывод матрицы}
for i := 0 to Count_SE.Value-1 do for j := 0 to Count_SE.Value-1 do
MatrB_SG.Cells[j,i] := IntToStr(matr[i,j]);
{Перед завершением работы необходимо освободить память, выделенную динамическому массиву} SetLength(matr,0,0);
end;
Внешний вид и пример работы программы показаны на рисунке 3.
Рисунок 3 – Внешний вид и пример работы программы, использующей компоненты выбора
2.3 Простейшие классы
Задание: Элементом списка является пара целых числа. Отображение элемента осуществляется в виде строки, например, «10/15». Считая первое
20
число делимым, а второе – делителем, требуется найти сумму результатов делений.
Будем считать, что форма называется Main_F (изменено свойство Name у формы).
Для решения поставленной задачи потребуются компоненты:
First_E класса TEdit для ввода первого числа добавляемого элемента;
Second_E класса TEdit для ввода второго числа добавляемого элемен-
та;
Spisok_LB класса TListBox для хранения и отображения введенных элементов;
Result_E класса TEdit для вывода результата расчета;
First_L класса TLabel для подписи компонента First_E;
Second_L класса TLabel для подписи компонента Second_E;
Spisok_L класса TLabel для подписи компонента Spisok_LB;
Result_L класса TLabel для подписи компонента Result_E;
Add_B класса TButton для активизации добавления элемента;
Del_B класса TButton для активизации удаления элемента;
Calc_B класса TButton для активизации расчета.
Установим следующие значения свойств компонентов (таблица 3):
Таблица 3 – Значения свойств компонентов для примера выполнения задания по работе с простейшими классами
Компонент.Свойство |
Значение |
First_L.Caption |
П&ервое число добавляемого элемента |
First_L.FocusControl |
First_E |
|
|
Second_L.Caption |
Второе число доба&вляемого элемента |
Second_L.FocusControl |
Second_E |
Spisok_L.Caption |
Спи&сок элементов |
Spisok_L.FocusControl |
Spisok_LB |
Result_L.Caption |
Ре&зультат |
Result_L.FocusControl |
Result_E |
Result_E.ReadOnly |
True |
Add_B.Caption |
Доб&авить |
Del_B.Caption |
Удал&ить |
Calc_B.Caption |
Рас&чет |
Очистим свойство «Text» у компонентов First_E, Second_E и
Result_E.
В разделе type секции implementation опишем свой класс:
TElement = class public
21

{Поля для хранения первого и второго чисел элемента} First,Second : integer;
end;
Опишем событие OnClick кнопки Add_B:
procedure TMain_F.Add_BClick(Sender: TObject); var
Element : TElement; begin
{Перед работой с экземпляром класса, его нужно создать. Создание выполняется через конструктор класса} Element := TElement.Create;
{Заполнение свойств класса введенными пользователем данными} Element.First := StrToInt(First_E.Text);
Element.Second := StrToInt(Second_E.Text);
{Добавление в список нового элемента в виде строки заданного
формата и связывание с данной строкой экземпляра класса} Spisok_LB.Items.AddObject(First_E.Text+'/'+
Second_E.Text, Element);
end;
Опишем событие OnClick кнопки Del_B:
procedure TMain_F.Del_BClick(Sender: TObject); var
Element : TElement; begin
{Проверка, выбран ли элемент в списке}
if Spisok_LB.ItemIndex>-1 then // Элемент выбран begin
{Получение элемента, связанного с выбранной строкой} Element := Spisok_LB.Items.Objects[Spisok_LB.ItemIndex]
as TElement; {Разрушение элемента} Element.Free;1
{Удаление строки, соответствующей выбранному элементу} Spisok_LB.Items.Delete(Spisok_LB.ItemIndex);
end
else // Элемент не выбран
{Вывод окна сообщений с необходимым текстом} ShowMessage('Не выбран элемент в списке');
end;
Опишем событие OnClick кнопки Calc_B:
procedure TMain_F.Calc_BClick(Sender: TObject); var
1На самом деле, сохранять элемент в отдельную переменную и потом разрушать его
спомощью этой переменной нет необходимости. Можно заменить разрушение одной стро-
кой: Spisok_LB.Items.Objects[Spisok_LB.ItemIndex].Free;
22
Element : TElement; i : integer;
Sum : double; begin
{Проверка, введены ли данные}
if Spisok_LB.Count>0 then // Элементы введены begin
{Обнуление переменной-накопителя} Sum := 0;
{Организация перебора всех введенных элементов} for i := 0 to Spisok_LB.Items.Count-1 do
begin
{Получение элемента, связанного с текущей строкой} Element := Spisok_LB.Items.Objects[i] as TElement; {Суммирование результатов деления для текущего элемента} Sum := Sum+Element.First/Element.Second;
end;
{Вывод результата} Result_E.Text := FloatToStr(Sum)
end
else // Элементы не введены
{Вывод окна сообщений с необходимым текстом} ShowMessage('Не введены элементы');
end;
При завершении работы программы надо разрушить все введенные элементы. Опишем событие OnDestroy формы.
procedure TMain_F.FormDestroy(Sender: TObject); var
i : integer; begin
{Перебор всех введенных элементов}
for i := 0 to Spisok_LB.Items.Count-1 do
{Получение элемента, связанного с текущей строкой, и его разрушение.}
Spisok_LB.Items.Objects[i].Free;
end;
Внешний вид и пример работы программы показаны на рисунке 4.
2.4 Графика
Задание: Фигура представляет собой квадрат красного цвета с черной границей и двумя диагональными линиями синего цвета. Диагональные линии не доходят до углов на 1/10 ширины квадрата. Начальное расположение – низцентр поверхности рисования. Поверхность рисования квадратная. Движение
– по линиям, соединяющим центры сторон поверхности рисования по часовой стрелке.
23

Рисунок 4 – Внешний вид и пример работы программы, реализующей работу с простейшими классами
Будем считать, что поверхность, по которой будет осуществляться движение фигуры, имеет размер 300 300 точек. Фигура осуществляет 20 единичных перемещений в секунду.
Для решения поставленной задачи потребуются компоненты:
Image_I класса TImage для построения изображения;
Move_T класса TTimer для обеспечения перемещения фигуры.
Установим следующие значения свойств компонентов (таблица 4):
Таблица 4 – Значения свойств компонентов для примера выполнения задания по работе с графикой
Компонент.Свойство Значение
Image_I.Height 300
Image_I.Width 300
Move_T.Enabled False
Move_T.Interval 50
Для удобства управления фигурой создадим класс TFigure. Так как экземпляр класса будет храниться в форме, то описание класса фигуры реализуется в разделе interface модуля перед описанием класса формы. Описание реализации методов класса фигуры дается в разделе implementation модуля. Данный класс должен иметь базовую точку рисования и базовый размер. На основе этих параметров должны рассчитываться все остальные координаты и размеры элементов фигуры. В качестве базовой точки взят левый верхний угол квадрата, а в качестве базового размера – его сторона.
TFigure = class public
24
X,Y,dX,dY : integer; Size,MaxSize : integer; Canvas : TCanvas;
constructor Create(NewX,NewY,NewSize,NewMaxSize : integer; NewCanvas : TCanvas);
destructor Destroy; override; procedure Show;
procedure Hide; procedure Move;
end;
где X, Y – текущие координаты верхнего левого угла фигуры;
dX, dY – текущее приращение по координатам при единичном перемещении;
Size – размер фигуры;
MaxSize – размер стороны поверхности рисования; Canvas – ссылка на поверхность рисования;
Create – конструктор, вызываемый при создании экземпляра класса; Destroy – деструктор, вызываемый при разрушении экземпляра класса; Show – метод рисования фигуры;
Hide – метод стирания фигуры; Move – метод перемещения фигуры.
constructor TFigure.Create(NewX, NewY, NewSize, NewMaxSize: integer; NewCanvas: TCanvas);
begin
inherited Create; // Вызов конструктора родителя {Установка начальных характеристик фигуры}
X := NewX;
Y := NewY;
dx := -1; // Движение влево dY := -1; // Движение вверх
Size := NewSize; MaxSize := NewMaxSize; Canvas := NewCanvas;
Show; // Вывод фигуры на поверхности рисования end;
destructor TFigure.Destroy; begin
Hide; // Стирание фигуры на поверхности рисования inherited Destroy; // Вызов деструктора родителя
end;
procedure TFigure.Show; begin
{В первую очередь необходимо установить цвета рисования
границы и заливки фигуры} Canvas.Pen.Color := clBlack;
25
Canvas.Brush.Color := clRed; {Рисование прямоугольника} Canvas.Rectangle(X,Y,X+Size,Y+Size); {Установка цвета диагональных линий} Canvas.Pen.Color := clBlue;
{Рисование диагональных линий. Для рисования одной линии
используется комбинация процедур MoveTo–LineTo. Координаты точек линии определяем в долях от основного
размера Size}
Canvas.MoveTo(X+Size div 10,Y+Size div 10); Canvas.LineTo(X+Size-Size div 10,Y+Size-Size div 10); Canvas.MoveTo(X+Size div 10,Y+Size-Size div 10); Canvas.LineTo(X+Size-Size div 10,Y+Size div 10);
end;
procedure TFigure.Hide; begin
{Стирание фигуры должно осуществляться путем установки цвета
рисования границ и заливки в цвет фона поверхности рисования и отрисовки наибольшей составляющей фигуры} Canvas.Pen.Color := clWhite;
Canvas.Brush.Color := clWhite; Canvas.Rectangle(X,Y,X+Size,Y+Size);
end;
Процедура единичного перемещения включает определение новой вероятной позиции фигуры, проверку выхода фигуры за границы области рисования и, если необходимо, корректировку движения, расчет новых координат.
procedure TFigure.Move; var
Temp : integer; begin
Hide; // Стирание фигуры в старом месте
Temp := X+dX; // Расчет вероятной позиции фигуры по оси Х
{Проверка выхода за границы по оси Х. В случае выхода – смена направления движения по оси Х}
if (Temp<0) or (Temp>MaxSize-Size) then dX := -dX;
X := X+dX; // Расчет новой позиции фигуры по оси Х
{Далее аналогичные действия для оси Y} Temp := Y+dY;
if (Temp<0) or (Temp>MaxSize-Size) then dY := -dY;
Y := Y+dY;
Show; // Отображение фигуры в новом месте end;
Описание переменной в разделе public или private класса TForm1.
Figure : TFigure;
26