Некоммерческое акционерное общество
АЛМАТИНСКИЙ УНИВЕРСИТЕТ ЭНЕРГЕТИКИ И СВЯЗИ
Кафедра компьютерных технологий
ВИЗУАЛЬНОЕ ПРОГРАММИРОВАНИЕ
Методические указания к выполнению лабораторных работ для студентов
всех форм обучения специальностей 5В070300 – Информационные системы и 5В070400 – Вычислительная техника и программное обеспечение (часть 3)
Алматы 2011
СОСТАВИТЕЛИ: Конуспаева А.Т., Байжанова Д.О., Рахимжанова З.М. Визуальное программирование. Методические указания к выполнению лабораторных работ для студентов всех форм обучения специальностей 5В070300 – Информационные системы и 5В070400 – Вычислительная техника и программное обеспечение (часть 3). - Алматы: АУЭС, 2011. - 33 с.
Методические указания составлены в соответствии с требованиями квалификационной характеристики специалиста, Государственных стандартов, типовой программы курса. Они составлены с учетом активизации процесса изучения основ курса, закреплению лекционного курса и являются подготовкой к проведению лабораторных работ.
Методические указания предназначены для студентов всех форм обучения специальностей 5В070300 – Информационные системы и 5В070400 – Вычислительная техника и программное обеспечение.
Библиография – 19 названий.
Рецензент: канд. физ.-мат. наук, доцент Б. М. Шайхин.
Печатается по плану издания некоммерческого акционерного общества «Алматинский университет энергетики и связи» на 2011 г.
© НАО «Алматинский университет энергетики и связи», 2011 г.
9 Лабораторная работа. Работа с массивами чисел. Графические построения
Цель работы: знакомство с компонентами StringGrid, PaintBox, использование их в визуальных приложениях, установка логических связей между ними, практика написания программного кода.
Методические указания к выполнению лабораторной работы
Компонент StringGrid предназначен для создания таблиц, в ячейках которых располагаются произвольные текстовые строки. Класс TStringGrid является прямым потомком класса TDrawGrid, от которого им унаследовано большинство свойств и методов. У данного класса появляется лишь несколько новых свойств.
Cells [ACol, ARow: Integer] определяет содержимое ячейки с координатами (ACol, ARow);
Cols [Index: Integer] содержит все строки колонки с номером Index;
Objects [ACol, ARow: Integer] обеспечивает доступ к объекту, связанному с ячейкой (ACol, ARow);
Rows [Index: Integer] содержит все строки столбца с номером Index.
Компонент PaintBox используется для графических построений, вычерчивания графических линий и фигур. Основным объектом компонента является Canvas (холст), на котором строятся все графические примитивы.
Задание
Разработать приложение для построения графа по заданной матрице.
Решение
Создайте новое приложение и сохраните его в новой папке. Разместите на форме Компоненты StringGrid из закладки «Дополнительно», компонент PaintBox из закладки «Система», компоненты Button, Label, Edit из закладки «Стандартные» как показано на рисунке:
Измените свойства Caption формы на «Построение графа», Label1 на «Введите число вершин графа», Button1 на «Построить граф», очистите свойство Text компонента Edit1. Установите свойтва компонента StringGrid1:
1) RowCount (количество строк)– 100;
2) ColCount (количество столбцов)– 100;
3) FixedCols (номер самой верхней строки)– 0;
4) FixedRows (номер самого левого столбца)– 0;
5) DefaultColWidth (ширина столбцов)– 24;
6) DefaultRowHeight (высота строк) – 24.
Для написания кода программы, следует объявить глобальные переменные:
В обработчике события OnClick кнопки «Построить граф» наберите следующий программный код:
procedure TForm1.Button1Click(Sender: TObject);
var b,c:integer;
a: array [0..100,0..100] of integer;
x,y: array [0..100] of integer;
begin
randomize;
n:=StrToInt(Edit1.Text);
for i:=0 to n-1 do
for j:=i to n-1 do
begin
a[i,j]:=random(2);
a[j,i]:=a[i,j];
a[i,i]:=0;
StringGrid1.Cells[i,j]:=IntToStr(a[j,i]);
StringGrid1.Cells[j,i]:=IntToStr(a[i,j]);
StringGrid1.Cells[i,i]:='0';
end;
b:=PaintBox1.ClientWidth;
c:=trunc(b/2)-5;
PaintBox1.Canvas.Brush.Color:=clRed;
PaintBox1.Canvas.Pen.Color:=clRed;
Paintbox1.Canvas.Ellipse(c-5,1,c+5,11);
x[0]:=c; y[0]:=6;
for i:=1 to n-1 do
begin
x[i]:= trunc(c+c*sin(6.28*i/n));
y[i]:=trunc(c-c*cos(6.28*i/n));
Paintbox1.Canvas.Ellipse(x[i]-5,y[i]-5,x[i]+5,y[i]+5);
end;
for i:=0 to n-1 do begin
for j:=0 to n-1 do begin
if a[i,j]=1 then begin
PaintBox1.Canvas.MoveTo(x[i],y[i]);
PaintBox1.Canvas.LineTo(x[j],y[j]);
end; end; end;
PaintBox1.Canvas.Brush.Color:=clBtnFace;
for i:=0 to n-1 do
PaintBox1.Canvas.TextOut(x[i]+5,y[i]-5,'A'+IntToStr(i+1));
end;
Для получения фокуса ввода компонентом Edit1 при запуске приложения в обработчике события OnActivate формы
наберите код:
Edit1.SetFocus;
Далее следует набрать программный код обработчика события OnClick кнопки «Очистить»:
Edit1.Text:='';
PaintBox1.Canvas.Brush.Color:=clBtnFace;
PaintBox1.Canvas.Pen.Color:=clBtnFace;
PaintBox1.Canvas.Rectangle(0,0, PaintBox1.Width,PaintBox1.Height);
for i:=0 to 100 do
for j:=0 to 100 do
StringGrid1.Cells[j,i]:='';
Сохраните и запустите приложение на выполнение.
Закройте проект и среду программирования.
10 Лабораторная работа. Разработка приложения с компонентами
Цель работы: научиться применять класс TString в разработках приложений. Знакомство с основными свойствами и методами данного класса.
Методические указания к выполнению лабораторной работы
Ход выполнения
1 Открытие среды программирования Delphi: Пуск-> Все программы->Borland Delphi 7.
2 Поместить компонент TabSet1 (список закладок) со страницы Win3.1 под компонентом Notebook1 . Сделать эти компоненты одинаковыми по ширине.
Приложение «Блокнот»
3 В правую часть формы из закладки «Стандартные» расположить на форме компонент Panel1 . На нем расположить из закладки «Стандартные» компонент для комментариев – Label1 , однострочный редактор - компонент Edit1 , 3 компонента Button - Button1, Button2, Button3.
4 Установить в свойствах Инспектора объектов свойства компонентов следующим образом:
Компонент |
Свойство |
Значение |
Panel1 |
Caption |
‘’ |
Label1 |
Caption |
Введите сообщение |
Editl |
Name |
RecordEdit |
Editl |
Text |
‘’ |
Button1 |
Name |
AddBtn |
Button1 |
Caption |
Добавить |
Button2 |
Name |
ChangeBtn |
Button2 |
Caption |
Изменить |
Button3 |
Name |
DeleteBtn |
Button3 |
Caption |
Удалить |
5 Справа, в нижней части формы, под контейнером Panel1, расположить из закладки «Стандартные» 2 компонента Button - Button4, Button5.
6 Изменить свойства компонентов следующим образом:
Компонент |
Свойство |
Значение |
Button4 |
Name |
ClearBtn |
Button4 |
Caption |
Очистить |
Button5 |
Name |
CloseBtn |
Button5 |
Caption |
Закрыть |
7 Создать страницы компонента NoteBook1. Для этого в инспекторе объектов найти свойство Pages (страницы); щелкнуть на кнопке с тремя точками для открытия диалогового окна редактирования значений выбранного свойства. Используя диалоговое окно, создать 12 страниц, каждая из которых называется именем, соответствующим месяцу года. Для редактирования названия первой страницы воспользоваться кнопкой Edit, для добавления очередной страницы - кнопкой Add. Значение Help context можно оставить без изменения (это свойство используется при вызове контекстно-зависимой справочной системы приложения), так как приложение не содержит справочной системы. Для завершения создания списка страниц нажмите на кнопку Close.
8 Положить на каждую страницу компонента Notebook1 компонент ListBox (окно списка) для размещения записей на каждый месяц. Для этого необходимо выполнить следующую последовательность действий.
8.1 Установить свойство ActivePage (активная страница) компонента NoteBook1 в значение, равное 'Январь'. Щелкнуть на выбранной странице объекта NoteBook1. В палитре компонентов на странице «Стандартные» (Standard) выбрать компонент ListBox1 и поместить (щелкнуть) в компонент NoteBook1. Свойство Align компонета ListBoxl установить в AlClient. Скопировать компонент ListBox1 в буфер обмена (щелкнуть на объекте ListBoxl и выполнить команду Edit/Copy).
8.2 На вторую страницу блокнота поместить компонент Listbox2. Установить свойство ActivePage (активная страница) компонента NoteBookl в значение, равное 'Февраль’. Щелкнуть на компоненте Notebookl (для активизации этой страницы блокнота). Поместите копию компонента ListBoxl на страницу блокнота, выполнив команду Edit/Paste.
8.3 Повторить эту операцию для оставшихся 10 страниц блокнота. Таким образом, для каждого месяца года существует свой компонент ListBox: для января — ListBoxl, для февраля — ListBox2 и т. д.
9 Необходимо создать закладки в TabSet1 и синхронизировать их со страницами блокнота. Для этого используется свойство Tabs компонента TabSet1, предоставляющее список имен закладок. Список закладок соответствует списку страниц блокнота (Pages). Создать следующий обработчик события:
Procedure TNoteBook1.FormCreate(Sender: TObject);
begin TabSet1.Tabs:=NoteBook1.Pages;
{Cкопировать содержимое свойства Pages компонента NoteBook1 в свойство Tabs компонента TabSet1, т. е. создать закладки в TabSet1}
TabSet1.TabIndex:=NoteBookl.PageIndex;
{В соответствии с тем, какая страница блокнота активна во время проектирования (свойство ActivePage), активной будет закладка с тем же именем (номером)}
end;
10 Используя свойства UnSelectedColor, SelectedColor, BackgroundColor, DitherBackground, StartMargin, EndMargin компонента TabSet1, изменить внешний вид закладок.
11 Создать обработчик события OnClick для кнопки 'Добавить'. После щелчка на кнопке содержимое окна редактирования (RecordEdit) будет добавляться в список на странице блокнота. Для операций со строками у компонента ListBox имеется свойство Items, принадлежащее классу TStrings. Чтобы добавить строку в список, используется метод Add этого класса. Обработчик события будет выглядеть следующим образом:
1-й способ
procedure TNoteBook1.AddBtnClick(Sender: TObject);
begin
if RecordEdit.Text <>' ' then begin
case NoteBook1.PageIndex of
{Для того чтобы поместить запись в список на страницу блокнота, выбрать компонент ListBox по номеру страницы блокнота}
0: ListBox1.Items.Add(RecordEdit.Text);
1: ListBox2.Items.Add(RecordEdit.Text);
2 : ListBox3.Items.Add(RecordEdit.Text);
3: ListBox4.Items.Add(RecordEdit.Text);
4; ListBox5.Items.Add(RecordEdit.Text);
5: ListBox6.Items.Add(RecordEdit.Text);
6: ListBox7.Items.Add(RecordEdit.Text) ;
7: ListBox8.Items.Add(RecordEdit.Text);
8: ListBox9.Items.Add(RecordEdit.Text);
9: ListBox10.Items.Add(RecordEdit.Text);
10: ListBox11.Items.Add(RecordEdit.Text);
11: ListBox12.Items.Add(RecordEdit.Text);
end;
RecordEdit. Text: =' ' ; {введенный текст затираем}
end;
end;
Процедура получилась довольно громоздкой, ее можно описать по-другому.
2-й способ
В Object Pascal определена функция: function FindComponent(const AName: string): TComponent; которая возвращает ссылку на компонент, имя которого задано параметром функции AName.
Воспользуемся этой функцией в коде обработчика события OnClick кнопки 'Добавить':
procedure TNoteBook1.AddBtnClick(Sender: TObject);
var TempComponent: TListBox; {введем вспомогательную переменную}
begin
TempComponent :=TListBox<FindComponent(ListBox1+ IntToStr (Notebook1. PageIndex+l) );
{TListBox(<KOMПОHЕHT>) используется для преобразования к типу TListBox}
if RecordEdit.Text :=' ' then TempComponent. Items.Add (RecordEdit.Text); RecordEdit.Text: = ' ' ; end;
Строки записываются на одну страницу блокнота потому, что закладки Tabset1 не синхронизированы со страницами NoteBook1, т. е. при выборе закладки соответствующая страница блокнота не активизируется.
Чтобы устранить этот недостаток необходимо создать обработчик события OnClick закладок:
procedure TNoteBookl.TabSet1Click(Sender: TObject);
begin
NoteBook1.PageIndex:=TabSet1.TabIndex; {страница блокнота и страница набора закладок должны совпадать}
end;
12 Сохранить проект. Проверить правильность работы приложения.
11 Лабораторная работа. Разработка приложения с несколькими формами
Цель работы: приобретение навыков работы с компонентами Timer, ProgressBar, Image, RichEdit, SpeedButton, BitBtn, использования их в визуальных приложениях, работы с файлами, практика написания программного кода.
Методические указания к выполнению лабораторной работы
Компонент Timer относится к невизуальным компонентам. Невизуальные компоненты представляют собой, как правило, компоненты, с помощью которых осуществляется доступ к системным ресурсам. Они отображаются только во время конструирования интерфейса, но не видны во время работы приложения. Компонент Timer обеспечивает генерацию последовательности событий OnTimer. Основные свойства компонента:
Interval – период генерации события OnTimer, задается в миллисекундах.
Enabled – разрешение работы. Разрешает (значение True) или запрещает (значение False) генерацию события OnTimer.
Задание
Разработайте приложение с несколькими формами – макет электронного учебника.
Ход выполнения работы
Создайте новое приложение и сохраните в новой папке.
На форме разместите компоненты Image, Label, ProgressBar, 2 компонента Timer как показано на рисунке:
В свойстве Picture компонента Image1 щелкните кнопкой мыши на , откроется диалоговое окно для загрузки рисунка:
Нажмите на кнопку «Загрузить», в открывшемся окне найдите какой-нибудь рисунок
и нажмите кнопку «Открыть». Установите свойство Stretch компонента Image в True. Измените свойство Caption компонента Label на «Технология программирования».
Установите свойство Interval компонента Timer1 - 5000, Timer2 – 50. Измените свойство формы BorderStyle на bsNone.
Добавьте в приложение еще 3 формы: в меню Файл/Создать/Форма.
В разделе Interface окна кода добавьте модули Unit2, Unit3, Unit4:
В обработчике события OnClick компонента Timer1 наберите код:
form1.Hide; {скрытие 1-формы}
form2.show; {показ 2-формы}
timer1.Free; {удаление Timer1}
timer2.Free; {удаление Timer2}
На 2-форме расположите компонент Label и 3 компонента SpeedButton, как показано на рисунке:
Измените свойство Caption метки Label1 и кнопок согласно следующему рисунку, установите свойство Flat в true кнопок SpeedButton:
Измените свойство 2-формы BorderStyle на bsNone. Подключите модули 3-й и 4-й форм в разделе Interface 2-формы:
Заранее подготовьте файлы в формате RTF: «1.rtf», «2.rtf» с лекциями и лабораторными работами
В обработчиках событий кнопок наберите программные коды:
1) на кнопку «Лекции»:
Form2.Hide;
Form3.Show;
Form3.RichEdit1.Lines.LoadFromFile(‘с:\1.rtf’);
2) на кнопку «Лабораторные работы»:
Form2.Hide;
Form4.Show;
Form4.RichEdit1.Lines.LoadFromFile(‘c:\2.rtf’);
3) на кнопку «Выход»:
Application.Terminate;
Очистите свойство Lines компонента RichEdit1 и измените название кнопки.
На кнопку «Содержание» наберите код:
Form3.Hide;
Form2.Show;
Подключите модуль 2-формы для возврата к ней:
Аналогично оформите 4-формы.
Сохраните и запустите проект. Проверьте правильность работы приложения.
При запуске 1-форма выглядит следующим образом:
2-форма:
3-форма:
4-форма:
Закройте приложение и среду программирования.
Задание на самостоятельную работу
Разработать электронный учебник с тестовой системой.
12 Лабораторная работа. Разработка баз данных
Цель работы: знакомство с компонентами создания баз данных и работы с базами данных.
Методические указания к выполнению лабораторной работы
Ход выполнения
1 Открытие среды программирования Delphi: Пуск-> Все программы->Borland Delphi 7.
2 Компоненты, используемые для связи с базами данных. Компоненты для работы с БД расположены в библиотеке компонентов на страницах Data Access и Data Controls. Существует три типа компонентов, каждый из которых выполняет специфическую роль. Компоненты Table и Query служат в качестве интерфейса между физической таблицей на диске и остальной частью приложения. Эти компоненты обладают методами, которые открывают, закрывают, считывают, дополняют и выполняют другие манипуляции с дисковыми файлами. Компонент DataSource является интерфейсной прокладкой между компонентами, непосредственно связывающимися с БД и воспринимающимися данными компонентами, такими, как, DBGrid, DBImage и другими. Большинство из воспринимающихся данными компонентами являются просто расширениями стандартных компонентов, которые знают, как получить информацию от DataSource.
2.1 Компонент Table
Основой архитектуры доступа к наборам данных является базовый класс TDataSet, который содержит абстрактное представление записей и полей набора данных, инкапсулирующее управление, навигацию и манипулирование наборам данных. Некоторые методы класса TDataSet могут быть переопределены с целью создания компонента, подключаемого к определенному физическому формату данных. Исходя из этого, класс TBDEDataSet определен как производный от класса TDataSet и является основным классом источников данных; он вводит такие концепции, как BDE-базы данных и сеансы.
TDataSet
TDBDataSet
TTable TQuerty
Класс TTable представляет структуру и данные, содержащиеся в таблице базы данных, знает, как обрабатывать индексы и применять специальные приемы, связанные с поддержкой отношений двух таблиц типа один ко многим. Класс TQuery — набор данных, содержащий информацию, возвращенную в результате выполнения SQL-запроса.
Основные свойства класса TTable, унаследованные от TDataSet:
AutoCalcFields - определяет, когда вызвано событие OnCalcField;
Active - определяет, открыт или нет набор данных;
FieldDefs - список имен полей из набора данных.
Свойство DatabaseName, унаследованное классом ТТаblе от TDBDataSet, определяет псевдоним базы данных, содержащей таблицу, либо имя каталога, в котором находятся файлы таблиц.
Основные свойства компонента ТТаblе, унаследованные от TBDEDataSet: Filter - выражение для отбора данных;
Filtered - значение True выполняет фильтрацию данных в соответствии с выражением, определенным свойством Filtered;
FilterOptions - определяет, является ли фильтрование нечувствительным и разрешаются или нет частичные сравнения.
Основные свойства компонента ТТаble:
MasterSource - определяет источник данных для связи с другой таблицей;
DataSource - выбирает источник данных;
DefaultIndex - определяет, нужно ли сортировать данные в таблице;
Exclusive - определяет доступ к используемой таблице при одновременном обращении к ней нескольких приложений;
IndexDefs - содержит информацию об индексах таблицы;
IndexFieldNames - составляет список индексов для таблицы;
IndexFields - поля текущего индекса;
TableName - таблицы, доступные в данной базе данных;
ТаbleТуре - тип таблицы.
Методы ТТаblе:
CreateTable - создание таблицы;
Append - добавление новой записи в конец таблицы;
Delete - удаление записи, на которой стоит курсор;
DeleteTable - удаление таблицы;
Edit - перевод таблицы в режим редактирования записей;
FieldByName - обращение к значению поля записи по имени;
FindFirst - установка курсора на первую запись таблицы, соответствующей условию отбора;
First - установка курсора на первую запись таблицы;
Insert - перевод таблицы в режим вставки новой записи;
Next - перемещение курсора на следующую запись;
Post - перевод таблицы в режим завершения редактирования.
2.2 Компонент DataSource и компоненты отображения данных
Класс TDataSource обеспечивает канал связи, по которому компоненты доступа к данным могут подключаться к компонентам отображения данных.
Свойство State отображает текущее состояние связанного с ним набора данных, т. е. режима, в котором находится таблица (вставки, редактирования, и др.).
Свойство DataSet используется для указания компонента, содержащего набор данных.
3 Создайте приложение для просмотра таблицы biolife.db
3.1 1-й способ. Для отображения данных воспользуемся компонентом DBGrid. Создайте новое приложение и сохраните его в папке BioLife_l. Файл модуля - под именем Main.pas, файл проекта — BioLife_l.dpr.
3.1.2 Из палитры компонентов страницы Data Access перенесите на форму компонентов Table и DataSource. Для отображения данных используем компонент TDBGrid со страницы Data Control.
3.1.3 Подготовка компонентов к отображению данных.
3.1.3.1 Установите свойство DataSource компонента DBGrid1 в значение DataSource1 (в выпадающем списке этого свойства перечислены все имеющиеся на форме источники данных).
3.1.3.2 Для связи компонентов DataSource1 и Table1 определите значение свойства DataSet компонента DataSource1 равным Table1.
3.1.3.3 Присвойте свойствам компонента Table1 следующие значения:
DataBaseName – DBDemos
TableName - biolife.db
Active - True
Примечание. Установка свойств компонента Table производится только в указанном порядке: DataBase, TableName, Active. Перед изменением имени набора данных (имени таблицы) свойству Active присвойте значение False. В результате будет получено приложение.
3.1.3.4 Запустите проект. Убедитесь, что полосы прокрутки позволяют просматривать все поля и записи таблицы.
4 2-й способ. Для отображения данных воспользуемся компонентами со страницы DataControl таким образом, чтобы данные отображались не в таблице, а в отдельных полях на форме.
4.1 Создайте новое приложение, сохраните файлы проекта в папке BioLife_2 файл модуля под именем Main.pas, файл проекта — BioLife_2.dpr.
4.2 Положите на форму четыре компонента DBEdit, четыре компонента Label и по одному компоненту DBImage, DBMemo, DataSource, Table. Выделите компоненты воспроизведения данных и установите значение свойства DataSource в DataSource1.
4.3 Установите значения свойств компонентов следующим образом:
Компонент |
Свойство |
Значение |
DataSource1 |
DataSet |
Table1 |
Table1 |
DataBaseName |
DBDEMOS |
Table1 |
TableName |
Biolife.db |
Table1 |
Active |
True |
DBEdit1 |
DataField |
Category |
DBEdit2 |
DataField |
Common_Name |
DBEdit3 |
DataField |
Length (cm) |
DBEdit4 |
DataField |
Length_In |
DBMemo1 |
DataField |
Notes |
DBImage1 |
Stretch |
True |
DBImage1 |
DataField |
Graphic |
4.4 Свойству Caption компонентов Label присвойте значение, равное свойству DataField соответствующего компонента DBEdit.
4.5 Для навигации по таблице используется компонент DBNavigator со страницы DataControl.
4.5.1 Положите на форму компонент DBNavigator.
Компонент объединяет в себе ряд кнопок:
NbFirst - перемещение к первой записи;
NbPrior - перемещение к предыдущей записи;
NbNext - перемещение к следующей записи;
NbLast - перемещение к последней записи;
NbInsert - вставка новой записи в место, указанное курсором;
NbDelete - удаление текущей записи;
NbEclit - редактирование текущей записи;
NbPost - внесение изменений после редактирования в БД;
NbCancel - отмена результатов редактирования или добавления новой записи;
NbRefresh - очистка буфера, связанного с набором данных.
Примечание. Для перемещения по записям таблицы можно воспользоваться методами компонента Table - First (на первую запись), Next (на следующую запись), Last (на последнюю запись), Pred (на предыдущую запись). Для определения начала и конца набора данных используются свойства EOF и BOF.
Для связи навигатора с набором данных установите свойство DataSource компонента DBNavigator в DataSource1.
Для просмотра таблицы biolife необходимы кнопки NbFirst, NbPrior, NbNext, NbLast. Удалите лишние кнопки навигатора, изменив значение свойства VisibleButtons (установите значение False для всех кнопок, кроме необходимых для работы приложения).
4.6 Запустите приложение. Убедитесь, что кнопки навигатора позволяют перемещаться по записям таблицы.
5 Чтобы грамотно оформить приложение, работающее с БД, необходимо добавить соединение с набором данных в момент начала работы и разорвать его в момент окончания.
5.1 Установите значение свойства Active компонента Table в False.
5.2 Создайте обработчик события OnCreate формы:
procedure TForm1.FormCreate (Sender: TObject);
begin
Table1.Active := true;
end;
5.3 В обработчике события OnDestroy формы напишите:
procedure TForm1.FormDestroy (Sender: TObject);
begin
Table1.Active := false;
end;
5.4 Запустите приложение. Убедитесь, что ничего не изменилось в функционировании приложения.
6 3-й способ. Использование редактора полей. Отображение данных на форме в отдельных полях можно сделать автоматически.
6.1 Создайте новое приложение, сохраните файлы приложения в каталоге BioLife_3, файл проекта под именем Main.pas, файл проекта — BioLife_3.dpr.
Положите на форму компоненты DataSource и Table.
6.2 Измените значения свойств так же, как и при выполнении первого и второго способов.
6.3 Выполните двойной щелчок левой кнопкой мыши на компоненте Table1, появится редактор полей. Щелкните правой кнопкой мыши и выберите из всплывающего меню Add all Fields.
6.4 В Инспекторе объектов измените свойство DisplayLabel каждого поля на значение, соответствующее заголовку, например, Notes — описание. Из всплывающего меню выберите Select all. Перетащите поля на форму, в результате чего автоматически создаются компоненты, отображающие данные.
6.5 Положите на форму DBNavigator для перемещения по записям таблицы.
6.6 Создайте приложение «Employees» для просмотра таблицы Employee базы данных DBDEMOS. Используя фильтрацию данных,
a) отобразите только тех работников, у которых зарплата больше 40000;
b) отобразите записи, поле EmpNo которых является двузначным числом;
c) выведите всех сотрудников, чьи фамилии начинаются на букву «L».
6.6.1 Создайте новый проект. Сохраните файлы проекта в папке Employee.
6.6.2 Разработайте интерфейс приложения одним из трех описанных выше способов.
6.6.3 Запустите приложения, обратите внимание на количество отображаемых записей.
6.6.4 Фильтрация определяется свойствами
Filter,
Filtered,
FilterOptions компонента
Table.
В свойство Filter введите условие:
Salary > '40000',
так как нужно выбрать тех работников, у которых зарплата больше 40000.
6.6.5 Свойство Filtered установите в True.
6.6.6 Запустите приложение.
6.6.7 При записи условий можно использовать операции отношения
(>, <, =, >=, <=,<>) и логические операции (and, or, not).
Например, фильтр
(FirstName = 'M*') and {Salary > '40000')
будет выводить людей, у которых имя начинается на букву «М» и зарплата больше 40000.
6.6.8 Процедура ApplyRange позволяет установить фильтр, который ограничивает диапазон записей для просмотра, используя индексированное поле. В таблице Employee.db первое поле EmpNo является ключевым. Воспользуемся им для фильтрации данных. Положите на форму кнопку «Фильтр», создайте обработчик события OnClick кнопки, в теле которого опишите такую последовательность действий. Вызовите процедуру
SetRangeStart и установите начала диапазона, используя свойство Fields:
Table1.SeyRangeStart;
Table1.Fields[0].AsInteger:=10; {самое маленькое двузначное число)
6.6.9 По умолчанию свойство Fields содержит значения строкового типа. Свойство AsInteger позволяет преобразовать значение поля записи к целочисленному значению. Похожие свойства преобразуют значения полей к логическому (AsBoalean), вещественному (AsFloat) и формату даты (AsDate).
Вызовите процедуру SetRangeEnd и установите начала диапазона, используя свойство Fields:
Table1.SeyRanqeEnd;
Table1.Fields[0].AsInteger:=99; {самое большое двузначное число}
6.6.10 Вызовите команду ApplyRange для выполнения фильтра:
Table1.ApplyRange;
6.6.11 Положите на форму кнопку «Отменить фильтр». Чтобы отменить результаты вызова ApplyRange, используйте метод CancelRange:
Tabe1l.CancelRange;
6.6.12 Запустите приложение. Проверьте, отфильтрованы ли записи в соответствии с поставленным условием.
6.6.13 Фильтрация при помощи события OnFilterRecord. Событие OnFilterRecord позволяет устанавливать фильтры на неключевых полях. Создадим обработчик события OnFilteredRecord компонента Table1:
procedure TForm1.Table1FilterRecord (DataSet: TDataSet; var Accept: Boolean); begin
accept: = (table1 ['LastName']>=’L*’ ) and (table1 ['LastName']<’M*') ;
end;
Примечание. Для обращения к полю записи также можно воспользоваться способом, описанным выше:
accept := (table1.Fields [1] .AsStrings >= 'L*') and (table1.Fields[1].AsString < 'M*');
6.6.14 Положите на форму компонент CheckBox. Измените свойство Caption на “Фильтр”. Установка флажка будет приводить к фильтрованию записей, отмена флажка — к сбросу фильтра. Создайте обработчик OnClick компонента CheckBox:
procedure TForm1.CheckBox1Click (Sender: TObject);
begin
Table1.Filtered:=CheckBox1.Checked;
end;
6.6.15 Запустите приложение. Сколько записей таблицы Employee отображается?
7 Создание баз данных с помощью Database Desktop. Для работы со структурой таблиц баз данных в Delphi используется программа Database Desktop, которая поставляется вместе с Delphi. DataBase Desktop - это программа-утилита, являющаяся своеобразным текстовым редактором для таблиц баз данных. Она позволяет создавать, редактировать и изменять структуру таблиц баз данных.
7.1 Выполните команду Пуск\ Программы\ Borland Delphi 7\ Database Desktop. Создайте таблицу базы данных СУБД Paradox7.
Реляционная база данных состоит из нескольких таблиц, каждая из которых имеет свою структуру. Структура таблицы базы данных задается следующими свойствами:
- список полей, их тип и размер;
- наличие ключевых полей;
- наличие проверочных шаблонов для ввода данных;
- выбор национальной азбуки;
- наличие вторичных индексов;
- существование специальных ссылок к другой таблице.
Все это можно задать в главном окне программы Database Desktop.
Каждое поле таблицы определяется именем (Field Name), содержащим до 25 символов, и типом (Туре).
Тип полей определяется форматом базы данных. Типы полей таблицы Paradox представлены в следующей таблице.
Обозначение |
Тип |
Значение |
Размер |
Описание |
А |
Alpha |
|
1..255 |
Строковый |
N |
Number |
-10307> to 10308 |
|
Вещественный |
$ |
Money |
|
|
Денежный |
S |
Short |
-32768..32767 |
|
Короткое целое |
I |
Long Integer |
-2147483648 .. 2147483647 |
|
Длинное целое |
# |
BCD |
|
0..32 |
Поле двоично-десятичного кода |
D |
Data |
|
|
Даты |
T |
Time |
|
|
Время |
@ |
TimeStamp |
|
|
Время и Дата |
M |
Memo |
|
1..240 |
Текст |
F |
Formatted Memo |
|
0..240 |
Форматированные тексты |
G |
Graphic |
|
|
Графический |
О |
OLE |
|
|
Содержат объекты, размещенные в таблице из других приложений Windows, которые поддерживают стандарт OLE |
L |
Logical |
|
|
Логический |
+ |
Autoincrement |
|
|
Содержат целое значение, которое увеличивается на единицу при каждой новой записи в таблицу |
В |
Binary |
|
0..240 |
Содержит данные, которые Paradox не может интерпретировать (например, звуковые) |
Y |
Bytes |
|
1..255 |
Содержит данные, которые Paradox не может не только интерпретировать, но и читать |
Для некоторых типов необходимо задавать размер (Size). Например, для строкового типа Alpha размер — это число символов.
Первичный ключ (Key) — это поле, которое содержит данные, однозначно определяющие каждую запись в таблице. Ключевые поля должны быть отмечены символом '*'. Двойной щелчок мыши (или клавиша пробел) ставит или удаляет этот значок.
В правой части окна задаются свойства таблицы (Table Properties):
Validity Checks (контроль правильности). Это свойство определяет, какие данные можно вводить в текущее поле, а какие — нет. Способ определения зависит от типа условия — Required Field (обязательное поле), Minimum Value (минимальное значение), Maximum Value (максимальное значение), Default Value (значение по умолчанию) и Picture (шаблон).
Table Lookup (связанные таблицы). Наличие ссылочной таблицы позволяет ограничить значения, которые можно вводить в поле главной таблицы, значениями, которые содержатся в первом поле ссылочной таблицы.
Secondary Indexes (вторичные индексы). Вторичный индекс - это справочная таблица, которая определяет логический порядок записей в физической таблице на диске.
Referential Integrity (справочная целостность) обеспечивает связи между данными отдельных таблиц.
Password Security (защита паролем) позволяет задавать для таблицы или полей таблицы пароли.
Table Language (выбор языка данных таблицы).
Dependent Tables (зависимые таблицы) позволяет просмотреть список зависимых таблиц, связанных на уровне ссылок Referential Integrity.
После оформления структуры таблицы необходимо сохранить таблицу, выполнив щелчок на кнопке Save as....
Для открытия таблицы используется команда File/Open.../ Table.
Команда Table/EditData переводит таблицу в режим редактирования записей.
Команда Table/Info Structure позволяет просмотреть структуру таблицы, a Table/Restructure — изменить структуру таблицы.
7.2 Создайте приложение «Автостоянка». Это приложение отображает работу нескольких автостоянок. Автомобили могут приезжать или уезжать с какой-либо автостоянки. Все изменения фиксируются в БД.
7.2.1 Создайте каталог CarPark. Написание приложения начнем с разработки базы данных.
7.2.2 Создайте подкаталог BD каталога CarPark для хранения таблиц базы данных.
7.2.3 Таблица autostation.db предназначена для хранения информации о стоянках:
|
Название поля |
Тип (размер) |
Первичный ключ |
Номер автостоянки |
NAutostation |
Alpha (5) |
* |
Количество мест |
Seats |
Short |
|
Количество занятых мест |
BuzySeats |
Short |
|
7.2.4. В таблицу ncars.db будем записывать информацию об автомобилях, находящихся на стоянках:
|
Название поля |
Тип (размер) |
Первичный ключ |
Номер машины |
NumberCar |
Alpha (10) |
* |
Номер автостоянки |
NAutostation |
Alpha(5) |
|
7.2.5 Разработка визуального интерфейса приложения. Положите на форму по два компонента Table, DataSource, DBGrid.
7.2.6 Установите значения свойств следующим образом:
Компонент |
Свойство |
Значение |
Table1 |
Name |
ParkTbl |
|
DataBaseName |
...\CarPark\DB |
|
TableName |
autostation.db |
|
Active |
True |
Table2 |
Name |
CarsTbl |
|
DataBaseName |
...\CarPark\DB |
|
TableName |
ncars.db |
|
Active |
True |
DataSource1 |
Name |
ParkDsc |
|
DataSet ■-- ■ ^ |
ParkTbl |
DataSource2 |
Name |
CarsDsc |
|
DataSet |
CarsTbl |
DBGrid1 |
Name |
ParkDbg |
|
DataSource |
ParkDsc |
DBGrid2 |
Name |
CarsDbg |
|
DataSource |
CarsDsc |
7.2.7 Сохраните файл модуля под именем Main.pas, файл проекта — CarPark.dpr. Запустите приложение. Убедитесь, что данные таблиц отображены на форме.
7.3 Для определения взаимоотношения типа один-ко-многим между таблицами autostation.db и ncars.db воспользуемся свойством «связанные курсоры».
Запустите DataBase DeskTop и создайте для таблицы ncars.db вторичный индекс по полю NAutostation:
- откройте таблицу ncars.db;
- выполните команду Table/ Restructure...;
- измените свойство таблицы SecondaryIndexes. Для этого щелкните на кнопке Define, в левом столбце выберите поле NAutostation и переместите его в правый столбец;
- щелкните на кнопке ОК;
- в диалоговом окне Save Index As установите имя в ByNAutostation;
- сохраните таблицу и закройте DataBase Desktop.
7.4 Измените значения следующих свойств компонента CarsTbl:
MasterSource – ParkDsc
MasterFields - Autostation
IndexName - ByNAutostation
7.5 Запустите приложение. Как влияет изменение значений свойств компонента CarsTbl на отображение данных?
7.6 Внесите изменения в данные таблицы Cars.db.
Примечание. Для добавления новой записи нажмите кнопку Insert, для удаления записи - Ctrl+Delete, для редактирования - F2.
7.7 Дополним приложение возможностью аудита автостоянки: по прибытии машины в приложение вводится номер машины и номер автостоянки (в TEdit2); если свободные места на выбранной автостоянке есть, запись добавляется в БД, иначе выводится сообщение, что мест нет. После освобождения машиной места на автостоянке соответствующая запись удаляется.
7.7.1 Положите на форму по два компонента Label, Edit и Button. В первый компонент Edit будем заносить номер автостоянки, во второй — номер автомобиля. После щелчка на первой кнопке машина добавляется в БД, на второй — удаляется.
7.7.2 Измените значения свойств Name компонентов следующим образом:
Editl - NAutostationEdt
Edit2 - NCarEdt
Button1 - ArriveBtn
Button2 - LeaveBtn
7.7.3 Установите значения свойств Caption компонентов.
7.7.4 Для определения количества свободных мест создайте вычисляемое поле. Выделите компонент ParkTbl.
Правой кнопкой мыши вызовите контекстное меню и выберите редактор полей (Fields Editor).
Добавьте в редактор полей все поля таблицы: вызовите контекстное меню редактора полей и выполните команду Add fields (добавить поля). В появившемся диалоговом окне щелкните на кнопке ОК.
Для добавления нового поля еще раз вызовите контекстное меню и выполните команду New field (новое поле). В диалоговом окне создания нового поля установите свойства поля:
Name - FreeSeats
Type - integer
Size - 0
Field type - Calculated
7.7.5 Создайте обработчик события OnCalcFields компонента ParkTbl:
procedure TForm1.ParkTblCalcFields (DataSet: TDataSet);
begin
ParkTblFreeSeats.Value := ParkTblSeats.Value -ParkTblBuzySeats.Value;
end;
7.7.6 Создайте обработчик события OnClick компонента ArriveBtn.
Для определения наличия свободных мест на стоянке воспользуемся возможностью поиска записи по ключевому полю (NAutostation). Если номер стоянки введен верно и на ней есть свободные места, то занимаем одно из свободных мест, а в таблицу CarsTbl вносим номер машины. Если свободных мест нет, то выводится сообщение об отсутствии свободных мест.
procedure TForm1.AriveBtnClick (Sender: TObject);
begin
ParkTbl.SetKey;
{переключение таблицы в режим поиска по ключевому полю}
try
ParkTbl.FieldByName('NAutostation') .AsString:= NAutostationEdt.Text;
{установка значения для поиска}
if not ParkTbl.GotoKey then raise EDataBaseError.create(' ')
{ParkTbl.GotoKey — осуществляет поиск; если искомая запись не найдена, возбуждаем исключительную ситуацию}
if ParkTblFreeSeats.Value=0 then begin
{если свободных мест нет, вывод сообщения и удаление из NAutuatationEdl номера выбранной автостоянки}
MessageDlg( 'Извините, мест нет. Выберите другую автостоянку', mtInformation, [mbOk], 0);
NAutostationEdt.Text:='';
end
else begin {если свободные места на стоянке есть}
ParkTbl.Edit; {переключение в режим редактирования записей}
ParkTblBuzySeats.Value:= ParkTblBuzySeats.Value+1;
{увеличение счетчика занятых мест}
ParkTbl.Post;
CarsTbl.Insert;
{переключение таблицы Cars.db в режим вставки новой записи} CarsTbl.FieldByName(‘NumberCar’).AsString := NCarEdt.Text;
CarsTbl.FieldByName ('NAutostation ').AsString : =NAutostationEdt.Text;
CarsTbl.Post;
end
except
on EDataBaseError do
begin
MessageDlg('Номер автостоянки введен неверно’, mtError, [mbOk], 0) ;
NAutostationEdt.Text:=’’;
end;
end;
end;
7.7.7 Запустите приложение. Добавьте автомашину на стоянку, где есть свободные места, и туда, где их нет.
Список литературы
1. Иванова Г.С. Технология программирования. - М.: Изд-во МГТУ им. Н.Э.Баумана, 2002.
2. Аляев Ю.А., Козлов О.А. Алгоритмизация и языки программирования Pascal, C++, Visual Basic: Учебно-справочное пособие. – М.: Финансы и статистика, 2007.
3. Иванова Г.С. Основы программирования. - М.: Изд-во МГТУ им. Н.Э.Баумана, 2009.
4. Терехов А.Н. Технология программирования. – М.: БИНОМ. Лаборатория знаний, Интернет-университет информационных технологий - Intuit.ru, 2006.
5. Вендров А.М. CASE-технологии. Современные методы и средства проектирования информационных систем. - М.: Финансы и статистика, 1998.
6. Вирт Н. Алгоритмы и структуры данных. – М.: Мир, 1989.
7. Тассел Д. Ван. Стиль, разработка, эффективность, отладка и испытание программ. – М.: Мир, 2005.
8. Соммервиль И. Инженерия программного обеспечения. - М.: Изд-во Вильямс, 2002.
9. Кантор М. Управление программными проектами. Практическое руководство по разработке успешного программного обеспечения. - М.: Вильямс, 2002.
10. Бахман П., Френцель М., Ханцшманн К и др. Программные системы. – М.: Мир, 1998.
11. Фаулер М., Скотт К. UML в кратком изложении. Применение стандартного языка объектного моделирования. – М.: Мир, 1999.
12. Буч Г., Рамбо Д., Джекобсон А. Язык UML. Руководство пользователя. – М.: ДМК Пресс, 2001.
13. Кватрани Т. Rational Rose 2000 и UML. Визуальное моделирование. - М.: ДМК Пресс, 2001.
14. Мандел Т. Разработка пользовательского интерфейса. – М.: ДМК Пресс, 2001.
15. Канер С., Фолк Д., Нгуен Е.К. Тестирование программного обеспечения. - Киев: «ДиаСофт», 2008.
16. Гримм С.Дж. Как писать руководства для пользователей. – М.: Радио и связь, 1985.
17. Ашарина И.В. Основы программирования на языках С и С++.- М.: Горячая линия - Телеком, 2009.
18. Попов В.Б. Основы информационных и телекоммуникационных технологий. Программные средства информационных технологий. – М.: Финансы и статистика, 2008.
19. Архангельский А.Я. Язык Pascal и основы программирования в Delphi. – М.: ЗАО Бином, 2004.
Содержание
9 Лабораторная работа. Работа с массивами 3
10 Лабораторная работа. Разработка приложения с компонентами 7
11 Лабораторная работа. Разработка приложения с несколькими формами 11
12 Лабораторная работа. Разработка баз данных 18
Список литературы 31
Сводный план 2011 г. поз. 268