Программирование в Delphi

МИНИСТЕРСТВО СЕЛЬСКОГО ХОЗЯЙСТВА И ПРОДОВОЛЬСТВИЯ РЕСПУБЛИКИ БЕЛАРУСЬ

Учреждение образования «Белорусский государственный аграрный технический университет»







Факультет: Предпринимательства и управления

Кафедра: Экономической информатики





Курсовой проект

Тема: «ПРОГРАМИРОВАНИЕ В DELPHI»







Выполнил студент II курса

группы 52-ЗЭИ

Зачетная книжка №506020

Братулин Евгений Петрович

Проверил:_______________















Минск 2007


 CОДЕРЖАНИЕ



	1. Введение	3

	2. Постановка задачи	4

	3. Математическая формулировка задачи и выбор метода обработки   информации	7

	4. Разработка алгоритма схемы алгоритма и его описание	9

	5. Форма представления исходных данных	21

	6. Разработка интерфейса	22

	7. Листинг программы	25

	8. Результаты проведенных расчетов и их анализ	32

	Выводы	35

	Список использованных источников.	36

	Приложения.	37




1. Введение.



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

Разработчику ставиться вполне определенная задача, при выполнении которой используются навыки работы с операционными системами, программными оболочками, разнообразными служебными и сервисными средствами. А также навыки по алгоритмизации, программированию и решению в интегрированной визуальной среде программирования Delphi задач по экономике и управлению на предприятии.


2. Постановка задачи.



В данной курсовой работе требуется создать Windows-приложение на алгоритмическом языке Object Pascal в среде визуального программирования Delphi, которое обеспечивает формирование, обработку на ЭВМ и вывод информации. Предусмотреть хранение информации в типизированных файлах, содержащих не менее 10 записей. Приложение должно обеспечивать формирование базы данных сведений о выручке от реализации продукции за плановый период, выполнить математические вычисления по расчету объема реализации и стоимости в оптовых ценах всего объема реализации. Также необходимо обеспечить сортировку базы данных в алфавитном порядке по наименованию продукции и организовать вывод в MEMO-поле наименование продукции, имеющее значение наибольшей стоимости.

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

- хранение малого объема данных

- произведение простых математических вычислений

- обеспечение хранение базы данных

При исследовании существующих программных продуктов, был сделан вывод, что используя комплексное программное обеспечение компании Microsoft, на базе электронных таблиц Excel или базы данных Access можно было создать такое же приложение, выполняющее поставленную задачу. При этом затрачивается минимум усилий на проработку интерфейса и процедур сортировки. Однако, большим минусом данного решения будет является необходимость обязательной предварительной установки программного обеспечении Microsoft Office, лицензионные версии которого не получили широкого распространения на территории Республики Беларусь.

Поэтому принято считать, что уже исходя из этого разрабатываемое Windows- приложение не является «бесполезным», потому как имеет одну четко сформировавшуюся цель и место применения. Вероятное использование данного продукта - финансовые терминалы на базе операционных систем семейства Windows любого производственного предприятия. Данная программа, используя стандартные компоненты, с успехом будет работать в ОС-ах Windows’95, 98, 2000, ХР не требуя при этом дополнительных инсталляций программного обеспечения.

Для создания подобного приложения, которое будет удовлетворять поставленную задачу, и обеспечения функционирования математического аппарата необходимо как минимум:

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

MEMO-поле для вывода данных, указанных в задании

Набор компонентов для добавления / изменения / удаления записей в базу данных

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

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

Таким образом, учитывая вышесказанное, разработчиком были приняты следующие решения, касающиеся будущей структуры приложения:

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

	MEMO-поле прежде всего предназначенное для вывода данных, указанных в условии, дополнительно использовать для визуального подтверждения выполняемых пользователем действий.

	для добавления / изменения / удаления записей в базу данных использовать 5  компонентов edit (для заполнения соответствующих столбцов), и 2 button-а (для добавления и удаления записи соответственно). Так как для отображения информации в StringGrid используется текстовая форма, предусмотреть невозможность ввода текстовых данных в численные поля с выводом соответствующего сообщения, а также невозможность внесения «пустого» поля, так как все поля базы данных, необходимые для математического расчета по условиям задачи должны быть заполнены.

	использовать стандартные диалоги OpenDialog и SaveDialog для предоставления пользователю возможности визуального выбора имени и пути типизированного файла для открытия либо для сохранения базы данных. Для вызова диалогов использовать 2 компонента button с соответствующими названиями

	для «обнуления» данных, т.е. создания новой базы использовать компонент button с подписью «создать базу».

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

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

	выполнить сортирование базы данных в автоматизированном режиме. Что исключит лишние действия пользователя по периодическому нажатию кнопки «сортировка». Действие сортировки выполнить уникальным, специально разработанным методом при каждом изменении базы данных.


3. Математическая формулировка задачи и выбор метода обработки информации



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

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

2) выполнить вычисление объема реализации по формуле, указанной в задании.

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

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

