Лабораторная работа №09 icon

Лабораторная работа №09



НазваниеЛабораторная работа №09
Дата конвертации30.06.2012
Размер96.93 Kb.
ТипЛабораторная работа
1. /OOP/Лабораторная работа ь00-Введение.doc
2. /OOP/Лабораторная работа ь01-Calc&Type.doc
3. /OOP/Лабораторная работа ь02-Drag&Except.doc
4. /OOP/Лабораторная работа ь03-Font&Phrase.doc
5. /OOP/Лабораторная работа ь04-Menu.doc
6. /OOP/Лабораторная работа ь05-Canvas.doc
7. /OOP/Лабораторная работа ь06-Animation.doc
8. /OOP/Лабораторная работа ь07-Hint&Format.doc
9. /OOP/Лабораторная работа ь08-Notepad&BMP.doc
10. /OOP/Лабораторная работа ь09-StringGrid.doc
11. /OOP/Лабораторная работа ь10-MediaPlayer.doc
12. /OOP/Лабораторная работа ь11-Shape.doc
13. /OOP/Лабораторная работа ь12-Events.doc
14. /OOP/Лабораторная работа ь13-Finally&Except.doc
15. /OOP/Лабораторная работа ь14-Animal.doc
16. /OOP/Лабораторная работа ь15-MyButton.doc
17. /OOP/Темы курсовых работ по курсу ООП.doc
Введение
Лабораторная работа №01
Лабораторная работа №02
Лабораторная работа №03
Лабораторная работа №04
Лабораторная работа №05
Лабораторная работа №06
Лабораторная работа №07
Лабораторная работа 08
Лабораторная работа №09
Лабораторная работа №10
Свойства в Delphi
Лабораторная работа №12 События в Delphi
Chapter 12
Лабораторная работа №14
Лабораторная работа №15
Кнопка (TButton)

Лабораторная работа №09


Использование компонентов StringGrid

Компонент StringGrid представляет собой модифицированное окно списка, которое включает не только строки, но и другие объекты, например битовые карты.
Компонент StringGrid способен отобра­жать таблицы строк, каждая из которых может быть связана с другим объектом.

Приведенная ниже программа GlyphLst демонстрирует, как использовать StringGrid для создания массива строк и битовых карт. Программа отображает все глифы, имеющиеся в составе Delphi, и соответст­вующие им имена файлов с помощью объекта StringGrid, управляемого программой. Термин управляемый программой означает, что за вывод пунктов StringGrid отвечает не система Windows, а прикладная программа. В зависимости от того, на каком устройстве и в каком каталоге у вас установлена система Delphi, вам, возмож­но, придется изменить путь в константе glyphPath, объявленной после ключевого слова implementation.

Glyphlst\Main. pas

unit Main;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, Grids;

type

TMainForm = class(TForm)

PathLabel: TLabel;

BitBtnl: TBitBtn;

GlyphList: TStringGrid;

procedure FormCreate(Sender: TObject);

procedure FormClose(Sender: TObject;

var Action: TCloseAction) ;

procedure GlyphListDrawCell(Sender: TObject;

Col, Row: Integer; Rect: TRect; State: TGridDrawState);

private

( Закрытый раздел. } public

{ Открытый раздел. } end;

var

MainForm: TMainForm;

implementation

($R *.DFM)

const glyphPath = 'C:\Program Files\Borland\Delphi 4\Images\Buttons';

// Чтение всех битовых карт; сохранение имен файлов и

// изображений в объекте GlyphList TStringGrid.

procedure TMainForm.FormCreate(Sender: TObject);

var

SearchRec: TSearchRec; { Результаты просмотра каталога. }

К: Integer; { Переменная цикла. )

Bitmap: TBitmap; { Хранение битовых карт. Память не освобождается! }

Index: Integer; ( Индекс ячейки TStringGrid. )

begin

Show; { В процессе загрузки битовых карт форма остается видимой. }

Screen.Cursor := crHourGlass; { Изменение формы указателя. }

Index :=0;

try

PathLabel.Caption := glyphPath; ( Над компонентом ListBox отображается путь. )

{ Начало просмотра. )

К := FindFirst(glyphPath + '\*.*', faAnyFile, SearchRec);

try

while К = 0 do { Просмотр имен файлов в каталоге. }

begin

if SearchRec.Name[1] <> '.' then {No '.' or '..' paths}

begin

Bitmap := TBitmap.Create; ( Создание объекта битовой карты. }

try ( Загрузка битовой карты. )

