Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методички по информатике / Программирование в среде Delphi (Часть 2).pdf
Скачиваний:
60
Добавлен:
27.05.2015
Размер:
1.41 Mб
Скачать

он нулевой и пользователь выбрал учет нулевых элементов"}

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