Элемент автоматической сортировки встроен в систему вывода информации через компонент StringGrid. Для этого используется типизированный массив набора данных. При добавлении новой записи происходит перенос данных из StringGrid-а в типизированный массив и затем происходит прямой перебор базы данных с поиском наиболее большего в текстовом смысле значения наименования продукции с использованием функции CompareText. При определении первого большего элемента добавляемая запись записывается между строк типизированного массива, а затем все «не пустые» записи типизированного массива переносятся в уже очищенный StringGrid. Затем типизированный массив очищается. 

Таким образом исключается необходимость участия пользователя в процессе сортировки данных. Ход процесса перестроения базы данных как бы вмонтирован в операции по изменению данных. То есть конечной целью разработчика являлась создание унифицированной процедуры по преобразованию массива данных.Однако, данный метод (ровно как и метод «пузырька») применим только для малых объемов баз данных, так как преобразование большого массива информации потребует значительные ресурсы. Поэтому набор данных намеренно был ограничен 100 записями, что в полной мере удовлетворяет поставленному условию (оперирование с более чем десятью записями).

Дальнейшим возможным развитием программы может быть использование стандартизированных типов баз данных со встроенной системой индексации и поиска, со встроенными функциями сортировки. Также возможно интегрирование типизированных файлов с программами Microsoft Office Excel или Access. Также, при необходимости, возможно доработать программу до клиент/серверного положения, которое будет иметь общую систему защищенных баз данных, удобное управление, а также распределение полномочий по добавлению/изменению/удалению записей.




4. Разработка алгоритма, схема алгоритма и его описание.



На основе вышеизложенной математической формулировки задачи, составляем соответствующие подпрограммы:





Sg1.cells

2

Начало

11. процедура выполнения действий при загрузке формы:   FormShow.







           Пояснения к алгоритму 1:

Блок 2 – задание имен фиксированным столбцам в StringGrid.



3

memo1.LinesБлок 3 – вывод в поле memo сообщения о запуске.









4



Конец





Начало

12. процедура очистки StringGrid:   CleanSG.











n2=1, Sg1.Rowcount,1

2           Пояснения к алгоритму 2:



Sg1.rows[n2].clear

Блок 2 – цикл перемещения по строкам  StringGrid.



3Блок 3 – очистка строки StringGrid.







Конец

4



3. процедура очистки edit-ов:   clearedit.



1



Начало





2           Пояснения к алгоритму 3:



edit1.clearБлоки 2-6 – очистка edit-ов.





А



B





3

edit2.clear



4



edit3.clear







5

edit4.clear







6



edit5.clear







Конец

7






4. процедура создания новой базы:   button4click.



1



Начало

           Пояснения к алгоритму 4:



Нет

Да

 2

messagedlgБлок 2 – запрос удаления несохраненных данных.

Блок 3 – вызов процедуры.



cleansg

 3Блок 4 – вывод в поле memo подтверждение создания базы.







 4

memo1.lines.insert







7

Конец





5. процедура добавления записи:   button1click.

           Пояснения к алгоритму 5:

Блок 2 – проверка edit-ов на не пустые строки.

Блок 3 – попытка присвоить строке целочисленные переменные.

                сообщение о необходимости полей 2…5 быть числом.

Блок 4 – задание начального условия цикла.

Блоки 5,6 – цикл очистки типового массива.

Блок 7 – задание начального условия цикла.

Блоки 8,9,10 – цикл перевода строки StringGrid в массив записей.

Блок 11 – задание начального условия цикла.

Блоки 12,13,14 – цикл нахождения количества записей больших добавленного значения.

Блок 13 – выполнение условия сравнения текстовых переменных.

Блоки 15,16 – междустрочное добавление записи в массив.

Блок 17 – вызов процедуры.

Блок 18 – задание начального условия цикла.

Блоки 19,20,21,22,23 – цикл перевода массива в StrinпGrid.

Блок 24 – вызов процедуры очистки edit-ов.

Блок 25 – вызов процедуры авторасчета.

                 сообщение о необходимости всех полей к обязательному заполнению.



Начало

1







Да

Нет



If edit1.text <>'' and    edit2.text <>'' and edit3.text <>'' and edit4.text <>'' and edit5.text <>''

 2





А







Да

Нет

B

messagedlg



Try:n=strtoint(edit2…5)

 3









n = 0

 4



n = 0, 200, 1

5







 6



Mzap[n].prod:='';

Mzap[n].onng:=0;

Mzap[n].plan:=0;

Mzap[n].onkg:=0;

Mzap[n].svocep:=0;













 7



n = 1



8

n = 1, sg1.rowcount, 1







sg1.Cells[0,n]<>''

Нет

Да

 9





D

C



B

А



D

C

B

А







Mzap[2*n].prod:=sg1.Cells[0,n];

Mzap[2*n].onng:=strtoint(sg1.cells[1,n]);

Mzap[2*n].plan:=strtoint(sg1.cells[2,n]);

