Лабораторная работа 7.Создание числовых изображений
Задание1.
1. Поместите в форму чертежную таблицу - компонент DrawGridl (его заготовка имеется на вкладке Additional палитры компонентов). Расположить ее нужно так, чтобы она занимала большую часть формы за исключением небольшого места внизу, куда поместите еще две кнопки.
2. В паспорте DrawGridl задайте следующие характеристики некоторых свойств этой таблицы. Чтобы вызвать ощущение бездонности «числового космоса», сделайте цвет фона черным
Color: ctВlack.
3. Принятые по умолчанию ширину столбца таблицы DefaultColWidth и высоту ее строки Default RowHeight установите равными трем пикселям.
4. Для отображения ячеек таблицы используем инструкции своей программы, поэтому откажитесь от принятых по умолчанию средств Delphi DefaultDrawing: False.
5. Выбрав нулевую толщину линий сетки (GridLineWidth: О), вы тем самым избавляетесь от табличной сетки.
6. Для отключения обрамления таблицы установим стиль рамки: BorderStyle: bsNone.
7. Разместите в форме часы Тimeгl (вкладка System панели компонентов). Под DrawGridl расположите две кнопки с заголовками СТОП и ПУСК
Обработчик щелчка на первой из них содержит всего одну строку программы: Тimer1. Enabled : = fa1se;
обработчик другой –
Timer1.Enabled := true.
С помощью этих кнопок вы будете останавливать часы и снова их запускать. Изображения формируется при срабатывании прерывания от этих часов через интервалы времени длительностью 1 секунда (при желании величину интервала можно изменить).
8. У таблицы DrawGridl имеются свойства ColCount и Row Count, устанавливающие соответственно 'Количество (соипt) столбцов и строк (rows). Вам удобнее будет пользоваться другими обозначениями для них, поэтому опишете следующие глобальные переменные:
var
Form1: TForm1;
m:integer=1;
n:integer;
9. Количество строк можно рассчитать при создании формы в процедуре TForm1.FormCreate (заготовка этой процедуры откроется, если два раза щелкнуть мышью на свободном месте формы):
procedure TForm1.FormCreate(Sender: TObject);
begin
with DrawGrid1 do
begin
n := round(Height/DefaultRowHeight); // рассчитываем количество строк
RowCount := n; //и устанавливаем их в таблице
end;
end;
10. Количество столбцов необходимо увеличивать на 1 байт всякий раз при срабатывании таймера. Текст процедуры TForm1. TimerIТimer приводится ниже.
procedure TForm1.Timer1Timer(Sender: TObject);
var
k: integer ; // Счетчик сквозной нумерации ячеек таблицы
i, j: integer; //Счетчик циклов
Area: TRect; // Вспомогательный прямоугольник
begin
inc(m); // Увеличиваем m на 1
Caption := ' '+ IntToStr(m); // В заголовке формы высвечиваем число m
DrawGrid1.ColCount := m; // Устанавливаем в таблице m столбцов
DrawGrid1.Canvas.Brush.Color := clBlack; // "Макаем" кисть в черную краску
for i:=0 to n-1 do // цикл по строкам таблицы
for j:=0 to m-1 do // цикл по столбцам таблицы
begin
Area := DrawGrid1.CellRect(j,i);
DrawGrid1.Canvas.FillRect(Area);
end;
Выше приведена стандартная совокупность операторов по закраске ячейки таблицы, стоящей на пере сечении i-й строки и j-ro столбца, i=O, 1, ..., n-1; j=O, 1, ..., т.1. Обратите внимание, что при вызове функции CeLlRect, определяющей прямоугольник этой ячейки (сеll- ячейка, rectaпgle - прямоугольник), сначала указывается индекс столбца, а потом - индексстроки. Закрашивание всех ячеек происходит текущим цветом кисти, в данном случае - черным. Это необходимо для обновления всего изображения в дальнейшем.
k := -1; // начальная инициализация к
DrawGrid1.Canvas.Brush.Color := clWhite;//"Макаем"кисть в белую краску
for i:=0 to n-1 do
for j:=0 to m-1 do
begin
inc(k); // берем следующее число
if Frac(Sqrt(k)) = 0 then // если оно является точным квадратом, то
begin
Area :=DrawGrid1.CellRect(j,i);
DrawGrid1.Canvas.FillRect(Area); //закрасим текущую яейку белой краской
end;
// перейдем к следующему числу
// и к следующей ячейке
end;
end;
Здесь использованы стандартные функции языка: Sqrt(x) - квадратныЙ корень из числа х, и Frac(x) дробная часть числа х.
В условии if Frac(Sqrt(k)) = о проверяется, извлекается ли нацело квадратный
из числа k.
Таким образом, в данной программе периодически перерисовываются белой краской те ячейки таблицы, номер k которых при сквозном подсчете ячеек по строкам слева направо и сверху вниз является квадратом некоторого целого числа.
Попробуйте дать математическое описание парабол. Для проведения арифметических исследований вам может понадобиться изменить некоторые паспортные свойства таблицы DrawGrid1 (размер ячеек, цвет фона, отображение сетки и, возможно, некоторые другие).
Задание 2.
В этом задании будем отмечать различным цветом квадраты в таблице умножения n х n, если числа, попадающие в эти квадраты, при делении на заданное число m (модуль) дают заданный остаток rest. Изменяя число m от 2 до n2 - 1, а при каждом фиксированном m число rest О до m - 1, мы получим коллекцию причудливых орнаментов., выражающих арифметические свойства чисел.
1. Создайте форму, представленную на рисунке.
2. В качестве сцены для арифметических представлений опять используем таблицу DrawGridl. В паспорте DrawGridl уста новим следующие значения ее свойств:
+ FixedCols: 0 (число фиксированных столбцов 0);
+ FixedRows: 0 (число фиксированных строк 0);
+ ScrollBars: ssNone (отсутствие полос прокрутки);
+ DefaultDrawing: false (подключение собственных программных средств отображения ячеек таблицы).
3. Изображение «танцующих чисел» в таблице изменять периодически при срабатывании таймера. Для этой цели в форму нужно поместить компонент Timer, установив значение его свойства Enabled в false. Этот таймер будет запускаться при щелчке на кнопке Buttonl с заголовком ПУСК. В обработчике TForml.ButtonlClick этой кнопки напишем одну строчку кода:
Timerl.Enabled := true;
4. Кнопка Button2 с заголовком СТОП предназначена для остановки таймера с тем. В обработчике TForml.ButtonZ Click запишем: Timerl.Enabled := false;
5. Для подключения или отключения сетки таблицы предназначен компонент CheckBoxl с заголовком СЕТКА.
6. Размеры таблицы умножения зависят от натурального числа, показанного в поле рядом с надписью: «Таблица умножения на». Это поле — компонент SpinEditl, смещенный на форму со вкладки Samples (Образцы) компонентов. В паспорте компонента SpinEditl утановите следующие значения его свойств:
MaxValue: 80 (максимальная величина);
MinValue: 2 (минимальная величина);
Value: 10 (величина по умолчанию).
Значение величины по умолчанию Value: 10 соответствует таблице умножения чисел а х b , где каждый из Множителей а и b пробегает значения от 0 до 9.
Минимальная 2 и максимальная 80 величины задают диапазон изменения размеров таблицы от 2 х 2 до 80 х 80 (здесь измерения указаны в ячейках таблицы).
7. Компоненты класса TSpinEdit помещены после надписей «модуль» (SpinEdit2), «остаток» (SрiпЕditз), «миллисекунды» (SpinEdit4). Параметры этих полей представлены в таблице:
| SpinEdit2 | SpinEdit3 | SpinEdit4 |
MaxValue | 6399 | 6399 | 10000 |
MinValue | 2
| -1 | 10 |
Value | 2 | 0 | 1000 |
8. Чтение новых параметров изо всех размещенных в форме полей во время исполнения программы осуществляется при щелчке на кнопке ВuttопЗ с надписью ПРИМЕНИТЬ. Прежде чем приступить к написанию процедуры-реакции для этой кнопки, опишете глобальные переменные в программе:
var
Form1: TForm1; // модуль
m: integer; // остаток
rest: integer; // количество строк (столбцов)
n: integer ; // в таблице умножения
9. Два раза щелкнув мышью на свободном месте формы Form1, откройте заготовку процедуры TForml. Form Create и наберите в ней следующий текст:
procedure TForm1.FormCreate(Sender: TObject);
begin
n:=SpinEdit1.Value; // читаем новые значения
m:=SpinEdit2.Value;
rest:=SpinEdit2.Value;
Timer1.Interval:=SpinEdit4.Value;
with DrawGrid1 do
begin // устанавливаем параметры
DrawGrid1.
DefaultColWidth:=round(Width div n);
DefaultRowHeight:=round(Height div n);
ColCount:=n;
RowCount:=n;
if CheckBox1.Checked then GridLineWidth:=1
else GridLineWidth:=0;
end;
end;
10. Содержимое процедуры-реакции на щелчок на кнопке с заголовком ПРИМЕНИТЬ ничем не отличается от только что написанного кода, поэтому скопируем.
11. Ниже приводится текст процедуры-реакции на срабатывание таймера
TForml. TimerlТimer. Ее заготовка откроется, если два раза щелкнуть мышью в форме на компоненте Timer1.
procedure TForm1.Timer1Timer(Sender: TObject);
var
c,r, // счетчики циклов
// по столбцам и строкам
i: integer ; // число в ячейке таблицы умножения
Area: TRect; //вспомогательный прямоугольник
begin
inc(rest); // увеличиваем остаток
SpinEdit2.Value:=m; //отображаем текущие значения
SpinEdit3.Value:=rest; // модуля и остатка
with DrawGrid1 do
begin
Canvas.Brush.Color:=clWhite;
for r:=0 to n-1 do //закрашиваем все ячейки таблицы
// белым цветом фона
for c:=0 to n-1 do
begin
Area:=CellRect(c,r);
Canvas.FillRect(Area);
end;
Canvas.Brush.Color:=random($1000000); // выбираем цвет по случайному коду
for r:=0 to n-1 do
for c:=0 to n-1 do
begin
i :=c*r ;
// Рассчитываем число
// в таблице умножения,
// стоящее на пересечении
// i строки и j столбца
if i mod m=rest then // Если остаток равен rest то
begin // закрашиваем ячейку
// текущим цветом
Area:=CellRect(c,r);
Canvas.FillRect(Area);
end;
end;
if rest >= m -1 then // Если остаток
//достиг предельного значения, то
begin
rest:= -1;// восстанавливаем его исходное значение
inc(m); // и переходим к следующему значению модуля
if m >= n*n then //Если модуль превысил максимальное значение, то
begin
m:=2; //восстанавливаем его исходное значение и
Timer1.Enabled:=false; // отключаем таймер
end;
end;
end;
end;
initialization //настройка датчика случайных чисел
randomize;
end.
12. Для улучшения качества работы программы в разделе инициализации (перед завершающим оператором end. (с точкой)) нужно настроить датчик случайных чисел random на системный таймер: I
initialization
randomize:
Запустите программу.
Задание 3.
Замените строку в программе вместо
if I mod n=rest then
напишите
If Frac(Sqrt(i))=0 then
В этом случае будут раскрашиваться те ячейки таблицы умножения, в которых располагаются квадраты чисел.
Задание 4.
Попробуйте составить свое числовое изображение, изменяя необходимые значения и программный код.
- 1. Теоретические основы объектно – ориентированного программирования 5
- 2. Использование системы программирования Delphi для создания Windows-приложений 9
- 3. Лабораторный практикум 27
- Введение
- 1. Теоретические основы объектно – ориентированного программирования
- 1.1.Объектная модель и ее элементы.
- 1.2.Основные понятия объектно-ориентированного подхода - объект и класс.
- 1.3.Методы построения классов.
- 2. Использование системы программирования Delphi для создания Windows-приложений
- 2.1. Интерфейс интегрированной среды разработки Delphi
- 2.2. Синтаксические правила языка Object Pascal
- 2.3. Создание и структура пользовательских приложений в среде Delphi
- 2.4. Структура модуля (*.Pas)
- 2.5. Создание формы и написание откликов на события
- 1) Компоновка формы и задание свойств компонентов
- 2) Написание отклика на событие
- 2.6. Компиляция и исполнение программы
- 2.7. Ввод и вывод данных. Функции преобразования типов данных
- 3. Лабораторный практикум Лабораторная работа 1. Разработка приложения Калькулятор
- Лабораторная работа 2. Использование курсоров в приложениях Windows.
- Лабораторная работа 4. Создание простого текстового редактора.
- Лабораторная работа 5. Рисование мышью в форме
- Лабораторная работа 6. Применение графических компонентов
- Лабораторная работа 7.Создание числовых изображений
- Лабораторная работа 8. Создание текстурных заливок
- Лабораторная работа 9. Поддержка справочной системы. Создание всплывающих подсказок.
- Лабораторная работа 10.Создание видеопроигрывателя
- Лабораторная работа 12.Создание браузера
- Лабораторная работа 13. Работа с внешним файлом.
- Лабораторная работа 14. Работа с базами данных.
- Лабораторная работа 15. Создание многооконных приложений.
- Литература Основная литература
- Дополнительная литература