Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа №21.pdf
Скачиваний:
17
Добавлен:
16.03.2015
Размер:
1 Mб
Скачать

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

//если ячейка не пустая,то загружаем изображение в окно просмотра

if Index<SketchList.Count then imgPreview.Picture.LoadFromFile(SketchList.Strings[Index]);

end;

Добавьте ограничения на размер панели pnCommand, а также ограничения на размер формы. Примерный вид работающей программы приведен на рисунке 20. Запустите программу, проверьте, что она корректно работает. Полный листинг программы приведен в приложении А.

Рисунок 20 – Примерный вид окна работающей программы

Задания к лабораторной работе

1.Наберите программы, приведенные в лабораторной работе.

2.Модифицируйте программу, приведенную в листинге 1 для сложения матриц (размерность 3х3). Для ввода значений в матрицу реализуйте фильтр для ввода чисел (см. компонент TEdit).

3.Модифицируйте программу, приведенную в листинге 3. Добавьте колонку, содержащую средний бал студента. Строки, где средний балл больше четырех, должны подсвечиваться красным цветом.

4.Модифицируйте программу из предыдущего задания. При изменении размеров таблицы колонки должны изменять свои размеры таким образом, чтобы занимать всю область таблицы, а именно колонки «№» и «Средний бал» должны иметь ширину по 25 пиксел, а остальное пространство должно поровну делится между оставшимися 3-мя колонками (используйте событие Resize компонента pnGrid).

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

5.Модифицируйте программу из листинга 4 (Приложение А). На панель pnCommand добавьте компоненты для настройки внешнего вида таблицы с эскизами, а именно настройку цвета бордюра.

Вопросы к лабораторной работе

1.Для чего предназначено свойство Kind компонента TBitBtn?

2.В чем отличие компонента TBitBtn от компонента TButton?

3.Для чего предназначен компонент TSplitter?

4.С помощью какого свойства можно изменить содержимое ячеек компонента

TStringGrid?

5.В чем отличие компонента TDrawGrid от компонента TStringGrid?

6.Какова структура формата CVS, объясните алгоритм загрузки таблицы из файла (листинг 2)?

7.Какое событие отвечает за программную прорисовку ячеек компонентов TStringGrid

и TDrawGrid?

8.Объясните работу алгоритма прорисовки ячеек в программе из листинга 3.

9.Для чего предназначены функции FindFirst, FindNext и FindClose?

10.Как по координатам ячейки вычислить позицию элемента в списка сопоставленного данной ячейке?

11.Объясните работу алгоритма масштабирования изображений для получения эскизов.

Справочные таблицы

 

Таблица 1 – Свойства компонента TBitBtn.................................................................................

2

Таблица 2 – Свойства компонента TSplitter................................................................................

4

Таблица 3

– Свойства компонента TStringGrid ..........................................................................

6

Таблица 4

– Назначение элементов множества TGridOptions. .................................................

8

Таблица 5

– Некоторые методы компонента TStringGrid. ........................................................

9

Таблица 6

– События доступные компоненту TStringGrid .......................................................

9

Приложение A – Листинг программы «Компонент

TDrawGrid»

Листинг 4 – Программа "Компонент TDrawGrid"

unit UDGrid;

interface

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Grids, Jpeg;

type

TfrmDGrid = class(TForm) pnGrid: TPanel; pnCommand: TPanel; VSplitter: TSplitter; DrawGrid: TDrawGrid; btnExit: TButton; imgPreview: TImage;

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure DrawGridDrawCell(Sender: TObject;

ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); procedure btnExitClick(Sender: TObject);

procedure pnGridResize(Sender: TObject); procedure DrawGridSelectCell(Sender: TObject;

ACol, ARow: Integer; var CanSelect: Boolean);

private

{Private declarations } public

{Public declarations }

SketchList:TStringList; //список для хранения эскизов

CellWidth:Integer;

//ширина ячейки

CellHeight:Integer;

//высота

ячейки

BorderSize:Integer;

//отступ

от

края ячейки

BorderColor:TColor;

//цвет фона

бордюра

SelectBrdColor:TColor;//цвет фона бордюра (выделенного) SketchBkColor:TColor; //цвет фона зоны эскиза SketchTextColor:TColor; //цвет текста

procedure ScanDir; //сканирование каталога

procedure UpdateCellsParam; //устанавливает размер ячеек

{создает уменьшенную копию изображения (эскиз) находящегося в файле AFileName и созвращает его

в качестве результата, если эскиз не удалось создать, то возвращается nil}

function CreateSketchImage(AFileName:string):TBitmap; end;

var frmDGrid: TfrmDGrid;

implementation

{$R *.dfm}

procedure TfrmDGrid.FormCreate(Sender: TObject); begin

//параметры ячейки

CellWidth:=64;

CellHeight:=80;

BorderSize:=5;

BorderColor:=clYellow;

SketchBkColor:=clGreen;

SketchTextColor:=clBlack;

SelectBrdColor:=clBlue; //устанавливаем размеры ячеек

UpdateCellsParam; //создаем список

SketchList:=TStringList.Create; //сканирование каталога программы

ScanDir;

end;

procedure TfrmDGrid.FormDestroy(Sender: TObject); var i:Integer;

begin

//удаляем эскизы (TBitmap) из списка

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

for i:=0 to SketchList.Count-1 do SketchList.Objects[i].Free;

//удаляем список

SketchList.Free;

end;

procedure TfrmDGrid.ScanDir; var Search:TSearchRec;

Path :string; // каталог для сканирования

Sketch:TBitmap; begin

//вычисляем путь до папки с файлами (каталог программы) Path:=ExtractFilePath(Application.ExeName);