Mzap[2*n].onkg:=strtoint(sg1.cells[3,n]);

Mzap[2*n].svocep:=strtofloat(sg1.cells[5,n]);

10







n = 1, n = 0

11





12



n = 1, 200, 1





Нет

Да

13





(Mzap[2*n].prod<>'') and (CompareText(edit1.Text,Mzap[2*n].prod)>0)







14

L = L + 1













15

k = 2L + 1





Mzap[k].prod:=edit1.Text;

Mzap[k].onng:=strtoint(edit2.text);

Mzap[k].plan:=strtoint(edit3.text);

Mzap[k].onkg:=strtoint(edit4.text);

Mzap[k].svocep:=strtofloat(edit5.text);



16











cleansg

17







18

n = 1, k = 1





19



n = 1, 200, 1





Нет

Да

20

Mzap[n].prod<>''





D

C

B

А





D

C

B

А







sg1.Cells[0,k]:=Mzap[n].prod;

sg1.Cells[1,k]:=inttostr(Mzap[n].onng);

sg1.Cells[2,k]:=inttostr(Mzap[n].plan);

sg1.Cells[3,k]:=inttostr(Mzap[n].onkg);

sg1.Cells[5,k]:=floattostr(Mzap[n].svocep);



21













22

k = k +1





n = n + 1

23









B

А

24

cleanedit







messagedlg



25

autorachet







Конец

26



6. процедура автоматического расчета:   autorachet.



           Пояснения к алгоритму 6:

Блок 2 – формирование цикла.

Блок 3 – условие математического расчета (при не пустой ячейке - выполняется).

Блок 4 – выполнение математических расчетов.

Блоки 5,6,7 – поиск максимального элемента.

Блок 8 – вывод в поле memo наименование статьи с наибольшим значением.




1

Начало





2



n = 1, sg1.rowcount, 1





Нет

Да

3

Sg1.cells[0,n]<>''



D

C

B

А



D

C

B

А

4

Sg1.cells[4,n]:=inttostr(strtoint(cells[1,n])+strtoint(cells[2,n])-strtoint(cells[3,n]));



Sg1.cells[6,n]:=floattostr(strtoint(cells[4,n])*strtofloat(cells[5,n])/1000);















Да

5



Нет



Sg1.cells[6,n]>max







6

L = n





max = Sg1.cells[6,n]

7















8



memo1.lines



9

Конец



7. процедура сохранения базы:   button6click.



           Пояснения к алгоритму 7:

Блоки 2,3 – открытие для записи данных.

Блок 4 – задание начального условия цикла.

Блоки 5,6 – повторный цикл очистки массива.

Блок 7 – задание начального условия цикла.

Блоки 8,9,10 – повторение цикла перевода строки StringGrid в массив записей.

Блоки 11,12 – запись в файл.

Блок 13 – закрытие файла.

Блок 14 – вывод в поле memo подтверждения.





1

Начало



assignfile(filezap,filenamezap);



2







rewrite(filezap);

n:=0;



3







 4

n = 0





5



n = 0, 200, 1





Mzap[n].prod:='';

Mzap[n].onng:=0;

Mzap[n].plan:=0;

Mzap[n].onkg:=0;

Mzap[n].svocep:=0;





 6









 7



n = 1



8



n = 1, sg1.rowcount, 1





Нет

Да

 9

sg1.Cells[0,n]<>''







10

Mzap[2*n].prod:=sg1.Cells[0,n];

Mzap[2*n].onng:=strtoint(sg1.cells[1,n]);

Mzap[2*n].plan:=strtoint(sg1.cells[2,n]);

Mzap[2*n].onkg:=strtoint(sg1.cells[3,n]);

Mzap[2*n].svocep:=strtofloat(sg1.cells[5,n]);













n = 1, 100, 1

11







12



filezap, mzap[n]





А



А

13

сlosefile (filezap);





14



memo1.lines





15

Конец




8. процедура открытия базы:   button5click.



           Пояснения к алгоритму 8:

Блоки 2,3 – открытие для чтения данных.

Блок 4 – задание начального условия цикла.

Блоки 5,6 – повторный цикл очистки массива.

Блоки 7,8,9 – чтение из типизированного файла в типизированный массив.

Блок 10 – вызов подтверждения очистки StringGrid.

Блок 11 – задание начального условия цикла.

Блоки 12,13,14,15,16 – повтор цикла перевода массива в StringGrid.

Блок 17 – вызов процедуры расчета.

Блок 18 – вывод в поле memo подтверждения.



1



Начало



assignfile(filezap,filenamezap);



2



reset(filezap);

n:=0;



3



 4



n = 0



n = 0, 200, 1

5





 6

Mzap[n].prod:='';

Mzap[n].onng:=0;

Mzap[n].plan:=0;

Mzap[n].onkg:=0;

Mzap[n].svocep:=0;













А






А



 7

while not eof(filezap)





8

