Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Пример создания приложения




Задание. Создать Windows-приложение для обработки ведомости об успеваемости Обучающийсяов группы в количестве 5 человек. Каждая запись должна содержать номер зачетной книжки, фамилию и инициалы, а также оценки по математике, физике и информатике. Для каждого Обучающийсяа рассчитать средний балл. Вывести ведомость в порядке убывания среднего балла.

В отдельный список вывести информацию о неуспевающих Обучающийсяах (Обучающийсяах, получивших хотя бы одну двойку).

В отдельное поле вывести наибольший и наименьший номера зачетных книжек в группе, а так же фамилии Обучающийсяов, которым они принадлежат.

Размещение компонентов на Форме

Один из возможных вариантов панели интерфейса создаваемого приложением показан на рисунке 10.1.

 

 

Рис. 10.1. Размещение компонентов на форме 8

 

При работе с записями ввод и вывод информации на экране удобно организовать с помощью компонента StringGrid, который находится на странице Additional.

Как видно, на форме размещены три компонента StringGrid: первый (StringGrid1) предназначен для ввода исходной ведомости, второй (StringGrid2) - для вывода ведомости, содержащей средний балл в порядке убывания среднего балла, третий (StringGrid3) - для вывода списка неуспевающих Обучающийсяов.

Для соответствующих заголовков колонок и номеров строк используется фиксированная зона компонента StringGrid, поэтому в Инспекторе Объектов значение FixedCols и FixedRows установите равными 1 для всех компонентов StringGrid. В соответствии с заданием установите значение свойства ColCount = 6 (количество столбцов) для StringGrid1 и ColCount = 7 для StringGrid2 и String-Grid3, а значение свойства RowCount = 6 (количество строк) для всех компонентов StringGrid. Для наличия вертикальной или горизонтальной или обеих линеек прокрутки в компоненте StringGrid установите свойство ScrollBars в состояние ssVertical, ssGorizontal или ssBoth соответственно. Но старайтесь устанавливать такой размер поля компонента StringGrid, чтобы вся таблица умещалась в поле.

Откройте список опций свойства +Options и установите значение goEditing в True - это даст возможность редактировать информацию в компоненте StringGrid с помощью клавиатуры и «мыши».

На форме также размешены три кнопки (Batton). Каждая из них выполняет функцию задания соответственно надписи.

Компонент Memo предназначена для вывода фамилий Обучающийсяов с максимальным и минимальным номерами зачетных книжек.

Три компонента Label (Метка) служат для вывода пояснительных надписей.

Сохранение проекта

Для нового проекта создайте новую папку

Сохраните проект File | Save Project As…. Сначала сохраните модуль c именем UnZap.pas, затем файл проекта под именем PrZap.dpr.

Последующие сохранения выполнять командами File | Save All.

Создание процедур обработки событий FormCreate и ButtonClick

Двойным нажатием клавиши «мыши» на Форме и на кнопках Button1, Button2, Button3 создайте соответствующие процедуры обработки событий. Используя текст модуля UnZap, внимательно наберите операторы этих процедур.

Работа с приложением

Запустите созданное приложение. Проанализируйте результаты. В случае необходимости откорректируйте приложение, снова сохраните его аналогичным образом. Выполните приложение и проанализируйте результаты (рисунок 10.2). После каждой корректировки следует выполнять сохранение приложения с помощью пунктов File \ Save All.

 
 

 


Рис. 10.2. Интерфейс приложения после его выполнения

 

Текст программы приведен в листинге 10.1.

Листинг 10.1

Unit UnZap;

interface

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

type TForm1 = class(TForm)

StringGrid1: TStringGrid;

StringGrid2: TStringGrid;

Memo1: TMemo;

Button1: TButton;

Button2: TButton;

Button3: TButton;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

StringGrid3: TStringGrid;

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject); private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

type // Создание типа данных «запись»(record), имя типа - zap

zap=record

nzach:integer;

fio:string[20];

mat,fiz,inf:integer;

srb:extended;

end;

var MZap:array[1..5] of zap; // объявление массива записей

{ Обработчик события создания формы}

procedure TForm1.FormCreate(Sender: TObject);

var i: integer;

begin with StringGrid1 do

begin // занесение информации в ячейки StringGrid1

Cells[0,0]:='№ п/п'; Cells[1,0]:='№ зачетной книжки'; Cells[2,0]:='Фамилия';

Cells[3,0]:='Математика'; Cells[4,0]:='Физика'; Cells[5,0]:='Информатика';

for i:=1 to 5 do Cells[0,i]:=IntToStr(i);

