- •Государственное образовательное учреждение высшего профессионального образования «Тульский государственный университет»
- •Конспект лекций
- •Информатика
- •Содержание
- •Системы счисления. Позиционные и непозиционные системы
- •2.1. Кодирование текста
- •2.2. Растровая и векторная графика
- •2.3. Представление цвета
- •2.4. Представление звука. Ацп. Цап
- •3.1. Принцип фон Неймана
- •3.2. Общая структурная схема процессора
- •3.3. Арифметико-логическое устройство (алу)
- •3.4. Адрес ячейки памяти
- •3.5. Регистры процессора
- •3.6. Как процессор складывает два числа
- •4.1. Эволюция средств вычислений
- •4.2. Эволюция эвм
- •4.3. Поколения эвм
- •5.1. Эволюция персональных эвм
- •5.2. Классификация эвм
- •6.1. Программное обеспечение
- •6.2. Функции ос
- •6.3. Трансляция программ
- •6.5. Декомпозиция
- •6.6. Объектно-ориентированное программирование
- •7.1. Понятие алгоритма. Свойства алгоритма
- •7.2. Способы записи алгоритма: псевдокод, блок-схема
- •7.3. Преобразование программы в машинные коды. Интерпретаторы и компиляторы
- •7.4. Оптимизация кода для повышения эффективности
- •7.5. Структура ide. Отладка программ
- •8.1. Описание структуры проекта
- •8.2. Описание структуры модуля
- •8.3. Описание элементов программ
- •8.4. Алфавит языка программирования
- •8.5. Идентификаторы, константы, выражения
- •9.1. Целая и вещественная арифметика
- •9.2. Приоритет операций
- •9.3. Встроенные функции. Построение сложных выражений
- •10.1. Встроенные типы данных. Целые типы. Представление знака числа. Арифметическое переполнение
- •10.1.1. Встроенные типы данных
- •10.1.2. Целые типы
- •10.1.3. Представление знака числа
- •10.1.4. Арифметическое переполнение
- •10.2. Вещественные типы. Сопроцессор
- •10.3. Текстовые типы
- •10.4. Логический тип
- •10.5. Оператор присваивания. Совместимость типов по присваиванию
- •11.1. Устройства вывода
- •11.2. Объекты, обеспечивающие вывод данных на экран
- •11.2.1. Перечень компонентов ввода и отображения текстовой информации
- •11.2.2. Отображение текста в надписях компонентов Label, StaticText и Panel
- •11.2.3. Окна редактирования Edit и MaskEdit
- •11.2.4. Многострочные окна редактирования Memo и RichEdit
- •11.2.5. Группа радиокнопок – компонент RadioGroup
- •Ввод и отображение целых чисел — компоненты UpDown и SpinEdit
- •11.2.6. Компоненты выбора из списков — ListBox, CheckBox, CheckListBox и ComboBox
- •11.2.7. Таблица строк — компонент StringGrid
- •11.2.8. Функция InputBox
- •11.2.9. Процедура ShowMessage
- •11.3. Вывод в текстовый файл
- •11.3.1. Объявление файла
- •Назначение файла
- •11.3.2. Вывод в файл
- •11.3.3. Открытие файла для вывода
- •11.3.4. Ошибки открытия файла
- •11.3.5. Закрытие файла
- •11.4. Устройства ввода. Ввод с клавиатуры. Реакция на действия пользователя
- •11.4.1. Устройства ввода
- •11.5. Ввод из файла
- •11.5.1. Открытие файла
- •11.5.2. Чтение данных из файла
- •11.5.3. Чтение чисел
- •11.5.4. Чтение строк
- •12.1. Ветвление
- •12.2. Логические (булевские) операции
- •12.3. Составной оператор
- •12.4. Оператор ветвления if
- •12.5. Оператор ветвления case
- •12.6. Исключительные ситуации
- •13.1. Функции цикла в программе. Циклы с пред- и постусловием
- •13.2. Оператор While. Вечные циклы
- •13.3. Вечные циклы
- •13.4. Оператор repeat. Процедуры inc и dec
- •13.5. Цикл с переменной for
- •13.6. Команды break и continue
- •13.7. Вложенные циклы
- •13.8. Примеры задач с циклами
- •14.1. Объявление массива
- •14.2. Операции с массивами
- •14.2.1. Вывод массива
- •14.2.2. Ввод массива
- •14.2.3. Поиск минимального (максимального) элемента массива
- •14.2.4. Поиск в массиве заданного элемента
- •14.3. Ошибки при использовании массивов
- •15.1. Создание пользовательских функций. Передача аргументов
- •15.2. Глобальные и локальные переменные
- •15.3. Примеры написания пользовательских функций
- •15.4. Процедуры
- •15.5. Процедуры программиста
- •15.6. Передача параметров по ссылке и значению
- •15.7. Перегрузка процедур и функций
- •15.8. Упреждающее объявление процедур и функций (forward)
- •16.1. Основные понятия компьютерной графики
- •16.2. Получение сведений о режимах экрана. Эффекты прозрачности
- •16.3. Графические построения
- •16.4. Построение графиков функций
- •16.5. Использование компонента tChart
- •16.6. Обновление изображения
- •17.1. Анимация на основе операции xor
- •17.2. Буферизация фона
- •17.3. Работа с таймером
- •18.1. Виды диалога
- •18.2. Стандарты пользовательского интерфейса
- •18.2.3. Размеры окон
- •18.2.2. Размеры элементов управления
- •Надписи на элементах управления:
- •18.2.4. Схема расположения
- •19.1. Технология mmx
- •19.2. Мультимедийные аппаратные интерфейсы
- •20.1. Тест Тьюринга
- •20.2. Представление знаний и вывод на знаниях
- •20.3. Модели представления знаний
- •20.4. Вывод на знаниях
- •21.1. Основы телекоммуникаций и распределенной обработки информации
- •21.2. Каналы связи
- •21.2.1. Аналоговые и цифровые каналы
- •21.2.2. Коммутируемые и выделенные каналы
- •21.2.3. Двух- и четырехпроводные каналы
- •21.3. Семиуровневая модель osi
- •21.3.1. Физический уровень
- •21.3.2. Канальный уровень
- •21.3.3. Верхние уровни osi
- •21.4. Управление потоком
- •21.5. Технология "клиент-сервер"
- •22.1. Методы защиты информации
- •22.2. Основы криптографии
- •22.3. Симметричные криптосистемы
- •22.3.1.Моно- и многоалфавитные подстановки
- •22.3.2. Перестановки
- •22.3.3. Гамирование и блочные шифры
- •22.4. Алгоритмы цифровой подписи
- •22.5. Сжатие данных
- •22.5.1. Методы сжатия изображений
- •22.6. Понятие об экономических и правовых аспектах информационных технологий
16.6. Обновление изображения
Помимо объекта Image, рисовать можно непосредственно на форме или панели. Например, проведем белые диагональные полосы на форме, превратив ее в подобие Андреевского флага. Для этого напишем следующий обработчик нажатия на кнопку:
procedure TForm1.Button1Click(Sender: TObject);
begin
with Self.Canvas do
begin
Pen.Color:=clWhite;
Pen.Width:=20;
MoveTo(0,0);
LineTo(Self.ClientWidth,Self.ClientHeight);
MoveTo(Self.ClientWidth,0);
LineTo(0,Self.ClientHeight)
end
end;
Данный фрагмент проводит две белые полосы шириной в 20 пикселов по диагонали формы. Точка (0,0) формы находится в ее левом верхнем углу. Обратите внимание, что для определения размеров формы используются свойства формы ClientWidth и ClientHeight, а не просто Width и Height. Дело в том, что свойства Width и Height содержат полный размер формы, включая полоску заголовка, а ClientWidth и ClientHeight – лишь размеры так называемой клиентской части формы, на которой можно размещать другие объекты.
Если запустить нашу программу и щелкнуть по кнопке, полосы действительно отрисуются (Рис. 16.13, а). Но... Попробуем перетащить окно программы так, чтобы оно частично оказалось за пределами экрана, а потом вытащим его обратно. О, ужас! На части окна, побывавшей за границей экрана, линии стерлись! (Рис. 16.13, б). Причем при использовании объекта Image подобный эффект не наблюдается.
а) |
б) |
Рис. 16.13. Потеря части изображения.
Как бороться с таким безобразием? Увы, единственный способ – перерисовывать картинку всякий раз, когда часть изображения затирается. Для этого вынесем все команды рисования в отдельную процедуру Draw:
procedure Draw;
begin
with Form1.Canvas do
begin
Pen.Color:=clWhite;
Pen.Width:=20;
MoveTo(0,0);
LineTo(Form1.ClientWidth,Form1.ClientHeight);
MoveTo(Form1.ClientWidth,0);
LineTo(0,Form1.ClientHeight)
end
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Draw
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
Draw
end;
В данном фрагменте добавлен обработчик события формы OnPaint. Это событие происходит всякий раз, когда форму надо перерисовывать. Соответственно в такие моменты и вызывается процедура Draw. Теперь с исчезновениями частей изображения покончено.
Лекция 17. Построение динамических изображений
Анимация в Delphi создается двумя основными способами. Давайте изобразим звездное небо, по которому летит летающая тарелка. При этом нужно обеспечить автоматическое восстановление фона под движущейся картинкой.
17.1. Анимация на основе операции xor
Первый способ основан на хитром свойстве логической операции XOR. Поместим на форму кнопку и объект Image1 с шириной, в два раза превышающей высоту. Сначала нарисуем небо – это мы уже умеем. Теперь надо нарисовать летающую тарелку. Их толком никто не видел, поэтому особой точности в деталях не требуется. Давайте вынесем команды рисования тарелки в отдельную процедуру, это заметно облегчит жизнь в дальнейшем.
PROCEDURE Ufo(x,y:INTEGER);
BEGIN
WITH Form1.Image1.Canvas DO
BEGIN
Pen.Color:=clBlue;
Pen.Width:=3;
Ellipse(x,y,x+20,y+10)
END
END;
Осталось организовать движение тарелки по экрану. Делается это в обработчике нажатия на кнопку примерно так:
Pen.Mode:=pmNOTXOR;
FOR i:=0 TO Image1.Width DO
BEGIN
Ufo(i, i DIV 2);
Application.ProcessMessages;
Sleep(10);
Ufo(i, i DIV 2)
END
END;
Самая важная строчка в этом фрагменте - Pen.Mode:=pmNOTXOR. Она устанавливает режим вывода графики "исключающее ИЛИ". При таком режиме вывод одной и той же картинки дважды в одно и то же место изображения приводит к автоматическому восстановлению фона под картинкой. Такой эффект основан на свойстве логической операции "исключающее ИЛИ": если a XOR b=c, то с XOR b=a. В цикле картинка выводится первый раз (вызов процедуры Ufo), затем выполняется команда Application.ProcessMessages, обеспечивающая немедленное отображение НЛО на экране и делается задержка на 10мс, чтобы мы успели увидеть, что получилось. Далее НЛО выводится в то же самое место еще раз, при этом изображение тарелки пропадет, а под ней автоматически восстановится фон. Координаты тарелки меняются и по Х, и по Y, поэтому она поедет по экрану вправо вниз.
Запускаем… Красиво? Нет! Экран безобразно мерцает. Что делать? Спокойно, это просто еще один фокус Delphi. Чтобы динамическое изображение на форме не мерцало, в начало процедуры вывода анимации надо добавить строчку
Form1.DoubleBuffered:=TRUE;
Окончательный вариант обработчика имеет вид:
procedure TForm1.Button1Click(Sender: TObject);
var i:word;
begin
DoubleBuffered:=true;
with Image1.Canvas do
begin
Brush.Color:=clBlack;
FillRect(Image1.ClientRect);
for i:=1 to 500 do
Pixels[Random(Image1.Width),Random(Image1.Height)]
:=clWhite;
Pen.Mode:=pmNOTXOR;
FOR i:=0 TO Image1.Width DO
BEGIN
Ufo(i, i DIV 2);
Application.ProcessMessages;
Sleep(10);
Ufo(i, i DIV 2)
END
END
end;
Вот теперь наш мультик будет смотреться вполне неплохо, если бы не одна неприятность. Мы заказывали тарелку синего цвета (строчка Pen.Color:=clBlue), а получили желтого. Причина – в операции "исключающее ИЛИ". Она неизбежно искажает цвета выводимых на экран точек. Поэтому создать нормальную многоцветную анимацию таким способом затруднительно.