filezap, mzap[n]





n = n + 1

 9







cleansg

10





11

n = 1, k = 1





n = 1, 200, 1

12





Да

13

Mzap[n].prod<>''

Нет







14



sg1.Cells[0,k]:=Mzap[n].prod;

sg1.Cells[1,k]:=inttostr(Mzap[n].onng);

sg1.Cells[2,k]:=inttostr(Mzap[n].plan);

sg1.Cells[3,k]:=inttostr(Mzap[n].onkg);

sg1.Cells[5,k]:=floattostr(Mzap[n].svocep);











15



k = k +1





16

n = n + 1







17

autorachet





А



А



Конец

memo1.lines

18





19



9. процедура удаления базы:   button3click.



           Пояснения к алгоритму 9:

Блок 2 – очистка выбранной строки.

Блок 3 – задание начального условия цикла.

Блоки 4,5 – повторный цикл очистки массива.

Блок 6 – задание начального условия цикла.

Блоки 7,8,9 – повторение цикла перевода строки StrinGrid в массив записей.

Блок 10 – задание начального условия цикла.

Блоки 11,12,13,14,15 – повтор цикла перевода массива в StrinGrid.

Блок 16 – расчет.




1



Начало





2

sg1.Rows[sg1.Row].Clear;





n = 0, 200, 1

 3

n = 0

Mzap[n].prod:='';

Mzap[n].onng:=0;

Mzap[n].plan:=0;

Mzap[n].onkg:=0;

Mzap[n].svocep:=0;









 4





 5







 6



n = 1





 7

n = 1, sg1.rowcount, 1





C

B

А





C

B

А



Нет

Да

 8

sg1.Cells[0,n]<>''

Mzap[2*n].prod:=sg1.Cells[0,n];

Mzap[2*n].onng:=strtoint(sg1.cells[1,n]);

Mzap[2*n].plan:=strtoint(sg1.cells[2,n]);

Mzap[2*n].onkg:=strtoint(sg1.cells[3,n]);

Mzap[2*n].svocep:=strtofloat(sg1.cells[5,n]);









 9











n = n + 1

k = k +1

sg1.Cells[0,k]:=Mzap[n].prod;

sg1.Cells[1,k]:=inttostr(Mzap[n].onng);

sg1.Cells[2,k]:=inttostr(Mzap[n].plan);

sg1.Cells[3,k]:=inttostr(Mzap[n].onkg);

sg1.Cells[5,k]:=floattostr(Mzap[n].svocep);



Нет

Да

Mzap[n].prod<>''

n = 1, 200, 1

10

n = 1, k = 1

autorachet







11









12









13

















14



15



16



Конец

17






10. клик StringGrid-а.



           Пояснения к алгоритму 10:



Начало

1Блок 2 – подтверждение выбора.





2



memo1.lines





3



Конец



11. вызов печати.



           Пояснения к алгоритму 11:



Начало

1Блок 2 – вызов стандартного почтового клиента.



2



shellexecute



3



Конец





12. выход.



           Пояснения к алгоритму 12:



Начало

1Блок 2 – выход из программы.



1



halt





3



Конец



5. Форма представления исходных данных



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



type zap=record

prod:string[80];

onng:longint;

plan:longint;

onkg:longint;

svocep:extended;

end;



Т.е. данная переменная представляет собой линейный массив переменных данных необходимого нам типа. Для организации двумерного массива, опишем в разделе переменных массив «Mzap»:



var

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

Типизированный файл представляет собой набор типизированных элементов, структура и наименование которого описаны в вышеназванном разделе переменных:



filezap: file of zap;

filenamezap:string;


6. Разработка интерфейса



Принимая во внимание поставленную ранее задачу, создаем на форме следующие визуальные компоненты:

- StringGrid - для визуального отображения данных в табличной форме. Шапка таблицы будет повторять таблицу, указанную в начальном условии, и заполняется при открытии формы. Предустановленное максимальное количество строк – 100, столбцов – 7. Ширины столбцов выбираем в соответствии с размерностью данных. 

- MEMO-поле для вывода данных, указанных в условии.

- 5  компонентов edit для добавления / изменения / удаления записей в базу данных (компоненты имеют ширину, соответствующую ширинам стобцов, и расположены напротив каждого столбца снизу) (см. рис. 1).





Рис.1. Общий вид приложения.

2 button-а для добавления и удаления записи, названных соответственно выполняемой функции. Так как для отображения информации в StringGrid используется текстовая форма, предусмотрено невозможность ввода текстовых данных в численные поля с выводом соответствующего сообщения, а также невозможность внесения «пустого» поля, так как все поля базы данных, необходимые для математического расчета по условиям задачи, должны быть обязательными для заполнения. Эти события регистрируются специальными предвартельными условиями и при обнаружения несоответствия выводится окно, отображающее наименование ошибки (см. рис.2 и рис.3).



Рис.2. Ошибка при добавлении пустого (пыстых) полей.





