COM – технологиясы курстық жұмыс
Жоспар
КІРІСПЕ 4
1 НЕГІЗГІ БӨЛІМ 5
1.1 COM – технологиясының негіздері. 5
1.2 Интерфейс 7
1.3 Интерфейстерді жариялау 9
1.4 Интерфейстер және VCL Tcomponent класы 14
1.5 COM – сервер, құрамы және қолдануы 16
1.6 Ағымдар мен бөлмелер 17
2 ПРАКТИКАЛЫҚ БӨЛІМ 18
2.1 COM – серверін ұйымдастыру 18
2.2 COM - серверін тіркеу 21
2.3 Интерфейстердің және параметрлердің берілуі 22
ҚОРЫТЫНДЫ 26
ПАЙДАЛАНЫЛҒАН ӘДЕБИЕТТЕР 27
ҚОСЫМША 28
Жұмыс түрі: Курстық жұмыс
Жұмыс көлемі: 32 бет
Пәні: Соңғы қосылған курстық жұмыстар
-----------------------------------------------------------------------------------
КУРСТЫҚ ЖҰМЫСТЫҢ ҚЫСҚАРТЫЛҒАН МӘТІНІ
КІРІСПЕ 4
1 НЕГІЗГІ БӨЛІМ 5
1.1 COM – технологиясының негіздері. 5
1.2 Интерфейс 7
1.3 Интерфейстерді жариялау 9
1.4 Интерфейстер және VCL Tcomponent класы 14
1.5 COM – сервер, құрамы және қолдануы
1.6 Ағымдар мен бөлмелер 17
2 ПРАКТИКАЛЫҚ БӨЛІМ 18
2.1 COM – серверін ұйымдастыру 18
2.2 COM - серверін тіркеу 21
2.3 Интерфейстердің және параметрлердің берілуі 22
ҚОРЫТЫНДЫ 26
ПАЙДАЛАНЫЛҒАН ӘДЕБИЕТТЕР 27
ҚОСЫМША 28
КІРІСПЕ
COM (Component Object Model – көп компонентті
СОМ – технологиясының екі ерекшелігі бар:
- СОМ – объектілерді құру программалау тіліне
- СОМ-объектілері Windows – қа арналған
1 НЕГІЗГІ БӨЛІМ
1.1 COM – технологиясының негіздері.
COM технологиясы бір программаға (клиент) басқа
СОМ – ның көзқарасы бойынша приложенияның құрамында
MyCalc=class
fx,fy:integer;
public:
procedure SetOperands(x,y:integer)
function Sum:integer;
function Diff:integer;
end;
procedure MyCalc.SetOperands(x,y:integer)
begin
fx:=x; fy:=y;
end;
function MyCalc.Sum:integer;
begin
result:=fx+fy;
end;
function MyCalc.Diff:integer;
begin
result:=fx-fy;
end;
Енді бізде осы кластың элементі болса, онда
unit MyCalc
type
MyCalc=class
var
Calc:MyCalc;
Енді біз оны қайтадан компиляция жасамай -
unit MyCalc
type
MyCalc=class
var Calc:MyCalc;
procedure SetOperands(x,y:integer)
begin
Calc.SetOperands(x,y);
end;
function Sum:integer;
begin
result:= Calc.Sum;
end;
function Diff:integer;
begin
result:= Calс.Diff;
end;
procedure CreateObject;
begin
Calc:=MyCalc.Create;
end;
procedure ReleaseObject;
begin
Calc.Free;
end;
1.2 Интерфейс
Енді интерфейсті толығырақ қарастырайық.Интерфейс программист пен компилятор
Осындай жолмен клиентке объектінің интерфейсін және ол
Интерфейсті жариялаудың құрамына оның әдістерін және қасиеттерін
Интерфейстер мұрагерлене алады.Интерфейстің мұрагерленуі бұл – мұрагерлік
Интерфейс - бұл класс емес.Класс интерфейстің іске
Интерфейс - қатаң түрде типтелген.Клиентте интерфейстің жүзеге
1.3 Интерфейстерді жариялау
Интерфейстерді қолдау үшін Delphi Pascal тілінің
type
IMyInterface = interface
['{412AFF00-5C21-11D4-84DD-C8393F763A13}']
procedure DoSomething(var I: Integer); stdcall;
function DoSomethingAnother(S: String): Boolean;
end;
IMyInterface2 = interface(IMyInterface)
['{412AFF01-5C21-11D4-84DD-C8393F763A13}']
procedure DoAdditional(var I: Integer); stdcall;
end;
Delphi – да GUID жаңа мағынасының генерациясын
COM моделінің негізгі интерфейсі Iunknown болып табылады.Кез
type
IUnknown = interface
['{00000000-0000-0000-C000-000000000046}']
function QueryInterface(const IID: TGUID; out Obj): HResult;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
end;
Iunknown әдісінің не үшін арналғанын қарастырайық.Соңғы екі
function _AddRef: Integer; stdcall;
Бұл функция интерфейске жасалған сілтемелердің санын бірге
function _Release: Integer; stdcall;
Бұл функция интерфейске жасалынған сілтемелердің санын бірге
Бірінші әдіс интерфейсті іске асырып жатқан класқа
function QueryInterface(const IID: TGUID; out Obj): HResult;
Бұл функция кіру қасиеті ретінде интерфейстің идентификаторын
1. Оған жасалған сілтемені Obj параметріне қайтарады.
2. Қабылданған интерфейстің _AddRef әдісін шақырады.
3. Нолді қайтарады.
Болмаған жағдайда функция қателік кодын E_NOINTERFACE қайтарады.
System.pas модулінде Iunknown – ды және оның
function TObject.GetInterface(const IID: TGUID; out Obj): Boolean;
Егер объект сұраныс жасалған интерфейсті іске асыратын
1. Оған жасалған сілтемені Obj параметріне қайтарады.
2. Қабылданған интерфейстің _AddRef әдісін шақырады.
3. TRUE - ні қайтарады
Болмаған жағдайда функция FALSE – ты қайтарады.Осындай
type
TMyClass = class(TComponent, IMyInterface, IDropTarget)
// Әдістерді іске асыру
end;
TmyClass класы IMyInterface және IdropTarget интерфейстерін
type
ITest = interface
['{61F26D40-5CE9-11D4-84DD-F1B8E3A70313}']
procedure Beep;
end;
TTest = class(TInterfacedObject, ITest)
procedure Beep;
destructor Destroy; override;
end;
…
procedure TTest.Beep;
begin
Windows.Beep(0,0);
end;
destructor TTest.Destroy;
begin
inherited;
MessageBox(0, 'TTest.Destroy', NIL, 0);
end;
Бұл жерде Ttest класы Itest интерфейсін
procedure TForm1.Button1Click(Sender: TObject);
var
Test: ITest;
begin
Test := TTest.Create;
Test.Beep;
end;
Егер біз интерфейстің жүзеге асырылуын бірден жойғымыз
Code:
var
Test: ITest;
T: TTest;
begin
T := TTest.Create;
Test := T;
Test.Beep;
Test := NIL; // IUnknown._Release автоматты
end;
Iunknown әдісінің автоматты түрде шақырылуына көңіл бөлу
- интерфейске объекттің типін келтірген кезде _AddRef
- интерфейске сұраныс жасап тұрған ауыспалыға басқа
Бір рет объекттен интерфейске сұраныс жасағаннан кейін,
var
Test: ITest;
begin
Test := TInterfacedObject.Create as ITest;
Test.Beep;
end;
Сол уақытта да код:
var
Test: ITest;
begin
Test := TTest.Create as ITest;
Test.Beep;
end;
Компиляциядан өтеді және орындалады.
Енді интерфейстерді жүзеге асыруды толығырақ қарастырайық.
Екі интерфейсті жариялайық:
type
ITest = interface
['{61F26D40-5CE9-11D4-84DD-F1B8E3A70313}']
procedure Beep;
end;
ITest2 = interface
['{61F26D42-5CE9-11D4-84DD-F1B8E3A70313}']
procedure Beep;
end;
Енді осы екі интерфейсті де жүзеге асыратын
TTest2 = class(TInterfacedObject, ITest, ITest2)
procedure Beep1;
procedure Beep2;
procedure ITest.Beep = Beep1;
procedure ITest2.Beep = Beep2;
end;
Көрініп тұрғандай кластың құрамында бірден екі Beep
TTest2 = class(TInterfacedObject, ITest, ITest2)
procedure MyBeep;
procedure ITest.Beep = MyBeep;
procedure ITest2.Beep = MyBeep;
end;
Екі интерфейсті жүзеге асыратын кластың мысалын қарастырайық:
type
TBeeper = class
procedure Beep;
end;
TMessager = class
procedure ShowMessage(const S: String);
end;
TTest3 = class(TInterfacedObject, ITest, IAnotherTest)
private
FBeeper: TBeeper;
FMessager: TMessager;
property Beeper: TBeeper read FBeeper implements ITest;
property Messager: TMessager read FMessager implements IAnotherTest;
public
constructor Create;
destructor Destroy; override;
end;
Интерфейстің жүзеге асырылуын басқа класқа жүктеу үшін
{ TBeeper }
procedure TBeeper.Beep;
begin
Windows.Beep(0,0);
end;
{ TMessager }
procedure TMessager.ShowMessage(const S: String);
begin
MessageBox(0, PChar(S), NIL, 0);
end;
{ TTest3 }
constructor TTest3.Create;
begin
inherited;
FBeeper := TBeeper.Create;
FMessager := TMessager.Create;
end;
destructor TTest3.Destroy;
begin
Кластарды босату
FBeeper.Free;
FMessager.Free;
inherited;
end;
1.4 Интерфейстер және VCL Tcomponent класы
VCL Tcomponent базалық класында Iunknown интерфейсін жүзеге
type
IGetData = interface
['{B5266AE0-5E77-11D4-84DD-9153115ABFC3}']
function Getdata: String;
end;
TForm1 = class(TForm, IGetData)
private
function Getdata: String;
end;
…
var
I: Integer;
GD: IGetData;
S: String;
begin
S := '';
for I := 0 to Pred(Screen.FormCount) do
if Screen.Forms[I].GetInterface(IGetData, GD) then
S := S + GD.GetData + #13;
end;
ShowMessage(S);
end;
Бұл код приложенияларындағы бүкіл формалардың ішінде IgetData
Жоғарыда қаралған Tcomponent приложениядағы компоненттерді қатаң типтілікті
Мысалы біркелкі құралдар панелі және көптеген әртүрлі
unit ToolbarInterface;
interface
type
TCommandType = (ctSave, ctLoad, ctClear);
TCommandTypes = set of TCommandType;
TSaveType = (stSave, stSaveAS);
IToolBarCommands = interface
['{B5266AE1-5E77-11D4-84DD-9153115ABFC3}']
function SupportedCommands: TCommandTypes;
function Save(AType: TSaveType): Boolean;
procedure Load;
procedure Clear;
end;
implementation
end.
1- суретте. Программаның жұмысы
1.5 COM – сервер, құрамы және қолдануы
COM моделі программалау тілдерінен тәуелсіз көп рет
COM сервер – бұл арнайы түрде безендірілген
DLL түріндегі сервер.
Бұл сервер әрқашанда оны жүзеге асырған (In-Process)
Орындалушы файл ретіндегі сервер.
Бұл сервер басқа приложениялардың сұранысы бойынша COM
1.6 Ағымдар мен бөлмелер
Windows – көптапсырмалы және көпағымды орта.COM –
клиент пен сервер приложенияның әртүрлі ағымдарында немесе
серверге бір уақытта бірнеше клиент сұраныс
STA
Бірағымды бөлмені құрған кезде COM терезе құрады.COM
1.Программист әдістердің синхрондалуы туралы алаңдамаса болады.Ағымдағы әдістің
2.Программист класс өрістерінің рұқсатының синхрондалуы туралы алаңдамаса
STA – ның кемшіліктері:
1.Әдістерді шақырған кездегі синхрондалуға кететін қосымша шығындар.
2.Алдыңғы әдіс өңделіп бітпегенше келесі әдістің өңделуі
MTA
Синхрондалудың автоматты сервисін жүзеге асырмайды және оған
2 ПРАКТИКАЛЫҚ БӨЛІМ
2.1 COM – серверін ұйымдастыру
Delphi COM серверлерін ұйымдастыру үшін кең
library Project1;
uses
ComServ;
exports
DllGetClassObject,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer;
{$R *.RES}
begin
end.
COM – ның дұрыс жұмыс істеуі үшін
ClassName - COM-серверді жүзеге асыратын Delphi класының
Instansing - COM - объектілерді жасау режимін
Internal – объект тек қана осы приложенияның
Threading Model – сервердің ағымдық жобасы.Бұл қасиеттің
Single – ағымдарды қолдау жоқ.Әдетте бұл жоба
Include Type Library – бұл қасиетті орнатқан
Implemented Interfaces – бұл өріске рұқсат етілген
Mark interface Oleautomation – бұл қасиет COM
1. Сервер TtypedComObject – тен мұрагерленуі керек.
2. Интерфейстің бүкіл әдістері safecall ретінде жариялануы
Кітапханасыз серверлер.
Егер осындай кітапханалар Imarshall интерфейстерін жүзеге асыра
unit Unit1;
interface
uses
Windows, ActiveX, Classes, ComObj;
type
TTest = class(TComObject, ITest)
protected
end;
const
Class_Test: TGUID = '{1302FB00-703F-11D4-84DD-825B45DBA617}';
Implementation
uses ComServ;
initialization
TComObjectFactory.Create(ComServer, TTest, Class_Test,
Test', '', ciMultiInstance, tmApartment);
end.
Өз программамызда керекті серверлерді автоматты түрде тіркеу
procedure CheckComServerInstalled(const CLSID: TGUID; const DllName: String);
var
Size: Integer;
DllHandle: THandle;
FileName: String;
begin
Size := MAX_PATH;
SetLength(FileName, Size);
try
if RegQueryValue(HKEY_CLASSES_ROOT,
PChar(Format('CLSID%sInProcServer32',
[GUIDToString(CLSID)])), PChar(FileName), Size) = ERROR_SUCCESS
then
begin
SetLength(FileName, Size);
DllHandle := LoadLibrary(PChar(FileName));
FreeLibrary(DllHandle);
if DllHandle = 0 then begin
RegDeleteKey(HKEY_CLASSES_ROOT,
PChar(Format('CLSID%s',[GUIDToString(CLSID)])));
RegisterComServer(DllName);
end;
end else begin
RegisterComServer(DllName);
end;
except
raise Exception.CreateFmt(%s Тіркей алмаймын.', [DllName]);
end;
end;
Процедура дискте орналасқан тіркеуден өткен файлдың қосымша
2.2 COM - серверін тіркеу
COM клиенттің сұраныс жасаған серверлерін автоматты түрде
2 – сурет. HKEY_CLASSES_ROOTCLSID.
Әр сервердің орналасуын табу және модулін жүктеу
2.3 Интерфейстердің және параметрлердің берілуі
Клиент басқа бөлмеден сұраныс жасалған интерфейсті шақыру
1.Рroxy – ді жүзеге асыру үшін серверде
2.IDL (Interface Definition Language) – де интерфейсті
3.Ole Automation мен үйлесімді сервер жасау.Бұл жағдайда
4.Сонымен қатар интерфейсте Ole Automationмен үйлесімді ғана
COM инициализациясы
COM клиенттері мен серверлері өз талаптары бойынша
const
COINIT_MULTITHREADED =
COINIT_APARTMENTTHREADED = 2; // Apartment
function CoInitializeEx(pvReserved: Pointer;
coInit: Longint): HResult; stdcall;
РvReserved парамерті болашақта қолдануға қалдырылған және NIL
COINIT_APARTMENTTHREADED - ағым үшін STA жасалады.Әр
COINIT_MULTITHREADED - егер MTA ағымдағы процесте жасалынбаған
Егер бөлме сәтті жасалынса,онда функция S_OK қайтарады.COMмен
procedure CoUninitialize; stdcall;
CoInitializeEx – ті шақыру кезінде оған сәйкес
program Project1;
uses
Forms,
ComObj,
ActiveX,
Unit1 in 'Unit1.pas' {Form1};
{$R *.RES}
begin
CoInitFlags := COINIT_MULTITHREADED;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Егер COM ағымда қолданылса, онда мына функциялар
procedure TMyThread.Execute;
begin
CoInitializeEx(NIL, COINIT_MULTITHREADED);
…
CoUninitialize
end;
COM инициализациясы COM – ға қатысты Windows
DLL алдында өзінің бөлмесін құрастырып қойған ағыммен
Apartment – сервер тек қана STA –
Free – сервер тек қана MTA
3 – сурет.ThreadingModel
Both – сервер MTA - да және
Серверді іске қосу
COM – серверін іске қосу үшін клиент
function CreateComObject(const ClassID: TGUID):
Керекті объектінің параметрі ретінде функция CLSID
var
COMServer: IComServer;
…
// COM объектісін құрып интерфейсіне сұраныс
:= CreateComObject(IComServer) as IComServer;
//Интерфейспен жұмыс жасаймыз.
ComServer.DoSomething;
// Интерфейсті босатамыз.
ComServer := NIL;
ҚОРЫТЫНДЫ
Осы курстық жұмысымда мен COM – технологиясын
DLL түріндегі сервер.
Бұл сервер әрқашанда оны жүзеге асырған (In-Process)
Орындаушы файл ретіндегі сервер.
Бұл сервер басқа приложениялардың сұранысы бойынша COM
Ол клиенттерге өздері жүзеге асырған объектілерге сұраныс
ПАЙДАЛАНЫЛҒАН ӘДЕБИЕТТЕР
1. Евгений Марков. Программирование в Delphi 7.СПб.:
2. Флёнов М. Е. Программирование в
3. Гофман В. Э. Хомоненко А. Д.
4. Дмитрий О. Delphi. Профессиональное программирование 2006.
5. Delphi 7 для прфессионалов, Марко
6. Delphi 6 Учебный курс.Фаронов В.В. М.:
7. А. Я.Архангельский.Програмирование в Delphi 7. Издательство
8. Владимир Попов. Самоучитель Паскаль и Дельфи.
9. Климова Л.М. Delphi 7. Основы программирования.М.:Кудиц-Образ,2004.
10. Delphi и технология COM, Елманова Н.З.,Трепалин
11. Фаронов В. В. Программирование баз данных
12. Бобровский С. Delphi5: учебный курс.Спб: Питер,2001.
13. Шкрыль А.А. Шкрыль А. -
14. Delphi 5-6 Камардинов О., Шымкент 2002г
15. Никита Культин Delphi в задачах
2003 г.
16. Егоров Е. Лекции по программированию на
17. В. Понамарев, Базы данных в Delphi
18. Понамарев В. COM и ActiveX
19. Стив Тейксейра, Borland Delphi 6. Руководство
20. Сухарев М. В. Основы Delphi. Профессиональный
21. И. Ю. Баженова.Год издания: 2003,Издат.:
ҚОСЫМША
Жаңа форма құрып,оның бетіне 4 – суретте
4 – сурет.Компоненттерді форма бетіне орналастыру.
Содан кейін келесі процедураны енгіземіз:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
ExtCtrls, StdCtrls, Gauges, MyMath, Unit2;
type
TForm1 = class(TForm)
StartBtn: TButton;
Image1: TImage;
ClearBtn: TButton;
GroupBox1: TGroupBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Gauge1: TGauge;
FormEd: TEdit;
XStart: TEdit;
XEnd: TEdit;
StepEd: TEdit;
LinesCh: TCheckBox;
MashCh: TCheckBox;
GroupBox2: TGroupBox;
Label5: TLabel;
Label6: TLabel;
XEd: TEdit;
YEd: TEdit;
StartBtn2: TButton;
OpenDialog: TOpenDialog;
SaveDialog: TSaveDialog;
OpenBtn: TButton;
SaveBtn: TButton;
AbBtn: TButton;
procedure StartBtnClick(Sender: TObject);
procedure ClearBtnClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormCreate(Sender: TObject);
procedure StartBtn2Click(Sender: TObject);
procedure OpenBtnClick(Sender: TObject);
procedure SaveBtnClick(Sender: TObject);
procedure AbBtnClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
var x,y:array of extended;
xmnoj,ymnoj,ymin,ymax,xe,xs,step:extended;
graph:boolean=false;
ram:boolean=false;
f:file of extended;
fn:string;
procedure XYMinMax;
var n:cardinal;
imh,imw:word;
begin
form1.caption:='Graphics - Ïîèñê ìèíèìàëüíûõ è ìàêñèìàëüíûõ çíà÷åíèé
form1.gauge1.maxvalue:=high(y);
if form1.mashch.checked=true then
begin
//åñëè ìàñøòàáèðîâàíèå îòìå÷åíî, òî èùåòñÿ ìíîæèòåëü äëÿ
imh:=form1.image1.height;
imw:=form1.image1.width;
ymax:=y[1];
ymin:=y[1];
for n:=0 to high(y) do
begin
if ymax
form1.gauge1.progress:=n;
end;
if ymax-ymin=0 then ymnoj:=1
else ymnoj:=imh/abs(ymax-ymin);
if xe-xs=0 then xmnoj:=1
else xmnoj:=imw/abs(xe-xs);
end else
//à åñëè ìàñøòàáèðîâàíèå íå îòìå÷åíî, òî ìíîæèòåëè
begin
ymnoj:=1;
xmnoj:=1;
end;
form1.caption:='Graphics - Ïîèñê çàâåðøåí';
end;
procedure ris;
var n:cardinal;
imh,imw:word;
begin
form1.caption:='Graphics - Ïîñòðîåíèå ãðàôèêà';
form1.image1.canvas.pen.color:=clwhite;
imh:=form1.image1.height;
imw:=form1.image1.width;
form1.gauge1.maxvalue:=high(x);
//ðèñóåò îñè
with form1.image1.canvas do
begin
pen.style:=psdot;
moveto(0,imh-trunc((-ymin)*ymnoj));
lineto(imw,imh-trunc((-ymin)*ymnoj));
moveto(trunc((-xs)*xmnoj),0);
lineto(trunc((-xs)*xmnoj),imh);
pen.style:=pssolid;
end;
if form1.linesch.checked=true then
begin
//åñëè îòìå÷åíî ñîåäèíåíèå ëèíèÿìè, òî òî÷êè ñîåäèíÿþòñÿ
for n:=0 to high(x)-1 do
begin
with form1.image1.canvas do
begin
moveto(trunc((x[n]-xs)*xmnoj),imh-trunc((y[n]-ymin)*ymnoj));
lineto(trunc((x[n+1]-xs)*xmnoj),imh-trunc((y[n+1]-ymin)*ymnoj));
end;
form1.gauge1.progress:=n;
end;
form1.gauge1.progress:=high(x);
end else //à åñëè íåò, òî íå
for n:=0 to high(x) do
begin
form1.image1.canvas.moveto(trunc((x[n]-xs)*xmnoj),imh-trunc((y[n]-ymin)*ymnoj));
form1.image1.canvas.lineto(trunc((x[n]-xs)*xmnoj)+1,imh-trunc((y[n]-ymin)*ymnoj)+1);
form1.gauge1.progress:=n;
end;
graph:=true;
form1.caption:='Graphics - Ïîñòðîåíèå çàâåðøåíî';
end;
procedure TForm1.StartBtnClick(Sender: TObject);
var n:cardinal;
m:word;
str:string;
label a;
begin
form1.caption:='Graphics - Ðàñ÷åò òî÷åê';
graph:=true;
ram:=true;
xe:=strtofloat(xend.text);
xs:=strtofloat(xstart.text);
if xe
str:=xend.text;
xend.text:=xstart.text;
xstart.text:=str;
xe:=xe+xs;
xs:=xe-xs;
xe:=xe-xs;
end;
step:=strtofloat(steped.text);
if (step>abs(xe-xs))or(stepbegin
showmessage('Íåâåðíûé øàã');
exit;
end;
setlength(x,trunc(abs(xe-xs)/step)+1);
setlength(y,trunc(abs(xe-xs)/step)+1);
gauge1.maxvalue:=high(y);
for n:=0 to high(x) do
begin
x[n]:=xs+n*step;
str:=formed.text;
str:=erranalise(str);
a:; //ìåòêà äëÿ îáíîâëåíèÿ äëèííû
for m:=1 to length(str) do
begin
//ïîäñòàíîâêà ÷èñëà âìåñòî x
if ((str[m]='x')or(str[m]='X')){and(x[n]>=0)} then
begin
delete(str,m,1);
insert(floattostr(x[n]),str,m);
goto a;
end;
{if ((str[m]='x')or(str[m]='X'))and(x[n]begin
delete(str,m,1);
insert(floattostr(x[n]),str,m);
str[m]:='~';
goto a;
end;}
end;
//ðåøåíèå ôóíêöèè â òî÷êå x
y[n]:=strtofloat(analise(str));
gauge1.progress:=n;
end;
xyminmax;
ris;
end;
procedure TForm1.ClearBtnClick(Sender: TObject);
begin
with form1.image1.canvas do
begin
brush.color:=clblack;
pen.color:=clblack;
rectangle(0,0,form1.image1.width,form1.image1.height);
end;
graph:=false;
xed.text:='0';
yed.text:='0';
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
finalize(x);
finalize(y);
end;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if graph then
begin
xed.text:=floattostr((x/image1.width)*(xe-xs)+xs);
yed.text:=floattostr(ymax-(y/image1.height)*(ymax-ymin));
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
with form1.image1.canvas do
begin
brush.color:=clblack;
pen.color:=clblack;
rectangle(0,0,form1.image1.width,form1.image1.height);
end;
end;
procedure TForm1.StartBtn2Click(Sender: TObject);
begin
xyminmax;
ris;
end;
procedure TForm1.OpenBtnClick(Sender: TObject);
var l:extended;
formula:string;
n:word;
begin
form1.caption:='Graphics - Îòêðûòèå ôàéëà';
if opendialog.execute then
fn:=opendialog.filename;
if fn='' then exit;
setlength(x,0);
setlength(y,0);
assignfile(f,fn);
{$I-}
reset(f);
{$I+}
if ioresult=0 then
begin
finalize(x);
finalize(y);
read(f,l);
formula:='';
for n:=1 to trunc(l) do
begin
read(f,l);
formula:=formula+chr(trunc(l));
end;
read(f,xe,xs,step);
while not eof(f) do
begin
setlength(x,high(x)+2);
setlength(y,high(y)+2);
read(f,x[high(x)],y[high(y)]);
end;
setlength(x,high(x));
setlength(y,high(y));
formed.text:=formula;
xstart.text:=floattostr(xs);
xend.text:=floattostr(xe);
steped.text:=floattostr(step);
end else showmessage('Íå ìîãó îòêðûòü ôàéë');
closefile(f);
form1.caption:='Graphics - Îòêðûòèå çàâåðøåíî';
end;
procedure TForm1.SaveBtnClick(Sender: TObject);
var n:cardinal;
l:extended;
begin
form1.caption:='Graphics - Ñîõðàíåíèå ôàéëà';
if savedialog.execute then
fn:=savedialog.filename;
if fn='' then exit;
l:=0;
for n:=length(fn) downto 1 do
if fn[n]='' then
begin
l:=n;
break;
end;
if pos('.',copy(fn,trunc(l),length(fn)-trunc(l)))=0 then fn:=fn+'.grf';
assignfile(f,fn);
rewrite(f);
l:=length(formed.text);
write(f,l);
for n:=1 to length(formed.text) do
begin
l:=ord(formed.text[n]);
write(f,l);
end;
write(f,xe,xs,step);
for n:=0 to high(x) do
write(f,x[n],y[n]);
closefile(f);
form1.caption:='Graphics - Ñîõðàíåíèå çàâåðøåíî';
end;
procedure TForm1.AbBtnClick(Sender: TObject);
begin
AboutForm.ShowModal;
end;
end.
Енгізіп болғаннан кейін,компиляция жасаймыз.Нәтижесінде 5 – суретте
5 – сурет.Құрылған программаның көрінісі.
5