Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задачи_Делфи.docx
Скачиваний:
9
Добавлен:
14.08.2019
Размер:
1.17 Mб
Скачать

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;

Задание. Реализуйте этот проект как заготовку для проекта «Зоомагазин». Нарисуйте животных и рыб, продаваемых в зоомагазинах, и подпишите, как они называются.