Cells[1,1]:='223254';Cells[2,1]:='Первый Н.П.'; Cells[3,1]:='5'; Cells[4,1]:='7';

Cells[5,1]:='8'; Cells[1,2]:='233254';Cells[2,2]:='Второй А.Н.'; Cells[3,2]:='9';

Cells[4,2]:='9'; Cells[5,2]:='9';Cells[1,3]:='123754';Cells[2,3]:='Третий Н.П.';

Cells[3,3]:='2'; Cells[4,3]:='5'; Cells[5,3]:='4';

Cells[1,4]:='216254';Cells[2,4]:='Четвертый Н.П.'; Cells[3,4]:='5'; Cells[4,4]:='6';

Cells[5,4]:='2';Cells[1,5]:='329270';Cells[2,5]:='Пятый Н.П.'; Cells[3,5]:='9';

Cells[4,5]:='8'; Cells[5,5]:='9';

for i:=1 to 5 do with MZap[i] do begin // формирование полей массива записей

nzach:=StrToInt(Cells[1,i]);fio:=Cells[2,i];mat:=StrToInt(Cells[3,i]);

fiz:=StrToInt(Cells[4,i]); inf:=StrToInt(Cells[5,i]);

end; end; end;

{ Сортировка записей в порядке убывания среднего балла}

procedure TForm1.Button1Click(Sender: TObject);

var i,j: integer;

rab: zap; // Рабочая переменная для обмена значениями двух элементов массива при сортировке

begin

for i:=1 to 5 do with StringGrid1,MZap[i] do

begin // формирование полей массива записей при нажатии Button1

nzach:=StrToInt(Cells[1,i]);fio:=Cells[2,i];

mat:=StrToInt(Cells[3,i]);fiz:=StrToInt(Cells[4,i]);inf:=StrToInt(Cells[5,i]);

srb:=(mat+fiz+inf)/3 // Расчет среднего балла

end;

for i:=2 to 5 do // Сортировка массива записей по убыванию среднего балла

for j:=5 downto i do // методом пузырька

if MZap[j-1].srb<MZap[j].srb then begin

rab:=MZap[j-1];MZap[j-1]:=MZap[j];MZap[j]:=rab;

end;

with StringGrid2 do // Очистка ячеек StringGrid2

for i:=0 to 5 do

for j:=0 to 6 do Cells[j,i]:=' '; with StringGrid2 do

begin // Пересылка заголовков столбцов в первую строку StringGrid2

Cells[0,0]:='№ п/п'; Cells[1,0]:='№ зачетной книжки'; Cells[2,0]:='Фамилия';

Cells[3,0]:='Математика'; Cells[4,0]:='Физика'; Cells[5,0]:='Информатика';

Cells[6,0]:='Средний балл';

for i:=1 to 5 do with MZap[i] do begin // Занесение информации в остальные ячейки

StringGrid2 Cells[0,i]:=IntToStr(i); // из рассортированного массива Mzap

Cells[1,i]:=IntToStr(nzach);Cells[2,i]:=fio;Cells[3,i]:=IntToStr(mat);

Cells[4,i]:=IntToStr(fiz);Cells[5,i]:=IntToStr(inf);Cells[6,i]:=floatToStrF(srb,ffFixed,5,2);

end; end; end;

{ Вывод списка неуспевающих Обучающийсяов}

procedure TForm1.Button2Click(Sender: TObject); var i,j:integer;

begin

for i:=1 to 5 do with StringGrid1,MZap[i] do begin // Занесение данных в массив записей

nzach:=StrToInt(Cells[1,i]);fio:=Cells[2,i];mat:=StrToInt(Cells[3,i]);

fiz:=StrToInt(Cells[4,i]);inf:=StrToInt(Cells[5,i]);srb:=(mat+fiz+inf)/3

end;

with StringGrid3 do // Очистка ячеек StringGrid3

for i:=0 to 5 do

for j:=0 to 6 do

Cells[j,i]:=' '; with StringGrid3 do

begin // Занесение заголовков столбцов в первую строку

StringGrid3

Cells[0,0]:='№ п/п'; Cells[1,0]:='№ зачетной книжки';

Cells[2,0]:='Фамилия'; Cells[3,0]:='Математика';

Cells[4,0]:='Физика'; Cells[5,0]:='Информатика';

Cells[6,0]:='Средний балл';

j:=0;

for i:=1 to 5 do // Занесение только данных о неуспевающих Обучающийсяах в StringGrid3

with MZap[i] do

if (mat=2) or (fiz=2) or (inf=2) then begin j:=j+1;

Cells[0,j]:=IntToStr(j); Cells[1,j]:=IntToStr(nzach);

