Среда программирования Delphi
Введение в Оbject Pascal. Операторы языка, массивы, процедуры и функции, учебные программы. Программирование алгоритмов с использованием функций и процедур. Создание модуля и подключение его к проекту. Программирование алгоритмов с использованием файлов.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | учебное пособие |
Язык | русский |
Дата добавления | 29.11.2010 |
Размер файла | 149,4 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Таким образом меняем свойства Caption для всех действий, согласно таблице
&Arrange |
Упорядочить значки |
|
&Cascade |
Каскадом |
|
C&lose |
Закрыть |
|
&Minimize All |
Минимизировать все |
|
Tile &Horizontally |
Упорядочить по горизонтали |
|
&Tile Vertically |
Упорядочить по вертикали |
Теперь можно закрыть окно с действиями. Вызываем проектировщик пунктов меню MainMenu1 для формы MainForm.
Удаляем все пункты из меню "Окна". Там из наших первых уроков присутствует только один пункт "Упорядочить". Дальше все довольно просто. Для первого пустого пункта меню изменяем свойство Action в Arrange1. Этот пункт меню сразу изменит свое название на "Упорядочить значки". В проектировщике меню сразу добавляется новый пункт. Изменяем его свойство Action на Cascade1.
И так далее. Добавляем в меню все стандартные действия с окнами.
Теперь сохраняйте проект и запускайте приложение на выполнение. Обратите внимание, что если дочерних окон нет, то эти пункты меню становятся серыми и недоступными для пользователя.
Еще раз отмечу прелесть визуального программирования. На этом примере вы убедились, что можно не писать ни строчки программного кода в редакторе, а добавлять необходимые компоненты, изменять некоторые свойства и в результате получается некоторое работоспособное приложение.
У нас остался незадействованным меню "Правка". Там содержатся три стандартных пункта "Вырезать", "Копировать" и "Вставить". Эти действия являются стандартными и содержатся в списке стандартных действий в ActionList1. Они находятся в категории Edit. Добавьте их в список действий самостоятельно. Не забудьте о русификации свойства Caption. В проектировщике меню измените свойство Action у пунктов правки на соответствующие пункты стандартных действий.
Итак, наша программа уже обладает почти всеми стандартными функциями работы с простым текстом. Напишем еще процедуры сохранения текста на диск.
Если редактируемый файл новый, то вместо сохранения будет предложено файл "сохранить как...", где пользователь должен указать имя файла.
Для начала изменяем свойство Caption для окна ChildForm на 'НОВЫЙ'. Это можно сделать и программно. Для этого для реакции на событие OnCreate для этого дочернего окна создаем процедуру.
procedure TChildForm.FormCreate(Sender: TObject);
begin
Caption:='НОВЫЙ'; // Заголовок окна нового файла содержит название "НОВЫЙ"
end;
Теперь пишем процедуру нажатия на меню "Сохранить как...". Для этого в главную форму MainForm устанавливаем компонент TSaveDialog, находящейся на странице Dialogs палитры компонентов. Поскольку фильтр отображаемых файлов в диалоговых окнах открытия и сохранения файла одинаков, то копируем строчку свойства Filter для компонента OpenDialog1 в аналогичное свойство для компонента SaveDialog1. Дальше с помощью Object Inspector создаем процедуру реакции на нажатие кнопки "Сохранить как...".
procedure TMainForm.N5Click(Sender: TObject);
begin
if MDIChildCount=0 then Exit; // если нет MDI дочерних окон, то выйти из процедуры
SaveDialog1.Title:='Сохранить файл как...'; // заголовок диалогового окна сохранения файла
if SaveDialog1.Execute then // если пользователь выбрал название файла
begin
(ActiveMDIChildas TChildForm).Memo1.Lines.SaveToFile(SaveDialog1.FileName); // сохранение
(ActiveMDIChild as TChildForm).Caption:=SaveDialog1.FileName; // заголовок окна
end;
end;
Строка (ActiveMDIChild as TChildForm) позволяет получить доступ из главного окна к активному дочернему. Эта строка равноценна ChildForm, только выполняется она только для активного окна.
После сохранения файла заголовок дочернего окна содержит полный путь и название редактируемого файла.
Делаем процедуру сохранения файла для пункта "Сохранить". Следует при этом помнить, что если файл новый и название не определено, то вместо этого необходимо вызывать процедуру "Сохранить как..."
procedure TMainForm.N4Click(Sender: TObject);
begin
if MDIChildCount=0 then Exit; // если нет MDI дочерних окон, то выйти из процедуры
if (ActiveMDIChild as TChildForm).Caption='НОВЫЙ' then // если заголовок окна "НОВЫЙ", то выполнять 1, иначе выполнять 2
N5Click(Sender) // 1. Идти в процедуру "Созранить как..."
else (ActiveMDIChild as TChildForm).Memo1.Lines.SaveToFile((ActiveMDIChild as TChildForm).Caption); // 2. Сохранить файл с именем, указанным в заголовке
end;
Если текст в текстовых редакторах меняется, то обычно при выходе программа делает запрос на сохранение измененных данных. Если ответить "Да", то файл сохраняется. Если файл новый и не был ни разу сохранен, то будет предложен диалог сохранения файла под именем, или проще "Сохранить как...". Если ответить "Нет", то файл (окно) закроется без сохранения. Если нажать "Отмена", то ничего с окном не произойдет и пользователь продолжит редактирование.
Для окон есть событие OnCloseQuery, которое следует применять именно в этих случаях. Оно вызывается именно тогда, когда пользователь пытается закрыть окно и в качестве вносимого параметра CanClose определяет, может ли продолжаться закрытие окна или нет.
У каждого компонента в Delphi есть свойство Tag. Оно имеет тип Integer и является свойством, которым пользуются только программисты. Tag в программе ни на что не влияет. По умолчанию принимает нулевое значение.
В нашей программе я предлагаю использовать его для флага состояния редактирования. Если текст изменяется, то он в последствии подлежит запросу на сохранение.
Если свойство Tag для компонента Memo1 установлен в 0, то файл закрывается без запросов, иначе - 1.
Событие OnChange для компонента Memo1:
procedure TChildForm.Memo1Change(Sender: TObject);
begin
Memo1.Tag:=1; // Текст изменен и подлежит запросу на сохранение
end;
Тогда нам нужно убрать запрос на сохранение в случае "ручного" сохранения файла, когда пользователь сам выбрал необходимый пункт меню. Изменяем следующие процедуры сохранения файла.
Процедура "Открыть"
procedure TMainForm.N3Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
ChildForm:=TChildForm.Create(Self);
ChildForm.Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
ChildForm.Caption:=OpenDialog1.FileName;
ChildForm.Memo1.Tag:=0; // добавить
end;
end;
Процедура "Сохранить как..."
procedure TMainForm.N5Click(Sender: TObject);
begin
if MDIChildCount=0 then Exit;
SaveDialog1.Title:='Сохранить файл как...';
if SaveDialog1.Execute then
begin
(ActiveMDIChild as TChildForm).Memo1.Lines.SaveToFile(SaveDialog1.FileName);
(ActiveMDIChild as TChildForm).Caption:=SaveDialog1.FileName;
(ActiveMDIChild as TChildForm).Memo1.Tag:=0; // добавить
end;
end;
Процедура "Сохранить"
procedure TMainForm.N4Click(Sender: TObject);
begin
if MDIChildCount=0 then Exit;
if (ActiveMDIChild as TChildForm).Caption='НОВЫЙ' then
N5Click(Sender) else
begin // добавить
(ActiveMDIChild as TChildForm).Memo1.Lines.SaveToFile((ActiveMDIChild as TChildForm).Caption);
(ActiveMDIChild as TChildForm).Memo1.Tag:=0; // добавить
end; // добавить
end;
Добавленные строки отделены комментарием "//добавить".
А теперь непосредственно создаем процедуру OnCloseQuery для окна ChildForm.
procedure TChildForm.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
Var Res:Integer; // переменная для хранения результата выбора действия
Begin
if Memo1.Tag=0 then // если не сохранять, то 1, иначе - 2
begin // 1:
CanClose:=true; // можно закрыть окно
end else
begin // 2:
Res:=Application.MessageBox('Вы желаете сохранить изменения?','Вопрос',MB_YESNOCANCEL + MB_ICONQUESTION);
// вопрос на сохранение
if Res=IDYES then // нажата кнопка "Да"
begin
ChildForm.BringToFront; // Расположить данное окно выше всех (сделать активным)
MainForm.N4Click(Sender); // Вызвать процедуру "Сохранить"
if Memo1.Tag=1 then CanClose:=false;
// если пользователь все-таки не сохранил файл, то окно не закрывать
end;
if Res=IDNo then CanClose:=true; // если "Нет", то можно закрыть
if Res=IDCANCEL then CanClose:=false; // если "Отмена", то не закрывать
end;
end;
Находясь в редакторе кода в файле ChildUnit необходимо подключить модуль главной формы MainUnit через пункт меню "UseUnit".
Организуем закрытие главного окна при выборе пункта меню "Выход". Для этого по известной нам методике, вызываем главное окно проекта MainForm на редактирование. Для этого нажимаем Shift+F12 и выбираем его в списке. Дальше, чтобы организовать реализацию события выбора пункта меню пользователем OnClick можно двумя способами:
1. Для дважды кликнуть по компоненту главного меню MainMenu1, после чего вызывается на редактирование редактор пунктов этого меню. После чего нужно выбрать пункт "Выход" и в инспекторе объектов (вкладка Events) выбрать процедуру OnClick на этом пункте, тем самым создав новую процедуру обработки события.
2. Просто из уже готового (отображаемого) меню в окне MainForm выбрать пункт "Выход". Delphi автоматически по умолчанию воспринимает как выбор программистом события OnClick для этого меню и создает все ту же пустую процедуру реакции программы на событие.
Какой из этих методов в дальнейшей работе - выбирать вам. Второй экономит время написания программы, первый нагляднее. Такой способ быстрого выбора событий для компонентов, которые установлены по умолчанию, характерны для всех компонентов в delphi. Например, двойной щелчок мышки по форме создает событие OnCreate для этой формы, для кнопки TBotton - событие OnClick, TMemo - событие OnChange. Постепенно в ходе обучения я буду обращать внимание на такие моменты оптимизации вашей работы.
В готовой процедуре реакции на событие выбора пункта меню "Выход" пишем только одно слово:
procedure TMainForm.N8Click(Sender: TObject);
begin
Close; // Закрыть главное окно (закрыть программу)
end;
Можно написать MainForm.Close, что равнозначно вышесказанному. Но поскольку данный модуль (Unit) предназначен для работы с формой (MainForm) и с его компонентами, то все команды в этом модуле воспринимаются как команды для окна, если мы непосредственно не указываем получателя.
Лабораторная работа №3
Программирование алгоритмов с использованием функций и процедур.Создание модулей. Создание библиотек.
1. Пример создания приложения
Задание: создать Windows-приложение которое выводит таблицу значений функции
и ее разложения в ряд в виде суммы
для значений x от xn до xk c шагом h=(xk - xn)/10. Создать модуль, в котором вычисление значений оформить в виде функции, а вычисление - в виде процедуры. Подключить модуль к проекту и выполнить созданное приложение.
2. Размещение компонентов на Форме
Разместим на Форме компоненты Label, Edit, SpinEdit, Button и Memo.
3. Создание модуля и подключение его к проекту
В соответствии с заданием создадим модуль, в котором вычисление значений оформим в виде функции, а вычисление - в виде процедуры. Для создания модуля откроем в главном меню пункт File и щелкнем “мышью” на опции New…(Новый…). Delphi откроет панель New Items(Репозиторий), в которой сделаем активной пиктограмму Unit(Модуль) и нажмем кнопку OK. Откроется окно с “пустым” модулем Unit2. С помощью опции Save As… меню File сохраним модуль в папке c файлами проекта, присвоив ему имя, например, UnFuncProc.
В этом модуле операторы вычисления Y(x) в виде подпрограммы-функциии F и операторы вычисления S(x) в виде подпрограммы-процедуры Sum оформим по правилам создания модулей (текст модуля UnFuncProc приведен в п.8.1.3).
Для подключения модуля UnFuncProc к проекту необходимо сделать активным окно с текстом модуля UnModul, затем в меню File выбрать опцию Use Unit…и в открывшемся окне Use Unit указать имя используемого модуля - UnFuncProc. Убедитесь в том, что в разделе Implementation модуля UnModul появился оператор Uses UnFuncProc; , который Delphi вставила в текст модуля UnModul.
Откройте главный файл проекта и убедитесь в том, что проект не содержит посторонних модулей и файлов.
4. Текст модуля UnFuncProc
unit UnFuncProc;
interface
var
n:integer; // количество слагаемых в сумме S
Function F(x:extended):extended;
Procedure Sum(x:extended;Var s:extended);
Implementation
Function F(x:extended):extended;
begin
result:=(1-x*x*0.5)*cos(x)-0.5*x*sin(x);
end;
Procedure Sum(x:extended;Var s:extended);
var
c:extended;
k:integer;
begin
c:=-x*x*0.5;
S:=1;
for k:=1 to n do
begin
s:=s+c*(2*k*k+1);
c:=-c*x*x/((2*k+1)*(2*k+2));
end;
end;
end.
5. Текст модуля UnModul
Unit UnModul;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Spin, Buttons;
type
TForm1 = class(TForm)
Memo1: TMemo;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Edit1: TEdit;
Edit2: TEdit;
SpinEdit1: TSpinEdit;
BitBtn1: TBitBtn;
procedure FormCreate(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Type
func=function(x:extended):extended; // функциональный тип
proc=procedure(x:extended;Var s:extended); // процедурный тип
var
Form1: TForm1;
implementation
uses UnFuncProc; // Delphi подключает модуль UnFuncProc
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
SpinEdit1.text:='4'; // начальное значение N
Edit1.text:='0.1'; // начальное значение Xn
Edit2.text:='2.0'; // начальное значение Xk
Memo1.Clear;
Memo1.Lines.Add('Лабораторная работа - Создание модулей');
end;
{В процедуре Tablica вычисляется и выводится таблица значений x, S(x) и Y(x)}
procedure Tablica(Sum:proc;F:func;n:integer;xn,xk,h:extended);
var
x,y,s:extended;
begin
Form1.Memo1.Lines.Add(#9+'x'+#9+'S'+#9+'Y');// заголовок таблицы
x:=xn;
repeat // цикл по x
Sum(x,s); // вызов процедуры Sum для вычисления S(x)
y:=F(x); // обращение к функции F для вычисления Y(x)
Form1.Memo1.Lines.Add(#9+FloatToStrF(x,ffFixed,5,2) // вывод x
+#9+FloatToStrF(s,ffFixed,6,3) // вывод S
+#9+FloatToStrF(y,ffFixed,6,3)); // вывод Y
x:=x+h;
until x>xk;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var
xn,xk,h:extended;
begin
n:=StrToInt(SpinEdit1.Text);
xn:=StrToFloat(Edit1.Text);
xk:=StrToFloat(Edit2.Text);
h:=(xk-xn)*0.1; // шаг h
Tablica(Sum,F,n,xn,xk,h); // вызов процедуры Tablica для вычисления таблицы
end;
end.
6. Создание библиотек DLL
Пример: создать библиотеку математических функций, одна из которых вычисление степени числа.
Создание библиотеки:
library matem;
uses
SysUtils,
Classes;
{$R *.res}
function step(a,x:real):real;export;
begin
if a>0 then step:=exp(x*ln(a))
else step:=1.1e+38;
end;
exports
step;
begin
end.
Код проекта:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;
type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Edit2: TEdit;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
function step(a,x:real):real; external 'matem.dll';
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.BitBtn1Click(Sender: TObject);
var a1,x1:real;
begin
if (edit1.text='') or (edit2.text='') then ShowMessage('Введите значение!')
else
begin
a1:=strtofloat(edit1.text);
x1:=strtofloat(edit2.text);
label1.caption:=floattostr(step(a1,x1));
end;
end;
end.
Выполнение индивидуального задания
По указанию преподавателя выберите из таблицы два варианта индивидуальных заданий. Создайте модуль и библиотеку, в котором вычисление значений суммы ряда с требуемой точностью реализуйте в виде подпрограммы-процедуры и подпрограммы-функции. На панели интерфейса установите компонент, с помощью которого реализуйте возможность выбора соответствующего варианта задания и вывод таблицы значений ряда. Созданный модуль подключите к проекту и выполните приложение.
Вариант задания |
Сумма членов ряда |
Значение Х |
Точность вычисления |
|
1 |
0,20 |
0,00001 |
||
2 |
0,10 |
0,00005 |
||
3 |
0,15 |
0,0001 |
||
4 |
0,12 |
0,0001 |
||
5 |
0,70 |
0,0001 |
||
6 |
- |
0,0001 |
||
7 |
1,5 |
0,0005 |
||
8 |
- |
0,00005 |
||
9 |
1,7 |
0,001 |
||
10 |
- |
0,00005 |
||
11 |
0,75 |
0,0005 |
||
12 |
0,62 |
0,0001 |
||
13 |
0,20 |
0,0001 |
||
14 |
0,30 |
0,00001 |
||
15 |
0,25 |
0,0001 |
||
16 |
- |
0,00005 |
||
17 |
0,50 |
0,0001 |
||
18 |
- |
0,001 |
||
19 |
- |
0,00005 |
||
20 |
0,45 |
0,0001 |
||
21 |
- |
0,0005 |
||
22 |
0,90 |
0,00005 |
||
23 |
- |
0,001 |
||
24 |
0,15 |
0,00001 |
||
25 |
- |
0,00005 |
Лабораторная работа №4
Программирование алгоритмов с использованием файлов.
1. Пример создания приложения
Задание: создать Windows-приложение для записи в файл и чтения из файла ведомости об успеваемости учащихся в количестве 10 человек. Каждая запись файла должна содержать фамилию, инициалы, а также оценки по физике, математике и сочинению. Вывести список учащихся, отсортированный в алфавитном порядке и записать эту информацию в текстовой файл.
2. Размещение компонентов на Форме
При работе с файлами чтение и запись информации удобно организовывать с помощью компонентов OpenDialog и SaveDialog.
Компоненты OpenDialog и SaveDialog находятся на странице Dialogs. Все компоненты этой страницы являются невизуальными, т.е. не видны в момент выполнения приложения. Поэтому их можно разместить в любом удобном месте Формы. Оба рассматриваемых компонента имеют идентичные свойства и отличаются только внешним видом.
Для установки компонентов OpenDialog и SaveDialog на Форму необходимо на странице Dialogs Палитры Компонентов щелкнуть “мышью” соответственно по пиктограмме или и разместить ее в любом свободном месте Формы. При выполнении приложения в момент вызова компонента появляется диалоговое окно, с помощью которого пользователь выбирает имя файла и маршрут к нему. В случае успешного завершения диалога имя выбранного файла и маршрут поиска содержится в свойстве FileName.
Пользователь имеет возможность настроить параметры окна диалога по своему усмотрению. В частности, изменить заголовок окна можно с помощью свойства Title. В свойстве DefaultExt можно указать расширение файла, если оно не задано пользователем. Свойство Filter используется для поиска (фильтрации) файлов, отображаемых в окне. Установка фильтра производится следующим образом. Выделив соответствующий компонент, необходимо дважды щелкнуть по правой (белой) части свойства Filter Инспектора Объектов. В появившемся окне редактора фильтра-Filter Editor необходимо в колонке Filter Name набрать текст, характеризующий соответствующий фильтр, а в колонке Filter-маску. Маска *.dat означает что, будут видны файлы данных с любым именем и с расширением dat, а маска *.* - что будут видны все файлы (с любым именем и с любым расширением).
Для того, чтобы файл автоматически записывался с расширением dat в свойстве DefaultExt запишем требуемое расширение - dat.
Аналогичным образом настроим компонент SaveDialog1 для текстового файла (расширение txt).
3. Создание процедур обработки событий
Для удобства работы с несколькими различными процедурами обработки событий в свойстве Name каждого компонента BitBtn замените программные имена кнопок: BitBtn1 - на BitBtnNew, BitBtn2 - на BitBtnOpen, BitBtn3 - на BitBtnSort, BitBtn4 - на BitBtnSave. Двойным нажатием клавиши “мыши” на кнопках BitBtn создайте соответствующие процедуры обработки событий. Пользуясь текстом модуля UnFile, внимательно наберите операторы этих процедур.
Текст модуля UnFile
Unit UnFile;
Interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, Grids, Spin;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
BitBtnNew: TBitBtn;
BitBtnOpen: TBitBtn;
BitBtnSort: TBitBtn;
BitBtnSave: TBitBtn;
SaveDialog1: TSaveDialog;
SpinEdit1: TSpinEdit;
Label1: TLabel;
OpenDialog1: TOpenDialog;
procedure TForm1.FormCreate(Sender: TObject);
procedure BitBtnSortClick(Sender: TObject);
procedure BitBtnNewClick(Sender: TObject);
procedure SpinEdit1Change(Sender: TObject);
procedure BitBtnOpenClick(Sender: TObject);
procedure BitBtnSaveClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Implementation
{$R *.DFM}
type
zap=record // объявление записи
fio :string[20];
mat,fiz,soch:integer;
end;
var
MZap:array[1..25] of zap; // объявление массива записей
FileZap:file of zap; // объявление файла записей
FileText:TextFile; // объявление текстового файла
FileNameZap,FileNameText:string; // имена файла записей и текстового файла
n:integer; // текущее кол-во элементов массива записей
{ Обработчик события создания Формы }
procedure TForm1.FormCreate(Sender: TObject);
begin
with StringGrid1 do
begin // занесение информации в ячейки StringGrid1
Cells[0,0]:='№пп';
Cells[1,0]:='Фамилия,инициалы';
Cells[2,0]:='Математика';
Cells[3,0]:='Физика';
Cells[4,0]:='Сочинение';
end;
BitBtnSort.Hide;// спрятать кнопку ”Sort”
BitBtnSave.Hide;// спрятать кнопку “Save”
end;
{ Обработчик нажатия кнопки Sort }
procedure TForm1.BitBtnSortClick(Sender: TObject);
var
i,j :integer;
vper:zap;
begin
for i:=1 to n do
with StringGrid1,MZap[i] do
begin
fio:=Cells[1,i];
mat:=StrToInt(Cells[2,i]);
fiz:=StrToInt(Cells[3,i]);
soch:=StrToInt(Cells[4,i]);
end;
{ сортировка методом "пузырька"}
for i:=2 to n do
for j:=n downto i do
if MZap[j-1].fio>MZap[j].fio then
begin
vper:=MZap[j-1];
MZap[j-1]:=MZap[j];
MZap[j]:=vper;
end;
for i:=1 to n do // заполнение ячеек StringGrid1 полями массива записей
with StringGrid1,MZap[i] do
begin
Cells[0,i]:=IntToStr(i);
Cells[1,i]:=fio;
Cells[2,i]:=IntToStr(mat);
Cells[3,i]:=IntToStr(fiz);
Cells[4,i]:=IntToStr(soch);
end;
end;
{ Создание нового файла записей}
procedure TForm1.BitBtnNewClick(Sender: TObject);
var
i:integer;
begin // вывод на экран окна с предупреждающим сообщением
if MessageDlg('Содержимое существующего файла будет уничтожено. Вы уверены?',
mtConfirmation, mbYesNoCancel, 0)=mrYes then
begin
for i:=1 to n do
with StringGrid1,MZap[i] do
begin // формирование полей массива записей
fio:=Cells[1,i];
mat:=StrToInt(Cells[2,i]);
fiz:=StrToInt(Cells[3,i]);
soch:=StrToInt(Cells[4,i]);
end;
with OpenDialog1 do
begin
Title:='Создание файла'; // заголовок окна диалога
if Execute then // выполнение стандартного диалога выбора имени файла
begin
FileNameZap:=FileName; // присваивание имени файла
AssignFile(FileZap,FileNameZap); // назначить файлу FileZap имя FileNameZap
ReWrite(FileZap); // открыть файл на запись
for i:=1 to n do
write(FileZap,MZap[i]); // запись в файл массива записей
CloseFile(FileZap); // закрытие файла записей
end;
end;
end;
end;
{Обработчик кнопки изменения размера}
procedure TForm1.SpinEdit1Change(Sender: TObject);
var
i,m:integer;
begin
m:=StrToInt(SpinEdit1.Text); // присвоить новое значение размера
with StringGrid1 do
begin
RowCount:=m+1; // пересчитать количество строк
if m>n then // если строки добавлены то
for i:=n+1 to m do // инициализировать новые ячейки
begin
Cells[0,i]:=IntToStr(i);
Cells[1,i]:='';
Cells[2,i]:='';
Cells[3,i]:='';
Cells[4,i]:='';
end;
end;
n:=m; // запомнить новое значение размера
end;
{ обработчик нажатия кнопки Open }
procedure TForm1.BitBtnOpenClick(Sender: TObject);
var
i:integer;
begin
with OpenDialog1 do
begin
Title:='Открытие файла'; // заголовок окна диалога
if Execute then // выполнение стандартного диалога выбора имени файла
begin
FileNameZap:=FileName; // присваивание имени файла
AssignFile(FileZap,FileNameZap); // назначить файлу FileZap имя FileNameZap
ReSet(FileZap); // открыть файл на чтение
n:=0; // инициализация счетчика кол-ва прочитанных из файла элементов
while not EoF(FileZap) do
begin
n:=n+1; // увеличение счетчика
read(FileZap,MZap[n]); // чтение из файла n-го элемента массива записей
end;
SpinEdit1.Text:=IntToStr(n); // занести кол-во прочитанных записей в SpinEdit
StringGrid1.RowCount:=n+1; // присвоить кол-во строк
for i:=1 to n do
with StringGrid1,MZap[i] do
begin // заполнение ячеек StringGrid1 полями массива записей
Cells[0,i]:=IntToStr(i);
Cells[1,i]:=fio;
Cells[2,i]:=IntToStr(mat);
Cells[3,i]:=IntToStr(fiz);
Cells[4,i]:=IntToStr(soch);
end;
CloseFile(FileZap); // закрытие файла записей
end;
end;
BitBtnSort.Show;// показать кнопку “Sort”
BitBtnSave.Show;// показать кнопку “Save”
end;
{ Сохранение данных в текстовом файле}
procedure TForm1.BitBtnSaveClick(Sender: TObject);
var
i:integer;
begin
with SaveDialog1 do
if Execute then // выполнение стандартного диалога выбора имени файла
begin
FileNameText:=FileName; // присваивание имени файла
AssignFile(FileText,FileNameText); // назначить файлу FileText имя FileNameText
ReWrite(FileText); // открыть текстовый файл на запись
for i:=1 to n do
with MZap[i] do // запись в текстовый файл
writeln(FileText,i:3,fio:20,mat:5,fiz:5,soch:5);
CloseFile(FileText); // закрытие текстового файла по окончании записи
end;
BitBtnSort.Hide;// спрятать кнопку ”Sort”
end;
end.
4. Работа с приложением
Запустите созданное приложение. Занесите в соответствующие поля панели интерфейса информацию об успеваемости учащихся. Кнопкой “New” сохраните данные в файле. Завершите выполнение приложения.
Вновь запустите приложение и кнопкой “Open” откройте только что созданный файл. Убедитесь, что информация не содержит ошибок. При необходимости обнаруженные ошибки можно исправить, а также дополнить ведомость новой информацией. Для сортировки ведомости в алфавитном порядке воспользуйтесь кнопкой “Sort” и сохраните отсортированную информацию кнопкой “New”.
Еще раз завершите и вновь запустите приложение.
Кнопкой “Open откройте файл и убедитесь, что в нем теперь содержится ведомость, отсортированная в алфавитном порядке. Кнопкой “Save” сохраните информацию в текстовом файле. Для просмотра содержимого текстового файла воспользуйтесь, например, приложением “Microsoft Word”.
Используя все управляющие компоненты панели интерфейса, убедитесь в правильном функционировании приложения во всех предусмотренных режимах работы.
Индивидуальные задания
Во всех заданиях предусмотреть сохранение вводимых данных в файле и возможность чтения из ранее созданного файла. Результаты выводить в панель интерфейса и в текстовый файл.
1. Ведомость абитуриентов, сдавших вступительные экзамены в университет содержит: Ф.И.О. абитуриента, оценки. Определить средний балл по университету и вывести список абитуриентов, средний балл которых выше среднего балла по университету. Первыми в списке должны идти студенты, сдавшие все экзамены на 5.
2. В радиоателье хранятся квитанции о сданной в ремонт радиоаппаратуре. Каждая квитанция содержит следующую информацию: наименование группы изделий (телевизор, радиоприемник и т. п.), марка изделия, дата приемки в ремонт, состояние готовности заказа (выполнен, не выполнен). Вывести информацию о состоянии заказов на текущие сутки по группам изделий.
3. У администратора железнодорожных касс хранится информация о свободных местах в поездах дальнего следования на ближайшую неделю в следующем виде: дата выезда, пункт назначения, время отправления, число свободных мест. Оргкомитет международной конференции обращается к администратору с просьбой зарезервировать m мест до города N на k-й день недели с временем отправления поезда не позднее t часов вечера. Вывести время отправления или сообщение о невозможности выполнить заказ в полном объеме.
4. Разработать программу формирования ведомости об успеваемости студентов. Каждая запись этой ведомости должна содержать: номер группы, Ф.И.О. студента, оценки за последнюю сессию. Вывести списки студентов по группам. В каждой группе Ф.И.О. студентов должны быть расположены в порядке убывания среднего балла.
5. Склад бытовой техники. См. зад.2
6. Магазин продуктов питания. См. зад.2
7. Магазин канцелярских товаров. См. зад.2
8. Зоомагазин. См. зад.2
9. Магазин автомобильных запчастей. См. зад.2
10. Магазин книги. См. зад.2
11. Магазин спорт товаров. См. зад.2
12. Магазин строительных материалов. См. зад.2
13. Аптека. См. зад.2
14. Библиотека читальный зал. См. зад.2
15. Библиотека абонемент. См. зад.2
16. Библиотека новые книги. См. зад.2
17. Библиотека Архив. См. зад.2
18. Агентство по недвижимости. См. зад.2
19. Агентство знакомств. См. зад.2
20. Агентство трудоустройств. См. зад.2
21. Курсы парикмахеров. См. зад.2
22. Контроль экспортно-импортных валютных операций банка. См. зад.2
23. Учет материальных ценностей. См. зад.2
24. Распределение и использование водных ресурсов. См. зад.2
Лабораторная работа №5
Использование базы данных в Delphi: Создание таблиц базы данных, просмотр базы данных в виде таблицы, создание запросов.
Пример создания БД, формы и запросов.
Рассмотрим создание БД, формы и запросов к базе данных на примере.
Пример. Имеется база данных, состоящая из таблиц sotr.db и dep.db. Пока рассмотрим таблицу sort.db. Поля: Отдел, Фамилия, Отчество, Год рождения, Информация, Пол, Фото.
1. Создаем структуру таблицы с помощью утилиты DataBase DeskTop:
2. Определяем вторичные индексы:
3. Связываем таблицы sotr.db и dep.db:
4. Определяем язык таблицы:
5. Создаем приложение с двумя формами:
1. Главная форма:
2. Форма для запроса (мастер запросов):
Устанавливаем свойства для следующих компонентов:
ListBox1.Multiselected:=true; //для множественного выбора полей формы
SpinEditX.MaxValue:=1985;
SpinEditX.MinValue:=1940;
SpinEditX.Value:=1970;
ComboBox.Text:='='; комбинированные списки со знаковыми выражениями
Код программы для первой формы:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DBTables, DB, ExtCtrls, DBCtrls, Grids, DBGrids;
type
TForm1 = class(TForm)
DataSource1: TDataSource;
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
Table1: TTable;
Query1: TQuery;
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
begin
form2.visible:=true;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
close;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
datasource1.DataSet:=table1;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
with session do
begin
configmode:=cmSession;
try
addStandardalias('Сотрудники',extractfilepath(paramstr(0)),
'paradox');
table1.TableName:='person.db';
datasource1.DataSet:=table1;
dbgrid1.DataSource:=datasource1;
table1.Active:=true;
dbnavigator1.DataSource:=datasource1;
finally
configmode:=cmall;
end;
end;
end;
end.
Для отмеченных областей(окружности) данных создаем мастер запросов.
Код программы для второй формы:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Spin;
type
TForm2 = class(TForm)
Label1: TLabel;
ListBox1: TListBox;
ComboBox1: TComboBox;
ComboBox2: TComboBox;
ComboBox3: TComboBox;
Edit1: TEdit;
ComboBox4: TComboBox;
Edit2: TEdit;
ComboBox5: TComboBox;
ComboBox6: TComboBox;
ComboBox7: TComboBox;
Edit3: TEdit;
ComboBox8: TComboBox;
ComboBox9: TComboBox;
ComboBox10: TComboBox;
ComboBox11: TComboBox;
Edit4: TEdit;
ComboBox12: TComboBox;
ComboBox13: TComboBox;
ComboBox14: TComboBox;
SpinEdit1: TSpinEdit;
SpinEdit2: TSpinEdit;
SpinEdit3: TSpinEdit;
SpinEdit4: TSpinEdit;
SpinEdit5: TSpinEdit;
Edit5: TEdit;
Button1: TButton;
Memo1: TMemo;
procedure FormActivate(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
uses Unit1;
{$R *.dfm}
procedure TForm2.FormActivate(Sender: TObject);
begin
edit1.Visible:=false;
edit2.Visible:=false;
edit3.Visible:=false;
edit4.Visible:=false;
edit5.Visible:=false;
spinedit1.Visible:=false;
spinedit2.Visible:=false;
spinedit3.Visible:=false;
spinedit4.Visible:=false;
spinedit5.Visible:=false;
end;
procedure TForm2.ComboBox1Change(Sender: TObject);
begin
if combobox1.ItemIndex<>4 then
begin
edit1.Visible:=true;
spinedit1.Visible:=false;
end;
if combobox1.ItemIndex=4 then
begin
edit1.Visible:=false;
spinedit1.Visible:=true;
end;
end;
procedure TForm2.Button1Click(Sender: TObject);
var
otd,fam,name,otch,znak,pole,str,secondname:string;
year:integer;
begin
case combobox1.ItemIndex of
0:
begin
otd:=edit1.Text;
pole:='department';
end;
1:
begin
fam:=edit1.Text;
pole:='secondname';
end;
2:
begin
name:=edit1.Text;pole:='firstname';
end;
3:
begin
otch:=edit1.Text;pole:='lastname';
end;
4:
begin
year:=strtoint(spinedit1.Text);pole:='yof';
end;
end;
if combobox2.ItemIndex<>4 then
znak:=combobox2.Text
else
znak:=spinedit1.Text;
with form1.Query1 do
begin
close;
sql.Clear;
str:='select * '+'from "person.db" '+'where '+pole+'='+'"'+edit1.Text+'"';
memo1.Text:=str;
sql.Add(str);
open;
form1.datasource1.DataSet:=form1.query1;
end;
end;
end.
Выражение SQL-запроса должно отобразиться на форме 2 , компонент Memo1. После выполнения запроса (нажатие кнопки «запрос» на форме «Запрос»), данные по запросу отобразятся в таблице на первой форме.
Лабораторная работа №6
Создание классов и компонентов.
1. Создание классов
ПРИМЕР. Создать класс математических функций, одна из которых вычисление факториала.
unit cl;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TMat=class
ffact:integer;
constructor create(n:integer);
function factorial:integer;
end;
var
Form1: TForm1;
n,fn:integer;
implementation
{$R *.dfm}
constructor TMat.create(n:integer);
begin
fn:=n;
end;
function TMat.factorial:integer;
var p,i:integer;
begin
p:=1;
for i:=1 to fn do
p:=p*i;
result:=p;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
label1.Caption:=inttostr(TMat.create(strtoint(edit1.Text)).factorial);
end;
end.
2. Создание компонентов
ПРИМЕР. Создать текстовый компонент, одно из свойств которого вычисляет факториал числа, введенного в текстовый компонент.
Создание компонента:
1. При создании компонента MatEdit выбираем из пакета компонентов базовый компонет TEdit,
2. Добавляем свойство Fact
3. Создаем иконку в Image Editor(Tools).
4. Инсталлируем компонент. Компонент появляется на вкладке Sample(Рис.2).
5. Тестируем компонент.(см. код ниже).(Рис.3)
unit MatEdit;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, StdCtrls;
type
MatEdit1 = class(TEdit)
private
fnumb:integer;
function getfact:integer;
procedure setfact(value:integer);
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
constructor create(aowner:tcomponent);override;
property Fact:integer
read getfact write setfact;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [MatEdit1]);
end;
constructor MatEdit1.create(aowner:tcomponent);
begin
inherited Create(AOwner);
end;
function matedit1.getfact:integer;
var i,p:integer;
begin
try
fnumb:=strtoint(text);
except
on econverterror do
begin
result:=0;
text:='';
end;
end;
p:=1;
for i:=1 to fnumb do
p:=p*i;
result:=p;
end;
procedure matedit1.setfact(value:integer);
begin
fnumb:=value;
text:=inttostr(value);
end;
end.
Тестирование компонента:
unit testfact2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Edit1, StdCtrls, MyButton, MatEdit, Buttons;
type
TForm1 = class(TForm)
MatEdit11: MatEdit1;
BitBtn1: TBitBtn;
Label1: TLabel;
Label2: TLabel;
BitBtn2: TBitBtn;
Edit1: TEdit;
procedure BitBtn2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
edit1.Text:=inttostr(matedit11.Fact);
end;
end.
Задания
ЗАДАНИЕ 1. СОЗДАНИЕ КЛАССОВ(см. пример 1).
варианты заданий см. из Лаб. раб. №6.
ЗАДАНИЕ 2. СОЗДАНИЕ КОМПОНЕТОВ(см. пример 2).
а) варианты заданий см. из Лаб. раб. №6.
б) Создать класс объектов и добавить свойство, событие и метод:
1. Графический объект
2. Диалоговое окно
3. Списки
4. Полосы прокрутки
5. Таблица(StingGrid)
6. Shape
7. Chart
8. RichEdit
9. Кнопка
10. ProgressBar
11. UpDown
12. MonthCalendar
13. TreeView
14. Timer
15. Dialog(OpenDialog)
16. Dialog(SaveDialog)
17. Dialog(OpenDialog)
18. Dialog(FontDialog)
19. Dialog(ColorDialog)
20. Dialog (FindDialog)
Основная и дополнительная литература
Брукс Ф.П. Как проектируются и создаются программные комплексы.-И.:Наука, 1979.
Ван Тассел Д. Стиль, разработка, эффективность, отладка и испытание программ.-М.:Мир, 1981.
Липаев В.В. Проектирование программных средств. -М.:Высшая школа,1990.
Майерс Г. Искусство тестирования программ.-М.: Финансы и статистика, 1982.
Фокс Дж. Программное обеспечение и его разработка.-М.: Мир, 1985.
Фаронов В.В. Delphi 5. Учебный курс.
Архангельский А.Я. Программирование в Delphi 4. -М.: ЗАО «Издательство БИНОМ», 1999 г. -768 с., ил.
С.Бобровский. Delphi 5. Учебный курс. «Издательство ПИТЕР». 2000 г.
П. Дарахвелидзе, Е. Марков, О. Котенок. Программирование в Delphi 5. Современные технологии ADO, CORBA, COM. «Издательство BHV-Санкт-Петербург».
Размещено на Allbest.ru
Подобные документы
История создания и развитие языка программирования Pascal, его версии. Особенности и порядок построения графика функции на языке Turbo Pascal с использованием декартовой системы координат. Блок схема алгоритма процедур, листинг и тестирование программы.
курсовая работа [102,7 K], добавлен 23.12.2011Разработка программы обработки типизированных файлов с кодом на языке Object Pascal, с использованием компонентов Delphi для ввода и вывода данных. Разработка экранных форм и алгоритма программы. Описание программных модулей и инструкция оператору.
курсовая работа [1,5 M], добавлен 08.02.2011Различные способы обработки информации и программирование в среде Pascal. История создания языка. Блок схема с использованием заголовка функций задания. Описание подпрограмм. Сущность структурного программирования в аспекте написания алгоритмов программ.
курсовая работа [331,9 K], добавлен 18.01.2016Изучение функций и возможностей среды разработки языка программирования Pascal. Рассмотрение работы с одномерными и двумерными массивами, со строками и числами. Математическая формулировка задач. Разработка алгоритмов, описание структуры программ.
курсовая работа [879,8 K], добавлен 11.02.2016Проектирование программного модуля в среде программирования Borland Delphi 7.0. Схемы алгоритмов решения задач по темам "Символьные переменные и строки", "Массивы", "Работа с файлами", "Создание анимации". Реализация программного модуля, код программы.
отчет по практике [961,6 K], добавлен 21.04.2012Использование рекурсии в предметных областях. Рекурсивные процедуры и функции в программировании. Создание алгоритмов для рисования графических изображений с использованием рекурсии в среде программирования Pascal ABC. Примеры рекурсии в графике.
творческая работа [6,7 M], добавлен 01.02.2014История создания и развитие Pascal. Особенности пакета программирования Turbo. его возможности редактора текстов, компилятора и отладчика. Построения программы на языке Turbo Pascal, ее структура, типы алгоритмов, одномерные и многомерные массивы.
курсовая работа [519,3 K], добавлен 25.06.2011Методы реализации алгоритмов сортировки и алгоритмов поиска на языках программирования высокого уровня. Программирование алгоритмов сортировки и поиска в рамках создаваемого программного средства на языке Delphi. Создание руководства пользователя.
курсовая работа [1,7 M], добавлен 16.04.2012Значение и применение персонального компьютера и программного обеспечения в профессиональной деятельности. Перечень и содержание работы в системе программирования Pascal и Delphi. Условные операторы, массивы и строки. Общая схема работы с файлами.
отчет по практике [642,2 K], добавлен 04.06.2013Интегрированная среда разработки Delphi и элементы, входящие в ее состав. Математическая модель, алгоритм решения и его свойства. Описание операторов, процедур, функций и методов. Создание приложений по аналитической геометрии и теоретической механике.
курсовая работа [1,8 M], добавлен 26.05.2010