//сканируем каталог

try

if FindFirst(Path+'*.*', 0, Search)=0 then repeat

// если расширение файла jpg или bmp

if (ExtractFileExt(Search.Name)='.jpg')or (ExtractFileExt(Search.Name)='.bmp') then

begin Sketch:=CreateSketchImage(Path+Search.Name); // если удалось создать эскиз

if Sketch<>nil then // добавляем файл в список

SketchList.AddObject(Path+Search.Name, Sketch); end;{if}

until FindNext(Search)<>0; finally

FindClose(Search); // закрываем поиск end;{finally}

end;{ScanDir}

procedure TfrmDGrid.DrawGridDrawCell(Sender: TObject;

ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); var Index:Integer;

CaptionRect,

SkRect:TRect;

ImgTitle:string; begin

// если список не пуст

if SketchList.Count<>0 then begin

//вычисляем индекс изображения в списке

Index:=ARow*DrawGrid.ColCount+ACol;

//если ячейка не пустая

if Index<SketchList.Count then begin //рисуем ячейку

with DrawGrid.Canvas do begin

//рисуем бордюр

Pen.Color:=SketchTextColor;

//если ячейка выделена, то цвет фона SelectBrdColor

if gdSelected in State then Brush.Color:=SelectBrdColor else Brush.Color:=BorderColor; //иначе BorderColor Rectangle(Rect);

//зона эскиза изображения

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

Brush.Color:=SketchBkColor;

Rectangle(Rect.Left+BorderSize,

Rect.Top+BorderSize,

Rect.Right-BorderSize,

Rect.Top + (Rect.Right - Rect.Left)-BorderSize);

//вычисляем область вывода эскиза

SkRect.Left:=Rect.Left+BorderSize; SkRect.Right:=Rect.Right-BorderSize; SkRect.Top:=Rect.Top+BorderSize; SkRect.Bottom:=SkRect.Top + SkRect.Right-SkRect.Left;

{печать эскиза с центрированием по вертикали и горизонтали} Draw(Rect.Left+ (CellWidth-

TBitmap(SketchList.Objects[Index]).Width) div 2, Rect.Top + (CellWidth– TBitmap(SketchList.Objects[Index]).Height) div 2, TBitmap(SketchList.Objects[Index]));

//зона текста //вычисляем размер области для вывода текста

CaptionRect.Left:=Rect.Left; CaptionRect.Top:= Rect.Bottom - 15; CaptionRect.Right:=Rect.Right; CaptionRect.Bottom:=Rect.Bottom; //устанавливаем цвет для вывода текста

Brush.Color:=BorderColor;

Font.Color:=SketchTextColor;

Rectangle(CaptionRect);

//вывод подписи для картинки (по центру) ImgTitle:=ChangeFileExt(

ExtractFileName(SketchList.Strings[Index]), ''); DrawGrid.Canvas.TextRect(CaptionRect,

CaptionRect.Left+(CellWidth-TextWidth(ImgTitle)) div 2, CaptionRect.Top, ImgTitle);

end;{with}

end;{if Index<ImgList.Count} end;{if ImgList.Count<>0}

end;{DrawGridDrawCell}

procedure TfrmDGrid.btnExitClick(Sender: TObject); begin

Close;

end;

procedure TfrmDGrid.pnGridResize(Sender: TObject); begin

//вычисляем число строк и число столбцов таблицы

DrawGrid.ColCount:=DrawGrid.Width div CellWidth; DrawGrid.RowCount:=SketchList.Count div DrawGrid.ColCount + 1; //перерисовать таблицу

DrawGrid.Repaint;

end;

procedure TfrmDGrid.UpdateCellsParam; begin

DrawGrid.DefaultColWidth:=CellWidth;

DrawGrid.DefaultRowHeight:=CellHeight;

end;

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

function TfrmDGrid.CreateSketchImage(AFileName:string): TBitmap; var Picture:TPicture;

bmp:TBitmap; //объект для сохранения картинок SkRect:TRect; //координаты для миниатюры mas:real;

begin try try

//загружаем изображение

Picture:=TPicture.Create;

Picture.LoadFromFile(AFileName);

//подготовка изображения для показа его в таблице bmp:=TBitmap.Create; //создаем объект растр

//вычисление масштаба

if Picture.Width>Picture.Height then mas:=Picture.Width/(CellWidth-2*BorderSize-2)

else mas:=Picture.Height/(CellWidth-2*BorderSize-2);

//устанавливаем размер bmp.Width:=Trunc(Picture.Width/mas); bmp.Height:=Trunc(Picture.Height/mas);

//создаем уменьшенную копию изображения

SkRect.Left:=0;

SkRect.Top:=0;

SkRect.Right:=bmp.Width;

SkRect.Bottom:=bmp.Height; bmp.Canvas.StretchDraw(SkRect, Picture.Graphic); result:=bmp;

except

on EInvalidGraphic do begin

MessageBox(Handle, 'Неверный формат изображения!', 'Ошибка', MB_OK or MB_ICONWARNING);

result:=nil; end;{EInvalidGraphic}

else result:=nil;

end;{except} finally

Picture.Free; end;{finally}

end;{CreateSketchImage}

procedure TfrmDGrid.DrawGridSelectCell(Sender: TObject;

ACol, ARow: Integer; var CanSelect: Boolean);

var Index:Integer; begin

//вычисляем индекс изображения в списке

Index:=ARow*DrawGrid.ColCount+ACol;

//если ячейка не пустая, то загружаем изображение в окно просмотра if Index<SketchList.Count then

imgPreview.Picture.LoadFromFile(SketchList.Strings[Index]);

end;

end.