|
Формирование и отображение звёзд разных размеров |
Рисунок 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.
Страницы: 1, 2
|
|
|
© 2003-2013
Рефераты бесплатно, курсовые, рефераты биология, большая бибилиотека рефератов, дипломы, научные работы, рефераты право, рефераты, рефераты скачать, рефераты литература, курсовые работы, реферат, доклады, рефераты медицина, рефераты на тему, сочинения, реферат бесплатно, рефераты авиация, рефераты психология, рефераты математика, рефераты кулинария, рефераты логистика, рефераты анатомия, рефераты маркетинг, рефераты релиния, рефераты социология, рефераты менеджемент. |
|
|