Среда программирования 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

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.