Cells[2,j]:=fio; Cells[3,j]:=IntToStr(mat);

Cells[4,j]:=IntToStr(fiz); Cells[5,j]:=IntToStr(inf);

Cells[6,j]:=floatToStrF(srb,ffFixed,5,2);

end; end; end;

{ Определение наибольшего и наименьшего номеров зачетных книжек}

procedure TForm1.Button3Click(Sender: TObject);

var i, min, max, k, l: integer;

begin for i:=1 to 5 do with StringGrid1,MZap[i] do

begin // Занесение данных в массив записей при нажатии кнопки Batton3

nzach:=StrToInt(Cells[1,i]);

fio:=Cells[2,i]; mat:=StrToInt(Cells[3,i]);

fiz:=StrToInt(Cells[4,i]); inf:=StrToInt(Cells[5,i]);

srb:=(mat+fiz+inf)/3

end;

max:=MZap[1].nzach; k:=1; // занесение № первой зачетки в ячейку max

min:=MZap[1].nzach; l:=1; // занесение № первой зачетки в ячейку min

for i:=1 to 5 do // поиск максимального и минимального № зачеток

with MZap[i] do // и номеров в массиве их обладателей

begin

if MZap[i].nzach>max then begin max:=nzach; k:=i; end;

if MZap[i].nzach<min then begin

min:=nzach; l:=i;

end; end;

Memo1.Lines.Add('РЕЗУЛЬТАТ''); // Занесение результатовв Memo

Memo1.Lines.Add(#13#10+'Наибольший № зачетки '+IntToStr(max)+' имеет '+MZap[k].fio);

Memo1.Lines.Add(#13#10+'Наименьший № зачетки '+IntToStr(min)+' имеет '+MZap[l].fio);

end;end.

 

Практические задания

Выберите вариант индивидуальной задачи. Выполните задания определенного уровня. Создайте приложение и протестируйте его работу.

Задачи

1. Информация о сотрудниках предприятия содержит: Ф.И.О., номер отдела, должность, дату поступления на работу.

а) Вывести списки сотрудников по отделам (в порядке возрастания).

б) Выбрать список сотрудников, поступивших на работу в текущем году с подсчетом их количества.

в) Рассчитать количество сотрудников, работающих в каждой должности и вывести информацию в алфавитном порядке должностей.

2. В библиотеке хранится информация о наличии книг. Имеются следующие данные о каждой книге: инвентарный номер, фамилии авторов, название книги, год издания, количество страниц, цена.

а) Вывести имеющуюся информацию о книгах в алфавитном порядке авторов книг.

б) Выбрать список книг, изданных ранее заданного года и определить общую стоимость этих книг.

в) Вывести фамилию автора, количество книг которого в библиотеке наибольшее.

3. Для участия в конкурсе исполнителей необходимо заполнить следующую анкету: Ф.И.О., год рождения, название страны, класс музыкального инструмента (гитара, фортепиано, скрипка, виолончель).

а) Вывести список участников конкурса по классам инструментов.

б) Рассчитать количество молодых участников конкурса, родившихся не раньше заданного года и вывести список в алфавитном порядке фамилий.

в) Определить, по какому классу инструмента в конкурсе участвует наибольшее количество музыкантов.

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

а) Вывести список в алфавитном порядке фамилий.

б) Вывести список первоочередников, претендующих на места в общежитии в порядке возрастания дохода на члена семьи.

в) Определить группу, содержащую наибольшее количество очередников.

5. Сведения о наличии лекарственных средств в аптеках города содержат следующие данные: наименование лекарства, фирма-изготовитель, номер аптеки, количество упаковок, стоимость одной упаковки.

а) Вывести сведения в алфавитном порядке по названиям фирм-изготовителей.

б) Получить список аптек, в которых можно купить N упаковок заданного лекарства, включив все имеющиеся сведения о лекарстве. Список вывести в порядке возрастания цены за упаковку.

в) Вывести название фирмы-изготовителя, которая поставила наибольшее число наименований лекарств, зарегистрированных в рассматриваемой информации.

6. Фирма реализует изделия клиентам. Имеются следующие данные о продажах: изделие, цена, клиент, количество, дата продажи.

а) Вывести сведения о продажах с подсчетом вырученной суммы в порядке возрастания даты продажи.

б) Для заданного изделия вывести сведения о продажах его клиентам в порядке убывания количества проданных изделий. Рассчитать общую вырученную сумму от продаж изделия.

в) Определить клиента, купившего наибольшее суммарное количество изделий, и вывести его название вместе с рассчитанным наибольшим количеством.

7. В справочной автовокзала хранится расписание движения автобусов. Для каждого рейса указаны его номер, тип автобуса, пункт назначения, время отправления и прибытия.