Рис.3. Ошибка при добавлении не численного значения.

- использованы стандартные диалоги OpenDialog и SaveDialog для предоставления пользователю возможности визуального выбора имени и пути типизированного файла для открытия либо для сохранения базы данных  (См. рис.4).



Рис.4. Стандартное диалоговое окно для открытия базы данных.



Для вызова диалогов использованы 2 компонента button с соответствующими названиями. А для «обнуления» данных, т.е. создания новой базы использовать компонент button с подписью «создать базу».

Для дублирования функций программы и создания дополнительного удобства работы с приложением применен компонент menu с соответствующими подменю и подписями кнопок.

Расположение кнопок и других полей выбрано для гарантированного удобства работы с приложением.




7. Листинг программы



unit EconomInfo;



interface



uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, Grids, Menus, StdCtrls,shellapi;



type

  TForm1 = class(TForm)

    sg1: TStringGrid;

    MainMenu1: TMainMenu;

    N1: TMenuItem;

    N2: TMenuItem;

    N3: TMenuItem;

    N4: TMenuItem;

    N5: TMenuItem;

    N6: TMenuItem;

    N7: TMenuItem;

    N9: TMenuItem;

    N10: TMenuItem;

    N11: TMenuItem;

    Memo1: TMemo;

    Edit1: TEdit;

    Edit2: TEdit;

    Edit3: TEdit;

    Edit4: TEdit;

    Edit5: TEdit;

    Button1: TButton;

    Button3: TButton;

    Button4: TButton;

    Button5: TButton;

    Button6: TButton;

    OpenDialog1: TOpenDialog;

    SaveDialog1: TSaveDialog;

    N8: TMenuItem;

    procedure FormShow(Sender: TObject);

    procedure cleansg(Sender: TObject);

    procedure cleanedit(Sender:TObject);

    procedure Button4Click(Sender: TObject);

    procedure Button1Click(Sender: TObject);

    procedure autorachet(Sender: TObject);

    procedure Button6Click(Sender: TObject);

    procedure Button5Click(Sender: TObject);

    procedure Button3Click(Sender: TObject);

    procedure sg1Click(Sender: TObject);

    procedure N8Click(Sender: TObject);

    procedure N5Click(Sender: TObject);



  private

    { Private declarations }

  public

    { Public declarations }

  end;



var

  Form1: TForm1;



implementation



{$R *.dfm}





type zap=record // объявление типа записи

prod:string[80];

onng:longint;

plan:longint;

onkg:longint;

svocep:extended;

end;

var

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

filezap: file of zap;

filenamezap:string;



//процедура выполнения действий при загрузке формы

procedure TForm1.FormShow(Sender: TObject);

begin

with sg1 do begin

Cells[0,0]:='Наименование продукции';

Cells[1,0]:='ОнНГ';

Cells[2,0]:='ПВ';

Cells[3,0]:='ОнКГ';

Cells[4,0]:='ОР, шт';

Cells[5,0]:='СвОЦЕП, руб';

Cells[6,0]:='СвОЦВОР, т.руб';

end;

memo1.Lines.Insert(0,DateTimeToStr(Now)+' - Программа запущена!');

end;



//процедура очистки стринггрида

procedure Tform1.cleansg(Sender: TObject);

var n2:integer;

begin

with sg1 do begin

for n2:=1 to RowCount do begin

Rows[n2].Clear;

end;

end;

end;



//процедура очистки эдитов

procedure Tform1.cleanedit(Sender: TObject);

begin

edit1.Clear;

edit2.Clear;

edit3.Clear;

edit4.Clear;

edit5.Clear;

end;



//Создание новой базы

procedure TForm1.Button4Click(Sender: TObject);

begin

if messagedlg('Все несохраненные данные текушей базы будут стерты!',mtconfirmation,mbYesNoCancel,0)=mrYes then begin

cleansg(Sender);

memo1.Lines.Insert(0,DateTimeToStr(Now)+' - Новая база создана. Пожалуйста сохраните, задав новое имя.');

end;

end;



//добавление записи

procedure TForm1.Button1Click(Sender: TObject);

var n,k,l:integer;o:extended;

begin

//проверка на пустые поля edit-ов

if (edit1.Text<>'') and (edit2.Text<>'') and (edit3.Text<>'') and (edit4.Text<>'') and (edit5.Text<>'') then

begin

try

  n:=strtoint(edit2.text);

  n:=strtoint(edit3.text);

  n:=strtoint(edit4.text);

  o:=strtofloat(edit5.text);

except

on EConvertError do messagedlg('Поля 2..5 должны быть числом!',mterror,mbOKCancel,1);

end;

//цикл очистки массива записей

n:=0;

repeat

Mzap[n].prod:='';

Mzap[n].onng:=0;

Mzap[n].plan:=0;

Mzap[n].onkg:=0;

Mzap[n].svocep:=0;

n:=n+1;

until n>=200;

//цикл перевода строк stringgrid-a в массив записей

n:=1;

