Белорусскийнациональный технический университет
Кафедра информационныхсистем и технологий
ПОЯСНИТЕЛЬНАЯЗАПИСКА
ккурсовому проекту (работе)
подисциплине «Конструирование программ и языки программирования»
Тема: ”Программная реализация разложения временного процессав тригонометрический ряд”
Исполнитель:_______________________
(подпись)
Студент 2 курса 417318 группы
Руководитель: _____________________ Гурский Н.Н.
(подпись)
Минск2010
Содержание
Оглавление
Введение
1.Математическая формулировка задачи
2.Описание программы
2.1Структурная схема программы
2.2Описание разработанного класса
2.3Описание реализации технологии COM
2.4Описание динамических библиотек
2.5Основные возможности программы
2.6Средства использования сервисов, предоставляемых Microsoft Office
3.Руководство пользователя
4.Методика испытаний
Заключение
Литература
Приложение
Файлпроекта VremRiad.dpr
Файлголовного модуля UnitMain.pas
Файлвывода графика UnitGraphic.pas
Файлреализации класса — UnitRiad.pas
Файлописания динамической библиотеки About.dpr
Файлописания динамической библиотеки Prompt.dpr
Файлпроекта COM-сервера – MyServer.dpr
Файлописания COM- класса – UComRiad.pas
Введение
Временным рядом обычноназывается последовательность событий, наблюдаемых через некоторые, как правило,равные интервалы времени. Применительно к валютному дилингу это может бытьтекущее дневное значение обменного курса, по которому произошла очереднаясделка — когда мы изучаем дневной арбитраж, либо значение цены закрытия — еслимы пытаемся построить прогноз на несколько дней вперед.
Временной ряд — этоупорядоченная (по времени) последовательность значений некоторой произвольнойпеременной величины. Каждое отдельное значение данной переменной называетсяотсчётом временного ряда. Тем самым, временной ряд существенным образомотличается от простой выборки данных.
Анализ временных рядов —совокупность математико-статистических методов анализа, предназначенных длявыявления структуры временных рядов и для их прогноза. Сюда относятся, вчастности, методы регрессионного анализа. Выявление структуры временного ряданеобходимо для того, чтобы построить математическую модель того явления,которое является источником анализируемого временного ряда. Прогноз будущихзначений временного ряда используется при принятии решений, например, вэкономике.
Временные ряды состоят издвух элементов:
· периода времени,за который или по состоянию на который приводятся числовые значения;
· числовых значенийтого или иного показателя, называемых уровнями ряда.
Данная программапозволяет получить численные значения, описываемые следующей функциональнойзависимостью
/>
при заданных начальныхданных
/>
Результаты отображаются ввиде таблицы и графиков, совмещенных в одной системе координат.
Для разработки программыбыла выбрана среда визуального проектирования Borland Delphi 7.0. Она позволяетза короткий промежуток времени и с наименьшими затратами физических иумственных сил создавать прикладные программы различной направленности,обеспечивая при этом наличие дружественного оконного интерфейса. Указанные (атакже ряд других) преимущества среды Delphi 7.0. обуславливают широкое еёиспользование при создании программного обеспечения разнообразного назначения.
1.Математическая формулировка задачи
Разложения временного процесса в тригонометрический ряд осуществляетсяпри вычислении численных значений при использовании следующей функциональнойзависимости:
/>
Начальные данные:
/>
Вычисления необходимо провести для трех значений />:
/> /> />
Результаты получить ввиде таблицы и графиков, совмещенных в одной системе координат.
2.Описание программы 2.1 Структурная схема программы
Структурно программасостоит из главного модуля, модулей описания вспомогательных форм, динамическихбиблиотек, файлов помощи и обращений к другим программам. Связь модулейприведена на рисунке 2.1.
/>
Рисунок-2.1. Структурнаясхема связей модулей программы2.2 Описаниеразработанного класса
В результате анализапредметной области для её описания и моделирования был разработан класс TRiad, инкапсулирующий поля, методы исвойства, применимые к рассматриваемому объекту.
TRiad = class//класс
private
IniFile:TIniFile; //Объект Ini-файла
w: integer;
public
ConstructorCreate(AIniFileName: string);
Destructor Destroy;
procedureGraphic(AChart:TChart); //Постоение графика
procedureTable(AStringGrid:TStringGrid); //Вывод в таблицу
procedureWriteToIniFile; //Запись в Ini-файл
procedureReadFromIniFile; //Чтение из Ini-файла
function GetW: integer; //Получить w
procedureSetW; //Установить w
functionF(w:integer;t:extended):extended;//Вычисление суммы
//property ww: integer read GetW write SetW;
private
end;
Назначение полей иинкапсулированных в классе процедур и функций (методов) приведено вкомментариях. Описание и реализация класса структурно оформлено в отдельном Unit – UnitRiad. Используемые секции public и private определяют области видимости элементов класса. Так,видно, что все поля класса являются полностью закрытыми, а доступ к ниморганизуется с помощью методов и свойств. 2.3 Описание реализации технологии COM
В соответствии стребованиями на разработку данной курсовой работы была также реализованавозможность экспорта методов созданного класса с помощью технологии COM. Дляэтого был создан сервер в виде DLL –программный модуль MyServer.
libraryMyServer;
{ Importantnote about DLL memory management: ShareMem must be the first unit in yourlibrary's USES clause AND your project's (select Project-View Source) USESclause if your DLL exports any procedures or functions that pass strings asparameters or function results. This applies to all strings passed to and fromyour DLL--even those that are nested in records and classes. ShareMem is theinterface unit to the BORLNDMM.DLL shared memory manager, which must bedeployed along with your DLL. To avoid using BORLNDMM.DLL, pass stringinformation using PChar or ShortString parameters. }
uses
SysUtils,
ComServ,
UComRiad in'UComRiad.pas',
UCom_Tlb in'UCom_Tlb.pas',
Classes,
MyServer_TLBin 'MyServer_TLB.pas';
exports
DllGetClassObject,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer;
{$R *.TLB}
{$R *.res}
begin
end.
Этот сервер позволяетсоздать COM-объект, описание класса которого находится в модуле UСomRiad. Следует заметить, что данный классполностью соответствует, приведенному в п.2.2 классу TRiad и имеет и такое же название, т.е. он является его копией,за исключение конструктора Create, который заменен обычной процедурой.Непосредственный доступ к открытым элементам COM-класса осуществляется спомощью интерфейса IcomRiad,описанного в модуде UCom_Tlb. 2.4 Описание динамических библиотек
При разработке приложениябыли реализованы 2 динамические библиотеки.
Динамическая библиотека Prompt.dll содержит заставку, появляющуюся после запускапрограммы, но до появления главного окна.
Библиотека содержит 1экспортируемую процедуру ShowPrompt, служащую для отображения формы.
libraryPrompt;
{ Importantnote about DLL memory management: ShareMem must be the first unit in yourlibrary's USES clause AND your project's (select Project-View Source) USESclause if your DLL exports any procedures or functions that pass strings asparameters or function results. This applies to all strings passed to and fromyour DLL--even those that are nested in records and classes. ShareMem is theinterface unit to the BORLNDMM.DLL shared memory manager, which must bedeployed along with your DLL. To avoid using BORLNDMM.DLL, pass stringinformation using PChar or ShortString parameters. }
uses
SysUtils,
Classes,
Windows,
UnitPrompt in'UnitPrompt.pas' {FormPrompt};
{$R *.res}
//Показатьзаставку
procedureShowPrompt(AOwner:TComponent);
var
Time:extended;
Form:TFormPrompt;
begin
Form:=TFormPrompt.Create(AOwner);//Создать форму
Time:=GetTickCount/1000; //Запомнить время
Form.Show; //Показать форму
Form.Repaint; //Перерисовать форму
//Пока не вышел лимитвремени — ничего не делать
whileGetTickCount/1000
Form.Close; //Закрытьформу
Form.Free; //Уничтожить форму
end;
exports ShowPrompt;
begin
end.
Библиотека About.dll содержит форму с информацией о программе.
library About;
uses
SysUtils,
Classes,
Forms,
UnitAbout in'UnitAbout.pas' {FormAbout};
{$R *.res}
//Показатьформу
procedureShowAbout(AOwner:TComponent);
var
Form:TFormAbout;
begin
Form:=TFormAbout.Create(AOwner);//Создать форму
Form.ShowModal; //Показать форму
Form.Free; //Уничтожить форму
end;
exportsShowAbout;
begin
end.
Библиотека содержитэкспортируемую функцию ShowAbout для отображения формы. 2.5 Основные возможности программы
Программа начинается сотображения оригинальной заставки (содержится в Prompt.dll), а затем на экранепоявляется главное окно программы (модуль UnitMain). Главный модуль управляетработой всех других модулей в соответствии с запросами пользователя.
Он содержит:
· Вызов окна «Опрограмме»;
· Вызовпрезентации;
· Передачу данных вWord и Excel;
· Вызов формы«График»;
· Вызов окнапомощи;
· Сохранение данныхв Ini-файлах;
· Использованиевозможностей разработанного COM-сервера;
Диалог с пользователемподдерживается с помощью главного и выпадающего меню, панели инструментов,кнопок и других интерфейсных элементов.
Окно «О программе»содержит краткую информацию о приложении.
Окно «График» служит дляотображения информации в графической форме – в виде графиков.
В рамках данного проектатакже реализуется поддержка клиент-серверной технологии обмена данными междуприложениями.
Процесс логическоговзаимодействия пользователя c программой, назначение элементов главного окнаописаны в «Руководстве пользователя».
Вопросы непосредственнойпрограммной реализации конкретных модулей приведены в приложении. По текступрограмм даются достаточно полные комментарии, необходимые для описанияпеременных, процедур и функций, а также основных шагов реализации используемыхалгоритмов.2.6 Средстваиспользования сервисов, предоставляемых Microsoft Office
Кроме процедур и функций,описанных в классах, программа обеспечивает взаимодействие с серверамиавтоматизации приложений Microsoft Office. Так, следующие процедуры головногомодуля программы позволяют автоматически производить запуск MS Word, MS Excel,Power Point и передавать им текстовую, табличную и графическую информацию сцелью создания отчетов или использование ее для дальнейшей обработки.
1. ProcedureTFormMain.ReportExcel(AStringGrid: TStringGrid). Данная процедура обеспечивает передачуданных в Excel. Для формирования таблицы необходимо передать ссылку накомпонент типа TStringGrid, на основе данных которого будут заполнены ячейки вExcel. Рисунок, помещаемый в отчет, совпадает с текущим видом графика.
2. Procedure TFormMain.ReportWord(AStringGrid:TStringGrid). Процедура позволяет создать отчет,принятый в Word.
3. ProcedureTFormMain.PresentationClick(Sender: TObject). Активизация данной процедуры позволяет запуститьпрезентацию, которая может использоваться в рекламных и учебных целях.
3.Руководство пользователя
Для активизации программынеобходимо вызвать файл VremRiad.exe.При этом, на экране появится заставка, показанная на рисунке 3.1.
/>
Рисунок 3.1 — Заставкапрограммы
После того как заставкачерез несколько секунд исчезнет, появится главное окно программы (см. рисунок3.2).
/>
Рисунок 3.2 — Главноеокно программы
Как видно, данное окносостоит из следующих частей:
· Главного меню;
· Панелиинструментов;
· Области вводаданных;
· Области выводаинформации;
· Управляющихкнопок.
Пункты главного менюпоказаны на рисунке 3.3.
/>
Рисунок 3.3 — Главноеменю программы
В свою очередь пунктыглавного меню содержит ряд подпунктов, приведенных на рисунке 3.4.
/>
Рисунок 3.4 — Пункт меню«Файл»
При выборе пункта «Выход»происходит завершение работы приложения.
Пункт меню «Вычислить»обеспечивает разложение временного процесса в тригонометрический ряд призаданном w и вывод соответствующей информации. Если w не задано, выводитсясообщение об ошибке (рисунок 3.5).
/>
Рисунок 3.5 – Сообщениеоб ошибке
Пункты «Отчет в Word» и«Отчет в Excel» обеспечивают по желанию пользователяформирование результатов расчетов в виде текстового документа в стиле редактораMs Word или в табличном процессоре MS Excel соответсвенно.
На рисунке 3.6 приведеныкоманды, вызываемые пунктом главного меню «Помощь».
/>
Рисунок 3.6 — Пункт меню«Помощь»
При выборе пункта меню«Презентация» начинается просмотр возможностей программы под управлением PowerPoint.
Выбор пункта меню«Справка» приводит к появлению окна помощи, содержащим сведения о работе спрограммой (см. рисунок 3.7)
/>
Рисунок 3.7 — Окносправочной системы
Выбор пункта главного меню«О программе» позволяет получить на экране краткие сведения о программе в виде,показанном на рисунке 3.8.
/>
Рисунок 3.8 — Окно«About»
Кроме главного менюпрограмма управляется также кнопками на панели инструментов, которые дублируетнаиболее важные пункты главного меню и предназначены для оперативноговыполнения основных команд:
/>
Рисунок 3.9 — Панельинструментов
Также имеется четыреуправляющие кнопки, показанные на рисунке 3.10.
/>
Рисунок 3.10 — Управляющие кнопки
Кнопка «Вычислить»обеспечивает расчет состояния системы и вывод соответствующей информации.Кнопка «График» обеспечивает появление окна с графиком, т.е. имеетсявозможность просмотра результатов разложения временного процесса втригонометрический ряд при заданном значении w. Можно просмативать сразу какнесколько графиков (рисунок 3.11), так и один для определенного значения w (рисунок3.12).
/>
Рисунок 3.11 – График разложениявременного процесса в тригонометрический ряд при заданном значении w=3
/>
Рисунок 3.12 – Графикразложения временного процесса в тригонометрический ряд при заданном значенииw=3 и w=1
Кнопка «Очистить» очищаетобласть построения графиков. Для закрытия окна используется кнопка «Закрыть».
Для выхода из программыследует нажать кнопку «Выход».
4.Методика испытаний
Целью проведенияиспытаний является проверка работоспособности (надежности) программы приразличных условиях ее функционирования.
Программа должнаобеспечивать корректность ввода исходных данных (путем осуществлениясоответствующих проверок и информирования пользователя о возникших неточностяхв работе), а также получение непротиворечивого результата.
Для демонстрацииработоспособности программы необходимо провести ряд испытаний с различныминачальными условиями. Для обеспечения нормальной работы программы требуетсяналичие соответствующих DLL, а также приложений Word, Excel, PowerPoint.
Для использованияCOM-сервера, он должен быть предварительно зарегистрирован в системе. Тестовыепримеры выполнялись в среде операционной системы Windows XP Profesional прииспользовании процессора Intel Pentium 4 2.4 GHz и разрешении экрана 1024*768.Для работы с программой необходимо также наличие клавиатуры и манипулятора типа«мышь».
Испытание проведем сначальными данными, указанными в задании.
Начальные данные: при w=3
/>
Результаты этоговычислительного эксперимента приведены на рисунках 4.1, 4.2.
/>
Рисунок 4.1 -Тестоваятаблица №1
/>
Рисунок 4.2 — Тестовыйграфик №1
Если w не выбрано,выводится сообщение об ошибке (рисунок 3.5).
Произведем такжеиспытание при других значениях исходных данных и с использованиемразработанного COM-объекта.
Начальные данные: при w=5
/>
Полученные результаты
/>
Рисунок 4.3 — Тестовыйграфик №2
/>
Рисунок 4.4 — Тестоваятаблица №2
Таким образом,проведенное тестирование программы не выявило сбойных ситуаций инекорректностей в ее работе. Следует считать, что в целом программапротестирована, отвечает поставленным требованиям и вполне работоспособна.
Заключение
В ходе выполнениякурсовой работы:
· были закрепленызнания по курсу «Конструирование программ и языки программирования»;
· приобретен опытпри разработке объектно-ориентированных программ;
· изучены принципысоздания динамических библиотек;
· изучены иреализованы способы создания клиент-серверных приложений на базеCOM-технологий;
· освоены методыпередачи данных между приложениями;
· изученывозможности создания справочной системой высокой степени сложности и различныхформатов.
При разработке программыиспользовался модульный принцип программирования. Такая структура программыпозволяет в дальнейшем модифицировать отдельные её части без нарушенияработоспособности и потери функциональности приложения.
Программа имеетдостаточно ясный и понятый дружелюбный пользовательский интерфейс,обеспечивающий удобство в работе и обеспечивающий получение необходимойпользователю информации с наименьшими затратами времени.
Таким образом, разработанноев ходе выполнения курсовой работы приложение является законченным программнымпродуктом.
Программа может бытьиспользована для физического разложения временного процесса втригонометрический ряд.
Литература
1. Фаронов В.В. Delphi 6. Учебный курс.-М.: Издатель Молгачева С.В.,2001.-672с.
2. Елмакова Н., Трепалин С., Тенцер А. Delphi 6 и технология COM.-СПб.: Питер, 2002. – 640 с.
3. Федоров А… Delphi 5.0 для всех. -М.:Тоо фирма “КомпьютерПресс”, 1998. — 464 с.
4. Марко Кэнту. Delphi 5 для профессионалов.-СПб.: Питер. 2001. – 944 с.
5. Бобровский С. Delphi 5: учебный курс- СПб: Издательство«Питер», 2000.- 640с.
6. А.М.Епанешников, В.А.ЕпанешниковПрограммирование в среде Delphi.-М.:»ДиалогМИФИ», 1998.
Приложение Файл проекта VremRiad.dpr
program VremRiad;
uses
Forms,Windows,Classes,Dialogs,SysUtils,
UnitMain in'UnitMain.pas' {Form1},
UnitRiad in'UnitRiad.pas',
UComRiad in'UComRiad.pas',
UCom_Tlb in'UCom_Tlb.pas',
UnitGraphicin 'UnitGraphic.pas' {FormGraphic},
VremRiad_TLBin 'VremRiad_TLB.pas';
{$R *.TLB}
//******************************************
Type
//Процедурный тип дляфункции, вызываемой из DLL
TProc=procedure(AOwner:TComponent);
Var
Handle:LongWord; //Дескриптор DLL
ShowPrompt: tproc; //Переменная для функции
//*******************************************
{$R *.res}
begin
Application.Initialize;
//Загрузкаиконки
Application.Icon.LoadFromFile('Prompt.ico');
//*****Загрузка библиотекии показ заставки******//
Handle:=LoadLibrary('Prompt.dll');
if Handle 0 then
begin
//Получить адрес функциииз библиотеки
@ShowPrompt:=GetProcAddress(Handle, PChar('ShowPrompt'));
ShowPrompt(Application);//Показать заставку
FreeLibrary(Handle);//Удалить библиотеку
end
elseShowMessage('Не найдена библиотека Prompt.dll');
//***********************************************//
Application.CreateForm(TForm1,Form1);
Application.CreateForm(TFormGraphic,FormGraphic);
Application.Run;
end.Файлголовного модуля UnitMain.pas
unit UnitMain;
interface
uses
Windows,Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,StdCtrls, Menus, ToolWin, ComCtrls, XPMan, ImgList, Grids,
IniFiles,Clipbrd, WordXP, Math, ShellAPI, ExtCtrls, msppt8,
UCom_Tlb,ComObj, MSPpt2000, PowerPointXP, Activex, OleServer,
Buttons;
type
TForm1 =class(TForm)
Panel1:TPanel;
Panel2:TPanel;
Label1:TLabel;
Label2:TLabel;
Label3:TLabel;
Label4:TLabel;
Label5: TLabel;
Label6:TLabel;
Label7:TLabel;
Label8:TLabel;
RadioGroup1:TRadioGroup;
BitBtn1:TBitBtn;
Panel3:TPanel;
BitBtn2:TBitBtn;
MainMenu1:TMainMenu;
N1:TMenuItem;
N2:TMenuItem;
N3:TMenuItem;
N4:TMenuItem;
N6:TMenuItem;
BitBtn3:TBitBtn;
N7:TMenuItem;
StringGrid1:TStringGrid;
Label9:TLabel;
Label10:TLabel;
BitBtn4:TBitBtn;
PowerPointApplication1:TPowerPointApplication;
Presentation:TSpeedButton;
N8:TMenuItem;
Word1:TSpeedButton;
Excel1:TSpeedButton;
N9:TMenuItem;
EXcel2:TMenuItem;
SpeedButton1:TSpeedButton;
SpeedButton2:TSpeedButton;
procedureBitBtn3Click(Sender: TObject);
procedureFormActivate(Sender: TObject);
procedureBitBtn1Click(Sender: TObject);
procedureBitBtn4Click(Sender: TObject);
procedureBitBtn2Click(Sender: TObject);
procedureN4Click(Sender: TObject);
procedurePresentationClick(Sender: TObject);
procedureWord1Click(Sender: TObject);
procedureExcel1Click(Sender: TObject);
procedureSpeedButton2Click(Sender: TObject);
// ProcedureTFormMain.PresentationClick(Sender: TObject);
private
{ Privatedeclarations }
public
IniFileName:string; //Имя файла инициализации
procedureReportExcel(AStringGrid: TStringGrid); //Передать отчет в Excel
procedureReportWord (AStringGrid: TStringGrid); //Передать отчет в Word
{ Publicdeclarations }
end;
var
Form1:TForm1;
Flag: bool; //Флаг определения вида используемого объекта
const x=1;
const P=500;
implementation
uses UnitRiad,UnitGraphic;
{$R *.dfm}
procedureTForm1.BitBtn3Click(Sender: TObject);
begin
Close;
end;
procedureTForm1.FormActivate(Sender: TObject);
var i:integer;
begin
//По умолчаниюустановить работу с обычным (классическим) объектом
Flag:= false;
//Имя Ini-файла сохранения параметров
IniFileName:=GetCurrentDir+'\Riad.ini';
//Создать обычный объект
Riad:= TRiad.Create(IniFileName);
//Считать данные из Ini-файла
Riad.ReadFromIniFile;
//Вычисление и выводданных в таблицу
Riad.Table(StringGrid1);
StringGrid1.Cells[0,0]:='Номер';
StringGrid1.Cells[1,0]:='Время(с)';
StringGrid1.Cells[2,0]:='F{t}при w=1';
StringGrid1.Cells[3,0]:='F{t}при w=3';
StringGrid1.Cells[4,0]:='F{t}при w=5';
for i:=1 to201 do
StringGrid1.Cells[0,i]:=IntToStr(i);
for i:=0 to201 do
begin
StringGrid1.Cells[1,i+1]:=FloatToStr(0.5*i)
end;
label10.Caption:='';
end;
procedureTForm1.BitBtn1Click(Sender: TObject);
vari:integer;
begin
Riad.SetW();
//Вычисление и вывод данных в таблицу
Riad.Table(StringGrid1);
end;
procedureTForm1.BitBtn4Click(Sender: TObject);
var i:integer;
begin
for i:=0 to201 do
begin
StringGrid1.Cells[2,i+1]:='';
StringGrid1.Cells[3,i+1]:='';
StringGrid1.Cells[4,i+1]:='';
end;
end;
procedureTForm1.BitBtn2Click(Sender: TObject);
begin
FormGraphic.Show;
end;
procedureTForm1.N4Click(Sender: TObject);
Type
//Процедурный тип длявызова процедуры из DLL
TProc =procedure(AOwner:TComponent);
var
Handle:LongInt; //Дескриптор библиотеки
ShowAbout: TProc; //Переменая для вызова функции из DLLbegin
begin
//Получить значениедескриптора загруженной библиотеки
Handle:=LoadLibrary('About.dll');
//Проверить существованиебиблиотеки
if Handle = 0then
begin
ShowMessage('Библиотекане найдена: About.dll');
exit;
end;
//Получить адресвызываемой функции
@ShowAbout:=GetProcAddress(Handle, PChar('ShowAbout'));
//Вызов функции,показывающей форму About
ShowAbout(Application);
FreeLibrary(Handle);//Выгрузка библиотеки
end;
procedureTForm1.PresentationClick(Sender: TObject);
var
name: string;
pw: TOleEnum;
begin
//Запускпрезетации
Name:=ExtractFileDir(Application.ExeName) + '\Vremennoj process.ppsx';
PowerPointApplication1.Activate;
PowerPointApplication1.Presentations.Open(Name,pw, pw, pw);
PowerPointApplication1.Presentations.Item(1).SlideShowSettings.Run;
//Другойспособ запуска
//ShellExecute(Application.MainForm.Handle,PChar('Open'),
//PChar('Riad.pps'), NIL, PChar(''), sw_ShowNormal);
end;//TFormMain.PresentationClick
procedureTForm1.Word1Click(Sender: TObject);
begin //Отчетв Word
ReportWord(StringGrid1);
end;//TFormMain.Word1Click
ProcedureTForm1.ReportExcel(AStringGrid: TStringGrid);
//Отчет вExcel
var
Excel:variant;
WorkBook:variant; //Рабочая книга
i, j:integer;
begin
//Cоздатьформу для графика
FormGraphic:=TFormGraphic.Create(Form1);
//СоздатьСоm-объект
Excel:=CreateOleObject('Excel.Application');
//Отключить реакцию навнешние события-для ускорения процесса передачи данных
Excel.Application.EnableEvents:=false;
//Добавитьрабочую книгу
WorkBook:=Excel.WorkBooks.Add;
//Изменениеширины столбцов
for j:=0 toAStringGrid.ColCount do
WorkBook.WorkSheets[1].Columns[j+1].ColumnWidth:=10;
//Вывод строки
WorkBook.WorkSheets[1].Cells[1,1]:='Отчет о колебаниях стержня';
//Заполнение ячеектаблицы Excel значениями из StringGrid
//Нумерация ячеек в Excel начинается с 1 и идет в форматестрока-столбец
for i:= 1 toAStringGrid.RowCount + 1 do
for j:= 0 toAStringGrid.ColCount do
WorkBook.WorkSheets[1].Cells[i+1,j+1]:= AStringGrid.Cells[j, i-1];
//Вставитизображение графика в Excel
WorkBook.WorkSheets[1].Shapes.AddPicture(GetCurrentDir+'\PictureWord.bmp',
True, True, 0,(AStringGrid.RowCount+2)*12.5+10, FormGraphic.Chart1.Width*0.8,
FormGraphic.Chart1.Height*0.8);
//Уничтожитьформу
FormGraphic.Release;
FormGraphic:=NIL;
//ПоказатьExcel
Excel.Visible:=true;
end;//TFormMain.ReportExcel
ProcedureTForm1.ReportWord(AStringGrid: TStringGrid);
//Отчет в Word
var
i,j,k:integer;
a,b,c:OleVariant;
wa:TWordApplication; //WordApplication
wd:TWordDocument; //WordDocument
begin
//Создатьформу для графика
FormGraphic:=TFormGraphic.Create(Form1);
//Создатьcom-объект
wa:=TWordApplication.Create(Form1);
//Подключиться к серверу Word
wa.Connect;
//Добавить новый документ
wa.Documents.Add(EmptyParam, EmptyParam, EmptyParam, EmptyParam);
wd:=TWordDocument.Create(Form1);
wd.ConnectTo(wa.ActiveDocument);
//Отменитьпроверку правописания
wa.Options.CheckSpellingAsYouType:=False;
//Отменитьпроверку орфографии
wa.Options.CheckGrammarAsYouType:=False;
a:= 0;
b:= 0;
wd.Range.InsertAfter('Отчет');
c:=Length(wd.Range.Text) — 1;
a:= c;
b:= c + 10;
//Добавить таблицу
wd.Tables.Add(wd.Range(a),AStringGrid.RowCount,
AStringGrid.ColCount,EmptyParam, EmptyParam);
k:= 1;
//Перенести данные из StringGrid в таблицу
for i:= 1 toAStringGrid.RowCount do
for j:= 1 toAStringGrid.ColCount do
wd.Tables.Item(k).Cell(i,j).Range.Text:=AStringGrid.Cells[j-1, i-1];
//Загрузитьизображение в Image
FormGraphic.Image1.Picture.LoadFromFile('PictureWord.bmp');
//Поместитьизображение в буфер обмена
Clipboard.Assign(FormGraphic.Image1.Picture);
c:=Length(wd.Range.Text) — 1;
a:= c;
//Вставить изображение избуфера обмена
wa.Selection.Paste;
//ПоказатьWord
wa.Visible:=true;
//Уничтожитьформу
FormGraphic.Release;
FormGraphic:=NIL;
end;//TFormMain.ReportWord
procedureTForm1.Excel1Click(Sender: TObject);
begin
ReportExcel(StringGrid1);
end;
procedureTForm1.SpeedButton2Click(Sender: TObject);
begin
WinExec('hh.exe1.chm',SW_SHOW);
end;
end.Файлвывода графика UnitGraphic.pas
unitUnitGraphic;
interface
uses
Windows,Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,TeEngine, Series, StdCtrls, ExtCtrls, TeeProcs, Chart, XPMan,
TeeFunci,Buttons;
type
TFormGraphic= class(TForm)
Chart1:TChart;
Button1:TButton;
XPManifest1:TXPManifest;
Series1:TLineSeries;
Series2:TLineSeries;
TeeFunction1:TAddTeeFunction;
Series3:TLineSeries;
Image1:TImage;
BitBtn1:TBitBtn;
BitBtn2:TBitBtn;
BitBtn3:TBitBtn;
BitBtn4:TBitBtn;
procedureButton1Click(Sender: TObject);
procedureBitBtn1Click(Sender: TObject);
procedureBitBtn2Click(Sender: TObject);
procedureBitBtn3Click(Sender: TObject);
procedureBitBtn4Click(Sender: TObject);
private
{ Privatedeclarations }
public
{ Publicdeclarations }
end;
var
FormGraphic:TFormGraphic;
implementation
uses UnitRiad;
{$R *.dfm}
procedureTFormGraphic.Button1Click(Sender: TObject);
begin
Chart1.Series[0].Clear;
Chart1.Series[1].Clear;
Chart1.Series[2].Clear;
Close;
end;//TFormGraphic.Button1Click
procedureTFormGraphic.BitBtn1Click(Sender: TObject);
begin
Riad.Graphic1(FormGraphic.Chart1);
end;
procedureTFormGraphic.BitBtn2Click(Sender: TObject);
begin
Riad.Graphic2(FormGraphic.Chart1);
end;
procedureTFormGraphic.BitBtn3Click(Sender: TObject);
begin
Riad.Graphic3(FormGraphic.Chart1);
end;
procedureTFormGraphic.BitBtn4Click(Sender: TObject);
begin
Chart1.Series[0].Clear;
Chart1.Series[1].Clear;
Chart1.Series[2].Clear;
end;
end.
end.Файл реализациикласса — UnitRiad.pas
unit UnitRiad;
interface
uses Chart,Series, Math, Grids, SysUtils, Types, Graphics, IniFiles, Messages, Dialogs,StdCtrls, Variants, Classes, Controls, Forms,
ExtCtrls,Buttons, Menus;
Type
TRiad = class//класс
private
IniFile:TIniFile; //Объект Ini-файла
w: integer;
public
ConstructorCreate(AIniFileName: string);
DestructorDestroy;
procedureGraphic1(AChart:TChart); //Постоение графика
procedureGraphic2(AChart:TChart); //Постоение графика
procedureGraphic3(AChart:TChart); //Постоение графика
procedureTable(AStringGrid:TStringGrid); //Вывод в таблицу
procedureWriteToIniFile; //Запись в Ini-файл
procedureReadFromIniFile; //Чтение из Ini-файла
function GetW: integer; //Получить w
procedureSetW; //Установить w
functionF(w:integer;t:extended):extended;//Вычисление суммы
//property ww: integer read GetW write SetW;
private
end;
var
Riad: TRiad;//Объект
implementation
uses UnitMain,UnitGraphic;
const P=500;
const x=1;
constTimeStart=0; //Время начала отсчета
const TimeEnd=100; //Время окончания отсчета
const TimeStep=0.5; //Шаг дискретизация времени
ConstructorTRiad.Create(AIniFileName: string);
begin
//Создатьобъект Ini-файла
IniFile:=TIniFile.Create(AIniFileName);
end;//TRiad.Create
DestructorTRiad.Destroy;
begin
//Удалить из Heap объект Ini-файла
ifAssigned(IniFile) then
begin
IniFile.Free;
IniFile:= NIL;
end;
end;//TRiad.Create
procedureTRiad.Graphic1(AChart: TChart);
//Построениеграфика
var
time:extended;
Y: extended;
begin
Time:=TimeStart;
AChart.Series[0].Clear;//Очистить Series[0]
AChart.BottomAxis.Increment:=Floor((TimeEnd — TimeStart) / 5);
//Занестизначения в Series
while(time
begin
Y:= F(1,time);
AChart.Series[0].AddXY(time,Y);
time:= time +TimeStep / 4;
end;
end;//TRiad.Graphic1
procedureTRiad.Graphic2(AChart: TChart);
//Построениеграфика
var
time:extended;
Y: extended;
begin
Time:=TimeStart;
AChart.Series[1].Clear;//Очистить Series[0]
AChart.BottomAxis.Increment:=Floor(( TimeEnd- TimeStart) / 5);
//Занестизначения в Series
while(time
begin
Y:= F(3,time);
AChart.Series[1].AddXY(time,Y);
time:= time +TimeStep / 4;
end;
end;//TRiad.Graphic2
procedureTRiad.Graphic3(AChart: TChart);
//Построениеграфика
var
time:extended;
Y: extended;
begin
Time:=TimeStart;
AChart.Series[2].Clear;//Очистить Series[0]
AChart.BottomAxis.Increment:=Floor((TimeEnd — TimeStart) / 5);
//Занестизначения в Series
while(time
begin
Y:= F(5,time);
AChart.Series[2].AddXY(time,Y);
time:= time +TimeStep / 4;
end;
end;//TRiad.Graphic3
functionTRiad.F(w: integer;t: extended): extended;
//вычисление функции
var
j:integer;
begin
F:=(2*P/x)*(sin(w*t)-1/2*sin(2*w*t)+1/3*sin(3*w*t)-1/4*sin(4*w*t))
end;//TRiad.F
procedureTRiad.Table(AStringGrid: TStringGrid);
//Вывод информации втаблицу
var
k: integer;
time:extended;
y: extended;
begin
k:= 0;
time:=TimeStart;
if w=1 then
while (time
begin
inc(k);
y:= F(w,time);
Form1.StringGrid1.Cells[2,k]:=FloatToStrF(y, ffFixed, 5, 3);
time:= time +TimeStep;
end
else if w=3then
while (time
begin
inc(k);
y:= F(w,time);
Form1.StringGrid1.Cells[3,k]:=FloatToStrF(y, ffFixed, 5, 3);
time:= time +TimeStep;
end
else if w=5then
while (time
begin
inc(k);
y:= F(w,time);
Form1.StringGrid1.Cells[4,k]:=FloatToStrF(y, ffFixed, 5, 3);
time:= time +TimeStep;
end ;
end;//TRiad.Table
procedureTRiad.WriteToIniFile;
//запись вIni-файл
begin
IniFile.WriteInteger('Parameters','W', W);
IniFile.UpdateFile;//очистка буфера и запись файла надиск
end;//TRiad.WriteToIniFile
procedureTRiad.ReadFromIniFile;
//чтение изIni-файла
begin
W:=IniFile.ReadInteger('Parameters', 'W', w);
end;//TRiad.ReadFromIniFile
functionTRiad.GetW :integer;
begin
result:= W;
end;//TRiad.GetW
procedureTRiad.SetW;
begin
ifForm1.RadioGroup1.ItemIndex=-1 then
MessageDlg(Pchar('Невыбрано значение w!!!'),mtError,[mbOk],0);
ifForm1.RadioGroup1.ItemIndex =0 then
begin
Form1.Label10.Caption:='1';
w:=1;
end
else ifForm1.RadioGroup1.ItemIndex =1 then
begin
Form1.label10.Caption:='3';
w:=3;
end
else
begin
Form1.label10.Caption:='5';
w:=5;
end ;
end;//TRiad.SetW
end.
Файлописания динамической библиотеки About.dpr
library About;
{ Importantnote about DLL memory management: ShareMem must be the first unit in yourlibrary's USES clause AND your project's (select Project-View Source) USESclause if your DLL exports any procedures or functions that pass strings asparameters or function results. This
applies toall strings passed to and from your DLL--even those that are nested in recordsand classes. ShareMem is the interface unit to the BORLNDMM.DLL shared memorymanager, which must be deployed along with your DLL. To avoid using BORLNDMM.DLL,pass string information using PChar or ShortString parameters. }
uses
SysUtils,
Classes,
Forms,
UnitAbout in'UnitAbout.pas' {FormAbout};
{$R *.res}
//показать форму
procedureShowAbout(AOwner:TComponent);
var
Form:TFormAbout;
begin
Form:=TFormAbout.Create(AOwner);//создать форму
Form.ShowModal;//показать форму
Form.Free; //уничтожитьформу
end;
exportsShowAbout;
begin
end.
unitUnitAbout;
interface
uses
Windows,Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,StdCtrls, ExtCtrls, XPMan, Buttons;
type
TFormAbout =class(TForm)
Image1:TImage;
Label1:TLabel;
Label2:TLabel;
Label3:TLabel;
Label4:TLabel;
BitBtn1:TBitBtn;
Label5:TLabel;
XPManifest1:TXPManifest;
procedureBitBtn1Click(Sender: TObject);
private
{ Privatedeclarations }
public
{ Publicdeclarations }
end;
var
FormAbout:TFormAbout;
implementation
{$R *.dfm}
procedureTFormAbout.BitBtn1Click(Sender: TObject);
begin
Close;
end;
end.
Файл описания динамической библиотеки Prompt.dpr
libraryPrompt;
{ Importantnote about DLL memory management: ShareMem must be the
first unit inyour library's USES clause AND your project's (select
Project-ViewSource) USES clause if your DLL exports any procedures or
functionsthat pass strings as parameters or function results. This
applies toall strings passed to and from your DLL--even those that
are nested inrecords and classes. ShareMem is the interface unit to
theBORLNDMM.DLL shared memory manager, which must be deployed along
with yourDLL. To avoid using BORLNDMM.DLL, pass string information
using PCharor ShortString parameters. }
uses
SysUtils,
Classes,
Windows,
UnitPrompt in'UnitPrompt.pas' {FormPrompt};
{$R *.res}
//Показать заставку
procedureShowPrompt(AOwner:TComponent);
var
Time:extended;
Form:TFormPrompt;
begin
Form:=TFormPrompt.Create(AOwner);//Создать форму
Time:=GetTickCount/1000; //Запомнитьвремя
Form.Show; //Показатьформу
Form.Repaint; //Перерисоватьформу
//Пока не вышел лимитвремени — ничего не делать
whileGetTickCount/1000
Form.Close; //Закрыть форму
Form.Free; //Уничтожитьформу
end;
exportsShowPrompt;
begin
end.
unitUnitPrompt;
interface
uses
Windows,Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,ExtCtrls, XPMan;
type
TFormPrompt =class(TForm)
XPManifest1:TXPManifest;
Image1:TImage;
private
{ Privatedeclarations }
public
{ Publicdeclarations }
end;
var
FormPrompt:TFormPrompt;
implementation
{$R *.dfm}
end.
Файл проекта COM-сервера – MyServer.dpr
libraryMyServer;
{ Importantnote about DLL memory management: ShareMem must be the first unit in yourlibrary's USES clause AND your project's (select Project-View Source) USESclause if your DLL exports any procedures or functions that pass strings asparameters or function results. This applies to all strings passed to and fromyour DLL--even those that are nested in records and classes. ShareMem is theinterface unit to the BORLNDMM.DLL shared memory manager, which must bedeployed along with your DLL. To avoid using BORLNDMM.DLL, pass stringinformation using PChar or ShortString parameters. }
uses
SysUtils,
ComServ,
UComRiad in'UComRiad.pas',
UCom_Tlb in'UCom_Tlb.pas',
Classes,
MyServer_TLBin 'MyServer_TLB.pas';
exports
DllGetClassObject,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer;
{$R *.TLB}
{$R *.res}
begin
end.
Файл описанияCOM- класса – UComRiad.pas
unit UComRiad;
{$WARNSYMBOL_PLATFORM OFF}
interface
uses
Windows,ActiveX, Classes, ComObj, Chart, Grids, Math, SysUtils, IniFiles,
UCom_Tlb,ExtCtrls;
type
TRiad =class(TComObject, IComRiad)
protected
IniFile:TIniFile; //Объект Ini-файла
w: integer;
public
ProcedureCreate(AIniFileName: string); stdcall;
DestructorDestroy;
procedureGraphic(AChart:TChart); stdcall; //Постоение графика
procedureTable(AStringGrid:TStringGrid); stdcall; //Вывод в таблицу
procedureWriteToIniFile; stdcall; //Запись в Ini-файл
procedureReadFromIniFile; stdcall; //Чтение из Ini-файла
function GetW: integer; stdcall; //Получить w
procedureSetW; stdcall; //Установить w
functionF(w:integer; t:extended):extended;stdcall;//Вычисление суммы
private
end;
implementation
uses ComServ,Dialogs, Graphics, UnitMain;
const P=500;
const x=1;
constTimeStart=0; //Время началаотсчета
const TimeEnd=100;//Время окончания отсчета
const TimeStep=0.5; //Шагдискретизация времени
ProcedureTRiad.Create(AIniFileName: string);
begin
//Создать объектIni-файла
IniFile:=TIniFile.Create(AIniFileName);
end;//TRod.Create
DestructorTRiad.Destroy;
begin //Не используется
//Удалить из Heap объектIni-файла
ifAssigned(IniFile) then
begin
IniFile.Free;
IniFile:= NIL;
end;
end;//TRod.Create
procedureTRiad.Graphic(AChart: TChart);
//Построение графика
var
time:extended;
Y1, Y2:extended;
begin
Time:=TimeStart;
AChart.Series[0].Clear;//Очистить Series[0]
AChart.Series[1].Clear;//Очистить Series[1]
AChart.BottomAxis.Increment:=Floor((TimeEnd — TimeStart) / 5);
//Занести значения в Series
while(time
begin
Y1:=F(w,time);
Y2:=F(w,time);
AChart.Series[0].AddXY(time,Y1);
AChart.Series[1].AddXY(time,Y2);
time:= time +TimeStep / 4;
end;
end;//TRiad.Graphic
functionTRiad.F(w: integer;t: extended): extended;
//вычисление функции
var
j:integer;
begin
F:=(2*P/x)*(sin(w*t)-1/2*sin(2*w*t)+1/3*sin(3*w*t)-1/4*sin(4*w*t))
end;//TRiad.F
procedureTRiad.Table(AStringGrid: TStringGrid);
//Вывод информации втаблицу
var
k: integer;
time:extended;
y: extended;
begin
k:= 0;
time:=TimeStart;
while (time
begin
inc(k);
y:= F(w,time);
Form1.StringGrid1.Cells[2,k]:=FloatToStrF(y, ffFixed, 5, 3);
time:= time +TimeStep;
end;
end;//TRiad.Table
procedureTRiad.WriteToIniFile;
//запись в Ini-файл
begin
IniFile.WriteInteger('Parameters','W', W);
IniFile.UpdateFile;//очисткабуфера и запись файла на диск
end;//TRiad.WriteToIniFile
procedureTRiad.ReadFromIniFile;
//чтение из Ini-файла
begin
W:=IniFile.ReadInteger('Parameters', 'W', w);
end;//TRiad.ReadFromIniFile
functionTRiad.GetW :integer;
begin
result:= W;
end;//TRiad.GetW
procedureTRiad.SetW;
begin
ifForm1.RadioGroup1.ItemIndex=-1 then
MessageDlg(Pchar('Не выбрано значение w!!!'),mtError,[mbOk],0);
ifForm1.RadioGroup1.ItemIndex =0 then
begin
Form1.Label10.Caption:='1';
w:=1;
end
else ifForm1.RadioGroup1.ItemIndex =1 then
begin
Form1.label10.Caption:='3';
w:=3;
end
else
begin
Form1.label10.Caption:='5';
w:=5;
end ;
end;//TRiad.SetW
initialization
TComObjectFactory.Create(ComServer,TRiad, Class_ServerRiad,
'ServerRiad','', ciMultiInstance, tmApartment);
end.
Файлбиблиотеки типов COM- класса – Ucom_Tlb.pas
unit UCom_Tlb;
interface
uses Chart,Grids, StdCtrls, ExtCtrls;
const
Class_ServerRiad:TGUID = '{1CB7B26E-5BAF-4BA7-8F17-EA174D7CD750}';
Type
IComRiad =interface
['{1326DD83-DB3E-4054-9572-CFB9EAE3FE95}']
ProcedureCreate(AIniFileName: string); stdcall;
procedureGraphic(AChart:TChart); stdcall; //Постоение графика
procedureTable(AStringGrid:TStringGrid); stdcall; //Вывод в таблицу
procedureWriteToIniFile; stdcall; //Запись в Ini-файл
procedureReadFromIniFile; stdcall; //Чтение из Ini-файла
function Getw: integer; stdcall; //Получить w
procedureSetw; stdcall; //Установить w
functionF(w:integer; t:extended):extended;stdcall;//Вычисление суммы
end;
implementation
end.