а) Вывести расписание в алфавитном порядке пунктов назначения.

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

в) Определить пункт назначения, обеспеченный наибольшим количеством рейсов.

8. На междугородней АТС информация о разговорах содержит

дату разговора, код и название города, время разговора, тариф, номер телефона в этом городе и номер телефона абонента.

а) Вывести все данные с расчетом стоимости разговора в алфавитном порядке названий городов.

б) Вывести все разговоры за день, заданный с клавиатуры датой, общую стоимость этих разговоров и самый короткий из них.

в) Определить город, общая стоимость переговоров с которым наибольшая.

9. Информация о сотрудниках фирмы включает: код подразделения, Ф.И.О., табельный номер, количество отработанных часов за месяц, почасовый тариф. Рабочее время свыше 144 часов считается сверхурочным и оплачивается в двойном размере.

а) Подсчитать размер заработной платы каждого сотрудника фирмы за вычетом подоходного налога, который составляет 12 % от суммы заработка. Вывести ведомость в алфавитном порядке фамилий сотрудников.

б) Вывести ведомость по заданному подразделению.

в) Вывести список подразделений с указанием суммарной величины заработной платы по подразделению.

10. Разработать программу формирования ведомости об успеваемости Обучающийсяов. Каждая запись этой ведомости должна содержать: номер группы, Ф.И.О. Обучающийсяа, оценки за последнюю сессию (4 дисциплины) средний балл.

а) Вывести списки в алфавитном порядке фамилий с расчетом

общего (суммарного) балла для каждого Обучающийсяа.

б) Выбрать список Обучающийсяов заданной группы и рассчитать среднее значение общего балла по группе.

в) Определить группу с наибольшим средним баллом.

11. Различные цеха завода выпускают продукцию нескольких наименований. Сведения о выпущенной продукции включают номер цеха, наименование продукции, ее количество.

а) Вывести информацию по всем цехам в порядке возрастания номера цеха.

б) Вывести информацию об изделиях, выпуск которых составил 1000 и более единиц с подсчетом общего количества таких изделий.

в) Определить номер цеха, выпускающего наибольшее количество наименований изделий.

12. Ведомость абитуриентов, сдавших вступительные экзамены в университет, содержит Ф.И.О., город проживания, оценки по 4-м дисциплинам.

а) Вывести список абитуриентов в алфавитном порядке фамилий с подсчетом общего балла для каждого абитуриента.

б) Определить количество абитуриентов, проживающих в г. Минске и набравших общий балл не ниже 32, вывести всю информацию об этих абитуриентах.

в) Определить город, абитуриенты которого набрали наибольший суммарный общий балл.

13. В справочной аэропорта хранится расписание вылета самолетов на следующие сутки. Для каждого рейса указаны: номер рейса, тип самолета, пункт назначения, время вылета.

а) Вывести расписание в порядке возрастания времени вылета.

б) Вывести расписание вечерних рейсов для заданного пункта назначения (время вылета >=17-00) с подсчетом количества таких рейсов.

в) Для каждого пункта назначения рассчитать количество рейсов и вывести список в алфавитном порядке наименований пунктов назначения.

14. В магазине имеется список поступивших в продажу автомобилей. Каждая строка этого списка содержит следующие характеристики: марка автомобиля, количество, стоимость, расход топлива на 100 км, надежность (число лет безотказной работы), комфортность (отличная, хорошая, удовлетворительная), страна-производитель.

а) Вывести список в порядке возрастания стоимости автомобилей.

б) Получить перечень автомобилей, удовлетворяющих требованиям покупателя, которые вводятся с клавиатуры в виде некоторого интервала допустимых значений с подсчетом количества таких автомобилей.

в) Определить, какой стране принадлежит производитель, поставивший наибольшее количество автомобилей.

15. Для участия в конкурсе на замещение вакантной должности сотрудника фирмы желающие подают следующую информацию:

Ф.И.О, год рождения, образование (среднее, специальное, высшее), знание иностранных языков (английский, немецкий, французский), владение компьютером (Да, Нет), стаж работы.

а) Вывести список претендентов в алфавитном порядке фамилий.

б) Получить список претендентов в соответствии с требованиями руководства фирмы, которые вводятся с клавиатуры, с подсчетом количества претендентов.

в) Рассчитать количество претендентов каждого вида образования и вывести в виде списка.

Индивидуальные задания 1-го уровня

Выполнить задание (а) в соответствии с вариантом.

Индивидуальные задания 2-го уровня

Выполнить задания (а, б) в соответствии с вариантом.

Индивидуальные задания 3-го уровня