repeat

if sg1.Cells[0,n]<>'' then begin

Mzap[2*n].prod:=sg1.Cells[0,n];

Mzap[2*n].onng:=strtoint(sg1.cells[1,n]);

Mzap[2*n].plan:=strtoint(sg1.cells[2,n]);

Mzap[2*n].onkg:=strtoint(sg1.cells[3,n]);

Mzap[2*n].svocep:=strtofloat(sg1.cells[5,n]);

end;

n:=n+1;

until n>=sg1.RowCount;

//цикл нахождения количества записей больших добавляемого значения

n:=1;l:=0;

repeat

if (Mzap[2*n].prod<>'') and (CompareText(edit1.Text,Mzap[2*n].prod)>0) then l:=l+1;

n:=n+1;

until n>=200;

//междустрочная запись в массив

k:=2*l+1;

Mzap[k].prod:=edit1.Text;

Mzap[k].onng:=strtoint(edit2.text);

Mzap[k].plan:=strtoint(edit3.text);

Mzap[k].onkg:=strtoint(edit4.text);

Mzap[k].svocep:=strtofloat(edit5.text);

cleansg(sender); //вызов очистки стрингрида

//цикл перевода массива записей в стринггрид

n:=1;k:=1;

repeat

if Mzap[n].prod<>'' then begin

sg1.Cells[0,k]:=Mzap[n].prod;

sg1.Cells[1,k]:=inttostr(Mzap[n].onng);

sg1.Cells[2,k]:=inttostr(Mzap[n].plan);

sg1.Cells[3,k]:=inttostr(Mzap[n].onkg);

sg1.Cells[5,k]:=floattostr(Mzap[n].svocep);

k:=k+1;

end;

n:=n+1;

until n>=200;

cleanedit(Sender); //вызов очистки эдитов

autorachet(sender);

end

else messagedlg('Все поля обязательна для заполенения!',mterror,mbOKCancel,1); //вызов предупреждения

end;



//Процедура автоматического расчета

procedure Tform1.autorachet(Sender: TObject);

var n,l:longint; max:extended;

begin

n:=1;

max:=0;

repeat

with sg1 do begin

if cells[0,n]<>'' then begin

cells[4,n]:=inttostr(strtoint(cells[1,n])+strtoint(cells[2,n])-strtoint(cells[3,n]));

cells[6,n]:=floattostr(strtoint(cells[4,n])*strtofloat(cells[5,n])/1000);

if strtofloat(cells[6,n])>max then begin l:=n; max:=strtofloat(cells[6,n]);end;

end;

end;

n:=n+1;

until n>=sg1.rowCount;

memo1.Lines.Insert(0,DateTimeToStr(Now)+' - Расчет произведен. Максимальный СвОЦВОР '+floattostr(max)+' руб. у '+sg1.cells[0,l]);

end;



procedure TForm1.Button6Click(Sender: TObject);

var n:longint;

begin

with savedialog1 do begin

title:='Сохранение базы';

if execute then

begin

filenamezap:=filename;

assignfile(filezap,filenamezap);

rewrite(filezap);

n:=0;

repeat

Mzap[n].prod:='';

Mzap[n].onng:=0;

Mzap[n].plan:=0;

Mzap[n].onkg:=0;

Mzap[n].svocep:=0;

n:=n+1;

until n>=200;

n:=1;

repeat

if sg1.Cells[0,n]<>'' then begin

Mzap[n].prod:=sg1.Cells[0,n];

Mzap[n].onng:=strtoint(sg1.cells[1,n]);

Mzap[n].plan:=strtoint(sg1.cells[2,n]);

Mzap[n].onkg:=strtoint(sg1.cells[3,n]);

Mzap[n].svocep:=strtofloat(sg1.cells[5,n]);

end;

n:=n+1;

until n>=sg1.RowCount;

for n:=1 to 100 do write(filezap,mzap[n]);

closefile(filezap);

end;

end;

memo1.Lines.Insert(0,DateTimeToStr(Now)+' - База сохранена под именем '+filenamezap);

end;



rocedure TForm1.Button5Click(Sender: TObject);

var n,k:longint;

begin

with opendialog1 do begin

title:= 'Открытие базы';

if execute then

begin

filenamezap:=filename;

assignfile(filezap,filenamezap);

reset(filezap);

n:=0;

repeat

Mzap[n].prod:='';

Mzap[n].onng:=0;

Mzap[n].plan:=0;

Mzap[n].onkg:=0;

Mzap[n].svocep:=0;

n:=n+1;

until n>=200;

n:=1;

while not eof(filezap) do

begin

read(filezap,mzap[n]);

n:=n+1;

end;

cleansg(sender);

n:=0;k:=1;

repeat

if Mzap[n].prod<>'' then begin

sg1.Cells[0,k]:=Mzap[n].prod;

sg1.Cells[1,k]:=inttostr(Mzap[n].onng);

sg1.Cells[2,k]:=inttostr(Mzap[n].plan);

