Разработка справочной системы по визуальным компонентам языка программирования Delphi. Возможность сохранения измененных свойств компонент в файле с возможностью их загрузки в будущем. Логика работы приложения и разработка программного обеспечения.
При низкой оригинальности работы "Разработка демонстрационного многопоточного приложения с динамическим изменением свойств окна и компонент", Вы можете повысить уникальность этой работы до 80-100%
Выбор средств реализации Описание логики работы приложения и разработка программного обеспечения.
Список литературы
Приложения
Введение
Зачастую необходимо получить быстрый доступ к информации. Все чаще для этого используются различные компьютерные приложения.
Одним из важнейших разделов науки информатики является программирование. Язык программирования - это формальный, искусственно созданный язык для написания и реализации алгоритма на компьютере.
Среди главных причин, принесших заслуженную популярность объектно-ориентированного программирования, следует отметить следующие: · почти полное разрешение проблемы кризиса в программном обеспечении, за счет уменьшения времени на разработку программного продукта и высокой технологии программирования;
· переход от существующих языков программирования к новым, прогрессивным информационным технологиям и сходство идей объектно-ориентированного программирования с идеями из других областей науки.
Методы ООП для решения технических задач нередко используются в повседневной жизни, поэтому, обучение языкам объектно-ориентированного программирования не вызывает особых трудностей.
Преимущество ООП в наглядном представлении программы с помощью объектов (кнопок, строк для ввода информации и др.). Каждый объект принадлежит определенному классу. Например, кнопка (Button1) принадлежит классу кнопок TBUTTON. В класс входит сколь угодно много объектов, объединенных в одну группу согласно их свойствам и поведению в среде окружения, в которой они существуют и взаимодействуют.
Появление Delphi не могло пройти незамеченным среди многочисленных пользователей компьютера. Оценки экспертов, изучающих возможности этого продукта фирмы Borland, обычно окрашены в восторженные тона. Основное достоинство Delphi состоит в том, что здесь реализованы идеи визуального программирования. Среда визуального программирования превращает процесс создания программы в приятное и легко понимаемое конструирование приложения из большого набора графических и структурных примитивов.
Практической частью курсового проекта является разработка справочной системы по визуальным компонентам Delphi
1. Постановка задачи
Разработка справочной системы по визуальным компонентам Delphi.
Основные требования: получение информации по основным визуальным компонентам (не менее 15 компонент). Визуализация компонент в специально отведенной области с возможностью задания им разных свойств (размер, цвет и т.д.). Обеспечить возможность с помощью мыши перемещения компонент по отведенной области с отображением координат. Описание компонент должно храниться в текстовом файле.
Общие требования: 1. При выходе из программы обеспечить возможность сохранения измененных свойств компонент в файле с возможностью их загрузки в будущем.
2. Тип приложения: GUI
2. Выбор средств реализации
Для выполнения проекта был выбран язык программирования Delphi, так как он сочетает в себе простоту выполнения задачи, построения пользовательского интерфейса, а также обладает мощным набором функций, экономящим время на разработку программного обеспечения.
В разрабатываемой программе предполагается использование следующих функций и модулей
Модуль Forms позволяет работать с формами. Для создания GUI - приложения будут использованы объекты класса TFORM;
Модули STDCTRLS, Buttons, EXTCTRLS для создания с помощью кнопок интерфейса, удобного и привычного пользователю;
Модуль Controls для работы с классом TCONTROL, что позволяет упростить написание обработчиков события перемещения объектов по форме с помощью мыши;
Модуль Dialogs для вызова модальной формы с помощью функции showmessage;
Модуль Windows для создания объекта FOCUSRECT класса TRECT, используемого для отображения прямоугольника при перемещении объектов по форме с помощью мыши;
Модуль Graphics для работы с классом TCOLOR;
Модули COMCTRLS и Grids исключительно для создания примеров компонент, остальные компоненты есть в ранее упомянутых модулях.
Реализация метода Drag and Drop для перемещения объектов по форме;
Реализация сохранения и загрузки состояния компонент на форме;
Изменение некоторых свойств создаваемых объектов;
Получение справочной информации о выбранном компоненте;
Получение информации о программе;
Выход из программы.
3. Описание логики работы приложения и разработка программного обеспечения
В разрабатываемом приложении реализуется справочная система по визуальным компонентам Delphi. Пользователь имеет возможность получить информацию о некоторых компонентах библиотеки VLC Delphi, увидеть пример этих компонент, изменить их свойства, а также сохранить текущее состояние программы для последующей загрузки.
В файл, при условии наличия объекта компоненты на форме, сохраняются значения его координат и размеры объекта. При отсутствии компонента в файл записывается на соответствующее место ноль. Алгоритм загрузки производится в обратном порядке.
Листинг программы приведен в приложении А.
В процессе создания программного обеспечения были разработаны процедуры и функции, приведенные в таблице 1.
Таблица 1.
Используемые методы.
Процедура Описание procedure LISTBOX1Click При нажатии на элемент списка создается или удаляется соответствующий объект (при активированном переключателе CHECKBOX1 также показывается справка о нем). procedure SETPROPERTIES Присваевает свойству Text компонент Edit1, Edit2, Edit3, Edid4 соответствующие свойства выбранного компонента. procedure COMPONENTMOUSEDOWN Обработчик события нажатия кнопкой мыши на объекте для последующего его перемещения. procedure COMPONENTMOUSEMOVE Обработчик события перемещения компонента по ограниченной области формы с помощью мыши. procedure COMPONENTMOUSEUP Обработчик события прекращеия перемещения объекта по форме. procedure Button1Click Применение к выбранному компоненту свойств, заданных в Edi1, Edit2, Edit3, Edid4. procedure BITBTN4Click Выход из программы procedure BITBTN5Click Вызов модальной формы, показывающей информацию о программе procedure BITBTN1Click Сохранение текущего состояния программы в файл procedure BITBTN3Click Кнопка, вызывающая процедуру clear_all procedure BITBTN2Click Удаление всех созданных пользователем объектов и загрузка положения компонент на форме из файла procedure clear_all Удаляет созданные пользователем объекты с формы.
4. Описание пользовательского интерфейса
В интерфейсе проекта используются компоненты Delphi: Label, Button, BITBTN, Edit, LISTBOX, CHECKBOX, Shape, STATUSBAR.
Label - предназначен для отображения статического текста, то есть надписей и меток на форме, которые не меняются в течение всего времени работы программы.
Button и BITBTN - используется для реализации в программе команд с помощью обработчика события ONCLICK этого компонента.
Edit - используется для ввода - вывода текстовой информации.
LISTBOX - необходим для выбора пользователем компонента, с которым он хотел бы ознакомиться.
CHECKBOX - независимый переключатель, предназначенный для проверки решения пользователя типа Да/Нет.
Shape - данный компонент был использован для того, чтобы визуально ограничить область, в которой пользователь может работать с примерами компонент.
STATUSBAR - используется для отображения координаты курсора при перемещении компоненты по форме.
При запуске проекта пользователь попадает на следующую форму:
Рис. 1. Запуск проекта.
Далее, если пользователь активировал переключатель "Показывать информацию", при нажатии на один из элементов списка происходит запуск модальной формы с кратким описанием выбранного компонента, а также создание этого объекта на форме. Если переключатель не был активирован, то модальная форма не запускается. визуальный компонент язык программирование
Рис. 2. Нажатие на элемент списка.
Появившиеся объекты пользователь может перемещать с помощью мыши по форме в разрешенных пределах, изменять их свойства применяя изменения нажатием на кпопку "Apply". При перемещении объекта, отображаются координаты курсора
Рис. 3. Изменение свойств объектов.
При работе с программой пользователь может сохранить или загрузить положение и свойства находящихся на форме объектов кликнув на соответствующих кнопках "Save" и "Load". Пользователь также может очистить поле с помощью кнопки "Clear" от всех созданных им компонент или вручную удалять каждый из них повторно нажав на соответствующий элемент списка; получить информацию о самом приложении с помощью кнопки "About"; выйти из программы нажав на кнопку "Quit".
Рис. 4. О программе.
Заключение
Целью курсовой работы было изучение языка программирования Delphi и улучшение практических заданий.
В ходе курсовой работы было разработано приложение, позволяющее получать справочную информацию о визуальных компонентах Delphi. В нем был реализован метод Drag and Drop, сохранение и загрузка данных, отображение координат курсора, изменение некоторых свойств создаваемых объектов, использованы объекты классов TFORM, TLABEL, TEDIT, TBUTTON, TBITBTN, TSHAPE, TCHECKBOX, TLISTBOX, TSTATUSBAR, TCOLORBOX. Для отображения справочной информации использовались модальные формы, информация в которые загружается из соответствующего файла.
Список использованной литературы
1. Архангельский А.Я. Программирование в Delphi: Учебник по классическим версиям Delphi. - М.: Бином, 2011.
2. Дмитрий Осипов. Delphi. Профессиональное програмирование. - 2008
3. Фаронов В.В. Delphi. Программирование на языке высокого уровня: Учебник для вузов - Спб.: Лидер, 2010.
Canvas. DRAWFOCUSRECT (FOCUSRECT); // Erase Focus Rect
Dragg: = False;
with Selected_Component do begin
Left: = (Left X) - XOFFSET;
Top: = (Top Y) - YOFFSET;
if Left<120 then Left: =120;
if Left>900-Width then Left: =900-Width;
if Top<65 then Top: =65;
if Top>440-Height-20 then Top: =440-Height-20;
end;
SETPROPERTIES (Selected_Component);
end;
end;
procedure TFORM1. Button1Click (Sender: TOBJECT);
var vari: integer;
begin if (Edit1. Text="") or (Edit2. Text="") or (Edit3. Text="") or (Edit1. Text="") then begin showmessage ("Auaa?eoa eiiiiiaio! "); Exit; end else begin if (not (TRYSTRTOINT (Edit1. Text,vari))) or (not (TRYSTRTOINT (Edit2. Text,vari))) or (not (TRYSTRTOINT (Edit3. Text,vari))) or (not (TRYSTRTOINT (Edit1. Text,vari))) then begin showmessage ("Aaaaeoa oaeia ?enei! "); Exit; end;
if Assigned (button) then begin button. Destroy; button: =nil; end;
if Assigned (TEXTBOX) then begin TEXTBOX. Destroy; TEXTBOX: =nil; end;
if Assigned (CHECKBOX) then begin CHECKBOX. Destroy; CHECKBOX: =nil; end;
if Assigned (radio) then begin radio. Destroy; radio: =nil; end;
if Assigned (panel) then begin panel. Destroy; panel: =nil; end;
if Assigned (progress) then begin progress. Destroy; progress: =nil; end;
if Assigned (BITBTN) then begin BITBTN. Destroy; BITBTN: =nil; end; // 7 if Assigned (LABELBOX) then begin LABELBOX. Destroy; LABELBOX: =nil; end;
if Assigned (LABELEDEDIT) then begin LABELEDEDIT. Destroy; LABELEDEDIT: =nil; end;
if Assigned (GROUPBOX) then begin GROUPBOX. Destroy; GROUPBOX: =nil; end; // 10 if Assigned (MEMOBOX) then begin MEMOBOX. Destroy; MEMOBOX: =nil; end; // 11 if Assigned (SPEEDBTN) then begin SPEEDBTN. Destroy; SPEEDBTN: =nil; end; // 12 if Assigned (shape) then begin shape. Destroy; shape: =nil; end; // 13 if Assigned (STATICTEXT) then begin STATICTEXT. Destroy; STATICTEXT: =nil; end; // 14 if Assigned (STRINGGRID) then begin STRINGGRID. Destroy; STRINGGRID: =nil; end; // 15 end;
procedure TFORM1. BITBTN3Click (Sender: TOBJECT);
begin clear_all;
end;
procedure TFORM1. BITBTN2Click (Sender: TOBJECT);
var f: textfile; tmp: integer; sig: TCOLOR;
begin clear_all;
ASSIGNFILE (f,{GETCURRENTDIR }"save. txt");
Reset (f);
readln (f,tmp);
if tmp0 then begin // button if NOT (Assigned (button)) then begin button: = TBUTTON. Create (Form1);
button. Parent: = Form1;
button. ONMOUSEDOWN: = COMPONENTMOUSEDOWN;
button. ONMOUSEMOVE: = COMPONENTMOUSEMOVE;
button. ONMOUSEUP: = COMPONENTMOUSEUP;
button. Name: = "Button";
end;
button. Top: =tmp;
readln (f,tmp);
button. Left: =tmp;
readln (f,tmp);
button. Height: =tmp;
readln (f,tmp);
button. Width: =tmp;
// SETPROPERTIES (button);
button. Visible: =true;
end;
readln (f,tmp);
if tmp0 then begin // TEXTBOX if NOT (Assigned (TEXTBOX)) then begin
TEXTBOX: = TEDIT. Create (Form1);
TEXTBOX. Parent: = Form1;
TEXTBOX. ONMOUSEDOWN: = COMPONENTMOUSEDOWN;
TEXTBOX. ONMOUSEMOVE: = COMPONENTMOUSEMOVE;
TEXTBOX. ONMOUSEUP: = COMPONENTMOUSEUP;
TEXTBOX. Name: = "TEXTBOX";
end;
TEXTBOX. Top: =tmp;
readln (f,tmp);
TEXTBOX. Left: =tmp;
readln (f,tmp);
TEXTBOX. Height: =tmp;
readln (f,tmp);
TEXTBOX. Width: =tmp;
readln (f,sig);
TEXTBOX. Font. Color: =sig;
// SETPROPERTIES (TEXTBOX);
TEXTBOX. Visible: =true;
end;
readln (f,tmp);
if tmp0 then begin // CHECKBOX if NOT (Assigned (CHECKBOX)) then begin
CHECKBOX: = TCHECKBOX. Create (Form1);
CHECKBOX. Parent: = Form1;
CHECKBOX. ONMOUSEDOWN: = COMPONENTMOUSEDOWN;
CHECKBOX. ONMOUSEMOVE: = COMPONENTMOUSEMOVE;
CHECKBOX. ONMOUSEUP: = COMPONENTMOUSEUP;
CHECKBOX. Name: = "CHECKBOX";
end;
CHECKBOX. Top: =tmp;
readln (f,tmp);
CHECKBOX. Left: =tmp;
readln (f,tmp);
CHECKBOX. Height: =tmp;
readln (f,tmp);
CHECKBOX. Width: =tmp;
// SETPROPERTIES (CHECKBOX);
CHECKBOX. Visible: =true;
end;
readln (f,tmp);
if tmp0 then begin // radio if NOT (Assigned (radio)) then begin radio: = TRADIOBUTTON. Create (Form1);
radio. Parent: = Form1;
radio. ONMOUSEDOWN: = COMPONENTMOUSEDOWN;
radio. ONMOUSEMOVE: = COMPONENTMOUSEMOVE;
radio. ONMOUSEUP: = COMPONENTMOUSEUP;
radio. Name: = "RADIOBUTTON";
end;
radio. Top: =tmp;
readln (f,tmp);
radio. Left: =tmp;
readln (f,tmp);
radio. Height: =tmp;
readln (f,tmp);
radio. Width: =tmp;
// SETPROPERTIES (radio);
radio. Visible: =true;
end;
readln (f,tmp);
if tmp0 then begin // panel if NOT (Assigned (panel)) then begin panel: = TPANEL. Create (Form1);
panel. Parent: = Form1;
panel. ONMOUSEDOWN: = COMPONENTMOUSEDOWN;
panel. ONMOUSEMOVE: = COMPONENTMOUSEMOVE;
panel. ONMOUSEUP: = COMPONENTMOUSEUP;
panel. Name: = "Panel";
end;
panel. Top: =tmp;
readln (f,tmp);
panel. Left: =tmp;
readln (f,tmp);
panel. Height: =tmp;
readln (f,tmp);
panel. Width: =tmp;
readln (f,sig);
panel. Font. Color: =sig;
// SETPROPERTIES (panel);
panel. Visible: =true;
end;
readln (f,tmp);
if tmp0 then begin // progress if NOT (Assigned (progress)) then begin progress: = TPROGRESSBAR. Create (Form1);
progress. Parent: = Form1;
progress. ONMOUSEDOWN: = COMPONENTMOUSEDOWN;
progress. ONMOUSEMOVE: = COMPONENTMOUSEMOVE;
progress. ONMOUSEUP: = COMPONENTMOUSEUP;
progress. Name: = "PROGRESSBAR";
end;
progress. Top: =tmp;
readln (f,tmp);
progress. Left: =tmp;
readln (f,tmp);
progress. Height: =tmp;
readln (f,tmp);
progress. Width: =tmp;
// SETPROPERTIES (progress);
progress. Visible: =true;
end;
readln (f,tmp);
if tmp0 then begin // BITBTN if NOT (Assigned (BITBTN)) then begin
BITBTN: = TBITBTN. Create (Form1);
BITBTN. Parent: = Form1;
BITBTN. ONMOUSEDOWN: = COMPONENTMOUSEDOWN;
BITBTN. ONMOUSEMOVE: = COMPONENTMOUSEMOVE;
BITBTN. ONMOUSEUP: = COMPONENTMOUSEUP;
BITBTN. Name: = "BITBTN";
end;
BITBTN. Top: =tmp;
readln (f,tmp);
BITBTN. Left: =tmp;
readln (f,tmp);
BITBTN. Height: =tmp;
readln (f,tmp);
BITBTN. Width: =tmp;
readln (f,sig);
BITBTN. Font. Color: =sig;
// SETPROPERTIES (BITBTN);
BITBTN. Visible: =true;
end;
readln (f,tmp);
if tmp0 then begin // LABELBOX if NOT (Assigned (LABELBOX)) then begin
LABELBOX: = TLABEL. Create (Form1);
LABELBOX. Parent: = Form1;
LABELBOX. ONMOUSEDOWN: = COMPONENTMOUSEDOWN;
LABELBOX. ONMOUSEMOVE: = COMPONENTMOUSEMOVE;
LABELBOX. ONMOUSEUP: = COMPONENTMOUSEUP;
LABELBOX. Name: = "Label";
end;
LABELBOX. Top: =tmp;
readln (f,tmp);
LABELBOX. Left: =tmp;
readln (f,tmp);
LABELBOX. Height: =tmp;
readln (f,tmp);
LABELBOX. Width: =tmp;
readln (f,sig);
labelbox. Font. Color: =sig;
// SETPROPERTIES (LABELBOX);
LABELBOX. Visible: =true;
end;
readln (f,tmp);
if tmp0 then begin // LABELEDEDIT if NOT (Assigned (LABELEDEDIT)) then begin
LABELEDEDIT: = TLABELEDEDIT. Create (Form1);
LABELEDEDIT. Parent: = Form1;
LABELEDEDIT. ONMOUSEDOWN: = COMPONENTMOUSEDOWN;
LABELEDEDIT. ONMOUSEMOVE: = COMPONENTMOUSEMOVE;
LABELEDEDIT. ONMOUSEUP: = COMPONENTMOUSEUP;
LABELEDEDIT. Name: = "LABELEDEDIT";
end;
LABELEDEDIT. Top: =tmp;
readln (f,tmp);
LABELEDEDIT. Left: =tmp;
readln (f,tmp);
LABELEDEDIT. Height: =tmp;
readln (f,tmp);
LABELEDEDIT. Width: =tmp;
readln (f,sig);
LABELEDEDIT. Font. Color: =sig;
// SETPROPERTIES (LABELEDEDIT);
LABELEDEDIT. Visible: =true;
end;
readln (f,tmp);
if tmp0 then begin // GROUPBOX if NOT (Assigned (GROUPBOX)) then begin
GROUPBOX: = TGROUPBOX. Create (Form1);
GROUPBOX. Parent: = Form1;
GROUPBOX. ONMOUSEDOWN: = COMPONENTMOUSEDOWN;
GROUPBOX. ONMOUSEMOVE: = COMPONENTMOUSEMOVE;
GROUPBOX. ONMOUSEUP: = COMPONENTMOUSEUP;
GROUPBOX. Name: = "GROUPBOX";
end;
GROUPBOX. Top: =tmp;
readln (f,tmp);
GROUPBOX. Left: =tmp;
readln (f,tmp);
GROUPBOX. Height: =tmp;
readln (f,tmp);
GROUPBOX. Width: =tmp;
// SETPROPERTIES (GROUPBOX);
GROUPBOX. Visible: =true;
end;
readln (f,tmp);
if tmp0 then begin // MEMOBOX if NOT (Assigned (MEMOBOX)) then begin
MEMOBOX: = TMEMO. Create (Form1);
MEMOBOX. Parent: = Form1;
MEMOBOX. ONMOUSEDOWN: = COMPONENTMOUSEDOWN;
MEMOBOX. ONMOUSEMOVE: = COMPONENTMOUSEMOVE;
MEMOBOX. ONMOUSEUP: = COMPONENTMOUSEUP;
MEMOBOX. Name: = "Memo";
end;
MEMOBOX. Top: =tmp;
readln (f,tmp);
MEMOBOX. Left: =tmp;
readln (f,tmp);
MEMOBOX. Height: =tmp;
readln (f,tmp);
MEMOBOX. Width: =tmp;
readln (f,sig);
MEMOBOX. Font. Color: =sig;
// SETPROPERTIES (MEMOBOX);
MEMOBOX. Visible: =true;
end;
readln (f,tmp);
if tmp0 then begin // SPEEDBTN if NOT (Assigned (SPEEDBTN)) then begin
SPEEDBTN: = TSPEEDBUTTON. Create (Form1);
SPEEDBTN. Parent: = Form1;
SPEEDBTN. ONMOUSEDOWN: = COMPONENTMOUSEDOWN;
SPEEDBTN. ONMOUSEMOVE: = COMPONENTMOUSEMOVE;
SPEEDBTN. ONMOUSEUP: = COMPONENTMOUSEUP;
SPEEDBTN. Name: = "SPEEDBUTTON";
end;
SPEEDBTN. Top: =tmp;
readln (f,tmp);
SPEEDBTN. Left: =tmp;
readln (f,tmp);
SPEEDBTN. Height: =tmp;
readln (f,tmp);
SPEEDBTN. Width: =tmp;
// SETPROPERTIES (SPEEDBTN);
SPEEDBTN. Visible: =true;
end;
readln (f,tmp);
if tmp0 then begin // shape if NOT (Assigned (shape)) then begin shape: = TSHAPE. Create (Form1);
shape. Parent: = Form1;
shape. ONMOUSEDOWN: = COMPONENTMOUSEDOWN;
shape. ONMOUSEMOVE: = COMPONENTMOUSEMOVE;
shape. ONMOUSEUP: = COMPONENTMOUSEUP;
shape. Name: = "Shape";
end;
shape. Top: =tmp;
readln (f,tmp);
shape. Left: =tmp;
readln (f,tmp);
shape. Height: =tmp;
readln (f,tmp);
shape. Width: =tmp;
// SETPROPERTIES (shape);
shape. Visible: =true;
end;
readln (f,tmp);
if tmp0 then begin // STATICTEXT if NOT (Assigned (STATICTEXT)) then begin
STATICTEXT: = TSTATICTEXT. Create (Form1);
STATICTEXT. Parent: = Form1;
STATICTEXT. ONMOUSEDOWN: = COMPONENTMOUSEDOWN;
STATICTEXT. ONMOUSEMOVE: = COMPONENTMOUSEMOVE;
STATICTEXT. ONMOUSEUP: = COMPONENTMOUSEUP;
STATICTEXT. Name: = "STATICTEXT";
end;
STATICTEXT. Top: =tmp;
readln (f,tmp);
STATICTEXT. Left: =tmp;
readln (f,tmp);
STATICTEXT. Height: =tmp;
readln (f,tmp);
STATICTEXT. Width: =tmp;
// SETPROPERTIES (STATICTEXT);
STATICTEXT. Visible: =true;
end;
readln (f,tmp);
if tmp0 then begin // STRINGGRID if NOT (Assigned (STRINGGRID)) then begin
STRINGGRID: = TSTRINGGRID. Create (Form1);
STRINGGRID. Parent: = Form1;
STRINGGRID. ONMOUSEDOWN: = COMPONENTMOUSEDOWN;
STRINGGRID. ONMOUSEMOVE: = COMPONENTMOUSEMOVE;
STRINGGRID. ONMOUSEUP: = COMPONENTMOUSEUP;
STRINGGRID. Name: = "STRINGGRID";
end;
STRINGGRID. Top: =tmp;
readln (f,tmp);
STRINGGRID. Left: =tmp;
readln (f,tmp);
STRINGGRID. Height: =tmp;
readln (f,tmp);
STRINGGRID. Width: =tmp;
SETPROPERTIES (STRINGGRID);
STRINGGRID. Visible: =true;
end;
CLOSEFILE (f);
end;
procedure TFORM1. BITBTN5Click (Sender: TOBJECT);
begin
Showmessage (‘Справка по компонентам библиотеки VLC Deflphi 7. Разработал Брик Михаил. Воронеж 2013");
end;
end.
Размещено на
Вы можете ЗАГРУЗИТЬ и ПОВЫСИТЬ уникальность своей работы