Выполнить задания (а, б, в) в соответствии с вариантом.

Контрольные вопросы

1. Что такое пользовательский тип данных?

2. Дайте определение типа данных «запись» (Record).

3. Как организуется обращение к полям записи?

4. Как объявляется массив записей?

5. Могут ли элементы записи иметь разный тип данных?


Практическая работа № 11

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

Тема. Работа с файлами

Цель. Ознакомление с компонентами для создания меню и диалогов выбора файлов. Создание программы для просмотра и запуска созданных в предыдущих лабораторных работах приложений.

Ход работы.

1. Изучить теоретический материал.

2. Выполнить практическое задание.

3. Ответить на контрольные вопросы.

4. Составить отчет.

Теоретическая часть

Наше приложение будет состоять всего из одной формы, на которой надо разместить 4 компонента типов TMainMenu, ТМеmо и две TOpenDialog (рис. 11.1, а)). С помощью этих компонентов мы реализуем два способа решения поставленной задачи. Рассмотрим их.

       
 
   
 

 

 


а) б)

Рисунок 11.1

Для создания главного меню в Delphi используется компонент типа TMainMenu. Для этого необходимо поместить его на форму и дважды щелкнуть по нему. После этого на экране появится окно редактора меню (рис. 11.1, б)).

Замечание.

Для изменения пунктов меню используйте клавиши Insert, Delete и Ctrl+->

Сначала меню состоит из одного пустого элемента. Для добавления нового пункта меню можно просто начать изменять любой пустой пункт меню в редакторе меню (он обведен пунктирным прямоугольником). Для вставки - нового пункта меню в любой позиции необходимо нажать клавишу Insert. Для удаления пункта меню клавишу Delete. Для создания подменю второго уровня - клавишу Ctrl+->.

 

Таблица 11.1- Основные свойства объектов типа TMenuItem
Свойство Тип Комментарий
Caption String Текст, появляющийся в меню. Если перед некоторой буквой поставить знак &, то во время выполнения программы этот знак будет не виден, а буква будет изображаться с подчеркиванием, что позволит ее использовать в качестве горячей клавиши. Если текст состоит всего из одного знака «минус», то пункт меню становится разделительной линией.
Cheeked Boolean При установке значения True слева от пункта меню будет отображаться «галочка».
Enabled Boolean Если значение будет равно False, то пункт меню будет недоступен для выбора и станет отображаться серым цветом.
Shortcut TShortCut Горячая клавиша, которую можно будет использовать для быстрого вызова пункта меню. Кроме того, она будет отображаться справа от пункта меню.
Visible boolean Если значение будет равно False, то пункт меню будет невидим

 

Для изменения описания пунктов меню необходимо выбрать требуемый. При этом он станет доступным в инспекторе объектов, где можно изменить все необходимые свойства. В табл. 11.1 приведено краткое описание основных свойств элементов меню.

В данной лабораторной работе необходимо создать в главном меню два вида подменю. В первом подменю «Файл» можно создать три пункта и один разделитель. Это команды «Открыть...» для выбора файла в диалоге и загрузки его в главную форму, «Выполнить...» для выбора выполняемого файла в диалоге и его запуска, а также команда «Выход».

Все остальные подменю должны соответствовать предыдущим лабораторным работам и оформлены примерно так, как показано на рисунке.. Первым пунктом такого подменю должно быть название файла проекта, например Labl.dpr. Затем после разделителя список всех модулей, входящих в состав проекта. А в конце после разделителя имя выполняемого файла.

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

Самый простой из обработчиков соответствует пункту меню «Выход». В нем просто нужно вызвать метод формы Close.

Наша программа должна выполнять два вида действий - загрузку файла для просмотра в многострочный текстовый редактор и запуск программы на выполнение. Для этого создадим две соответствующие процедуры OpenFile и ExecuteFile с одним входным параметром строкового типа для передачи имени файла. Процедура OpenFile должна открыть текстовый файл, считать все его строчки и поместить их в многострочный редактор типа ТМето. Наиболее важные свойства компоненты данного типа приведены в табл. 11.2.

Процедура ExecuteFile должна запускать выполняемый файл. Для этого можно воспользоваться функцией WinExec, определенной в модуле Windows. Функция имеет два параметра. Первый типа PChar задает имя файла, второй целочисленный - способ запуска. В большинстве случаев способ запуска можно задавать равным 0. Тип данных PChar эквивалентен типу *char, используемому в языке С. Для приведения к нему обычной строки Delphi, например FileName типа string, можно просто записать PChar(FileName).