sg1.Cells[3,k]:=inttostr(Mzap[n].onkg);

sg1.Cells[5,k]:=floattostr(Mzap[n].svocep);

k:=k+1;

end;

n:=n+1;

until n>=200;

autorachet(sender);

end;

end;

memo1.Lines.Insert(0,DateTimeToStr(Now)+' - База '+filenamezap+ ' открыта');

end;



//процедура удаления записи

procedure TForm1.Button3Click(Sender: TObject);

var n,k:longint;

begin

sg1.Rows[sg1.Row].Clear;

n:=0;

repeat

Mzap[n].prod:='';

Mzap[n].onng:=0;

Mzap[n].plan:=0;

Mzap[n].onkg:=0;

Mzap[n].svocep:=0;

n:=n+1;

until n>=200;

n:=1;

repeat

if sg1.Cells[0,n]<>'' then begin

Mzap[n].prod:=sg1.Cells[0,n];

Mzap[n].onng:=strtoint(sg1.cells[1,n]);

Mzap[n].plan:=strtoint(sg1.cells[2,n]);

Mzap[n].onkg:=strtoint(sg1.cells[3,n]);

Mzap[n].svocep:=strtofloat(sg1.cells[5,n]);

end;

n:=n+1;

until n>=sg1.RowCount;

cleansg(sender);

n:=0;k:=1;

repeat

if Mzap[n].prod<>'' then begin

sg1.Cells[0,k]:=Mzap[n].prod;

sg1.Cells[1,k]:=inttostr(Mzap[n].onng);

sg1.Cells[2,k]:=inttostr(Mzap[n].plan);

sg1.Cells[3,k]:=inttostr(Mzap[n].onkg);

sg1.Cells[5,k]:=floattostr(Mzap[n].svocep);

k:=k+1;

cleanedit(Sender); //вызов очистки эдитов

end;

n:=n+1;

until n>=200;

autorachet(sender);

end;



procedure TForm1.sg1Click(Sender: TObject);

begin

edit1.Text:=sg1.Cells[0,sg1.Row];

edit2.Text:=sg1.Cells[1,sg1.Row];

edit3.Text:=sg1.Cells[2,sg1.Row];

edit4.Text:=sg1.Cells[3,sg1.Row];

edit5.Text:=sg1.Cells[5,sg1.Row];

memo1.Lines.Insert(0,DateTimeToStr(Now)+' - Запись № '+inttostr(sg1.Row)+ ' выбрана');

end;



procedure TForm1.N8Click(Sender: TObject);

begin

ShellExecute(form1.Handle, nil,PChar('mailto:ultrix@tut.by?Subject=EcoInfo'),'','', 0);

end;



procedure TForm1.N5Click(Sender: TObject);

begin

halt;

end;



end.


8. Результаты проведенных расчетов и их анализ.



В данной курсовой работе нам необходимо было рассчитать объем реализации и стоимость в оптовых ценах всего объема реализации продукции за плановый период. Для расчетов нам были даны исходные данные о выручке от реализации продукции за плановый период (Табл. 1).



Таблица1. Сведения о выручке от реализации продукции за плановый период.

Наименование продукции

Остатки на начало года

План выпуска

Остатки на конец года

Объем реализации, шт.

Стоимость в оптовых ценах единицы продукции, руб.

Стоимость в оптовых ценах всего объема реализации, тыс. руб.

1

2

3

4

5

6

7

Яблоко

711

40000

500



200000



Апельсин

236

80000

100



500150



Ананас

348

60000

200



400000



Мандарин 

117

90000

50



550000



Грейпфрут

284

50000

150



450000



Банан

173

70000

300



350000



Абрикос

513

95000

450



300000



Персик

286

65000

600



250000



Виноград

482

85000

300



600000



Груша

136

40000

150



650000





Расчеты производились следующим образом:

Рассчитаем объем реализации продукции за плановый период. Объем реализации, в нашем, случае равен сумме остатков на начало года с планом выпуска за вычетом остатков на конец года по каждому виду реализованной продукции (Табл. 2).




Таблица2. Сведения о выручке от реализации продукции за плановый период.

Наименование продукции

Остатки на начало года

План выпуска

Остатки на конец года

Объем реализации, шт.

Стоимость в оптовых ценах единицы продукции, руб.

Стоимость в оптовых ценах всего объема реализации, тыс. руб.

1

2

3

4

5

6

7

Яблоко

711

40000

500

40211

200000



Апельсин

236

80000

100

80136

500150



Ананас

348

60000

200

60148

400000



Мандарин 

117

90000

50

90067

550000



Грейпфрут

284

50000

150

50134

450000



Банан

173

70000

300

69873

350000



Абрикос

513

95000

450

95063

300000



Персик

286

65000

600

64686

250000



Виноград

482

85000

300

85182

600000



Груша

136

40000

150

39986

650000





