Моделирования маятника с подвижной точкой подвеса
Рассмотрение структурной схемы программы визуального проектирования маятника Капицы. Описание разработанного класса модели. Характеристика реализаций технологий Com. Определение динамических библиотек. Выявление возможностей созданной программы.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 05.02.2015 |
Размер файла | 933,3 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Введение
Мамятником Капицы называется система, состоящая из грузика, прикрепленного к легкой нерастяжимой спице, которая крепится к вибрирующему подвесу. Маятник носит имя академика и нобелевского лауреата П. Л. Капицы, построившего в 1951 г. теорию для описания такой системы. При неподвижной точке подвеса, модель описывает обычный математический маятник, для которого имеются два положения равновесия: в нижней точке и в верхней точке. При этом равновесие математического маятника в верхней точке является неустойчивым, и любое сколь угодно малое возмущение приводит к потере равновесия.
Удивительной особенностью маятника Капицы является то, что, вопреки интуиции, перевернутое (вертикальное) положение маятника может быть устойчивым в случае быстрых вибраций подвеса.
Для разработки программы была выбрана среда визуального проектирования Borland Delphi 7.0. Она позволяет за короткий промежуток времени и с наименьшими затратами физических и умственных сил создавать прикладные программы различной направленности, обеспечивая при этом наличие дружественного оконного интерфейса. Указанные (а также ряд других) преимущества среды Delphi 7.0. обуславливают широкое её использование при создании программного обеспечения разнообразного назначения.
маятник капица визуальный программа
1. Математическая формулировка задачи
Маятник -- система, подвешенная в поле тяжести и совершающая механические колебания. Колебания совершаются под действием силы тяжести, силы упругости и силы трения. Во многих случаях трением можно пренебречь, а от сил упругости (либо сил тяжести) абстрагироваться, заменив их связями.
,
где - амплитуда, м
- частота, Гц ()
- угол отклонение от строго вертикального положения, радианах
- длина, м
- ускорение свободного падения, м\
t - время, с
2. Описание программы
2.1 Структурная схема программы
Структурно программа состоит из главного модуля, модулей описания вспомогательных форм, динамических библиотек, файлов помощи и обращений к другим программам. Связь модулей приведена на рисунке 2.
2.2 Описание разработанного класса
В результате анализа предметной области для её описания и моделирования был разработан класс TPendulum, инкапсулирующий поля, методы и свойства, применимые к рассматриваемому объекту.
TPendulum = class
private
FA: Double;//Амплитуда
Fv: Double;//Частота
FL: Double;//Длина
FPhi: Double;//Угол
Fw: Double;//Угловая скорость
FG: Double;//Ускорение свободного падения
FTimeLimit: Double;//Промежуток времени между обновление таблицы
FTime: Double;//Время
FNomerSeries: Integer;//Номер серий Chart
Fk: Integer;//Чередование Амлитуд
Fk0: Integer;//Время следующего изменения амлитуды
Fk1: Integer;//Следущие время обновление таблиц
FImage: TImage;//Для вывода в главном окне
FFormIm: TForm;//Для вывода в дополнительном окне
FWidthImage, FHeightImage: Integer;//Координаты центра экрана главного окна
FWidthFormIm, FHeightFormIm: Integer;//Координаты центра экрана дополнительного окна
FMainTable: TStringGrid;//Главная таблица для вывода результата
FTable: TStringGrid;//Дополнительная таблица для вывода результата
FMemo: TMemo;//Окно мемо для вывода лога
FChart: TChart;//Chart для рисование зависимоти угла от времени
FSeparate_window: Boolean;//Вывод изображения в дополнительной форме
FMultiple_instances: Boolean;//Вывод изображения в главной и дополнительной форме
//Если оба значения стоят в false то вывод производится только в главной форме
FLog: Boolean;//Разрешения для логирования
Protected
procedure SetSeparate_window(NewSeparate_window: Boolean);
procedure SetMultiple_instances(NewMultiple_instances: Boolean);
procedure SetLog(NewLog: Boolean);
procedure SetTimeLimit(NewTimeLimit: Double);
procedure SetImage(NewImage: TImage);
procedure SetFormIm(NewFormIm: TForm);
procedure SetMainTable(NewMainTable: TStringGrid);
procedure SetTable(NewTable: TStringGrid);
procedure SetChart(NewChart: TChart);
procedure SetMemo(NewMemo: TMemo);
procedure SetCenterXImage(NewCenterXImage: Integer);
procedure SetCenterYImage(NewCenterYImage: Integer);
procedure SetCenterXFormIm(NewCenterXFormIm: Integer);
procedure SetCenterYFormIm(NewCenterYFormIm: Integer);
procedure AddTable;//Вывод в таблицу
procedure CalcPhi;virtual;//Вычисление фи
procedure DifUrav;//Вычисление дифф. урав. методом Рунге-Кутты 4-порядка
procedure Draw_Next_Main;virtual;//Построение на главной форме
procedure Draw_Next;virtual;//Построение на дополнительной форме
function f(t,y,z: Double): Double;//Функция вида z'=cos(3x)-4y=f(x,y,z)
function g(t,y,z: Double): Double;//Функция вида y'=z=g(x,y,z)
function GetAmplitInit: Double;
function GetFrequency: Double;
function GetLength: Double;
function GetDeviation: Double;
function GetPastTime: Double;
function GetAngularVelocity: Double;
public
constructor Create(A,v,L,f,w,g: Double;time: Double;nomer: Integer);
procedure StartBuilding;//Начинает выполнения
procedure ReadToIni;virtual;
//Вводим данные для начало построения маятника
property Separate_window: Boolean write SetSeparate_window;
property Multiple_instances: Boolean write SetMultiple_instances;
property Log: Boolean write SetLog;
property TimeLimit: Double write SetTimeLimit;
property Image: TImage write SetImage;
property FormIm: TForm write SetFormIm;
property MainTable: TStringGrid write SetMainTable;
property Table: TStringGrid write SetTable;
property Memo: TMemo write SetMemo;
property Chart: TChart write SetChart;
property CenterXImage: Integer write SetCenterXImage;
property CenterYImage: Integer write SetCenterYImage;
property CenterXFormIm: Integer write SetCenterXFormIm;
property CenterYFormIm: Integer write SetCenterYFormIm;
//Записываем значения для произведения сохранения в файл
property AmplitInit: Double read GetAmplitInit;
property Frequency: Double read GetFrequency;
property Length: Double read GetLength;
property PastTime: Double read GetPastTime;
property Deviation: Double read GetDeviation;
property AngularVelocity: Double read GetAngularVelocity;
end;
Назначение полей и инкапсулированных в классе процедур и функций (методов) приведено в комментариях. Описание и реализация класса структурно оформлено в отдельном Unit - Pendulum. Используемые секции public и private определяют области видимости элементов класса. Так, видно, что все поля класса являются полностью закрытыми, а доступ к ним организуется с помощью методов и свойств.
2.3 Описание реализаций технологий Com
В соответствии с требованиями на разработку данной курсовой работы была также реализована возможность экспорта методов созданного класса с помощью технологии COM. Для этого был создан сервер в виде exe, описание класса которого находится в модуле UComPendulum. Следует заметить, что данный класс полностью соответствует, приведенному в п.2.2 классу TPendulum, т.е. он является его копией, за исключение конструктора Create и названия TPendulumCom, который заменен обычной процедурой. Непосредственный доступ к открытым элементам COM-класса осуществляется с помощью интерфейса IPendulumCom, описанного в модуде UComPendulum_Tlb.
2.4 Описание динамических библиотек
При разработке приложения были реализованы 2 динамические библиотеки.Динамическая библиотека Prompt.dll содержит заставку, появляющуюся после запуска программы, но до появления главного окна.
library Prompt;
uses
SysUtils,
Classes,
Windows,
Unit_Prompt in 'Unit_Prompt.pas' {FormPrompt};
{$R *.res}
procedure ShowPrompt(AOwner:TComponent);stdcall;
var
Form:TFormPrompt;
begin
Form:=TFormPrompt.Create(AOwner);
Form.Show;
Form.Repaint;
sleep(5000);
Form.Close;
Form.Free;
end;
exports ShowPrompt;
begin
end.
Библиотека содержит 1 экспортируемую процедуру ShowPrompt, служащую для отображения формы.
Библиотека About.dll содержит форму с информацией о программе.
library About;
uses
SysUtils,
Classes,
Windows,
Unit_About in 'Unit_About.pas' {FormAbout};
{$R *.res}
procedure ShowAbout(AOwner:TComponent);stdcall;
var
Form:TFormAbout;
begin
Form:=TFormAbout.Create(AOwner);
Form.ShowModal;
Form.Free;
end;
exports ShowAbout;
begin
end.
Библиотека содержит экспортируемую функцию ShowAbout для отображения формы.
2.5 Основные возможности программы
Программа начинается с отображения оригинальной заставки (содержится в Prompt.dll), а затем на экране появляется главное окно программы (модуль StartPendulum). Главный модуль управляет работой всех других модулей в соответствии с запросами пользователя.
Он содержит:
· Вызов окна «О программе»;
· Передачу данных в Word и Excel;
· Строит график;
· Моделирует движение маятника;
· Вызов окна помощи;
· Сохранение данных в Ini-файлах;
· Использование возможностей разработанного COM-сервера;
Диалог с пользователем поддерживается с помощью главного и выпадающего меню, панели инструментов, кнопок и других интерфейсных элементов.Окно «О программе» содержит краткую информацию о приложении. Моделирование движение маятника позваяет визуально наблдать движение маятника. График показывает изменение угла от времени.
При выполнении расчетов пользователю предоставляется возможность выбора создания объекта обычного (классического типа), либо COM-объекта, экспортирующего свои методы головному модулю программы. Таким образом, в рамках данного проекта также реализуется поддержка клиент-серверной технологии обмена данными между приложениями.
Процесс логического взаимодействия пользователя c программой, назначение элементов главного окна описаны в «Руководстве пользователя».Вопросы непосредственной программной реализации конкретных модулей приведены в приложении. По тексту программ даются достаточно полные комментарии, необходимые для описания переменных, процедур и функций, а также основных шагов реализации используемых алгоритмов.
2.6 Средства использования сервисов, предоставляемых MS Office
Кроме процедур и функций, описанных в классах, программа обеспечивает взаимодействие с серверами автоматизации приложений Microsoft Office. Так, следующие процедуры головного модуля программы позволяют автоматически производить запуск MS Word, MS Excel, Power Point и передавать им текстовую, табличную и графическую информацию с целью создания отчетов или использование ее для дальнейшей обработки.
1. procedure Tool_Button_ExcelClick(Sender: TObject). Данная процедура обеспечивает передачу данных в Excel.
2. procedure Tool_Button_WordClick(Sender: TObject). Процедура позволяет создать отчет, принятый в Word.
3. Руководство пользователя
Для активизации программы необходимо вызвать файл StartPendulum.exe. При этом, на экране появится заставка, показанная на рисунке 3.
Рисунок 3 - Заставка
После того как заставка через несколько секунд исчезнет, появится главное окно программы (см. рисунок 4).
Рисунок. 4 - Главное меню
Для подробного описание следует обратится к меню->Справка.
Чтобы начать работать надо задать значения для вычисления с помощью
Edit выведенных на главную форму или через Меню->Параметры(Рисунок 5.).
Рисунок.5 - Параметры
Чтобы начать работу надо воспользовать управлящими кнопками(Построить или Построить все).Для остановки надо нажать (Стоп или Остановить все).
Для выхода нажмите выход или закройте на крестик.
Рисунок. 6 - График
Рисунок.7 - Построение маятника
Работа программы показана на 6 и 7 рисунке.
Методика испытаний
Целью проведения испытаний является проверка работоспособности (надежности) программы при различных условиях ее функционирования.
Программа должна обеспечивать корректность ввода исходных данных (путем осуществления соответствующих проверок и информирования пользователя о возникших неточностях в работе), а также получение непротиворечивого результата.
Для демонстрации работоспособности программы необходимо провести ряд испытаний с различными начальными условиями. Для обеспечения нормальной работы программы требуется наличие соответствующих DLL, а также приложений Word, Excel.
Для использования COM-сервера, он должен быть предварительно зарегистрирован в системе. Тестовые примеры выполнялись в среде операционной системы Windows XP Profesional при использовании процессора Intel Core 2,5 GHz и разрешении экрана 1366*768. Для работы с программой необходимо также наличие клавиатуры и манипулятора типа «мышь».
Первое испытание проведем с начальными данными, указанными в задании.
Начальные данные:
=2, =3, = 0,1 Градуса, =40, =10
Рисунок 8 - тестовый запуск(1)
Второе ипытание проведем так же с данными указанными в заданий с использование Com-сервера и Обращенного маятника.
Рисунок 9 - тестовый запуск(2)
Заключение
В ходе выполнения курсовой работы
· были закреплены знания по курсу «Конструирование программ и языки программирования»;
· приобретен опыт при разработке объектно-ориентированных программ;
· изучены принципы создания динамических библиотек;
· изучены и реализованы способы создания клиент-серверных приложений на базе COM-технологий;
· освоены методы передачи данных между приложениями;
· изучены возможности создания справочной системой высокой степени сложности и различных форматов.
При разработке программы использовался модульный принцип программирования. Такая структура программы позволяет в дальнейшем модифицировать отдельные её части без нарушения работоспособности и потери функциональности приложения.
Программа имеет достаточно ясный и понятый дружелюбный пользовательский интерфейс, обеспечивающий удобство в работе и обеспечивающий получение необходимой пользователю информации с наименьшими затратами времени.
Таким образом, разработанное в ходе выполнения курсовой работы приложение является законченным программным продуктом.
Программа может быть использована для физического моделирования гармонических колебаний маятника.
Литература
1. Фаронов В.В. Delphi 6. Учебный курс.-М.: Издатель Молгачева С.В., 2001.-672с.
2. Елмакова Н., Трепалин С., Тенцер А. Delphi 6 и технология COM.-СПб.: Питер, 2002. - 640 с.
3. Сван, Том. Delphi 4. Библия разработчика: Пер. с англ. -К; М.; СПб.: Диалектика, 1998. - 672 с.
4. Федоров А.. Delphi 5.0 для всех. -М.: Тоо фирма "КомпьютерПресс", 1998. - 464 с.
5. Марко Кэнту. Delphi 5 для профессионалов.-СПб.: Питер. 2001. - 944 с.
6. Федоров А.Г. Delphi 3.0 для всех.-М.:»КомпьютерПресс», 1998.-464с.
7. Дарахвелидзе П.Г., Марков Е.П. Delphi 4.-СПб.: БХВ-Санкт-Петербург, 1999.- 816 с.
8. Бобровский С. Delphi 5: учебный курс- СПб: Издательство «Питер», 2000.- 640с.
9. А.М.Епанешников, В.А.Епанешников Программирование в среде Delphi.-М.:»Диалог МИФИ», 1998.
10. Гринчишин Я.Т. и др. Алгоритмы и программы на Бейсике: Учеб. Пособие для студентов пед. Ин-тов по физ.-мат.
11. Спец./Я.Т.Гринчишин, В.И.Ефимов, А.Н.Ломакович.-М.: Просвещение, 1988.- 160 с.
Приложение
program StartPendulum;
uses
Forms,
Windows,
Classes,
Dialogs,
SysUtils,
MainForm in 'MainForm.pas' {Form1},
PendulumThread in 'PendulumThread.pas',
InvertedPendulumThread in 'InvertedPendulumThread.pas',
Pendulum in 'Pendulum.pas',
FormParametr in 'FormParametr.pas' {FormParametr},
StartPendulumTLB in 'StartPendulumTLB.pas',
PendulAutoServ in 'PendulAutoServ.pas' {PendulAutoServ: CoClass},
UComPendulum in 'UComPendulum.pas',
UComPendulumTlb in 'UComPendulumTlb.pas';
type
TProc=procedure(AOwner:TComponent);
Var
Handle : THandle; //Дескриптор DLL
ShowPrompt : tproc; //Переменная для функции
{$R *.TLB}
{$R *.res}
begin
Application.Initialize;
Handle:= LoadLibrary('Prompt.dll');
if Handle<>0
then begin
//Получить адрес функции из библиотеки
@ShowPrompt:= GetProcAddress(Handle,'ShowPrompt');
ShowPrompt(Application); //Показать заставку
FreeLibrary(Handle); //Удалить библиотеку
end
else begin
ShowMessage('Не найдена библиотека Prompt.dll');
FreeLibrary(Handle); //Удалить библиотеку
end;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TFormParametr, FormParametr);
Application.Run;
end.
unit StartPendulumTLB;//Ole-сервер
{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers.
{$WARN SYMBOLPLATFORM OFF}
{$WRITEABLECONST ON}
{$VARPROPSETTER ON}
interface
uses Windows, ActiveX, Classes, Graphics, StdVCL, Variants;
const
StartPendulumMajorVersion = 1;
StartPendulumMinorVersion = 0;
LIBIDStartPendulum: TGUID = '{D73C3600-EBB3-4729-BABC-501B7C5083D7}';
IIDIPendulAutoServ: TGUID = '{289A470E-90E0-4A17-81CF-9A6E5CEDB11A}';
CLASSPendulAutoServ: TGUID = '{42F7CF51-626F-4207-AD93-07C45A40348E}';
type
IPendulAutoServ = interface;
IPendulAutoServDisp = dispinterface;
PendulAutoServ = IPendulAutoServ;
IPendulAutoServ = interface(IDispatch)
['{289A470E-90E0-4A17-81CF-9A6E5CEDB11A}']
procedure SetPendEdit1(const Param1: WideString); safecall;
procedure SetPendEdit2(const Param1: WideString); safecall;
procedure SetPendEdit3(const Param1: WideString); safecall;
procedure SetPendEdit4(const Param1: WideString); safecall;
procedure SetPendEdit5(const Param1: WideString); safecall;
procedure SetPendEdit6(const Param1: WideString); safecall;
procedure PendStart; safecall;
procedure PendStop; safecall;
procedure SetInvPendEdit1(const Param1: WideString); safecall;
procedure SetInvPendEdit2(const Param1: WideString); safecall;
procedure SetInvPendEdit3(const Param1: WideString); safecall;
procedure SetInvPendEdit4(const Param1: WideString); safecall;
procedure SetInvPendEdit5(const Param1: WideString); safecall;
procedure SetInvPendEdit6(const Param1: WideString); safecall;
procedure InvPendStart; safecall;
procedure InvPendStop; safecall;
procedure SetVisible(Param1: WordBool); safecall;
procedure New; safecall;
procedure Open; safecall;
procedure Save; safecall;
procedure Saveas; safecall;
property PendEdit1: WideString write SetPendEdit1;
property PendEdit2: WideString write SetPendEdit2;
property PendEdit3: WideString write SetPendEdit3;
property PendEdit4: WideString write SetPendEdit4;
property PendEdit5: WideString write SetPendEdit5;
property PendEdit6: WideString write SetPendEdit6;
property InvPendEdit1: WideString write SetInvPendEdit1;
property InvPendEdit2: WideString write SetInvPendEdit2;
property InvPendEdit3: WideString write SetInvPendEdit3;
property InvPendEdit4: WideString write SetInvPendEdit4;
property InvPendEdit5: WideString write SetInvPendEdit5;
property InvPendEdit6: WideString write SetInvPendEdit6;
property Visible: WordBool write SetVisible;
end;
IPendulAutoServDisp = dispinterface
['{289A470E-90E0-4A17-81CF-9A6E5CEDB11A}']
property PendEdit1: WideString writeonly dispid 201;
property PendEdit2: WideString writeonly dispid 202;
property PendEdit3: WideString writeonly dispid 203;
property PendEdit4: WideString writeonly dispid 204;
property PendEdit5: WideString writeonly dispid 205;
property PendEdit6: WideString writeonly dispid 206;
procedure PendStart; dispid 207;
procedure PendStop; dispid 208;
property InvPendEdit1: WideString writeonly dispid 209;
property InvPendEdit2: WideString writeonly dispid 210;
property InvPendEdit3: WideString writeonly dispid 211;
property InvPendEdit4: WideString writeonly dispid 212;
property InvPendEdit5: WideString writeonly dispid 213;
property InvPendEdit6: WideString writeonly dispid 214;
procedure InvPendStart; dispid 215;
procedure InvPendStop; dispid 216;
property Visible: WordBool writeonly dispid 217;
procedure New; dispid 218;
procedure Open; dispid 219;
procedure Save; dispid 220;
procedure Saveas; dispid 221;
end;
CoPendulAutoServ = class
class function Create: IPendulAutoServ;
class function CreateRemote(const MachineName: string): IPendulAutoServ;
end;
implementation
uses ComObj;
class function CoPendulAutoServ.Create: IPendulAutoServ;
begin
Result := CreateComObject(CLASSPendulAutoServ) as IPendulAutoServ;
end;
class function CoPendulAutoServ.CreateRemote(const MachineName: string): IPendulAutoServ;
begin
Result := CreateRemoteComObject(MachineName, CLASSPendulAutoServ) as IPendulAutoServ;
end;
end.
unit PendulAutoServ;
{$WARN SYMBOLPLATFORM OFF}
interface
uses
ComObj, ActiveX, StartPendulumTLB, StdVcl;
type
TPendulAutoServ = class(TAutoObject, IPendulAutoServ)
protected
procedure SetPendEdit1(const Value: WideString); safecall;
procedure SetPendEdit2(const Value: WideString); safecall;
procedure SetPendEdit3(const Value: WideString); safecall;
procedure SetPendEdit4(const Value: WideString); safecall;
procedure SetPendEdit5(const Value: WideString); safecall;
procedure SetPendEdit6(const Value: WideString); safecall;
procedure PendStart; safecall;
procedure PendStop; safecall;
procedure SetInvPendEdit1(const Value: WideString); safecall;
procedure SetInvPendEdit2(const Value: WideString); safecall;
procedure SetInvPendEdit3(const Value: WideString); safecall;
procedure SetInvPendEdit4(const Value: WideString); safecall;
procedure SetInvPendEdit5(const Value: WideString); safecall;
procedure SetInvPendEdit6(const Value: WideString); safecall;
procedure InvPendStart; safecall;
procedure InvPendStop; safecall;
procedure SetVisible(Value: WordBool); safecall;
procedure New; safecall;
procedure Open; safecall;
procedure Save; safecall;
procedure Saveas; safecall;
end;
implementation
uses ComServ, MainForm;
procedure TPendulAutoServ.SetPendEdit1(const Value: WideString);
begin
Form1.MainPendulumEdit1.Text:=Value;//Ввод значения амлитуды для обычного маятника
end;
procedure TPendulAutoServ.SetPendEdit2(const Value: WideString);
begin
Form1.MainPendulumEdit2.Text:=Value; //Ввод значения частоты для обычного маятника
end;
procedure TPendulAutoServ.SetPendEdit3(const Value: WideString);
begin
Form1.MainPendulumEdit3.Text:=Value; //Ввод значения длины маятника для обычного маятника
end;
procedure TPendulAutoServ.SetPendEdit4(const Value: WideString);
begin
Form1.MainPendulumEdit4.Text:=Value; //Ввод значения угла отклонения для обычного маятника
end;
procedure TPendulAutoServ.SetPendEdit5(const Value: WideString);
begin
Form1.MainPendulumEdit5.Text:=Value; //Ввод значения ускорения свободного падения для обычного маятника
end;
procedure TPendulAutoServ.SetPendEdit6(const Value: WideString);
begin
Form1.MainPendulumEdit6.Text:=Value; //Ввод времени обновления таблиц обычного маятника
end;
procedure TPendulAutoServ.PendStart;
begin
Form1.MainPendulumResClick(nil);//Начать построения обычного маятника
end;
procedure TPendulAutoServ.PendStop;
begin
Form1.MainPendulumStopClick(nil); //Закончить построения обычного маятника
end;
procedure TPendulAutoServ.SetInvPendEdit1(const Value: WideString);
begin
Form1.MainInvertedpendulumEdit1.Text:=Value; //Ввод значения амлитуды для перевернутого маятника
end;
procedure TPendulAutoServ.SetInvPendEdit2(const Value: WideString);
begin
Form1.MainInvertedpendulumEdit2.Text:=Value; //Ввод значения частоты для перевернутого маятника
end;
procedure TPendulAutoServ.SetInvPendEdit3(const Value: WideString);
begin
Form1.MainInvertedpendulumEdit3.Text:=Value; //Ввод значения длины маятника для перевернутого маятника
end;
procedure TPendulAutoServ.SetInvPendEdit4(const Value: WideString);
begin
Form1.MainInvertedpendulumEdit4.Text:=Value; //Ввод значения угла отклонения для перевернутого маятника
end;
procedure TPendulAutoServ.SetInvPendEdit5(const Value: WideString);
begin
//Ввод значения ускорения свободного падения для перевернутого матника
Form1.MainInvertedpendulumEdit5.Text:=Value;
end;
procedure TPendulAutoServ.SetInvPendEdit6(const Value: WideString);
begin
Form1.MainInvertedpendulumEdit6.Text:=Value; //Ввод времени обновления таблиц перевернутого маятника
end;
procedure TPendulAutoServ.InvPendStart;
begin
Form1.MainInvertedpendulumResClick(nil); //Начать построения перевернутого маятника
end;
procedure TPendulAutoServ.InvPendStop;
begin
Form1.MainInvertedpendulumStopClick(nil); //Остановить построения перевернутого маятника
end;
procedure TPendulAutoServ.SetVisible(Value: WordBool);
begin
Form1.Visible:=Value;//Показать окно
end;
procedure TPendulAutoServ.New;
begin
Form1.MainMenuFileNewClick(nil);//Начать новое вычисление
end;
procedure TPendulAutoServ.Open;
begin
Form1.MainMenuFileOpenClick(nil);//Открыть сохронения
end;
procedure TPendulAutoServ.Save;
begin
Form1.MainMenuFileSaveClick(nil); //Сохранить
end;
procedure TPendulAutoServ.Saveas;
begin
Form1.MainMenuFileSaveasClick(nil); //Сохранить как
end;
initialization
TAutoObjectFactory.Create(ComServer, TPendulAutoServ, ClassPendulAutoServ,
ciSingleInstance, tmApartment);
end.
unit MainForm;//Главная вкладка
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, ToolWin, ComCtrls, StdCtrls, ExtCtrls, Grids, Buttons,
StdActns, ActnList, ImgList, XPMan, TeeProcs, TeEngine, Chart, IniFiles,
PendulumThread, InvertedPendulumThread, Series, FormParametr, ComObj, ActiveX,ShellApi, Clipbrd;
type
TSGP = record//Используется для сохранения и загрузки
Edit : Array[0..5] of String[20];
CCount, RCount : Integer;
Value : String[20];
end;
TForm1 = class(TForm)
ToolBar1: TToolBar;
MainMenu1: TMainMenu;
StatusBar1: TStatusBar;
MainMenuFile: TMenuItem;
MainMenuFileNew: TMenuItem;
MainMenuFileOpen: TMenuItem;
MainMenuFileSave: TMenuItem;
MainMenuFileSaveas: TMenuItem;
ToolButtonNew: TToolButton;
ToolButtonOpen: TToolButton;
MainMenuFileClose: TMenuItem;
ToolButtonSave: TToolButton;
ToolButtonSaveas: TToolButton;
Tool2: TToolButton;
ToolButtonWord: TToolButton;
ToolButtonExcel: TToolButton;
Tool3: TToolButton;
ToolButtonChart: TToolButton;
Tool1: TToolButton;
ToolButtonHelp: TToolButton;
ImageList1: TImageList;
SaveDialog1: TSaveDialog;
OpenDialog1: TOpenDialog;
PageControl: TPageControl;
MainSpeedButton1: TSpeedButton;
MainSpeedButton2: TSpeedButton;
MainPendulum: TGroupBox;
MainPendulumRes: TBitBtn;
MainPendulumStringGrid: TStringGrid;
MainPendulumEdit1: TLabeledEdit;
MainPendulumEdit2: TLabeledEdit;
MainPendulumEdit3: TLabeledEdit;
MainPendulumEdit4: TLabeledEdit;
MainInvertedpendulum: TGroupBox;
MainInvertedpendulumRes: TBitBtn;
MainInvertedpendulumStringGrid: TStringGrid;
MainInvertedpendulumEdit1: TLabeledEdit;
MainInvertedpendulumEdit2: TLabeledEdit;
MainInvertedpendulumEdit3: TLabeledEdit;
MainInvertedpendulumEdit4: TLabeledEdit;
MainPanel: TPanel;
MainPanelBitBtn1: TBitBtn;
MainPanelBitBtn2: TBitBtn;
MainPanelCheckBox: TCheckBox;
PopupMenu1: TPopupMenu;
PopupMenu1Clear: TMenuItem;
PopupMenu1Save: TMenuItem;
PopupMenu1Excel: TMenuItem;
PageControlMain: TTabSheet;
PageControlPendulum: TTabSheet;
PageControlInvertedpendulum: TTabSheet;
PageControlGraf: TTabSheet;
PageControlOption: TTabSheet;
PendulumImage: TImage;
InvertedpendulumImage: TImage;
GrafChart: TChart;
XPManifest1: TXPManifest;
OptionSeparatewindow: TGroupBox;
OptionSeparatewindowCheckBox1: TCheckBox;
OptionSeparatewindowCheckBox2: TCheckBox;
OptionSeparatewindowCheckBox3: TCheckBox;
OptionClose: TGroupBox;
OptionCloseCheckBox1: TCheckBox;
OptionCloseCheckBox2: TCheckBox;
OptionBitBtn2: TBitBtn;
PendulumStringGrid: TStringGrid;
InvertedpendulumStringGrid: TStringGrid;
OptionLog: TGroupBox;
OptionLogCheckBox2: TCheckBox;
OptionLogCheckBox3: TCheckBox;
OptionMultipleinstances: TGroupBox;
OptionMultipleinstancesCheckBox2: TCheckBox;
OptionMultipleinstancesCheckBox1: TCheckBox;
OptionMultipleinstancesCheckBox3: TCheckBox;
OptionLogCheckBox4: TCheckBox;
OptionBitBtn1: TBitBtn;
MainMenuView: TMenuItem;
MainMenuViewPendulum: TMenuItem;
MainMenuViewInvertedpendulum: TMenuItem;
MainMenuViewChart: TMenuItem;
MainMenuViewOption: TMenuItem;
OptionLogCheckBox1: TCheckBox;
PageControlLog: TTabSheet;
LogMemo: TMemo;
MainMenuViewLog: TMenuItem;
MainMenuHelp: TMenuItem;
MainMenuHelpHelp: TMenuItem;
MainMenuHelpProg: TMenuItem;
PopupMenu2: TPopupMenu;
PopupMenu2Clear: TMenuItem;
PopupMenu2Save: TMenuItem;
PopupMenu2Excel: TMenuItem;
Series1: TLineSeries;
Series2: TLineSeries;
MainMenuParametr: TMenuItem;
MainPendulumEdit5: TLabeledEdit;
MainPendulumEdit6: TLabeledEdit;
MainInvertedpendulumEdit5: TLabeledEdit;
MainInvertedpendulumEdit6: TLabeledEdit;
OptionCloseCheckBox3: TCheckBox;
MainPendulumStop: TButton;
MainInvertedpendulumStop: TButton;
PopupMenu3: TPopupMenu;
PopupMenu3Clear: TMenuItem;
PopupMenu4: TPopupMenu;
PopupMenu4Clear: TMenuItem;
OptionSeparatewindowCheckBox4: TCheckBox;
OptionMultipleinstancesCheckBox4: TCheckBox;
OptionLogCheckBox5: TCheckBox;
OptionRadioGroup: TRadioGroup;
procedure FormCreate(Sender: TObject);
procedure MainMenuFileNewClick(Sender: TObject);
procedure MainMenuFileOpenClick(Sender: TObject);
procedure MainMenuFileSaveClick(Sender: TObject);
procedure MainMenuFileSaveasClick(Sender: TObject);
procedure MainMenuFileCloseClick(Sender: TObject);
procedure MainMenuViewPendulumClick(Sender: TObject);
procedure MainMenuViewInvertedpendulumClick(Sender: TObject);
procedure MainMenuViewChartClick(Sender: TObject);
procedure MainMenuViewOptionClick(Sender: TObject);
procedure MainMenuViewLogClick(Sender: TObject);
procedure MainMenuParametrClick(Sender: TObject);
procedure MainMenuHelpHelpClick(Sender: TObject);
procedure MainMenuHelpProgClick(Sender: TObject);
procedure ToolButtonWordClick(Sender: TObject);
procedure ToolButtonExcelClick(Sender: TObject);
procedure ToolButtonChartClick(Sender: TObject);
procedure PopupMenu1ClearClick(Sender: TObject);
procedure PopupMenu1SaveClick(Sender: TObject);
procedure PopupMenu1ExcelClick(Sender: TObject);
procedure PopupMenu2ClearClick(Sender: TObject);
procedure PopupMenu2SaveClick(Sender: TObject);
procedure PopupMenu2ExcelClick(Sender: TObject);
procedure PopupMenu3ClearClick(Sender: TObject);
procedure PopupMenu4ClearClick(Sender: TObject);
procedure MainSpeedButton1Click(Sender: TObject);
procedure MainSpeedButton2Click(Sender: TObject);
procedure MainPendulumResClick(Sender: TObject);
procedure MainPendulumStopClick(Sender: TObject);
procedure MainInvertedpendulumResClick(Sender: TObject);
procedure MainInvertedpendulumStopClick(Sender: TObject);
procedure MainPanelCheckBoxClick(Sender: TObject);
procedure MainPanelBitBtn1Click(Sender: TObject);
procedure MainPanelBitBtn2Click(Sender: TObject);
procedure EditKeyPress(Sender: TObject; var Key: Char);
procedure MainPendulumEdit4Change(Sender: TObject);
procedure MainInvertedpendulumEdit4Change(Sender: TObject);
procedure FormMouseWheelDown(Sender: TObject; Shift: TShiftState;MousePos: TPoint; var Handled: Boolean);
procedure FormMouseWheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
procedure Separatewindow(Sender: TObject);
procedure OptionSeparatewindowCheckBox3Click(Sender: TObject);
procedure OptionSeparatewindowCheckBox4Click(Sender: TObject);
procedure Multipleinstances(Sender: TObject);
procedure OptionMultipleinstancesCheckBox3Click(Sender: TObject);
procedure OptionMultipleinstancesCheckBox4Click(Sender: TObject);
procedure OptionLogCheckBox1Click(Sender: TObject);
procedure Logoption(Sender: TObject);
procedure OptionLogCheckBox4Click(Sender: TObject);
procedure OptionLogCheckBox5Click(Sender: TObject);
procedure OptionRadioGroupClick(Sender: TObject);
procedure OptionCloseCheckBox1Click(Sender: TObject);
procedure OptionBitBtn1Click(Sender: TObject);
procedure OptionBitBtn2Click(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
//Статическая загрузка DLL
procedure ShowAbout(AOwner:TComponent);stdcall; external 'About.dll';
var
Form1: TForm1;
FormPend, FormInvPend: TForm;//Окна для долнительного построения маятника
Pendul: TPendulumThread;//Поток для построения обычного маятника
InvPendul: TInvertedPendulumThread;//Поток для построения перевернутого маятника
ClosePend: Boolean=true;//Проверка на завершенность построения обычного маятника
CloseInvPend: Boolean=true;// Проверка на завершенность построения перевернутого маятника
LoadSavePend, LoadSaveInvPend: Boolean;//Переменные для проверки было ли загружено сохранения
k0,k1: Integer;//Изменения уровня отдаления или приближение графика
implementation
{$R *.dfm}
//Функция для проверки установлены ли нужные для работы приложения MS office
function CheckInstall(Name: String):boolean;
var
ClassID: TCLSID;
Rez : HRESULT;
begin
Rez := CLSIDFromProgID(PWideChar(WideString(Name)), ClassID);
if Rez = SOK
then
Result := true
else
Result := false;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
Ini: Tinifile;
Name: String;
Begin
Name:='Word.Application';
if CheckInstall(Name)=false//Проверка наличия MS Word
then begin
ToolButtonWord.Enabled:=false;
ShowMessage('Word не найден');
end;
Name:='Excel.Application';
if CheckInstall(Name)=false//Проверка наличия MS Excel
then begin
ToolButtonExcel.Enabled:=false;
PopupMenu1Save.Enabled:=false;
PopupMenu1Excel.Enabled:=false;
PopupMenu2Save.Enabled:=false;
PopupMenu2Excel.Enabled:=false;
ShowMessage('Excel не найден');
end;
Ini:=TiniFile.Create(extractfilepath(paramstr(0))+'\Option.ini');//Загрузка сохраненных настроек
OptionSeparatewindowCheckBox1.Checked:=Ini.ReadBool('Separate window','Pendulum',false);
OptionSeparatewindowCheckBox2.Checked:=Ini.ReadBool('Separate window','Inverted pendulum',false);
OptionSeparatewindowCheckBox3.Checked:=Ini.ReadBool('Separate window','All Selection',false);
OptionMultipleinstancesCheckBox1.Checked:=Ini.ReadBool('Multiple instances','Pendulum',false);
OptionMultipleinstancesCheckBox2.Checked:=Ini.ReadBool('Multiple instances','Inverted pendulum',false);
OptionMultipleinstancesCheckBox3.Checked:=Ini.ReadBool('Multiple instances','All Selection',false);
OptionLogCheckBox1.Checked:=Ini.ReadBool('Log','Enable',false);
OptionLogCheckBox2.Checked:=Ini.ReadBool('Log','Pendulum',false);
OptionLogCheckBox3.Checked:=Ini.ReadBool('Log','Inverted pendulum',false);
OptionLogCheckBox4.Checked:=Ini.ReadBool('Log','All Selection',false);
OptionRadioGroup.ItemIndex:=Ini.ReadInteger('Server','Selection',0);
OptionCloseCheckBox1.Checked:=Ini.ReadBool('Close','Disable reminder',false);
OptionCloseCheckBox2.Checked:=Ini.ReadBool('Close','Automatically save',false);
MainMenuViewPendulum.Checked:=Ini.ReadBool('View','Pendulum',true);
MainMenuViewInvertedpendulum.Checked:=Ini.ReadBool('View','Inverted pendulum',true);
MainMenuViewChart.Checked:=Ini.ReadBool('View','Chart',true);
MainMenuViewOption.Checked:=Ini.ReadBool('View','Option',true);
PageControlPendulum.TabVisible:=Ini.ReadBool('View','Pendulum',true);
PageControlInvertedpendulum.TabVisible:=Ini.ReadBool('View','Inverted pendulum',true);
PageControlGraf.TabVisible:=Ini.ReadBool('View','Chart',true);
PageControlOption.TabVisible:=Ini.ReadBool('View','Option',true);
MainPendulumEdit1.Text:=Ini.ReadString('ParametrPendulum','Amplitude','2');
MainPendulumEdit2.Text:=Ini.ReadString('ParametrPendulum','Frequency','3');
MainPendulumEdit3.Text:=Ini.ReadString('ParametrPendulum','Length','40');
MainPendulumEdit4.Text:=Ini.ReadString('ParametrPendulum','Angle','0,1');
MainPendulumEdit5.Text:=Ini.ReadString('ParametrPendulum','Acceleration due to gravity','9,81');
MainPendulumEdit6.Text:=Ini.ReadString('ParametrPendulum','Time','10');
PendulumThread.NewAngVel:=Ini.ReadFloat('ParametrPendulum','Angular Velocity',0);
MainInvertedpendulumEdit1.Text:=Ini.ReadString('ParametrInvertedPendulum','Amplitude','2');
MainInvertedpendulumEdit2.Text:=Ini.ReadString('ParametrInvertedPendulum','Frequency','3');
MainInvertedpendulumEdit3.Text:=Ini.ReadString('ParametrInvertedPendulum','Length','40');
MainInvertedpendulumEdit4.Text:=Ini.ReadString('ParametrInvertedPendulum','Angle','0,1');
MainInvertedpendulumEdit5.Text:=Ini.ReadString('ParametrInvertedPendulum','Acceleration due to gravity','9,81');
MainInvertedpendulumEdit6.Text:=Ini.ReadString('ParametrInvertedPendulum','Time','10');
InvertedPendulumThread.NewAngVel:=Ini.ReadFloat('ParametrInvertedPendulum','Angular Velocity',1);
Ini.Free;
MainPendulumStringGrid.ColWidths[0]:=60;
MainPendulumStringGrid.ColWidths[1]:=47;
MainPendulumStringGrid.ColWidths[2]:=38;
MainPendulumStringGrid.ColWidths[3]:=30;
MainPendulumStringGrid.ColWidths[4]:=38;
MainInvertedpendulumStringGrid.ColWidths[0]:=60;
MainInvertedpendulumStringGrid.ColWidths[1]:=47;
MainInvertedpendulumStringGrid.ColWidths[2]:=38;
MainInvertedpendulumStringGrid.ColWidths[3]:=30;
MainInvertedpendulumStringGrid.ColWidths[4]:=38;
PendulumStringGrid.ColWidths[0]:=65;
PendulumStringGrid.ColWidths[1]:=50;
PendulumStringGrid.ColWidths[2]:=40;
PendulumStringGrid.ColWidths[3]:=35;
PendulumStringGrid.ColWidths[4]:=40;
InvertedpendulumStringGrid.ColWidths[0]:=65;
InvertedpendulumStringGrid.ColWidths[1]:=50;
InvertedpendulumStringGrid.ColWidths[2]:=40;
InvertedpendulumStringGrid.ColWidths[3]:=35;
InvertedpendulumStringGrid.ColWidths[4]:=40;
MainPendulumStringGrid.Cells[0,0]:='Амплитуда';
MainPendulumStringGrid.Cells[1,0]:='Частота';
MainPendulumStringGrid.Cells[2,0]:='Длина';
MainPendulumStringGrid.Cells[3,0]:='Угол';
MainPendulumStringGrid.Cells[4,0]:='Время';
MainInvertedpendulumStringGrid.Cells[0,0]:='Амплитуда';
MainInvertedpendulumStringGrid.Cells[1,0]:='Частота';
MainInvertedpendulumStringGrid.Cells[2,0]:='Длина';
MainInvertedpendulumStringGrid.Cells[3,0]:='Угол';
MainInvertedpendulumStringGrid.Cells[4,0]:='Время';
PendulumStringGrid.Cells[0,0]:='Амплитуда';
PendulumStringGrid.Cells[1,0]:='Частота';
PendulumStringGrid.Cells[2,0]:='Длина';
PendulumStringGrid.Cells[3,0]:='Угол';
PendulumStringGrid.Cells[4,0]:='Время';
InvertedpendulumStringGrid.Cells[0,0]:='Амплитуда';
InvertedpendulumStringGrid.Cells[1,0]:='Частота';
InvertedpendulumStringGrid.Cells[2,0]:='Длина';
InvertedpendulumStringGrid.Cells[3,0]:='Угол';
InvertedpendulumStringGrid.Cells[4,0]:='Время';
k0:=100;//Задания изначальных параметров приблежения
k1:=100;// Задания изначальных параметров отдаления
end;
//MainMenu
procedure TForm1.MainMenuFileNewClick(Sender: TObject);//Полная очистка
var
i : Integer;
begin
//Главной формы
MainPendulumEdit1.Text:='';
MainPendulumEdit2.Text:='';
MainPendulumEdit3.Text:='';
MainPendulumEdit4.Text:='';
MainInvertedpendulumEdit1.Text:='';
MainInvertedpendulumEdit2.Text:='';
MainInvertedpendulumEdit3.Text:='';
MainInvertedpendulumEdit4.Text:='';
PatBlt(PendulumImage.Canvas.Handle, 0, 0, PendulumImage.ClientWidth, PendulumImage.ClientHeight, WHITENESS);
PatBlt(InvertedpendulumImage.Canvas.Handle, 0, 0, InvertedpendulumImage.ClientWidth InvertedpendulumImage.ClientHeight, WHITENESS);,
with MainPendulumStringGrid do begin
for i:=FixedRows to RowCount-1 do
Rows[i].Clear;
RowCount:=2;
end;
with MainInvertedpendulumStringGrid do begin
for i:=FixedRows to RowCount-1 do
Rows[i].Clear;
RowCount:=2;
end;
with PendulumStringGrid do begin
for i:=FixedRows to RowCount-1 do
Rows[i].Clear;
RowCount:=2;
end;
with InvertedpendulumStringGrid do begin
for i:=FixedRows to RowCount-1 do
Rows[i].Clear;
RowCount:=2;
end;
GrafChart.SeriesList.Series[0].Clear;
GrafChart.SeriesList.Series[1].Clear;
for i:=1 to 6 do
StatusBar1.Panels.Items[i].Text:='';
LoadSavePend:=false;
LoadSaveInvPend:=false;
end;
procedure TForm1.MainMenuFileOpenClick(Sender: TObject);//Открытия сохранения
Var
f: File of TSGP;
i, j, k: Integer;
SGP: TSGP;
begin
if OpenDialog1.Execute
then begin
AssignFile(f,OpenDialog1.FileName);//Подготовка файла для чтения
Reset(F); //Открытия файла для чтения
k:=0;
Read(F, SGP);//Чтения из файла
MainPendulumEdit1.Text:=SGP.Edit[0];
MainPendulumEdit2.Text:=SGP.Edit[1];
MainPendulumEdit3.Text:=SGP.Edit[2];
MainPendulumEdit4.Text:=SGP.Edit[3];
PendulumThread.PastTime:=StrToFloat(SGP.Edit[4]);
PendulumThread.AngVel:=StrToFloat(SGP.Edit[5]);
with MainPendulumStringGrid do begin
colcount:=SGP.CCount;
rowcount:=SGP.RCount;
for i:=1 to RowCount-1 do
for j:=0 to ColCount-1 do begin
Seek(F,k);
Read(F,SGP); //Чтения из файла
cells[j, i]:=SGP.value;
Inc(k);
end;
end;
MainInvertedpendulumEdit1.Text:=SGP.Edit[0];
MainInvertedpendulumEdit2.Text:=SGP.Edit[1];
MainInvertedpendulumEdit3.Text:=SGP.Edit[2];
MainInvertedpendulumEdit4.Text:=SGP.Edit[3];
InvertedPendulumThread.PastTime:=StrToFloat(SGP.Edit[4]);
InvertedPendulumThread.AngVel:=StrToFloat(SGP.Edit[5]);
with MainInvertedpendulumStringGrid do begin
Read(F,SGP);
Colcount:=SGP.CCount;
rowcount:=SGP.RCount;
for i:=1 to RowCount-1 do
for j:=0 to ColCount-1 do begin
Seek(F,k);
Read(F,SGP); //Чтения из файла
cells[j, i]:=SGP.value;
Inc(k);
end;
end;
CloseFile(f);//Закрытия файла
LoadSavePend:=true;//Файл загружен
LoadSaveInvPend:=true; //Файл загружен
end;
end;
procedure TForm1.MainMenuFileSaveClick(Sender: TObject);
var
f: File of TSGP;
i, j: Integer;
SGP: TSGP;
FilePath: String;
begin
FilePath:=extractfilepath(paramstr(0))+'\Save\'+FormatDateTime('DDMMYYYYhhmmss', Now)+'Маятник.pms';
AssignFile(f, FilePath); //Подготовка файла для записи
Rewrite(f);//Открытия файла для записи
SGP.Edit[0]:=FloatToStr(PendulumThread.Ampl);
SGP.Edit[1]:=FloatToStr(PendulumThread.Freque);
SGP.Edit[2]:=FloatToStr(PendulumThread.Lent);
SGP.Edit[3]:=FloatToStr(PendulumThread.Deviation);
SGP.Edit[4]:=FloatToStr(PendulumThread.PastTime);
SGP.Edit[5]:=FloatToStr(PendulumThread.AngVel);
with MainPendulumStringGrid do begin
SGP.CCount:=colcount;
SGP.RCount:=rowcount;
for i:=1 to RowCount-1 do
for j:=0 to ColCount-1 do begin
SGP.value:=Cells[j,i];
Write(f,SGP); //Запись в файл
end;
end;
SGP.Edit[0]:=FloatToStr(InvertedPendulumThread.Ampl);
SGP.Edit[1]:=FloatToStr(InvertedPendulumThread.Freque);
SGP.Edit[2]:=FloatToStr(InvertedPendulumThread.Lent);
SGP.Edit[3]:=FloatToStr(InvertedPendulumThread.Deviation);
SGP.Edit[4]:=FloatToStr(InvertedPendulumThread.PastTime);
SGP.Edit[5]:=FloatToStr(InvertedPendulumThread.AngVel);
with MainInvertedpendulumStringGrid do begin
SGP.CCount:=colcount;
SGP.RCount:=rowcount;
for i:=1 to RowCount-1 do
for j:=0 to ColCount-1 do begin
SGP.value:=Cells[j,i];
Write(f,SGP); //Запись в файл
end;
end;
CloseFile(f); //Закрытия файла
end;
procedure TForm1.MainMenuFileSaveasClick(Sender: TObject);
Var
f: File of TSGP;
i, j: Integer;
SGP: TSGP;
begin
SaveDialog1.FileName:=FormatDateTime('DDMMYYYYhhmmss', Now)+'Маятник.pms';
if SaveDialog1.Execute
then begin
AssignFile(f,SaveDialog1.FileName); //Подготовка файла для записи
Rewrite(f); //Открытия файла для записи
SGP.Edit[0]:=FloatToStr(PendulumThread.Ampl);
SGP.Edit[1]:=FloatToStr(PendulumThread.Freque);
SGP.Edit[2]:=FloatToStr(PendulumThread.Lent);
SGP.Edit[3]:=FloatToStr(PendulumThread.Deviation);
SGP.Edit[4]:=FloatToStr(PendulumThread.PastTime);
SGP.Edit[5]:=FloatToStr(PendulumThread.AngVel);
with MainPendulumStringGrid do begin
SGP.CCount:=colcount;
SGP.RCount:=rowcount;
for i:=1 to RowCount-1 do
for j:=0 to ColCount-1 do begin
SGP.value:=Cells[j,i];
Write(f,SGP); //Запись в файл
end;
end;
SGP.Edit[0]:=FloatToStr(InvertedPendulumThread.Ampl);
SGP.Edit[1]:=FloatToStr(InvertedPendulumThread.Freque);
SGP.Edit[2]:=FloatToStr(InvertedPendulumThread.Lent);
SGP.Edit[3]:=FloatToStr(InvertedPendulumThread.Deviation);
SGP.Edit[4]:=FloatToStr(InvertedPendulumThread.PastTime);
SGP.Edit[5]:=FloatToStr(InvertedPendulumThread.AngVel);
with MainInvertedpendulumStringGrid do begin
SGP.CCount:=colcount;
SGP.RCount:=rowcount;
for i:=1 to RowCount-1 do
for j:=0 to ColCount-1 do begin
SGP.value:=Cells[j,i];
Write(f,SGP); //Запись в файл
end;
end;
CloseFile(f); //Закрытия файла
end;
end;
procedure TForm1.MainMenuFileCloseClick(Sender: TObject);
begin
Close;//Выход
end;
procedure TForm1.MainMenuViewPendulumClick(Sender: TObject);
begin//Показывать или не показывать вкладку маятник
PageControlPendulum.TabVisible:=MainMenuViewPendulum.Checked;
end;
procedure TForm1.MainMenuViewInvertedpendulumClick(Sender: TObject);
begin// Показывать или не показывать вкладку перевернутый маятник
PageControlInvertedpendulum.TabVisible:=MainMenuViewInvertedpendulum.Checked;
end;
procedure TForm1.MainMenuViewChartClick(Sender: TObject);
begin// Показывать или не показывать вкладку график
PageControlGraf.TabVisible:=MainMenuViewChart.Checked;
end;
procedure TForm1.MainMenuViewOptionClick(Sender: TObject);
begin// Показывать или не показывать вкладку дополнительные настройки
PageControlOption.TabVisible:=MainMenuViewOption.Checked;
end;
procedure TForm1.MainMenuViewLogClick(Sender: TObject);
begin// Показывать или не показывать вкладку лог
PageControlLog.TabVisible:=MainMenuViewLog.Checked;
end;
procedure TForm1.MainMenuParametrClick(Sender: TObject);
begin//Показать форму параметры
FormParametr.Show;
end;
procedure TForm1.MainMenuHelpHelpClick(Sender: TObject);
var//Открыть справку
HelpID: PChar;
begin
HelpID:=PChar(ExtractFilePath(Application.ExeName) +'\Help.chm');
if FileExists(HelpID)//Поиск справки
then
ShellExecute(Handle,'open',HelpID, nil, nil, SWSHOWNORMAL)
else
MessageBox(Self.Handle, PChar('Файл справки не найден'), PChar('Ошибка'), MBOK + MBICONINFORMATION + MBAPPLMODAL);;
end;
procedure TForm1.MainMenuHelpProgClick(Sender: TObject);
begin
ShowAbout(Form1);//Открыть окно О программе
end;
//ToolBar
procedure TForm1.ToolButtonWordClick(Sender: TObject);//Вывести в Word
const
wdAlignParagraphCenter=$00000001;
wdWord9TableBehavior=$00000001;
wdAutoFitFixed=$00000000;
var
Word: Variant;
WordID : String;
begin
WordID:='Word.Application';
Word:=CreateOleObject(WordID); //Создания Com-объекта
Word.Documents.Add;//Добавляем новый документ
Word.Selection.ParagraphFormat.Alignment:=wdAlignParagraphCenter;//По центру
Word.Selection.Font.Size:=16;//Размер шрифта 16
Word.Selection.TypeText('ГРАФИК КОЛЕБАНИЙ МАЯТНИКА');//Вставляем текст
Word.Selection.TypeParagraph;//На новую строку
GrafChart.CopyToClipboardBitmap;//Копируем картинку графика в буфер
Word.Selection.Paste;//Вставляем в Word
if (OptionMultipleinstancesCheckBox1.Checked=true) or (OptionSeparatewindowCheckBox1.Checked=false) and (OptionMultipleinstancesCheckBox1.Checked=false)//Проверяем если смысл копировать картинку
then begin
Word.Selection.TypeText('Изображение первого маятника');//Вставляем текст
Clipboard.Assign(PendulumImage.Picture);//Копируем картинку
Word.Selection.Paste;//Вставляем картинку
end;
if (OptionMultipleinstancesCheckBox2.Checked=true) or (OptionSeparatewindowCheckBox2.Checked=false) and (OptionMultipleinstancesCheckBox2.Checked=false) //Проверяем если смысл копировать картинку
then begin
Word.Selection.TypeText('Изображение второго маятника');//Вставляем текст
Clipboard.Assign(InvertedpendulumImage.Picture);//Копируем картинку
Word.Selection.Paste;//Вставляем картинку
end;
Word.Selection.TypeText('Таблица последних значений');
Word.ActiveDocument.Tables.Add(Word.Selection.Range, 4,5,wdWord9TableBehavior, wdAutoFitFixed);//Добавляем таблицу
Word.Selection.Tables.Item(1).Cell(1,1).Range.Text := 'Амплитуда М';
Word.Selection.Tables.Item(1).Cell(1,2).Range.Text := 'Частота М';
Word.Selection.Tables.Item(1).Cell(1,3).Range.Text := 'Точность М';
Word.Selection.Tables.Item(1).Cell(1,4).Range.Text := 'Отклонение М';
Word.Selection.Tables.Item(1).Cell(1,5).Range.Text := 'Время М';
if MainPendulumStringGrid.RowCount-2<>0
then begin
Word.Selection.Tables.Item(1).Cell(2,1).Range.Text := MainPendulumStringGrid.Cells[0,MainPendulumStringGrid.RowCount-2];
Word.Selection.Tables.Item(1).Cell(2,2).Range.Text := MainPendulumStringGrid.Cells[1,MainPendulumStringGrid.RowCount-2];
Word.Selection.Tables.Item(1).Cell(2,3).Range.Text := MainPendulumStringGrid.Cells[2,MainPendulumStringGrid.RowCount-2];
Word.Selection.Tables.Item(1).Cell(2,4).Range.Text := MainPendulumStringGrid.Cells[3,MainPendulumStringGrid.RowCount-2];
Word.Selection.Tables.Item(1).Cell(2,5).Range.Text := MainPendulumStringGrid.Cells[4,MainPendulumStringGrid.RowCount-2];
end;
Word.Selection.Tables.Item(1).Cell(3,1).Range.Text := 'Амплитуда ПМ';
Word.Selection.Tables.Item(1).Cell(3,2).Range.Text := 'Частота ПМ';
Word.Selection.Tables.Item(1).Cell(3,3).Range.Text := 'Точность ПМ';
Word.Selection.Tables.Item(1).Cell(3,4).Range.Text := 'Отклонение ПМ';
Word.Selection.Tables.Item(1).Cell(3,5).Range.Text := 'Время ПМ';
if MainInvertedpendulumStringGrid.RowCount-2<>0
then begin
Word.Selection.Tables.Item(1).Cell(4,1).Range.Text := MainInvertedpendulumStringGrid.Cells[0,MainInvertedpendulumStringGrid.RowCount-2];
Word.Selection.Tables.Item(1).Cell(4,2).Range.Text := MainInvertedpendulumStringGrid.Cells[1,MainInvertedpendulumStringGrid.RowCount-2];
Word.Selection.Tables.Item(1).Cell(4,3).Range.Text := MainInvertedpendulumStringGrid.Cells[2,MainInvertedpendulumStringGrid.RowCount-2];
Word.Selection.Tables.Item(1).Cell(4,4).Range.Text := MainInvertedpendulumStringGrid.Cells[3,MainInvertedpendulumStringGrid.RowCount-2];
Word.Selection.Tables.Item(1).Cell(4,5).Range.Text := MainInvertedpendulumStringGrid.Cells[4,MainInvertedpendulumStringGrid.RowCount-2];
end;
Word.Visible:=true;//Показать окно Word
Word:=UnAssigned;//Удаления ссылок на объект
end;
procedure TForm1.ToolButtonExcelClick(Sender: TObject);//Вывести в Excel
var
Excel: Variant;
ExcelID : String;
i,j : Integer;
begin
ExcelID:='Excel.Application';
Excel:=CreateOleObject(ExcelID); //Создания Com-объекта
Excel.Application.DisplayAlerts:=false;//Отклчения предупреждений
Excel.Workbooks.Add;//Добавляем новый лист
Excel.Range[Excel.Cells[1, 2], Excel.Cells[1, 6]].Select;//Выделяем диапозон ячеек
Excel.Selection.MergeCells:=True;//Объединяем их
Excel.Workbooks[1].WorkSheets[1].Cells[1,2].HorizontalAlignment:=3;
Excel.Workbooks[1].WorkSheets[1].Cells[1,2].Value:='Маятник';
Excel.Range[Excel.Cells[1, 7], Excel.Cells[1, 12]].Select; //Выделяем диапозон ячеек
Excel.Selection.MergeCells:=True; //Объединяем их
Excel.Workbooks[1].WorkSheets[1].Cells[1,7].HorizontalAlignment:=3;
Excel.Workbooks[1].WorkSheets[1].Cells[1,7].Value:='Обращенный маятник';
for j:=2 to PendulumStringGrid.RowCount+2 do
for i:=2 to MainPendulumStringGrid.ColCount+2 do begin
Excel.Workbooks[1].WorkSheets[1].Cells[j,i].Value:=
MainPendulumStringGrid.Cells[i-2,j-2];
end;
for j:=2 to MainInvertedpendulumStringGrid.RowCount+2 do
for i:=7 to MainInvertedpendulumStringGrid.ColCount+7 do begin
Excel.Workbooks[1].WorkSheets[1].Cells[j,i].Value:=
MainInvertedpendulumStringGrid.Cells[i-7,j-2];
end;
Excel.Visible:=true;//Показываем окно Excel
Excel:=UnAssigned;//Уничтожаем ссылку на объект
end;
procedure TForm1.ToolButtonChartClick(Sender: TObject);
begin
if MainMenuViewChart.Checked<>true
then begin //Проверяем видна ли пользователю вкладка график
MainMenuViewChart.Checked:=true;
PageControlGraf.TabVisible:=true;
end;
PageControl.ActivePageIndex:=3;//Переходим на вкладку график
end;
//PopupMenu
procedure TForm1.PopupMenu1ClearClick(Sender: TObject);//Очистка таблицы маятник на главной вкладке
var
i : Integer;
begin
with MainPendulumStringGrid do begin
for i:=FixedRows to RowCount-1 do
Rows[i].Clear;
RowCount:=2;
end;
end;
procedure TForm1.PopupMenu1SaveClick(Sender: TObject);//Сохраняем таблицу маятник
var
Excel: Variant;
ExcelID : String;
i,j : Integer;
begin
ExcelID:='Excel.Application';
Excel:=CreateOleObject(ExcelID);
Excel.Application.DisplayAlerts:=false;
Excel.Workbooks.Add;
Excel.Range[Excel.Cells[1, 2], Excel.Cells[1, 6]].Select;
Excel.Selection.MergeCells:=True;
Excel.Workbooks[1].WorkSheets[1].Cells[1,2].HorizontalAlignment:=3;
Excel.Workbooks[1].WorkSheets[1].Cells[1,2].Value:='Маятник';
for j:=2 to PendulumStringGrid.RowCount+2 do
for i:=2 to MainPendulumStringGrid.ColCount+2 do begin
Excel.Workbooks[1].WorkSheets[1].Cells[j,i].Value:=
MainPendulumStringGrid.Cells[i-2,j-2];
//Сохраняем таблицу по адресу end;
Excel.WorkBooks[1].SaveAs(GetCurrentDir()+'\Table\'+FormatDateTime('DDMMYYYYhhmmss', Now)+'Pendulum');
Excel.Application.Quit;//Закрываем Excel
Excel:=Unassigned;
end;
procedure TForm1.PopupMenu1ExcelClick(Sender: TObject);//Выводим таблицу маятник
...Подобные документы
Анализ временных рядов. Разработка программы для среды визуального проектирования Borland Delphi 7.0. Математическая формулировка задачи. Структурная схема программы. Описание реализации технологии COM, динамических библиотек, возможностей программы.
курсовая работа [4,3 M], добавлен 14.11.2010Анализ преимуществ и недостатков различных численных методов решения дифференциальных уравнений высших порядков. Обоснование выбора метода Рунге-Кутта четвертого порядка. Разработка программы, моделирующей физическое и математическое поведение маятника.
курсовая работа [1,6 M], добавлен 11.07.2012Разработка имитационной модели для изучения движения нелинейного маятника с графическим отображением в ГИС Maple в режиме функционирования системы наблюдений без задержки времени. Гармонические и периодические колебания маятника. Теорема Гюйгенса.
курсовая работа [1,3 M], добавлен 29.05.2014Стандартная библиотека для всех 32-разрядных операционных систем - OpenGL. Структурная схема программы. Описание разработанного класса, реализации технологии Com, динамических библиотек. Средства использования сервисов, предоставляемых Microsoft Office.
курсовая работа [4,3 M], добавлен 14.11.2010Исследование характера движения математического маятника в идеальных условиях, то есть без учёта сил сопротивления, что позволяет маятнику совершать гармонические колебания неограниченное количество времени. Рассмотрение алгоритма решения задачи на ЭВМ.
курсовая работа [231,1 K], добавлен 07.03.2013Процесс моделирования работы САПР: описание моделирующей системы, разработка структурной схемы и Q-схемы, построение временной диаграммы, построение укрупненного моделирующего алгоритма. Описание математической модели, машинной программы решения задачи.
курсовая работа [291,6 K], добавлен 03.07.2011Существующие альтернативы программы. Описание формул для выкроек, используемых в разработке. Описание разрабатываемой программы, а также структура ее интерфейса. Детальное описание возможностей и спецификация, функциональные особенности программы.
курсовая работа [427,4 K], добавлен 10.10.2015Постановка нелинейной задачи. Кусочно-линейная и кусочно-постоянная аппроксимация нелинейностей. Сопровождающая кусочно-линейная задача минимальной интенсивности. Свойства оптимальной стартовой обратной связи. Стабилизация перевернутого маятника.
дипломная работа [412,8 K], добавлен 28.05.2013Применение программного обеспечения для разработки игры "Быки и коровы". Описание алгоритма и интерфейса пользователя программы. Назначение и область применения и описание возможностей программы. Рассмотрение списка сообщений об ошибках программы.
курсовая работа [799,2 K], добавлен 26.04.2021Основные типы динамических подключаемых библиотек DLL: исполняемые и библиотеки ресурсов. Способы экспорта процедур и функций: по имени и порядковому номеру. Системные требования к разработке программы для организации проведения опросов (тестов).
курсовая работа [124,3 K], добавлен 23.07.2012Описание структурной схемы операционного устройства. Построение обратной структурной таблицы автомата. Проектирование функций выходов и управление элементами памяти. Изображение пользовательского интерфейса и инструкции по инсталляции и запуску программы.
курсовая работа [642,6 K], добавлен 19.05.2014Характеристика функций имитационного моделирования. Знакомство с особенностями имитационного моделирования агрегированной системы массового обслуживания. Анализ программы GPSSWorld: рассмотрение возможностей, способы составления имитационной модели.
курсовая работа [1,6 M], добавлен 27.05.2013Характеристика состава, интерфейса и основных возможностей программы схемотехнического моделирования и проектирования семейства Micro-Cap8, которая относится к наиболее популярным системам автоматизированного проектирования (САПР) электронных устройств.
реферат [108,0 K], добавлен 12.03.2011Характеристика алгоритмов и программных реализаций поведения агентов в двумерной среде. Исследование разработки структур данных и знаний. Особенность создания интерфейса и карты лабиринта. Экспериментальное тестирование и отладка модулей программы.
дипломная работа [2,4 M], добавлен 12.08.2017Назначение и применение микроконтроллеров - интегральных микросхем, предназначенных для управления электронными схемами. Описание способа адресации. Разработка программы, описание электрической и структурной схемы разрабатываемого микроконтроллера.
курсовая работа [177,6 K], добавлен 30.06.2014Необходимость создания моделируемой системы. Описание моделируемой системы и задание моделирования. Структурная схема модели системы. Блок–диаграмма. Текст программы. Описание текста программы. Результаты моделирования. Эксперимент, его результаты.
курсовая работа [35,9 K], добавлен 19.11.2007Разработка алгоритма решения задачи численного интегрирования методом трапеции. Словесное описание и блок-схема разработанного алгоритма программы. Описание интерфейса, главного окна и основных форм программы. Проверка работоспособности программы.
курсовая работа [1,4 M], добавлен 16.03.2012Изучение методов разработки приложений в среде визуального программирования Visual Studio. Создание программы, реализующей заказ железнодорожных билетов. Язык SQL-запросов в системе управления базами данных MS Access. Тестирование созданной программы.
курсовая работа [1,0 M], добавлен 03.07.2016Определение ускорения свободного падения с помощью физического маятника. Период колебания физического маятника. Нахождение ускорения свободного падения методом наименьших квадратов. Решение задач методами Гаусса-Ньютона и квазиньютоновскими методами.
лабораторная работа [32,4 K], добавлен 29.03.2015Порядок проектирования программы, демонстрирующей принцип заполнения очереди и стека и принцип удаления элементов из очереди и стека. Определение класса и всех необходимых функций. Программа на языке С, описание возможностей, используемых для алгоритма.
курсовая работа [254,3 K], добавлен 20.05.2013