Таблица 11.2- Основные свойства объектов типа ТМето
Свойство Тип Комментарий
Align TAlign Определяет режим автоматического изменения размера компоненты. Значение, равное alClient, позволяет автоматически растягивать компонент по размеру содержащего его визуального компонента, например формы.
ReadOnly Boolean При установке значения True, текст нельзя будет редактировать.
Lines TStrings Содержимое многострочного редактора.
ScrollBars TScrollStyle Определяет видимость полос прокрутки. Значение равное ssBoth включает обе полосы.

 

Замечание

Для назначения пунктам меню уже созданного обработчика событий необходимо в инспекторе объектов просто выбрать из ниспадающего списка нужный метод-обработчик.

Теперь рассмотрим обработчики событий выбора пунктов меню «Открыть...» и «Выполнить...». В них нужно вызвать диалоги выбора файлов типа TOpenDialog и вызвать соответствующую процедуру OpenFile или ExecuteFile. Наиболее важные свойства компонента типа TOpenDialog приведены в табл. 11.3. Для того чтобы выдать диалог на экран, необходимо использовать его метод Execute, возвращающий логическое значение, которое равно True, если пользователь выбрал файл.

 

Замечание
Для задания фильтра в компонентах для выбора файлов, можно вызвать редактор для свойства Filter, нажав кнопку с многоточием справа от его значения в инспекторе объектов. В нем имеется таблица с двумя колонками: в левой помещается описание варианта фильтра, а в правой - сам фильтр.

Теперь рассмотрим обработчики событий для пунктов меню, соответствующих файлам с расширениями dpr, pas и ехе. Для первых двух логично написать один общий обработчик, который загружает текстовый файл. Предполагая, что все лабораторные работы находятся в своих каталогах, например, так, как на рис. 1, будем формировать имя файла автоматически, составляя его из некоторого каталога, содержащего все лабораторные работы, например, 'H:\Work\Delphi', затем имени главного меню, например, 'Lаb1', и имени файла, указанного в тексте пункта меню, например, 'MainUnit.pas'. Основные процедуры в обоих обработчиках те же процедуры OpenFile и ExecuteFile.

В листингах 11-12 приведены тексты файлов проекта и модуля.

Таблица 11.3- Основные свойства объектов типа topendialog
Свойство Тип Комментарий
DefaultExt String Задает расширение файла по умолчанию. Оно будет добавлено к введенному пользователем имени файла, если оно указано без расширения.
FileName String Имя выбранного файла.
Filter String В этом свойстве указывается список типов видимых в диалоге файлов. Например, в данной работе для команды «Открыть...» уместно указать в строке инспектора объектов (не входя в редактор свойства) значение 'Проекты Delphi (*.dpr) |*.dpr| Модули Delphi (*.pas) |*. pas | Текстовые файлы (*.txt) |*.txt|Bce файлы |*.*', а для команды «Выполнить...» - ' Выполняемые файлы | *.ехе; *.сom; *.bat; *.pif'.
FilterIndex Integer Номер фильтра при открытии диалога
Options TOpenOptions В этом свойстве указываются различные параметры диалога. В нашем случае необходимо указать опцию ofFileMustExist для того чтобы пользователь не мог ввести имя несуществующего файла.
Title String Текст заголовка диалога выбора файлов.

 

Листинг 11. Текст файла проекта Lab5.dpr

program Lab15;

Uses

Forms,

MainUnit in 'MainUnit.pas' {MainForm};

{$R *.RES}

Begin

Applicacion.Initialize;

Application.CreateForm(TMainForm, MainForm);

Application.Run;

end.

 

Листинг 12. Текст главного модуля MainUnit.pas