Зная стоимость в оптовых ценах единицы продукции, мы можем рассчитать стоимость в оптовых ценах всего объема реализации произведением объема реализации и стоимости в оптовых ценах единицы продукции (Табл. 3).



Таблица3. Сведения о выручке от реализации продукции за плановый период.

Наименование продукции

Остатки на начало года

План выпуска

Остатки на конец года

Объем реализации, шт.

Стоимость в оптовых ценах единицы продукции, руб.

Стоимость в оптовых ценах всего объема реализации, тыс. руб.

1

2

3

4

5

6

7

Яблоко

711

40000

500

40211

200000

8042200

Апельсин

236

80000

100

80136

500150

40080020,4

Ананас

348

60000

200

60148

400000

24059200

Мандарин 

117

90000

50

90067

550000

49536850

Грейпфрут

284

50000

150

50134

450000

22560300

Банан

173

70000

300

69873

350000

24455550

Абрикос

513

95000

450

95063

300000

28518900

Персик

286

65000

600

64686

250000

16171500

Виноград

482

85000

300

85182

600000

51109200

Груша

136

40000

150

39986

650000

25990900



Анализируя данные расчета мы можем сказать, что наиболее выгодно для продавца производить и реализовывать по цене 600000 руб. виноград т.к. этот продукт наиболее востребован покупателем и производитель получит за него наибольшую прибыль (51109200 тыс. руб.). Также будет выгодно производить и реализовывать по цене 500150 и 550000 руб. апельсины и мандарины соответственно т.к. за реализацию этих продуктов производитель получит высокую прибыль (40080020,4 и 49536850 соответственно). При производстве таких продуктов как ананасы (400000 руб.), грейпфрут (22560300 руб.), банан (24455550 руб.), абрикос (28518900 руб.), персик (16171500 руб.), груша (25990900 руб.), производитель будет получать хорошую прибыль, но при разных объемах и цене от реализации, подстраиваясь под потребности покупателя. Эти продукты можно было производить под заказ для реализации сторонним покупателем в не основной деятельности. Не выгодным продуктом для производства и реализации по цене 200000 руб. и объеме 40000 шт. является яблоко т.к. этот продукт не приносит хорошей прибыли.

В результате анализа мы можем сделать вывод,  что наиболее выгодно для предприятия производить и реализовывать виноград, апельсины и мандарины т.к. эти продукты наиболее востребованы потребителем и влечет большие прибыли для предприятия.

Все расчеты производились в созданной нами программе на алгоритмическом языке ObjectPascal в визуальной среде Delphi. Для удобства расчета и просматривания результатов все наименование товара автоматически располагается в алфавитном порядке. Наибольшую прибыль и результат расчета мы можем видеть в поле memo куда эти данные также заносятся автоматически (рис. 5).





Рис.5. Общий вид приложения с расчетом и результатами.


Выводы



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

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


Список использованной литературы



		Архангельский А.Я. Программирование в Delphi 6 ––М.: ЗАО «Издательство БИНОМ», 2002г. – 1200 с.

		Кандзюба С.П., Громов В.Н. Delphi 6. Базы данных и приложения. Лекции и упражнения. – К.: Издательство «ДинСофт», 2001. – 576 с.

		Фаронов В.В. Delphi 6. Учебный курс. Издательство Молгачев С.В., 2001. – 672с.

		Программирование в среде Delphi: Лабораторный практикум для студентов всех специальностей. Под общей редакцией Синицына А.К. – Мн.; БГУИР, 1998. – 94 с.

		Основы информатики и вычислительной техники. Методические указания к выполнению курсовой работы для студентов факультета предпринимательства и управления специальности Э 03. 02. 00 «Экономическая информатика». Фурунжиев Р.И. – Ротапринт БАТУ, Мн.: 2000. – 25 с.

		Архангельский А.Я. Программирование в Delphi 6 ––М.: ЗАО «Издательство БИНОМ», 2002г. – 1200 с.

		Кандзюба С.П., Громов В.Н. Delphi 6. Базы данных и приложения. Лекции и упражнения. – К.: Издательство «ДинСофт», 2001. – 576 с.

		Фаронов В.В. Delphi 6. Учебный курс. Издательство Молгачев С.В., 2001. – 672с.

		Программирование в среде Delphi: Лабораторный практикум для студентов всех специальностей. Под общей редакцией Синицына А.К. – Мн.; БГУИР, 1998. – 94 с.

		Основы информатики и вычислительной техники. Методические указания к выполнению курсовой работы для студентов факультета предпринимательства и управления специальности Э 03. 02. 00 «Экономическая информатика». Фурунжиев Р.И. – Ротапринт БАТУ, Мн.: 2000. – 25 с.


Приложения



К данному курсовому проекта прилагается магнитный носитель информации (дискета 3,5’’, 1,44Mb) с электронной версией пояснительной записки, полученным Windows-приложением (файл EcoInfo.exe), исходными текстами программы (файл EconomInfo.pas), а также другими необходимыми файлами для компиляции приложения.







2