|
Формирование и отображение звёзд разных размеров
Формирование и отображение звёзд разных размеров
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РЕСПУБЛИКИ БЕЛАРУСЬ БЕЛОРУССКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ Факультет информационных технологий и робототехники (ФИТР) Кафедра программного обеспечения вычислительной техники и автоматизированных систем КУРСОВАЯ РАБОТА по дисциплине: ”Разработка приложений в визуальных средах” на тему: ”Формирование и отображение звёзд разных размеров” Выполнил: ст. гр. 107218 Бербаш Н.Р. Принял: доц. Гурский Н.Н. Минск 2010 Белорусский национальный технический университет Кафедра программного обеспечения вычислительной техники и автоматизированных систем ПОЯСНИТЕЛЬНАЯ ЗАПИСКА к курсовому проекту (работе) по дисциплине_Разработка приложений___ __в визуальных средах__ Тема __Формирование и отображение звёзд разных размеров________ _____________________________________________________________ Исполнитель:______________________________(фамилия, инициалы) (подпись) Студент____2____курса__107218__группы Руководитель : _____________________________(фамилия, инициалы) (подпись) Минск 2010 Содержание: Введение 1.Математическая формулировка задачи 2.Описание программы 2.1 Структурная схема программы 2.2 Описание разработанного класса 2.3 Описание реализации технологии Com 2.4 Описание динамических библиотек 2.5 Основные возможности программы 2.6 Средства использования сервисов, предоставляемых Microsoft Office 3.Руководство пользователя 4.Методика испытаний Заключение Литература ПРИЛОЖЕНИЕ Файл проекта Stars.dpr Файл головного модуля Unit1.pas Файл вывода формы настройки таймера Unit2.pas Файл реализации класса - UStar.pas Файл описания динамической библиотеки About.dpr Файл описания динамической библиотеки Screen.dpr Файл проекта COM-сервера - StarServer.dpr Файл описания COM- класса - UCom.pas Файл библиотеки типов COM- класса - ULibType.pas Введение Представленная в этой работе программа выполняет формирование и отображение звёзд разных размеров. Это осуществляется с помощью графической библиотеки OpenGL. OpenGL -- это стандартная библиотека для всех 32-разрядных операционных систем, в том числе и для операционной системы Windows. OpenGL -- не отдельная программа, а часть операционной системы. Это означает, что откомпилированное приложение, использующее OpenGL, не нуждается ни в каких дополнительных программах и модулях, кроме стандартных, содержащихся на любом компьютере с установленной операционной системой Windows 95 версии OSR2 и выше. Для разработки программы была выбрана среда визуального проектирования Borland Delphi 7.0. Она позволяет за короткий промежуток времени и с наименьшими затратами физических и умственных сил создавать прикладные программы различной направленности, обеспечивая при этом наличие дружественного оконного интерфейса. В состав стандартной поставки Delphi (начиная с третьей версии) входит заголовочный файл, позволяющий строить приложения с использованием OpenGL, а также справочный файл по командам этой библиотеки. Указанные (а также ряд других) преимущества среды Delphi 7.0. обуславливают широкое её использование при создании программного обеспечения разнообразного назначения. 1. Математическая формулировка задачиФормирование звёзд в представленой работе происходит с помощью библиотеки OpenGL путем рисования сгруппированных треугольноков. Построения на основе треугольников являются оптимальными по своим скоростным показателям: треугольники строятся наиболее быстро, и именно этот формат чаще всего предлагается для аппаратного ускорения. Сначала рисуется пятиугольник, состоящий из 5-и треугольников, координаты вершин которых вычисляются по формулам:Х1=0; Y1=0;X2= r * cos (2 * Pi * i / 5); Y2= r * sin (2 * Pi * i / 5);X3= r* cos (2 * Pi * (i + 1) / 5; Y3= r * sin (Pi-2 * Pi * (i + 1)/ 5); где i изменяется от 0 до 4;Затем к нему пририсовываются «лучи» - ещё 5 треугольников с координатами:Х1= r * cos (2 * Pi * i / 5); Y1= r * sin (2 * Pi * i / 5);X2= 2*r * cos (2 * Pi * i / 5 + Pi /5); Y2= 2*r * sin (2 * Pi * i / 5 + Pi / 5);X3= r * cos (2 * Pi * (i + 1) / 5 ); Y3= r * sin (Pi-2 * Pi * (i + 1)/ 5); где i изменяется от 0 до 4; 2. Описание программы2.1 Структурная схема программыСтруктурно программа состоит из главного модуля, модулей описания вспомогательных форм, динамических библиотек, файлов помощи и обращений к другим программам. Связь модулей приведена на рисунке 2.1. Com-сервер Заставка Модуль (MS Excel) (Screen.dpr) Com - класса (Uscreen.pas) (UCom.pas) DLL Com - сервер Com-сервер (StarServar.dpr) (MS Word) Главное окно Модуль программы интерфейса Модуль класса (Form1) (ULibType.pas) TStar (Unit1.pas) (UStar.pas) Окно Форма для «About» настройки таймера (About.dpr) (Form2) (UAbout.pas) (Unit2.pas) DLLРисунок-2.1. Структурная схема связей модулей программы2.2 Описание разработанного классаВ результате анализа предметной области для её описания и моделирования был разработан класс TStar, инкапсулирующий поля, методы и свойства, применимые к рассматриваемому объекту.type TStar = class private Ac1,Ac2:TColor; //переменные для установки цвета public procedure PaintStar; //процедура рисования звёзд procedure SetC1(cv1:TColor); //установить цвет фона procedure SetC2(cv2:TColor); //установить цвет звёзд function GetC1:TColor; //получить цвет фона function GetC2:TColor; //получить цвет звёзд property c1:TColor read GetC1 write SetC1; property c2:TColor read GetC2 write SetC2; end;Описание и реализация класса структурно оформлено в отдельном Unit - UStar. Используемые секции public и private определяют области видимости элементов класса. Так, видно, что все поля класса являются полностью закрытыми, а доступ к ним организуется с помощью методов и свойств.2.3 Описание реализации технологии COM В соответствии с требованиями на разработку данной курсовой работы была также реализована возможность экспорта методов созданного класса с помощью технологии COM. Для этого был создан сервер в виде DLL - программный модуль StarServer.library StarServer;uses ComServ, UCom in 'UCom.pas', ULibType in 'ULibType.pas', StarServer_TLB in 'StarServer_TLB.pas';exports DllGetClassObject, DllCanUnloadNow, DllRegisterServer, DllUnregisterServer;{$R *.TLB}{$R *.RES}beginend.Этот сервер позволяет создать COM-объект, описание класса которого находится в модуле UСom. Следует заметить, что данный класс полностью соответствует, приведенному в п.2.2 классу TStar. Непосредственный доступ к открытым элементам COM-класса осуществляется с помощью интерфейса IStar, описанного в модуде ULibType.2.4. Описание динамических библиотекПри разработке приложения были реализованы 2 динамические библиотеки. Динамическая библиотека Screen.dll содержит заставку, появляющуюся после запуска программы, но до появления главного окна.library Screen;uses SysUtils,Classes,Windows, UScreen in 'UScreen.pas' {FormScreen};{$R *.res}//показать заставкуprocedure ShowScreen(AOwner:TComponent);varTime:extended;FormSc:TFormScreen;beginFormSc:=TFormScreen.Create(AOwner); //создать формуTime:=GetTickCount/1000; //запомнить времяFormSc.Show; //показать формуFormSc.Repaint; //перерисовать форму//пока не вышел лимит времени - ничего не делатьwhile GetTickCount/1000<Time+4 do;FormSc.Close; //закрыть формуFormSc.Free; //уничтожить формуend;exports ShowScreen;beginend.Библиотека содержит 1 экспортируемую процедуру ShowScreen, служащую для отображения формы. Библиотека About.dll содержит форму с информацией о программе.library About;uses SysUtils, Classes, UAbout in 'UAbout.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 Основные возможности программыПрограмма начинается с отображения оригинальной заставки (содержится в Screen.dll), а затем на экране появляется главное окно программы (модуль Unit1). Главный модуль управляет работой всех других модулей в соответствии с запросами пользователя.Он содержит:· Вызов окна «About»;· Передачу данных в Word и Excel;· Вызов формы настройки таймера;· Вызов окна помощи;· Сохранение данных в Ini-файлах;· Использование возможностей разработанного COM-сервера; Диалог с пользователем поддерживается с помощью главного и выпадающего меню, панели инструментов, кнопок и других интерфейсных элементов.Окно «About» содержит краткую информацию о приложении. При выполнении приложения пользователю предоставляется возможность выбора создания объекта обычного (классического типа), либо COM-объекта, экспортирующего свои методы головному модулю программы. Таким образом, в рамках данного проекта также реализуется поддержка клиент-серверной технологии обмена данными между приложениями.Процесс логического взаимодействия пользователя c программой, назначение элементов главного окна описаны в «Руководстве пользователя».Вопросы непосредственной программной реализации конкретных модулей приведены в приложении. 2.6 Средства использования сервисов, предоставляемых Microsoft OfficeКроме процедур и функций, описанных в классах, программа обеспечивает взаимодействие с серверами автоматизации приложений Microsoft Office. Так, следующие процедуры головного модуля программы позволяют автоматически производить запуск MS Word, MS Excel и передавать им текстовую информацию с целью создания отчетов или использование ее для дальнейшей обработки.1. Procedure TForm1.ReportExcel.Данная процедура обеспечивает передачу данных в Excel. 2. Procedure TForm1.ReportWord. Процедура позволяет создать отчет, принятый в Word.3. Руководство пользователяДля активизации программы необходимо вызвать файл Stars.exe. При этом, на экране появится заставка, показанная на рисунке 3.1.Рисунок 3.1 - Заставка программыПосле того как заставка через несколько секунд исчезнет, появится главное окно программы (см. рисунок 3.2).Рисунок 3.2 - Главное окно программы Как видно, данное окно состоит из следующих частей:· Главного меню; · Панели инструментов; · Области вывода графического изображения; Пункты главного меню показаны на рисунке 3.3.Рисунок 3.3 - Главное меню программыВ свою очередь пункты главного меню содержит ряд подпунктов, приведенных на рисунке 3.4.Рисунок 3.4 - Пункт меню «Настройки»При выборе пункта «Выход» происходит завершение работы приложения.Пункт меню «Отобразить звёзды» обеспечивает выполнение поцедуры формирования и отображения звёзд.Пункт меню «Таймер» обеспечивает задание настроек таймера при помощи окна следующего вида:Рисунок 3.5 - Окно настройки таймераДля подтверждения ввода необходимо нажать кнопку "OK", для закрытия формы "Close". Также тут можно выключить таймер, поставив галочку в поле «Выкл таймер».После выбора пунктов «Цвет фона» или «Цвет звёзд» на экране появится стандартное диалоговое окно выбора цвета, где можно выбрать необходимый цвет.Рис 3.6 - Окно выбора цветаВыбор пункта меню «О программе» позволяет получить на экране краткие сведения о программе в виде, показанном на рисунке 3.7.Рисунок 3.7 - Окно «About»Кроме главного меню программа управляется также кнопками на панели инструментов, которые дублирует наиболее важные пункты главного меню и предназначены для оперативного выполнения основных команд:Рисунок 3.8 - Панель инструментовПри выборе кнопки происходит вызов окна помощи, содержащим сведения о работе с программой (см. рисунок 3.9)Рисунок 3.9 - Окно справочной системы Кнопки и обеспечивают по желанию пользователя формирование отчетов с параметрами формы в виде текстового документа в стиле редактора Ms Word или в табличном процессоре MS Excel.Также на панели управления можно указать тип обьекта (классический или COM), который будет создаваться для отображения звёзд.Рисунок 3.10 - Выбор типа обьектаПри щелчке правой кнопкой мыши в главном окне, появляется контекстное меню, приведенное на рисунке 3.11.Рисунок 3.10 - Контекстное меню программыДля выхода из программы следует нажать кнопку «Выход».4. Методика испытанийЦелью проведения испытаний является проверка работоспособности (надежности) программы при различных условиях ее функционирования.Программа должна обеспечивать корректность ввода исходных данных (путем осуществления соответствующих проверок и информирования пользователя о возникших неточностях в работе), а также получение непротиворечивого результата.Для демонстрации работоспособности программы необходимо провести ряд испытаний с различными начальными условиями. Для обеспечения нормальной работы программы требуется наличие соответствующих DLL, а также приложений Word, Excel.Для использования COM-сервера, он должен быть предварительно зарегистрирован в системе. Тестовые примеры выполнялись в среде операционной системы Windows XP Profesional при разрешении экрана 1024*768. Для работы с программой необходимо также наличие клавиатуры и манипулятора типа «мышь».Первое испытание произведем с созданием классического типа обьекта. Результаты испытания показаны на рисунке 4.1.Рисунок 4.10 - Работа программы При вводе некорректных данных появляется сообщение (например, при вводе значения таймера): поля ввода данных позволяют вводить только цифры.Рисунок 4.2 - Сообщение ошибки ввода данныхПроизведем также испытание с использованием разработанного COM-объекта.Рисунок 4.3 - Работа программы с использованием Com - объектаТаким образом, проведенное тестирование программы не выявило сбойных ситуаций и некорректностей в ее работе. Следует считать, что в целом программа протестирована, отвечает поставленным требованиям и вполне работоспособна.ЗаключениеВ ходе выполнения курсовой работы· были закреплены знания по курсу «Разработка приложений в визуальных средах»;· приобретен опыт при разработке объектно-ориентированных программ;· изучены принципы создания динамических библиотек;· изучены и реализованы способы создания клиент-серверных приложений на базе COM-технологий;· освоены методы передачи данных между приложениями;· изучены возможности создания справочной системой высокой степени сложности и различных форматов.При разработке программы использовался модульный принцип программирования. Такая структура программы позволяет в дальнейшем модифицировать отдельные её части без нарушения работоспособности и потери функциональности приложения.Программа имеет достаточно ясный и понятый дружелюбный пользовательский интерфейс, обеспечивающий удобство в работе и обеспечивающий получение необходимой пользователю информации с наименьшими затратами времени.Таким образом, разработанное в ходе выполнения курсовой работы приложение является законченным программным продуктом.Литература 1. Краснов М.В. OpenGL графика в проектах Delphi. -СПб.: БХВ-Петербург, 2002. 2. Конспекты по курсу «Разработка приложений в визуальных средах» ПРИЛОЖЕНИЕФайл проекта Stars.dprprogram Stars;uses Forms, Windows, Classes, Dialogs, SysUtils, Unit1 in 'Unit1.pas' {Form1}, Unit2 in 'Unit2.pas' {Form2}, UStar in 'UStar.pas';Type//Процедурный тип для функции, вызываемой из DLL TProc=procedure(AOwner:TComponent);VarHandle : LongWord; //Дескриптор DLLShowScreen : tproc; //Переменная для функции{$R *.res}begin Application.Initialize; //*****Загрузка библиотеки и показ заставки******// Handle:= LoadLibrary('Screen.dll');if Handle <> 0 thenbegin//Получить адрес функции из библиотеки@ShowScreen:= GetProcAddress(Handle, 'ShowScreen');ShowScreen(Application); //Показать заставкуFreeLibrary(Handle); //Удалить библиотекуendelse ShowMessage('Не найдена библиотека Screen.dll');//***********************************************// Application.CreateForm(TForm1, Form1); Application.CreateForm(TForm2, Form2); Application.Run;end.Файл головного модуля Unit1.pasunit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, OpenGL, Menus, ExtCtrls, Buttons, ToolWin, ComCtrls,inifiles,WordXP, StdCtrls;type TForm1 = class(TForm) MainMenu1: TMainMenu; N1: TMenuItem; N2: TMenuItem; N3: TMenuItem; N7: TMenuItem; N4: TMenuItem; N5: TMenuItem; N6: TMenuItem; Timer1: TTimer; ColorDialog1: TColorDialog; ColorDialog2: TColorDialog; PopupMenu1: TPopupMenu; N8: TMenuItem; N9: TMenuItem; N10: TMenuItem; N11: TMenuItem; N12: TMenuItem; ToolBar1: TToolBar; SpeedButton1: TSpeedButton; SpeedButton2: TSpeedButton; SpeedButton3: TSpeedButton; SpeedButton4: TSpeedButton; SpeedButton5: TSpeedButton; SpeedButton6: TSpeedButton; SpeedButton7: TSpeedButton; SpeedButton8: TSpeedButton; ToolButton1: TToolButton; CheckBox1: TCheckBox; ToolButton2: TToolButton; procedure N3Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure N6Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure N4Click(Sender: TObject); procedure N5Click(Sender: TObject); procedure N7Click(Sender: TObject); procedure N2Click(Sender: TObject); procedure SpeedButton5Click(Sender: TObject); procedure ReadParams; procedure WriteParams; procedure SpeedButton7Click(Sender: TObject); procedure ReportWord; procedure SpeedButton8Click(Sender: TObject); procedure ReportExcel; private hrc: HGLRC; end; var Form1: TForm1; c1,c2:TColor;implementationuses Unit2,ULibType,ComObj,Unit3;{$R *.dfm}procedure SetDCPixelFormat (hdc : HDC);var pfd : TPixelFormatDescriptor; nPixelFormat : Integer;begin FillChar (pfd, SizeOf (pfd), 0); pfd.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER; nPixelFormat := ChoosePixelFormat (hdc, @pfd); SetPixelFormat (hdc, nPixelFormat, @pfd);end;procedure TForm1.FormCreate(Sender: TObject);beginReadParams;SetDCPixelFormat(Canvas.Handle);hrc := wglCreateContext(Canvas.Handle);Timer1.Interval:=1000;Timer1.Enabled:=false;c1:=RGB(0,0,255);c2:=RGB(255,255,0);end;procedure TForm1.FormDestroy(Sender: TObject);begin wglDeleteContext(hrc);end;procedure TForm1.N3Click(Sender: TObject);varTest:IStar;Star:TStar;beginwglMakeCurrent(Canvas.Handle, hrc);glViewPort (0, 0, Form1.ClientWidth, Form1.ClientHeight); // область выводаif Form1.CheckBox1.Checked then begin Test:=CreateComObject(Class_Star) as IStar; Test.SetC1(c1); Test.SetC2(c2); Test.PaintStar; end else begin Star:=TStar.Create(); Star.c1:=c1; Star.c2:=c2; Star.PaintStar; end; SwapBuffers(Canvas.Handle); // содержимое буфера - на экран wglMakeCurrent(0, 0); Test:=Nil;if Form2.CheckBox1.Checked then Form1.Timer1.Enabled:=false else Form1.Timer1.Enabled:=true;end;procedure TForm1.N6Click(Sender: TObject);beginWriteParams;Close;end;procedure TForm1.Timer1Timer(Sender: TObject);beginN3Click(Sender);end;procedure TForm1.N4Click(Sender: TObject);beginif ColorDialog1.Execute then c1:=ColorDialog1.Color;end;procedure TForm1.N5Click(Sender: TObject);beginif ColorDialog2.Execute then c2:=ColorDialog2.Color;end;procedure TForm1.N7Click(Sender: TObject);beginForm2.Show;end;procedure TForm1.N2Click(Sender: TObject);Type//Процедурный тип для вызова процедуры из DLLTProc = procedure(AOwner:TComponent);varHLib : THandle; //Дескриптор библиотекиShowAbout : TProc; //Переменая для вызова функции из DLLbegin//Получить значение дескриптора загруженной библиотекиHLib:=LoadLibrary('About.dll');//Проверить существование библиотекиif HLib = 0 thenbeginShowMessage('Библиотека не найдена : About.dll');exit;end;//Получить адрес вызываемой функции@ShowAbout:= GetProcAddress(HLib, 'ShowAbout');//Вызов функции, показывающей форму AboutShowAbout(Application);FreeLibrary(HLib); //Выгрузка библиотекиN3Click(Sender);end;procedure TForm1.SpeedButton5Click(Sender: TObject);beginApplication.HelpFile := 'Help\NewProject.hlp';Application.HelpCommand(HELP_FINDER, 3);end;procedure TForm1.ReadParams;Var IniFile:TIniFile; // объявление переменной, через которую будут обрабатываться данные Path:String; // Переменная, где будет храниться путь к программе begin Path:=Application.ExeName; // полный путь и название запущенной программы Path:=ExtractFileDir(Path); // отбрасываем название программы. Остается путь. if Path[Length(Path)]<>'\' then Path:=Path+'\'; // если последний символ не \ то добавить его {Последняя строка нужна для присвоения последнего символа '\', потому что при обрезке файла 'C:\PROG.EXE' получим 'C:\', а при обрезке 'C:\WINDOWS\PROG.EXE' получим 'C:\WINDOWS' } IniFile:=TIniFile.Create(Path+'project.ini'); // полный путь к программе и имя ini файла Form1.Top:=IniFile.ReadInteger('FORM1','Form1Top',Form1.Top); // верхнее положение окна Form1.Left:=IniFile.ReadInteger('FORM1','Form1Left',Form1.Left); // левое положение окна Form1.Height:=IniFile.ReadInteger('FORM1','Form1Height',Form1.Height); // высота Form1.Width:=IniFile.ReadInteger('FORM1','Form1Width',Form1.Width); // ширина IniFile.Free; // если сами создаем, то сами уничтожаем.end;procedure TForm1.WriteParams;Var IniFile:TIniFile; Path:String; // Переменная, где будет храниться путь к программеbegin Path:=Application.ExeName; // полный путь и название запущенной программы Path:=ExtractFileDir(Path); // отбрасываем название программы. Остается путь. if Path[Length(Path)]<>'\' then Path:=Path+'\'; // если последний символ не \ то добавить его IniFile:=TIniFile.Create(Path+'project.ini'); // полный путь к программе и имя ini файла IniFile.EraseSection('FORM1'); //удаление секции IniFile.WriteInteger('FORM1','Form1Top',Form1.Top); IniFile.WriteInteger('FORM1','Form1Left',Form1.Left); IniFile.WriteInteger('FORM1','Form1Height',Form1.Height); IniFile.WriteInteger('FORM1','Form1Width',Form1.Width); IniFile.Free;end;procedure TForm1.SpeedButton7Click(Sender: TObject);beginReportWord;end;procedure TForm1.ReportWord;//Отчет в Wordvarwa : TWordApplication; //WordApplicationwd : TWordDocument; //WordDocumentbegin//Создать 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;wd.Range.InsertAfter('Отчет: '+#13);wd.Range.InsertAfter('Параметры формы: '+#13);wd.Range.InsertAfter('Отступ сверху '+IntToStr(Form1.Top)+#13);wd.Range.InsertAfter('Отступ слева '+IntToStr(Form1.Left)+#13);wd.Range.InsertAfter('Высота '+IntToStr(Form1.Height)+#13);wd.Range.InsertAfter('Ширина '+IntToStr(Form1.Width)+#13);//Показать Wordwa.Visible:= true;end;procedure TForm1.SpeedButton8Click(Sender: TObject);beginReportExcel;end;procedure TForm1.ReportExcel;//Отчет в ExcelvarExcel : variant;WorkBook : variant; //Рабочая книга j : integer;begin//Создать Соm-объектExcel:= CreateOleObject('Excel.Application');//Отключить реакцию на внешние события-для ускорения процесса передачи данныхExcel.Application.EnableEvents:= false;//Добавить рабочую книгуWorkBook:= Excel.WorkBooks.Add;//Изменение ширины столбцовfor j:=0 to 2 doWorkBook.WorkSheets[1].Columns[j+1].ColumnWidth:= 20;//Вывод строкиWorkBook.WorkSheets[1].Cells[1,1]:= 'Отчет: ';WorkBook.WorkSheets[1].Cells[2,1]:= 'Параметры формы: ';WorkBook.WorkSheets[1].Cells[3,1]:= 'Отступ сверху: ';WorkBook.WorkSheets[1].Cells[3,2]:= Form1.Top;WorkBook.WorkSheets[1].Cells[4,1]:= 'Отступ слева: ';WorkBook.WorkSheets[1].Cells[4,2]:= Form1.Left;WorkBook.WorkSheets[1].Cells[5,1]:= 'Высота: ';WorkBook.WorkSheets[1].Cells[5,2]:= Form1.Height;WorkBook.WorkSheets[1].Cells[6,1]:= 'Ширина: ';WorkBook.WorkSheets[1].Cells[6,2]:= Form1.Width;//Показать ExcelExcel.Visible:=true;end;end.Файл вывода формы настройки таймера Unit2.pas.unit Unit2;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm2 = class(TForm) Edit1: TEdit; Label1: TLabel; CheckBox1: TCheckBox; Button1: TButton; Button2: TButton; procedure CheckBox1Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); Procedure Edit1KeyPress(Sender: TObject; var Key: Char); private { Private declarations } public { Public declarations } end;var Form2: TForm2;implementationuses Unit1;{$R *.dfm}procedure TForm2.CheckBox1Click(Sender: TObject);beginif CheckBox1.Checked then Edit1.Enabled:=false else Edit1.Enabled:=true;end;procedure TForm2.Button1Click(Sender: TObject);beginif CheckBox1.Checked then Form1.Timer1.Enabled:=false else begin Form1.Timer1.Enabled:=true; Form1.Timer1.Interval:=StrToInt(Edit1.Text)*1000; end;end;Procedure TForm2.Edit1KeyPress(Sender: TObject; var Key: Char);begin //Фильтр ввода данныхif not(Key in ['0'..'9', #8]) then begin MessageBox(0,'Допускается только ввод чисел','Ошибка',mb_ok); Key:= #0; end;end;procedure TForm2.Button2Click(Sender: TObject);beginClose;Form1.N3Click(Sender);end;end.Файл реализации класса - UStar.pasunit UStar;interfaceUses OpenGL,Graphics,Windows;type TStar = class private Ac1,Ac2:TColor; //переменные для установки цвета public procedure PaintStar; //процедура рисования звёзд procedure SetC1(cv1:TColor); //установить цвет фона procedure SetC2(cv2:TColor); //установить цвет звёзд function GetC1:TColor; //получить цвет фона function GetC2:TColor; //получить цвет звёзд property c1:TColor read GetC1 write SetC1; property c2:TColor read GetC2 write SetC2; end;implementationUses Unit1;procedure TStar.SetC1(cv1:TColor);beginAc1:=cv1;end;procedure TStar.SetC2(cv2:TColor);beginAc2:=cv2;end;function TStar.GetC1:TColor;beginresult:=Ac1;end;function TStar.GetC2:TColor;beginresult:=Ac2;end;procedure TStar.PaintStar;var i,n,j:integer; x,y,r:real;begin glClearColor (GetRValue(c1)/256, GetGValue(c1)/256, GetBValue(c1)/256, 1.0); // цвет фона glClear (GL_COLOR_BUFFER_BIT); // очистка буфера цвета glColor3f (GetRValue(c2)/256, GetGValue(c2)/256, GetBValue(c2)/256); // текущий цвет примитивов for n:=1 to 12 do begin x:=(random(100)/100) - (random(100)/100); y:=(random(100)/100) - (random(100)/100); glTranslatef (x, y, 0.0); j:= random(180); glRotatef (j, 0.0, 0.0, 1.0); //54 r:=random(10)/100; glBegin (GL_TRIANGLES); For i := 0 to 4 do begin glVertex2f (0, 0); glVertex2f (r * cos (2 * Pi * i / 5), r * sin (2 * Pi * i / 5)); //0.25 glVertex2f (r* cos (2 * Pi * (i + 1) / 5 ), r * sin (Pi-2 * Pi * (i + 1)/ 5)); end; glEnd; glBegin (GL_TRIANGLES); For i := 0 to 4 do begin glVertex2f (r * cos (2 * Pi * i / 5), r * sin (2 * Pi * i / 5)); glVertex2f (2*r * cos (2 * Pi * i / 5 + Pi /5), 2*r * sin (2 * Pi * i / 5 + Pi / 5)); glVertex2f (r * cos (2 * Pi * (i + 1) / 5 ), r * sin (Pi-2 * Pi * (i + 1)/ 5)); end; glEnd; glRotatef (-j, 0.0, 0.0, 1.0); //-54 glTranslatef (-x, -y, 0.0); end;end;end.Файл описания динамической библиотеки About.dprlibrary About;uses SysUtils, Classes, UAbout in 'UAbout.pas' {FormAbout};{$R *.res}//показать формуprocedure ShowAbout(AOwner:TComponent);varForm:TFormAbout;beginForm:=TFormAbout.Create(AOwner); //создать формуForm.ShowModal; //показать формуForm.Free; //уничтожить формуend;exports ShowAbout;beginend.unit UAbout;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, jpeg, ExtCtrls; type TFormAbout = class(TForm) Button1: TButton; Image1: TImage; Label1: TLabel; Label2: TLabel; Label3: TLabel; procedure Button1Click(Sender: TObject); end;var FormAbout: TFormAbout;implementation{$R *.dfm}procedure TFormAbout.Button1Click(Sender: TObject);beginClose;end;end.Файл описания динамической библиотеки Screen.dprlibrary Screen;uses SysUtils, Classes, Windows, UScreen in 'UScreen.pas' {FormScreen};{$R *.res}//показать заставкуprocedure ShowScreen(AOwner:TComponent);varTime:extended;FormSc:TFormScreen;beginFormSc:=TFormScreen.Create(AOwner); //создать формуTime:=GetTickCount/1000; //запомнить времяFormSc.Show; //показать формуFormSc.Repaint; //перерисовать форму//пока не вышел лимит времени - ничего не делатьwhile GetTickCount/1000<Time+4 do;FormSc.Close; //закрыть формуFormSc.Free; //уничтожить формуend;exports ShowScreen;beginend.unit UScreen;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, jpeg, ExtCtrls;type TFormScreen = class(TForm) Image1: TImage; end;var FormScreen: TFormScreen;implementation{$R *.dfm}end.Файл проекта COM-сервера - StarServer.dprlibrary StarServer;uses ComServ, UCom in 'UCom.pas', ULibType in 'ULibType.pas', StarServer_TLB in 'StarServer_TLB.pas';exports DllGetClassObject, DllCanUnloadNow, DllRegisterServer, DllUnregisterServer;{$R *.TLB}{$R *.RES}beginend.Файл описания COM- класса - UCom.pasunit UCom;{$WARN SYMBOL_PLATFORM OFF}interfaceuses Windows, ActiveX, Classes, ComObj,OpenGL,ULibType, Graphics;type TStar = class(TComObject,IStar) protected Ac1,Ac2:TColor; public procedure PaintStar;stdcall; procedure SetC1(cv1:TColor); stdcall; procedure SetC2(cv2:TColor); stdcall; function GetC1:TColor; stdcall; function GetC2:TColor; stdcall; property c1:TColor read GetC1 write SetC1; property c2:TColor read GetC2 write SetC2; end;const Class_Star: TGUID = '{AF564D37-C789-4A62-8530-EE0AB25F52F7}';implementationuses ComServ;procedure TStar.SetC1(cv1:TColor);beginAc1:=cv1;end;procedure TStar.SetC2(cv2:TColor);beginAc2:=cv2;end;function TStar.GetC1:TColor;beginresult:=Ac1;end;function TStar.GetC2:TColor;beginresult:=Ac2;end;procedure TStar.PaintStar;var i,n,j:integer; x,y,r:real;begin glClearColor (GetRValue(c1)/256, GetGValue(c1)/256, GetBValue(c1)/256, 1.0); // цвет фона glClear (GL_COLOR_BUFFER_BIT); // очистка буфера цвета glColor3f (GetRValue(c2)/256, GetGValue(c2)/256, GetBValue(c2)/256); // текущий цвет примитивов for n:=1 to 12 do begin x:=(random(100)/100) - (random(100)/100); y:=(random(100)/100) - (random(100)/100); glTranslatef (x, y, 0.0); j:= random(180); glRotatef (j, 0.0, 0.0, 1.0); //54 r:=random(10)/100; glBegin (GL_TRIANGLES); For i := 0 to 4 do begin glVertex2f (0, 0); glVertex2f (r * cos (2 * Pi * i / 5), r * sin (2 * Pi * i / 5)); //0.25 glVertex2f (r* cos (2 * Pi * (i + 1) / 5 ), r * sin (Pi-2 * Pi * (i + 1)/ 5)); end; glEnd; glBegin (GL_TRIANGLES); For i := 0 to 4 do begin glVertex2f (r * cos (2 * Pi * i / 5), r * sin (2 * Pi * i / 5)); glVertex2f (2*r * cos (2 * Pi * i / 5 + Pi /5), 2*r * sin (2 * Pi * i / 5 + Pi / 5)); glVertex2f (r * cos (2 * Pi * (i + 1) / 5 ), r * sin (Pi-2 * Pi * (i + 1)/ 5)); end; glEnd; glRotatef (-j, 0.0, 0.0, 1.0); //-54 glTranslatef (-x, -y, 0.0); end;end;initialization TComObjectFactory.Create(ComServer, TStar, Class_Star, 'Star', 'Star Server', ciMultiInstance, tmApartment);end.Файл библиотеки типов COM- класса - ULibType.pasunit ULibType;interfaceuses Windows, Graphics; const Class_Star: TGUID = '{AF564D37-C789-4A62-8530-EE0AB25F52F7}'; type IStar= interface['{A7DA5480-DF7C-4053-8418-FF2B9BBBACB4}'] procedure PaintStar;stdcall; procedure SetC1(cv1:TColor); stdcall; procedure SetC2(cv2:TColor); stdcall; function GetC1:TColor; stdcall; function GetC2:TColor; stdcall; end; implementationend.
|
|