unit MainUnit;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus, StdCtrls;
const { Здесь указывается каталог с лабораторными работами }
Root = 'H:\Work\Delphi\';
type
TMainForm = class (TForm)
MainMenu: TMainMenu;
Lab11: TMenuItem;
Lab21: TMenuItem;
Lab31: TMenuItem;
Lab41: TMenuItem;
Lab51: TMenuItem;
ItemExit: TMenuItem;
Lab1dpr1: TMenuItem;
S2: TMenuItem;
MainUnitpas1: TMenuItem;
N3: TMenuItem;
Lab1exe1: TMenuItem;
Lab1dpr2: TMenuItem;
N4: TMenuItem;
MainUnitpas2: TMenuItem;
N5: TMenuItem;
Lab1exe2: TMenuItem;
Lab1dpr3: TMenuItem;
N6: TMenuItem;
MainUnitpas3: TMenuItem;
N7: TMenuItem;
Lab1exe3: TMenuItem;
Lab1dpr4: TMenuItem;
N8: TMenuItem;
MainUnitpas1: TMenuItem;
N9: TMenuItem;
Lab1exe4: TMenuItem;
Lab1dpr5: TMenuItem;
N10: TMenuItem;
MainUnitpas5: TMenuItem;
N11: TMenuItem;
Lab1exe5: TMenuItem;
Inputpas1: TMenuItem;
ListInputpas1: TMenuItem;
GridInputpas1: TMenuItem;
Memo: TMemo;
N12: TMenuItem;
ItemOpen: TMenuItem;
N14: TMenuItem;
ItemExecute: TMenuItem;
OpenFileDialog: TOpenDialog;
ExecuteFileDialog: TOpenDialog;
procedure ItemExitClick (Sender: TObject);
procedure ItemOpenClick (Sender: TObject);
procedure ItemExecuteClick (Sender: TObject);
procedure OpenFileClick (Sender: TObject);
procedure ExecuteFileClick (Sender: TObject);
private
procedure OpenFlle(FileName: string); // Загрузить содержимое текстового файла
procedure ExecuteFile(FileName: string); // Запутстить выполняемый файл
end;
var MainFom: TMainForm;
implementation
{$R *.DFM}
procedure TMainForm.ItemExitClick (Sender: TObject);
begin // Выход из программы
Close;
end;
procedure TMainForm.ItemOpenClick (Sender: TObject);
begin // Выбрана команда меню "Открыть..."
if OpenFileDialog.Execute then
OpenFile(OpenFiieDialog.Filename);
end;
procedure TMainForm.ItemExecuteClick (Sender: TObject);
begin // выбрана команда меню "Выполнить..."
if ExecuteFiieDialog.Execute then
ExecuteFile(ExecuteFileDialog.FiieName);
end;
procedure TMainForm.OpenFileClick (Sender: TObject);
begin // Обработчик команды открытия текстовых файлов с расширениями.dpr и.pas
with Sender as TMenuItem do
OpenFile(Root+Parent.Caption+'\'+Caption);
end;
procedure TMainForm.ExecuteFileCiick(Sender: TObject);
begin // Обработчик команды запуска выполняемых файлов с расширениями.exe
with Sender as TMenuItem do
ExecuteFile (Root+Parent.Caption+'\'+Caption);
end;
procedure TMainForm.OpenFile(FileName: string);
var f: TextFile; s: string;
begin //Процедура загрузки текстовых файлов в компоненту TMemo
AssignFile(f,FileName);
try
Reset(f); // Открыть файл для чтения
try
Memo.Lines.Clear;
while not EOF(f) do
begin // Пока не достигнут конец файла, читать построчно
ReadLn(f,s);
Memo.Lines.Add(s};
end;
finally
CloseFile(f); // Закрыть файл
end;
except
ShowMessage ('Ошибка загрузки файла '+FileName);
end;
end;

procedure TMainForm.ExecuteFile(FileName: string);
begin // Запуск выполняемого файла
if WinExec(PChar(FileName), 0)<32 then
ShowMessage('Ошибка запуска файла '+FileName);
еnd;

end.

Практическое задание

1. Создать программу для просмотра и запуска созданных в предыдущих лабораторных работах приложений Добавить возможность редактирования файлов в ТМеmо и последующего сохранения в выбираемый с помощью компоненты TSaveDialog файл.

2. Как назначить нескольким пунктам меню один и тот же обработчик событий?

3. Создайте пункт меню, выдающий в отдельном модальном окне информацию о программе (автор, дата создания и т.д.).

4. Создайте пункт меню, по которому на экран выдается в отдельном модальном окне статистика о текущем загруженном файле - количество строк и символов.

5. Добавьте новые пункты меню для запуска каких-нибудь наиболее распространенных программ Windows.

 


Практическая работа №12,

Лабораторная работа 12

 

Тема. Создание модуля и использование процедур и функций. Разработка и отладка программы и модуля с использованием процедур и функций

Цель. И зучить возможности Delphi для написания подпрограмм и создания модулей. Составить и отладить программу, использующую внешний модуль Unit с подпрограммой.

Ход работы

1 Повторить теоретическую часть

2 Ответить на контрольные вопросы

3 Выполнить практическое задание

1. Краткие теоретические сведения

Подпрограмма - это именованная, определенным образом оформленная группа операторов, которая может бить вызвана любое количество раз из любой точки основной программы. Подпрограммы используется в том случае, когда одна и та же, последовательность операторов в тексте программы повторяется несколько раз. Этa последовательность заменяется вызовом подпрограммы, содержащей необходимые операторы. Подпрограммы также применяются для создания специализированных библиотечных модулей, содержащих набор подпрограмм определенного назначения, для использованияих другими программистами.

Подпрограммы подразделяются на процедуры и функции. Процедура имеет следующую структуру:

 

Procedure <имя процедуры> ([список формальных параметров]);

Const [описание используемых констант];

Type [описание используемых типов];

Var [описание используемых переменных];

Begin

< операторы>

end;

 

Процедуры и функции могут быть использованы в качестве формальных параметров подпрограмм. Для этого определяется тип:

 

Type<имя>= function ([список формальных параметров]):<тип результата>;

 

или

 

Type <имя>= procedure ([список формальных параметров]);

 

Имя процедуры или функции должно быть уникальным в пределах программы. Список формальных параметров необязателен и может отсутствовать. Если же он есть, то в нем перечисляются через точку с запятой имена формальных параметров и их типы. Имеется три вида формальных параметров параметры-значения, параметры-переменные, параметры-константы. При вызове подпрограммы передача данных для этих видов осуществляются по-разному. Параметры-значения копируются, и подпрограмма работает с их копией, поэтому при вызове на месте такого параметра можно ставить арифметическое выражение. При использовании параметров-переменных (в описании перед ними ставится Var) и параметров-констант в подпрограмму передается адрес, и она работает с самой переменной. С помощью параметров-переменных подпрограмма передает результаты своей работы вызывающей программе.

В функциях используется специальная переменная Result, интерпретируемая как значение, которое вернет в основную программу по окончании работы функции.

В язык Object Pascal встроен ряд наиболее часто употребляемых процедур и функций, которые являются частью языка и вызываются без предварительного определения в разделе описаний.

 

Использование модулей

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

Заголовок состоит из зарезервированного слова Unit и следующего за ним имени модуля, которое должно совпадать с именем дискового файла. Использование имени модуля в разделе Uses основной программы приводит к установлению связи модуля с основной программой.

Интерфейсная часть расположена между зарезервированными словами Interface и Implementation и содержит объявление тех объектов модуля, которые должны быть доступны другим программам.

Исполняемая часть начинается зарезервированным словом implementation и содержит описание процедур и функций, объявленных в интерфейсной части. Она может также содержать вспомогательные типы, константы, переменные, процедуры и функции которые, будут использоваться только в исполняемой части и не будут доступны внешним программам.

Инициирующая часть начинается зарезервированным словом Initialization и содержит операторы, которые исполняются до передачи управления основной программе.

Завершающая часть начинается зарезервированным словом Finalization и выполняется в момент окончания работы программы. Инициализирующая и завершающая части модуля используются крайне редко.

 

Пример выполнения задания

Задание: написать программу вывода на экран таблицы функции, которую, оформить в виде процедуры. В качестве функции использовать по выбору Tg(x), Ch(x) и Sin(x).

 

Создание модуля

Создавая модуль, следует обратить внимание на то, что он не должен иметь своей формы. Система Delphi при начальной загрузке автоматически создает шаблон программы, имеющий в своем составе форму, файл проекта и т.д. Так как модуль состоит только из одного файла, то необходимо перед его созданием уничтожить заготовку файла проекта и форму. Для этого в меню File выбрать Close All, файл проекта не сохранять.

Для создания модуля в меню File выбрать File New, и затем в репозитории – пиктограмму . В результате будет создан файл с заголовком Unit Unit1. Имя модуля можно сменить на другое, отвечающее внутреннему содержанию модуля, например Unit MatFunc. Затем необходимо сохранить файл с именем, совпадающим с именем заголовка модуля: MatFunc.pas. Следует обратить внимание на то, что имя файла должно совпадать с именем модуля, иначе Delphi несможет подключить его к другой программе.

 

Подключение модуля

Для того чтобы подключить модуль к проекту необходимо в меню Project выбрать опцию Add to Project... и выбрать файл, содержащий модуль. После этого в разделе Uses добавить имя подключаемого модуля - MatFunc. Теперь в проекте можно использовать функции, содержащиеся в модуле.

Форма приложения приведена на рисунке 12.1.

 

Рисунок 12.1 – Форма приложения

Тексты модуля:

 

Unit MatFunc;

Interface

Function Tg(x: extended): extended; //Функция для вычисления тангенса

Function Ch(x:extended):extended; //Функция для вычисления гиперболического синуса

Function Sin2(x: extended): extended;//Функция для вычисления квадрата синуса

Implementation

Function Tg(x: extended): extended;

begin

Result:= sin(x)/cos(x);

end;

 

Function Ch(x: extended): extended;

begin

Result:= (exp(x)-exp(-x))/2;

end;

 

Function Sin2(x: extended): extended;

begin

Result:= sqr(sin(x));

end;

end.

 

Тек<

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...