- •Оглавление
- •Введение
- •Глава 1
- •Использование компонентов общего назначения: tLabel, tButton, tEdit, tShape, tTimer, tPanel
- •1.1.1. Проект «Калькулятор»
- •1.1.2. Проект «Таймер»
- •1.1.3. Проект «Светофор»
- •1.1.4. Проект «Движение шарика tShape с отражением»
- •Глава 2
- •2.1. Класс tCanvas, его свойства и методы
- •2.1.1. Рисование узоров
- •2.1.2. Рисование поля для различных игр
- •2.1.3. Рисование координатной сетки
- •2.1.4. Построение графиков элементарных функций
- •2.2. Класс tBitmap и работа с растровыми рисунками
- •2.2.1. Рисование на поле растрового рисунка
- •2.2.2. Движение двоичного образа по фоновой картинке
- •2.3. Компонент tImage и его использование
- •2.3.1. Проект «Движение компонента tImage»
- •2.3.2. Перемещение картинок
- •2.3.3. Проект «Движение компонента tImage
- •Глава 3
- •3.1. События от мыши
- •3.1.1. Проект «Попади в мишень»
- •3.1.2. Проект «Снежинки»
- •3.1.3. Проект «Крестики-нолики»
- •3.1.4. Движение образа по удерживанию левой кнопки мыши
- •3.1.5. Проект «Жизнь клеток»
- •3.2. События от клавиатуры
- •3.2.1. Код клавиши
- •3.2.2. Управляемое движение образа
- •3.2.3. Совмещение управляемого и неуправляемого движений.
- •Глава 4
- •4.1. Проект «Простейший графический редактор»
- •Глава 5
- •5.1. Создание кнопок
- •5.1.1. Проект «Лохотрон»
- •5.1.2. Игра «Пятнадцать»
- •5.2. Создание компонентов tImage
- •5.2.1. Проект «Угадай картинку»
- •5.2.2. Проект «Собери картинку»
- •Глава 6
- •6.1. Компоненты tStringGrid и tDrawGrid
- •6.1.1. Сортировка массива
- •6.1.2. Проект «Таблица успеваемости»
- •6.1.3. Система предварительной продажи билетов
- •6.1.4. Проект «Таблица рисунков»
- •6.1.5. Рисование в таблице tDrawGrid
- •6.2. Компоненты tListBox, tCombobox ,
- •6.2.1. Прорисовка изображений в списке tListBox
- •6.2.2. Проект «Зоомагазин»
- •6.2.3. Проект «Шуточная игра»
- •6.2.4. Проект «Редактирование списка вопросов»
- •Глава 7
- •7.1. Тест «Знаете ли вы загадки?»
- •7.2. Проект «Исторические даты»
- •Глава 8
- •8.1. Компоненты tOpenDialog, tSaveDialog – диалоги
- •8.1.1. Просмотр текстовых файлов
- •8.2. Добавление и удаление записей в файл и из файла
- •8.2.1. Проект «Журнал группы»
- •8.3. Файлы для проекта «Судоку»
- •Глава 9
- •9.1. Просмотр видеофильма с использованием
- •9.2. Простейшая мультипликация
- •Глава 10
- •10.1. Пример использования try… except
- •Глава 11
- •11.1. Оформление проекта
- •11.1.1. Проект «Бегущая строка»
- •11.1.2. Проект «Титры»
- •11.1.3. Общие рекомендации по оформлению
- •11.2. Рекомендации для отчета по проекту
- •11.3. Темы проектов
- •11.3.1. Головоломка «Сквэрворд»
- •11.3.2. Задача «Путешествие по маршруту»
- •11.3.3. Головоломка «Ходом коня»
- •11.3.4. Задача «Извилистый путь»
- •11.3.5. Головоломка «Фишки на поле»
- •Список литературы
- •630058, Новосибирск, ул. Русская, 35
6.1.5. Рисование в таблице tDrawGrid
Постановка задачи. Выведите изображение в ячейку компонента TDrawGrid, по которой сделан клик мыши.
Реализация. Положите в папку рисунок. На пустой форме разместите компонент TDrawGrid. Вид формы приведен на рис. 36.
Рис. 36. Вид формы
Установите свойство DefaultDrawing компонента TDrawGrid в позицию false. Чтобы по клику по ячейке получить номер и столбца, и строки, применим метод MouseToCell(x, y, Acol, ARow), где x, y – координаты точки чувствительности мыши, Acol, ARow – номера столбца и строки. Код обработчиков FormCreate и StringGrid1MouseDown приведен полностью, а результат показан на рис. 37.
Рис. 37. Проект «Рисунок по клику»
var Bitm : Tbitmap;
rect : Trect;
Acol, ARow, w, h : integer;
procedure TForm1.FormCreate(Sender: TObject);
begin
Bitm := TBitMap.create;
BitM.LoadFromFile('гибикус.bmp');
with StringGrid1 do
begin
DefaultColWidth:= bitm.Width;
DefaultRowHeight:=bitm.Height;
w:=DefaultColWidth;
h:=DefaultRowHeight;
Width:=ColCount*w+10;
Height:=RowCount*h+10;
end;
Form1.Width:=StringGrid1.Width + 50;
Form1.Height:=StringGrid1.Height + 50;
rect:=bounds(0,0,bitm.Width,Bitm.Height);
end;
procedure TForm1.StringGrid1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
StringGrid1.MouseToCell(x, y, Acol, ARow);
StringGrid1.Canvas.CopyRect(StringGrid1.CellRect(Acol, ARow), bitm.Canvas, rect);
end;
Задание. Логическая игра «Расставь цветы». Задайте в компоненте TDrawGrid три строки и шесть столбцов. Играющий должен расставить 6 цветков так, чтобы в каждой строке и в каждом столбце число цветков было четным, при этом некоторые столбцы могут остаться пустыми. Напишите проверку правильности расстановки цветков.
6.2. Компоненты tListBox, tCombobox ,
их свойства и методы
Списки задаются двумя компонентами TListBox и TComboBox со стандартной страницы компонентов.
TListBox – это список выбора, с помощью которого можно выбрать один или несколько элементов. В этом компоненте предусмотрена возможность прорисовки элементов, поэтому список может содержать не только строки, но и произвольные изображения. Если строк в списке много или они длинные, то снизу или справа будут помещены полосы прокрутки.
Комбинированный список TComboBox представляет собой комбинацию списка TListBox и редактора TEdit, и поэтому большинство его свойств и методов заимствованы у этих компонентов. Существует пять модификаций компонента, определяемых его свойством Style: csSimple, csDropDown, csDropDownList, csOwnerDrawFixed и csOwnerDrawVariable. В первом случае список всегда раскрыт, в остальных он раскрывается после нажатия кнопки справа от редактора. В модификации csDropDownList редактор работает в режиме отображения выбора и его нельзя использовать для ввода новой строки (в других модификациях это возможно).
6.2.1. Прорисовка изображений в списке tListBox
Постановка задачи. Цель приложения – научиться помещать текст и изображения в список TListBox. Результат работы приложения показан на рис. 38.
Рис. 38. Изображения в списке TListBox
Реализация. Выберем три небольшие картинки и поместим их в папку проекта. На форму положим список TListBox. Установим свойство Style компонента TListBox равным lbOwnerDrawVariable. Опишем глобальные переменные:
const n=3;
fn:array[0..n-1] of string=('Гепард.bmp','Кабан.bmp','Бурундук.bmp');
// Изображения в файлах
// Текст, который поместим в список, в массиве mas
mas:array[0..n-1] of string=('Гепард', 'Кабан', 'Бурундук');
Текст поместим в строки ListBox1.Items с помощью метода Add. Создадим объекты Objects для Items как растровые рисунки класса TBitMap и с помощью метода LoadFromFile загрузим в них изображения. Все это сделаем при наполнении формы.
procedure TForm1.FormCreate(Sender: TObject);
var k:integer;
begin
k:=0;
while k<n do
begin
ListBox1.Items.Add(mas [k]);
ListBox1.Items.Objects[k]:=TBitMap.Create;
(ListBox1.Items.Objects[k] as TBitMap).LoadFromFile(fn[k]);
k:=k+1;
end;
end;
Для компонента TListBox определены два события, связанные с программной прорисовкой элементов списка: OnDrawItem и OnMeasureItem. Обработчик события OnDrawItem получает ссылку на список выбора Control, индекс изображаемого элемента Index, границы элемента Rect.
Прорисовка ведется с помощью свойства Canvas. Свойство Canvas имеется также у формы, поэтому нужно явно указать канву, предварительно преобразовав тип TWinControl в тип TListBox.
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
var ras:integer; // Расстояние от растра до текста
bt: TBitMap;
begin
(Control as TListBox).Canvas.FillRect(Rect);
// Очищаем прямоугольник
bt:=TBitMap((Control as TListBox).Items.Objects[index]);
if bt<>nil then
begin
bt.Width:=100;
// Вычерчиваем растр
(Control as ListBox).Canvas.BrushCopy(Bounds(Rect.Left+2, Rect.Top, bt.Width, bt.Height), bt, Bounds(0,0,bt.Width, bt.Height), clRed);
ras:=bt.Width + 6;
end
else
ras:=2;
// Выводим текст
(Control as TListBox).Canvas.TextOut(Rect.Left + ras, Rect.Top, (Control as TListBox).Items[Index]);
end;
Событие OnMeasureItem возникает только для Style = lbOwnerDrawVariable. В ходе его обработки программа должна установить нужную высоту очередного элемента. Обработчику передается индекс элемента Index и переменная Height, в которой он должен вернуть высоту элемента. Например:
procedure TForm1.ListBox1MeasureItem(Control: TWinControl; Index: Integer; var Height: Integer);
var bt: TBitMap;
begin
bt:=TBitMap((Control as TListBox).Items.Objects[index]);
if bt<>nil then
Height:=bt.Height +30
else
Height:=35; //abs(ListBox1.Font.Height);
end;
Задание. Реализуйте этот проект как заготовку для проекта «Зоомагазин». Нарисуйте животных и рыб, продаваемых в зоомагазинах, и подпишите, как они называются.