Bitmap.LoadFromFile(glyphPath + '\' + SearchRec.Name);

if Index = GlyphList.RowCount then // Расширение списка.

GlyphList.RowCount := Index + 1;

GlyphList.Cells[0, Index] := SearchRec.Name;// Имя.

GlyphList.Objects[1, Index] := Bitmap; // Битовая карта.

inc(Index) ;

except

Bitmap.Free; { Выполняется в случае ЛЮБОЙ ошибки. }

raise; ( Передача исключения вверх по цепочке вызова. }

end;

end;

К := FindNext(SearchRec); ( Продолжение просмотра каталога. }

end;

finally

FindClose(SearchRec) ;

end;

finally

Screen.Cursor := crDefault; {( Восстановить нормальную форму указателя. }

end;

end;

// Освобождение памяти, занятой глифами. Объект TStringGrid

// НЕ делает этого автоматически.

procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);

var

I: Integer;

begin

for I := 0 to GlyphList.RowCount - 1 do TBitmap(GlyphList.Objects[0, I]).Free;

end;

// Отображение глифов. Объект TStringGrid обладает достаточным

// "интеллектом", чтобы самостоятельно вывести имена файлов.

// Этот код лишь выводит изображения во втором столбце.

procedure TMainForm.GlyphListDrawCell(Sender: TObject; Col, Row: Integer; Rect: TRect; State: TGridDrawState) ;

var

Bitmap: TBitmap;

begin

if col = 1 then ( Изображения должны выводиться в предназначенном для них столбце. )

begin

{ Получение объекта битовой карты. }

Bitmap := TBitmap(GlyphList.Objects[1, Row]);

if Bitmap <> nil then

begin {( Отображение битовой карты. }

GlyphList.Canvas.BrushCopy( Bounds(Rect.Left + 2, Rect.Top + 2, Bitmap.Width, Bitmap.Height), Bitmap, Bounds(0, 0, Bitmap.Width, Bitmap.Height), cIRed) ;

{ Параметр cIRed задает прозрачный цвет глифа. Чтобы убедиться в необходимости этого, укажите вместо него любой другой цвет или установите его равным 0. }

end;

end;

end;

end.

Приложение GlyphLst демонстрирует приемы, которые используются в программах, содержащих объ­екты StringGrid. Главная форма программы содержит три компонента: Labell, BitBtnl, а также объект GlyphList класса TStringGrid.

Чтобы создать список с двумя столбцами, изменяется свойство объекта GlyphList. Программа отобра­жает имена файлов в первом столбце. Во втором столбце выводятся битовые карты, соответствующие каж­дому глифу. В приложении StringGrid установлены следующие значения свойств.

• Colcount = 2. Число столбцов; это значение может быть изменено во время выполнения программы.

• DefaultColWidth = 128. Ширина каждого столбца. Поскольку информация отображается в форме ' сетки, все ячейки имеют одинаковую ширину.

• Fixedcols = 0; FixedRows = 0. Данные установки удаляют заголовки строк и столбцов серого цвета, которые по умолчанию отображаются в компоненте StringGrid. Обычно эти значения уста­навливаются равными 1, в результате чего один столбец и одна строка выделяются для отображения заголовков.

При разработке программ может возникнуть необходимость самостоятельно вывести содержимое каж­дой ячейки в, компоненте StringGrid. Чтобы сделать это, надо создать обработчик события onDrawCell объекта StringGrid. Так создается компонент, управляемый программой. Для каждой ячейки таблицы Delphi вызывает процедуру обработки указанного выше события, с помощью которого можно отобразить любую информацию. Кроме того, взаимодействие объекта StringGrid и обработчика события определя­ется значением свойства DefaultDrawing.

• DefaultDrawing = True. Перед вызовом обработчика события OnDrawCell объект StringGrid отображает фон ячейки и выводит всю текстовую информацию, связанную с ячейкой. После завер­шения процедуры обработки Delphi отображает прямоугольник вокруг выбранной ячейки.

• DefaultDrawing = False. Обработчик события OnDrawCell отвечает за отображение фона и пе­реднего плана каждой ячейки.

В программе GlyphList используется значение DefaultDrawing, равное True. Обработчик события OnDrawCell объекта StringGrid выводит в каждой паре ячеек имя файла и связанное с ним изображе­ние. При каждом вызове процедуры GlyphListDrawCell ей передаются три параметра, которые содержат следующие данные.

• Col. Номер столбца.

• Row. Номер строки.

• Rect. Прямоугольник, ограничивающий ячейку.

Нумерация столбцов и строк начинается с нуля. В приложении GlyphList заголовки столбцов и строк не используются. Если же вы разрешите отображение этих ячеек, не забывайте о том, что за вывод ин­формации в них также отвечаете вы.

Объект StringGrid включает два свойства, содержащие строки и связанные с ними объекты для всех ячеек. Свойство Cells объявлено следующим образом:

property Cells[ACol, ARow: Integer]: string;

Каждой ячейке соответствует объект строки. Свойство Objects может содержать объект любого класса при условии, что он является потомком TObject:

property Objects [ACol, ARow: Integer]: TObject;

Свойства Cells и Objects обеспечивают доступ к данным для каждой ячейки объекта StringGrid. Поскольку текстовая информация выводится автоматически, обработчик события рассматриваемого при­ложения сначала проверяет, равняется ли параметр Col единице. Положительный результат проверки оз­начает, что StringGrid-дает приложению команду на вывод графических данных. Эти данные хранятся в свойстве Objects. Поскольку Bitmap является объектом класса TBitmap, выражение

Bitmap := TBitmap(GlyphList.Objects[1, Row]);

копирует ссылку на объект битовой карты, хранящийся в столбце 1 и указанной строке. После получе­ния этой ссылки программа выводит изображение, вызывая метод BrushCopy объекта Canvas, содержа­щегося в компоненте StringGrid. Еще раз просмотрите листинг и обратите внимание на использование параметра Rect для позиционирования изображения внутри ячейки. Параметр CIRed указывает на то, что фон глифа должен быть прозрачным.

Те, кто программировали в системе Windows, наверное, уже поняли, что объект Canvas в Delphi играет роль контекста устройства.

Подготовка к выводу содержимого каждой ячейки происходит в обработчике события OnCreate глав­ного окна. Поскольку загрузка битовой карты из каждого файла может занять много времени, процедура FormCreate начинается с присвоения Screen. Cursor значения crHourGlass. Затем, чтобы найти пер­вый файл, вызывается функция FindFirst. Объект Bitmap создается с помощью следующего выражения:

Bitmap := TBitmap.Create;

Этот объект затем используется для загрузки битовой карты с диска:

Bitmap.LoadFromfile(glyphpath + '\' + SearchRec.Name;

Свойство Name переменной SearchRec содержит результаты вызова FindFirst. Чтобы обеспечить ме­сто для хранения следующего имени файла и битовой карты, программа выполняет такие операторы:

if Index = GlyphList.RowCount then GlyphList.RowCount := Index + 1;

Путем простого увеличения значения RowCount вы добиваетесь увеличения количества информации, которая может храниться и отображаться объектом StringGrid. Следующие два выражения связывают имя файла и изображение с ячейкой:

GlyphList.Cells[0, Index] :=SearchRec.Name;

GlyphList.Objects[1, Index] := Bitmap;

Свойство Cells содержит строку, соответствующую каждой ячейке (в данном примере это имя файла с изображением из переменной SearchRec). Свойство Objects может использоваться для того, чтобы связать с каждой ячейкой другую информацию (в данном случае — растровое изображение, загруженное с диска).

Необходимо помнить, что свойство Objects лишь связывает битовую карту с ячейкой, а не копирует ее. Поэтому для каждого объекта, связанного с массивом Objects компонента StringGrid, должен быть создан новый объект Bitmap с помощью вызова TBitmap. Create.

Рассмотренный код помещен в блок try-except, поэтому при возникновении любой ошибки, напри­мер при сбое в работе диска или недостатке памяти, текущий объект Bitmap освобождается, а исключение передается объекту, вызвавшему обработчик события. Если программа выполняется корректно, то после обработки каждого глифа происходит вызов функции FindNext. Это типичный способ перебора файлов — сначала вызывается FindFirst, затем в цикле вызывается FindNext до тех пор, пока эта функция не воз­вратит отличное от нуля значение, указывающее на то, что все файлы исчерпаны.

Обратите внимание, что обработчик события использует два выражения finally, каждое из которых связано с блоком try. Функция FindClose завершает процесс поиска файла и освобождает ресурсы сис­темы, занятые объектом SearchRec. Вызов FindClose в блоке finally гарантирует, что эта процедура будет выполнена, даже если исключительная ситуация возникнет внутри блока try.

В блоке finally также восстанавливается исходная форма указателя. Это не так критично, но все же лучше, если при возникновении ошибки указатель вернется в первоначальное состояние.

Объект StringGrid не освобождает память, которая занята данными, связанными с массивом Objects. Он управляет памятью, используемой свойством Cells, но сделать то же самое для элементов массива, например для битовых карт, присвоенных Objects, должны вы сами. Так происходит потому, что StringGrid не знает, какие данные вы связали с элементами Objects. Несмотря на то что в боль­шинстве случаев рассматриваемый компонент используется для работы с изображениями, массиву можно присвоить любой тип объекта. Универсальность достигается за счет того, что на разработчика возлагается ответственность за освобождение памяти, занятой объектами.

Обычно наилучшее место в программе, в котором можно разместить код для очистки объекта String-Grid, — обработчик события OnClose формы. Например, в приложении GlyphList в цикле for освобож­даются все объекты Bitmap, связанные с массивом Objects:

var

I: Integer;

begin

for I := 0 to GlyphList.RowCount - 1 do TBitmap(GlyphList.Objects[0, I]).Free;

end;

Свойство RowCount указывает, сколько пунктов содержит StringGrid. Это значение используется в цикле for, в котором для каждого объекта Bitmap в массиве objects вызывается метод TBitmap. Free.

Чтобы лучше ознакомиться с обработкой списков строк, обратитесь к демонстрационной программе ToDo, расположенной на компакт-диске в каталоге source\Todo. Эта программа выполняет различные действия над объектами TStrings. Например, в листинге 8.11 представлен текст процедуры, используемой для пе­редачи выбранных пунктов от одного объекта ListBox другому. Обратите внимание на параметр TCus-tomListBox. Этот класс - непосредственный предок класса TListBox. В качестве параметра можно было бы указать TListBox, но использование TCustomListBox гарантирует, что процедура будет рабо­тать с объектами любых классов, порожденных из TCustomListBox.

Процедура, используемая в приложении ToDo для передачи выбранных пунктов от одного объекта ListBox другому

procedure TMainForm:MoveSelected(List: TCustomListBox; Items: TStrings);

var

I: Integer;

begin

for I := List.Items.Count P 1 downto 0 do if List.Selected[I] then begin

Items.AddObject(List.Items[I], List.Items.Objects[I] ) ;

List.Items.Delete (I) ;

end;

FileDirty := True;

end;

В программе ToDo для передачи выбранных пунктов от объекта SrcList объекту DstList используется следующий вызов MoveSelected:

MoveSelected(DstList, SrcList.Items) ;

Как видно из листинга, в процедуре MoveSelected параметр List представляет целевой объект List-Box, а параметр Items — объект-источник TStrings. В цикле for происходит просмотр содержимого List от конца к началу (обратите внимание на ключевое слово Pascal downto). Такое направление про­смотра выбрано потому, что удаление пункта N повлияет на индексы пунктов, начиная с N+1.

Если пункт списка выбран, метод AddObject копирует строку объекта List и любой связанный с ней объект в параметр Items типа TStrings. Затем в процедуре удаляется исходный пункт. Метод Delete удаляет строку, определяемую индексом (I), а также устанавливает Objects [I] равным nil. Таким обра­зом, вызов Delete удаляет строку списка и связанный объект. Однако он не освобождает занимаемую объектом память — это вы должны сделать сами, вызвав метод Free.

Задания:

1. Используя компонент TStringgrid составьте программу решающую систему уравнений, (согласно варианту)

- методом Гаусса

- методом Зейделя.




Похожие:

Лабораторная работа №09 iconЛабораторная работа: создание мини-презентации «Памятники Кремля»
Лабораторная работа проводится в компьютерном классе, с подключением к сети Internet
Лабораторная работа №09 iconДокументы
1. /Lab1/Лабораторная работа 1.doc
2. /Lab2/Лабораторная...

Лабораторная работа №09 iconИ я забуду Покажи мне и я запомню, Дай мне действовать самому и я научусь. Китайская мудрость Тема: Лабораторная работа
Тема: «Лабораторная работа «Измерение работы и мощности тока в электрической лампочке»
Лабораторная работа №09 iconДокументы
1. /Nash/lab1/Лабораторная работа ь1.doc
2. /Nash/lab10/Лабораторная...

Лабораторная работа №09 iconЛабораторная работа №2 «Система безопасности Windows xp»
Лабораторная работа №2 «Система безопасности Windows xp» Цель работы: Изучить систему безопасности Windows xp
Лабораторная работа №09 iconЛабораторная работа «Работа в Windows c помощью основного меню. Использование технологии ole»
Запишите размер папки, выраженный в Мб (мегабайтах) в текстовый редактор блокнот
Лабораторная работа №09 iconЛабораторная работа «Работа с текстовыми фрагментами без помощи мыши»
Скопируйте последнее слово получившегося текста и вставьте его в начало текста один раз
Лабораторная работа №09 iconДокументы
1. /Базовые задачи на обработку массива.doc
2. /ЗадачиНаЛиниВетвление.doc
Лабораторная работа №09 iconДокументы
1. /laba/Лабораторная работа ь1.doc
2. /laba/Лабораторная...

Лабораторная работа №09 iconДокументы
1. /механизация/~$б работа ь4.doc
2. /механизация/~$бораторная...

Разместите кнопку на своём сайте:
Документы


База данных защищена авторским правом ©podelise.ru 2000-2014
При копировании материала обязательно указание активной ссылки открытой для индексации.
обратиться к администрации
Документы

Разработка сайта — Веб студия Адаманов