|
Программная реализация разложения временного процесса в тригонометрический ряд
Программная реализация разложения временного процесса в тригонометрический ряд
Белорусский национальный технический университет Кафедра информационных систем и технологий ПОЯСНИТЕЛЬНАЯ ЗАПИСКА к курсовому проекту (работе) по дисциплине «Конструирование программ и языки программирования» Тема: ”Программная реализация разложения временного процесса в тригонометрический ряд” Исполнитель:_______________________ (подпись) Студент 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 //классprivateIniFile : TIniFile; //Объект Ini-файлаw: integer;publicConstructor Create(AIniFileName : string);Destructor Destroy;procedure Graphic(AChart:TChart); //Постоение графикаprocedure Table(AStringGrid:TStringGrid); //Вывод в таблицуprocedure WriteToIniFile; //Запись в Ini-файлprocedure ReadFromIniFile; //Чтение из Ini-файлаfunction GetW : integer; //Получить wprocedure SetW; //Установить wfunction F(w:integer;t:extended):extended;//Вычисление суммы//property ww : integer read GetW write SetW;privateend;Назначение полей и инкапсулированных в классе процедур и функций (методов) приведено в комментариях. Описание и реализация класса структурно оформлено в отдельном Unit - UnitRiad. Используемые секции public и private определяют области видимости элементов класса. Так, видно, что все поля класса являются полностью закрытыми, а доступ к ним организуется с помощью методов и свойств.2.3 Описание реализации технологии COMВ соответствии с требованиями на разработку данной курсовой работы была также реализована возможность экспорта методов созданного класса с помощью технологии COM. Для этого был создан сервер в виде DLL - программный модуль MyServer.library MyServer;{ Important note about DLL memory management: ShareMem must be the first unit in your library's USES clause AND your project's (select Project-View Source) USES clause if your DLL exports any procedures or functions that pass strings as parameters or function results. This applies to all strings passed to and from your DLL--even those that are nested in records and classes. ShareMem is the interface unit to the BORLNDMM.DLL shared memory manager, which must be deployed along with your DLL. To avoid using BORLNDMM.DLL, pass string information using PChar or ShortString parameters. }uses SysUtils, ComServ, UComRiad in 'UComRiad.pas', UCom_Tlb in 'UCom_Tlb.pas', Classes, MyServer_TLB in 'MyServer_TLB.pas';exportsDllGetClassObject,DllCanUnloadNow,DllRegisterServer,DllUnregisterServer;{$R *.TLB}{$R *.res}beginend.Этот сервер позволяет создать COM-объект, описание класса которого находится в модуле UСomRiad. Следует заметить, что данный класс полностью соответствует, приведенному в п.2.2 классу TRiad и имеет и такое же название, т.е. он является его копией, за исключение конструктора Create, который заменен обычной процедурой. Непосредственный доступ к открытым элементам COM-класса осуществляется с помощью интерфейса IcomRiad, описанного в модуде UCom_Tlb.2.4 Описание динамических библиотекПри разработке приложения были реализованы 2 динамические библиотеки.Динамическая библиотека Prompt.dll содержит заставку, появляющуюся после запуска программы, но до появления главного окна.Библиотека содержит 1 экспортируемую процедуру ShowPrompt, служащую для отображения формы.library Prompt;{ Important note about DLL memory management: ShareMem must be the first unit in your library's USES clause AND your project's (select Project-View Source) USES clause if your DLL exports any procedures or functions that pass strings as parameters or function results. This applies to all strings passed to and from your DLL--even those that are nested in records and classes. ShareMem is the interface unit to the BORLNDMM.DLL shared memory manager, which must be deployed along with your DLL. To avoid using BORLNDMM.DLL, pass string information using PChar or ShortString parameters. }uses SysUtils, Classes, Windows, UnitPrompt in 'UnitPrompt.pas' {FormPrompt};{$R *.res}//Показать заставкуprocedure ShowPrompt(AOwner:TComponent);varTime:extended;Form:TFormPrompt;beginForm:=TFormPrompt.Create(AOwner); //Создать формуTime:=GetTickCount/1000; //Запомнить времяForm.Show; //Показать формуForm.Repaint; //Перерисовать форму//Пока не вышел лимит времени - ничего не делатьwhile GetTickCount/1000<Time+4 do;Form.Close; //Закрыть формуForm.Free; //Уничтожить формуend;exports ShowPrompt;beginend.Библиотека About.dll содержит форму с информацией о программе.library About;usesSysUtils,Classes,Forms,UnitAbout in 'UnitAbout.pas' {FormAbout};{$R *.res}//Показать формуprocedure ShowAbout(AOwner:TComponent);varForm:TFormAbout;beginForm:=TFormAbout.Create(AOwner); //Создать формуForm.ShowModal; //Показать формуForm.Free; //Уничтожить формуend;exports ShowAbout;beginend.Библиотека содержит экспортируемую функцию ShowAbout для отображения формы.2.5 Основные возможности программыПрограмма начинается с отображения оригинальной заставки (содержится в Prompt.dll), а затем на экране появляется главное окно программы (модуль UnitMain). Главный модуль управляет работой всех других модулей в соответствии с запросами пользователя.Он содержит:· Вызов окна «О программе»;· Вызов презентации;· Передачу данных в Word и Excel;· Вызов формы «График»;· Вызов окна помощи;· Сохранение данных в Ini-файлах;· Использование возможностей разработанного COM-сервера;Диалог с пользователем поддерживается с помощью главного и выпадающего меню, панели инструментов, кнопок и других интерфейсных элементов.Окно «О программе» содержит краткую информацию о приложении. Окно «График» служит для отображения информации в графической форме - в виде графиков.В рамках данного проекта также реализуется поддержка клиент-серверной технологии обмена данными между приложениями.Процесс логического взаимодействия пользователя c программой, назначение элементов главного окна описаны в «Руководстве пользователя».Вопросы непосредственной программной реализации конкретных модулей приведены в приложении. По тексту программ даются достаточно полные комментарии, необходимые для описания переменных, процедур и функций, а также основных шагов реализации используемых алгоритмов.2.6 Средства использования сервисов, предоставляемых Microsoft OfficeКроме процедур и функций, описанных в классах, программа обеспечивает взаимодействие с серверами автоматизации приложений Microsoft Office. Так, следующие процедуры головного модуля программы позволяют автоматически производить запуск MS Word, MS Excel, Power Point и передавать им текстовую, табличную и графическую информацию с целью создания отчетов или использование ее для дальнейшей обработки.1. Procedure TFormMain.ReportExcel(AStringGrid : TStringGrid). Данная процедура обеспечивает передачу данных в Excel. Для формирования таблицы необходимо передать ссылку на компонент типа TStringGrid, на основе данных которого будут заполнены ячейки в Excel. Рисунок, помещаемый в отчет, совпадает с текущим видом графика.2. Procedure TFormMain.ReportWord(AStringGrid:TStringGrid). Процедура позволяет создать отчет, принятый в Word.3. Procedure TFormMain.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 - Пункт меню «Помощь»При выборе пункта меню «Презентация» начинается просмотр возможностей программы под управлением Power Point.Выбор пункта меню «Справка» приводит к появлению окна помощи, содержащим сведения о работе с программой (см. рисунок 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.dprprogram 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', UnitGraphic in 'UnitGraphic.pas' {FormGraphic}, VremRiad_TLB in '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 thenbegin//Получить адрес функции из библиотеки@ShowPrompt:= GetProcAddress(Handle, PChar('ShowPrompt'));ShowPrompt(Application); //Показать заставкуFreeLibrary(Handle); //Удалить библиотекуendelse ShowMessage('Не найдена библиотека Prompt.dll');//***********************************************// Application.CreateForm(TForm1, Form1); Application.CreateForm(TFormGraphic, FormGraphic); Application.Run;end.Файл головного модуля UnitMain.pasunit UnitMain;interfaceuses 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; procedure BitBtn3Click(Sender: TObject); procedure FormActivate(Sender: TObject); procedure BitBtn1Click(Sender: TObject); procedure BitBtn4Click(Sender: TObject); procedure BitBtn2Click(Sender: TObject); procedure N4Click(Sender: TObject); procedure PresentationClick(Sender: TObject); procedure Word1Click(Sender: TObject); procedure Excel1Click(Sender: TObject); procedure SpeedButton2Click(Sender: TObject); // Procedure TFormMain.PresentationClick(Sender: TObject); private { Private declarations } publicIniFileName : string; //Имя файла инициализацииprocedure ReportExcel(AStringGrid : TStringGrid); //Передать отчет в Excelprocedure ReportWord (AStringGrid : TStringGrid); //Передать отчет в Word { Public declarations } end;var Form1: TForm1; Flag : bool; //Флаг определения вида используемого объекта const x=1; const P=500; implementationuses UnitRiad, UnitGraphic;{$R *.dfm}procedure TForm1.BitBtn3Click(Sender: TObject);begin Close;end;procedure TForm1.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 to 201 do StringGrid1.Cells[0,i]:=IntToStr(i) ; for i:=0 to 201 do begin StringGrid1.Cells[1,i+1]:=FloatToStr(0.5*i) end; label10.Caption:='';end;procedure TForm1.BitBtn1Click(Sender: TObject); var i:integer; begin Riad.SetW(); //Вычисление и вывод данных в таблицу Riad.Table(StringGrid1); end;procedure TForm1.BitBtn4Click(Sender: TObject);var i:integer;begin for i:=0 to 201 do begin StringGrid1.Cells[2,i+1]:=''; StringGrid1.Cells[3,i+1]:=''; StringGrid1.Cells[4,i+1]:=''; end;end;procedure TForm1.BitBtn2Click(Sender: TObject);begin FormGraphic.Show;end;procedure TForm1.N4Click(Sender: TObject);Type//Процедурный тип для вызова процедуры из DLLTProc = procedure(AOwner:TComponent);varHandle : LongInt; //Дескриптор библиотекиShowAbout : TProc; //Переменая для вызова функции из DLLbeginbegin//Получить значение дескриптора загруженной библиотекиHandle:=LoadLibrary('About.dll');//Проверить существование библиотекиif Handle = 0 thenbeginShowMessage('Библиотека не найдена : About.dll');exit;end;//Получить адрес вызываемой функции@ShowAbout:= GetProcAddress(Handle, PChar('ShowAbout'));//Вызов функции, показывающей форму AboutShowAbout(Application);FreeLibrary(Handle); //Выгрузка библиотекиend;procedure TForm1.PresentationClick(Sender: TObject);varname : 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.PresentationClickprocedure TForm1.Word1Click(Sender: TObject);begin //Отчет в WordReportWord(StringGrid1);end;//TFormMain.Word1ClickProcedure TForm1.ReportExcel(AStringGrid : TStringGrid);//Отчет в ExcelvarExcel : 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 to AStringGrid.ColCount doWorkBook.WorkSheets[1].Columns[j+1].ColumnWidth:= 10;//Вывод строкиWorkBook.WorkSheets[1].Cells[1,1]:= 'Отчет о колебаниях стержня';//Заполнение ячеек таблицы Excel значениями из StringGrid//Нумерация ячеек в Excel начинается с 1 и идет в формате строка-столбецfor i:= 1 to AStringGrid.RowCount + 1 dofor j:= 0 to AStringGrid.ColCount doWorkBook.WorkSheets[1].Cells[i+1, j+1]:= AStringGrid.Cells[j, i-1];//Вставит изображение графика в ExcelWorkBook.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;//Показать ExcelExcel.Visible:=true;end;//TFormMain.ReportExcelProcedure TForm1.ReportWord(AStringGrid : TStringGrid);//Отчет в Wordvari,j,k : integer;a,b,c : OleVariant;wa : TWordApplication; //WordApplicationwd : TWordDocument; //WordDocumentbegin//Создать форму для графикаFormGraphic:= TFormGraphic.Create(Form1);//Создать com-объектwa:= TWordApplication.Create(Form1);//Подключиться к серверу Wordwa.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 to AStringGrid.RowCount dofor j:= 1 to AStringGrid.ColCount dowd.Tables.Item(k).Cell(i,j).Range.Text:= AStringGrid.Cells[j-1, i-1];//Загрузить изображение в ImageFormGraphic.Image1.Picture.LoadFromFile('PictureWord.bmp');//Поместить изображение в буфер обменаClipboard.Assign(FormGraphic.Image1.Picture);c:= Length(wd.Range.Text) - 1;a:= c;//Вставить изображение из буфера обменаwa.Selection.Paste;//Показать Wordwa.Visible:= true;//Уничтожить формуFormGraphic.Release;FormGraphic:= NIL;end;//TFormMain.ReportWordprocedure TForm1.Excel1Click(Sender: TObject);begin ReportExcel(StringGrid1); end;procedure TForm1.SpeedButton2Click(Sender: TObject);begin WinExec('hh.exe 1.chm',SW_SHOW);end;end.Файл вывода графика UnitGraphic.pasunit UnitGraphic;interfaceuses 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; procedure Button1Click(Sender: TObject); procedure BitBtn1Click(Sender: TObject); procedure BitBtn2Click(Sender: TObject); procedure BitBtn3Click(Sender: TObject); procedure BitBtn4Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var FormGraphic: TFormGraphic;implementationuses UnitRiad;{$R *.dfm}procedure TFormGraphic.Button1Click(Sender: TObject);beginChart1.Series[0].Clear;Chart1.Series[1].Clear;Chart1.Series[2].Clear;Close;end;//TFormGraphic.Button1Clickprocedure TFormGraphic.BitBtn1Click(Sender: TObject);begin Riad.Graphic1(FormGraphic.Chart1);end;procedure TFormGraphic.BitBtn2Click(Sender: TObject);begin Riad.Graphic2(FormGraphic.Chart1);end;procedure TFormGraphic.BitBtn3Click(Sender: TObject);begin Riad.Graphic3(FormGraphic.Chart1);end;procedure TFormGraphic.BitBtn4Click(Sender: TObject);beginChart1.Series[0].Clear;Chart1.Series[1].Clear;Chart1.Series[2].Clear;end;end.end.Файл реализации класса - UnitRiad.pasunit UnitRiad;interfaceuses Chart, Series, Math, Grids, SysUtils, Types, Graphics, IniFiles, Messages, Dialogs, StdCtrls, Variants, Classes, Controls, Forms, ExtCtrls, Buttons, Menus;TypeTRiad = class //классprivateIniFile : TIniFile; //Объект Ini-файлаw: integer;publicConstructor Create(AIniFileName : string);Destructor Destroy;procedure Graphic1(AChart:TChart); //Постоение графикаprocedure Graphic2(AChart:TChart); //Постоение графикаprocedure Graphic3(AChart:TChart); //Постоение графикаprocedure Table(AStringGrid:TStringGrid); //Вывод в таблицуprocedure WriteToIniFile; //Запись в Ini-файлprocedure ReadFromIniFile; //Чтение из Ini-файлаfunction GetW : integer; //Получить wprocedure SetW; //Установить wfunction F(w:integer;t:extended):extended;//Вычисление суммы//property ww : integer read GetW write SetW;privateend;varRiad : TRiad; //Объектimplementationuses UnitMain, UnitGraphic;const P=500;const x=1;const TimeStart=0; //Время начала отсчетаconst TimeEnd=100; //Время окончания отсчетаconst TimeStep=0.5; //Шаг дискретизация времениConstructor TRiad.Create(AIniFileName : string);begin//Создать объект Ini-файлаIniFile:= TIniFile.Create(AIniFileName);end;//TRiad.CreateDestructor TRiad.Destroy;begin//Удалить из Heap объект Ini-файлаif Assigned(IniFile) thenbeginIniFile.Free;IniFile:= NIL;end;end;//TRiad.Createprocedure TRiad.Graphic1(AChart : TChart);//Построение графикаvartime : extended;Y: extended;beginTime:= TimeStart;AChart.Series[0].Clear; //Очистить Series[0]AChart.BottomAxis.Increment:= Floor((TimeEnd - TimeStart) / 5);//Занести значения в Serieswhile(time <= TimeEnd) dobeginY:= F(1,time);AChart.Series[0].AddXY(time, Y);time:= time + TimeStep / 4;end;end;//TRiad.Graphic1procedure TRiad.Graphic2(AChart : TChart);//Построение графикаvartime : extended;Y: extended;beginTime:= TimeStart;AChart.Series[1].Clear; //Очистить Series[0]AChart.BottomAxis.Increment:= Floor(( TimeEnd- TimeStart) / 5);//Занести значения в Serieswhile(time <= TimeEnd) dobeginY:= F(3,time);AChart.Series[1].AddXY(time, Y);time:= time + TimeStep / 4;end;end;//TRiad.Graphic2procedure TRiad.Graphic3(AChart : TChart);//Построение графикаvartime : extended;Y: extended;beginTime:= TimeStart;AChart.Series[2].Clear; //Очистить Series[0]AChart.BottomAxis.Increment:= Floor((TimeEnd - TimeStart) / 5);//Занести значения в Serieswhile(time <= TimeEnd) dobeginY:= F(5,time);AChart.Series[2].AddXY(time, Y);time:= time + TimeStep / 4;end;end;//TRiad.Graphic3function TRiad.F(w : integer;t : extended) : extended;//вычисление функцииvarj: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.Fprocedure TRiad.Table(AStringGrid : TStringGrid);//Вывод информации в таблицуvark : integer;time : extended;y: extended;begink:= 0;time:= TimeStart; if w=1 thenwhile (time <= TimeEnd) dobegininc(k);y:= F(w, time);Form1.StringGrid1.Cells[2,k]:= FloatToStrF(y , ffFixed, 5, 3);time:= time + TimeStep;end else if w=3 thenwhile (time <= TimeEnd) dobegininc(k);y:= F(w, time);Form1.StringGrid1.Cells[3,k]:= FloatToStrF(y , ffFixed, 5, 3);time:= time + TimeStep;end else if w=5 thenwhile (time <= TimeEnd) dobegininc(k);y:= F(w, time);Form1.StringGrid1.Cells[4,k]:= FloatToStrF(y , ffFixed, 5, 3);time:= time + TimeStep;end ;end;//TRiad.Tableprocedure TRiad.WriteToIniFile;//запись в Ini-файлbeginIniFile.WriteInteger('Parameters', 'W', W);IniFile.UpdateFile;//очистка буфера и запись файла на дискend;//TRiad.WriteToIniFileprocedure TRiad.ReadFromIniFile;//чтение из Ini-файлаbeginW:= IniFile.ReadInteger('Parameters', 'W', w);end;//TRiad.ReadFromIniFilefunction TRiad.GetW :integer;begin result:= W;end;//TRiad.GetWprocedure TRiad.SetW;beginif Form1.RadioGroup1.ItemIndex=-1 then MessageDlg(Pchar('Не выбрано значение w!!!'),mtError,[mbOk],0); if Form1.RadioGroup1.ItemIndex =0 then begin Form1.Label10.Caption:='1'; w:=1; end else if Form1.RadioGroup1.ItemIndex =1 then begin Form1.label10.Caption:='3'; w:=3; end else begin Form1.label10.Caption:='5'; w:=5; end ; end;//TRiad.SetWend.Файл описания динамической библиотеки About.dpr library About; { Important note about DLL memory management: ShareMem must be the first unit in your library's USES clause AND your project's (select Project-View Source) USES clause if your DLL exports any procedures or functions that pass strings as parameters or function results. This applies to all strings passed to and from your DLL--even those that are nested in records and classes. ShareMem is the interface unit to the BORLNDMM.DLL shared memory manager, 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} //показать форму procedure ShowAbout(AOwner:TComponent); var Form:TFormAbout; begin Form:=TFormAbout.Create(AOwner); //создать форму Form.ShowModal; //показать форму Form.Free; //уничтожить форму end; exports ShowAbout; begin end. unit UnitAbout; 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; procedure BitBtn1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var FormAbout: TFormAbout; implementation {$R *.dfm} procedure TFormAbout.BitBtn1Click(Sender: TObject); begin Close; end; end. Файл описания динамической библиотеки Prompt.dpr library Prompt; { Important note about DLL memory management: ShareMem must be the first unit in your library's USES clause AND your project's (select Project-View Source) USES clause if your DLL exports any procedures or functions that pass strings as parameters or function results. This applies to all strings passed to and from your DLL--even those that are nested in records and classes. ShareMem is the interface unit to the BORLNDMM.DLL shared memory manager, which must be deployed along with your DLL. To avoid using BORLNDMM.DLL, pass string information using PChar or ShortString parameters. } uses SysUtils, Classes, Windows, UnitPrompt in 'UnitPrompt.pas' {FormPrompt}; {$R *.res} //Показать заставку procedure ShowPrompt(AOwner:TComponent); var Time:extended; Form:TFormPrompt; begin Form:=TFormPrompt.Create(AOwner); //Создать форму Time:=GetTickCount/1000; //Запомнить время Form.Show; //Показать форму Form.Repaint; //Перерисовать форму //Пока не вышел лимит времени - ничего не делать while GetTickCount/1000<Time+4 do; Form.Close; //Закрыть форму Form.Free; //Уничтожить форму end; exports ShowPrompt; begin end. unit UnitPrompt; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, XPMan; type TFormPrompt = class(TForm) XPManifest1: TXPManifest; Image1: TImage; private { Private declarations } public { Public declarations } end; var FormPrompt: TFormPrompt; implementation {$R *.dfm} end. Файл проекта COM-сервера - MyServer.dpr library MyServer; { Important note about DLL memory management: ShareMem must be the first unit in your library's USES clause AND your project's (select Project-View Source) USES clause if your DLL exports any procedures or functions that pass strings as parameters or function results. This applies to all strings passed to and from your DLL--even those that are nested in records and classes. ShareMem is the interface unit to the BORLNDMM.DLL shared memory manager, which must be deployed along with your DLL. To avoid using BORLNDMM.DLL, pass string information using PChar or ShortString parameters. } uses SysUtils, ComServ, UComRiad in 'UComRiad.pas', UCom_Tlb in 'UCom_Tlb.pas', Classes, MyServer_TLB in 'MyServer_TLB.pas'; exports DllGetClassObject, DllCanUnloadNow, DllRegisterServer, DllUnregisterServer; {$R *.TLB} {$R *.res} begin end. Файл описания COM- класса - UComRiad.pas unit UComRiad; {$WARN SYMBOL_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 Procedure Create(AIniFileName : string); stdcall; Destructor Destroy; procedure Graphic(AChart:TChart); stdcall; //Постоение графика procedure Table(AStringGrid:TStringGrid); stdcall; //Вывод в таблицу procedure WriteToIniFile; stdcall; //Запись в Ini-файл procedure ReadFromIniFile; stdcall; //Чтение из Ini-файла function GetW : integer; stdcall; //Получить w procedure SetW; stdcall; //Установить w function F(w:integer; t:extended):extended;stdcall;//Вычисление суммы private end; implementation uses ComServ, Dialogs, Graphics, UnitMain; const P=500; const x=1; const TimeStart=0; //Время начала отсчета const TimeEnd=100; //Время окончания отсчета const TimeStep=0.5; //Шаг дискретизация времени Procedure TRiad.Create(AIniFileName : string); begin //Создать объект Ini-файла IniFile:= TIniFile.Create(AIniFileName); end;//TRod.Create Destructor TRiad.Destroy; begin //Не используется //Удалить из Heap объект Ini-файла if Assigned(IniFile) then begin IniFile.Free; IniFile:= NIL; end; end;//TRod.Create procedure TRiad.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 <= TimeEnd) do 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 function TRiad.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 procedure TRiad.Table(AStringGrid : TStringGrid); //Вывод информации в таблицу var k : integer; time : extended; y: extended; begin k:= 0; time:= TimeStart; while (time <= TimeEnd) do begin inc(k); y:= F(w, time); Form1.StringGrid1.Cells[2,k]:= FloatToStrF(y , ffFixed, 5, 3); time:= time + TimeStep; end; end;//TRiad.Table procedure TRiad.WriteToIniFile; //запись в Ini-файл begin IniFile.WriteInteger('Parameters', 'W', W); IniFile.UpdateFile;//очистка буфера и запись файла на диск end;//TRiad.WriteToIniFile procedure TRiad.ReadFromIniFile; //чтение из Ini-файла begin W:= IniFile.ReadInteger('Parameters', 'W', w); end;//TRiad.ReadFromIniFile function TRiad.GetW :integer; begin result:= W; end;//TRiad.GetW procedure TRiad.SetW; begin if Form1.RadioGroup1.ItemIndex=-1 then MessageDlg(Pchar('Не выбрано значение w!!!'),mtError,[mbOk],0); if Form1.RadioGroup1.ItemIndex =0 then begin Form1.Label10.Caption:='1'; w:=1; end else if Form1.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}'] Procedure Create(AIniFileName : string); stdcall; procedure Graphic(AChart:TChart); stdcall; //Постоение графика procedure Table(AStringGrid:TStringGrid); stdcall; //Вывод в таблицу procedure WriteToIniFile; stdcall; //Запись в Ini-файл procedure ReadFromIniFile; stdcall; //Чтение из Ini-файла function Getw : integer; stdcall; //Получить w procedure Setw; stdcall; //Установить w function F(w:integer; t:extended):extended;stdcall;//Вычисление суммы end; implementation end.
|
|