«ПРОГРАММИРОВАНИЕ В С++ BUILDER Учебное пособие по курсу МЕТОДЫ ПРОГРАММИРОВАНИЯ для студентов специальностей G31 03 01 Математика, G31 03 03 Механика Минск 2007 УДК 004.43(075.8) ББК 32.973.26-018.1я73 Б69 Авторы: В. С. ...»
if (InputQuery("Computer to connect to", "Address Name:", Server)) { void fastcall TForm2::Button2Click(TObject *Sender) { ClientSocket1->Active = false; } void fastcall TForm2::ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket) { if (ClientSocket1->Active == true) if (Socket->Connected == true) Memo1->Lines->Add( AnsiString("(Server) ") +Socket->ReceiveText() ); } void fastcall TForm2::ClientSocket1Write(TObject *Sender, TCustomWinSocket *Socket) { if (ClientSocket1->Active == true) if (Socket->Connected == true) Socket->SendText("This text is passed to"+Memo2->Text); } void fastcall TForm2::Button3Click(TObject *Sender) Close();
1. Какие свойства используются при создании приложения-сервера с использованием компонента TserverSocket?
2. Какие свойства используются при создании приложения-клиента с использованием компонента TclientSocket?
3. С помощью какого метода можно получить данные с сервера по инициативе клиента ?
4. С помощью какого метода клиент может переслать текстовые данные на сервер ?
5. Куда в приложении-клиенте поступают данные, пересылаемые от сервера?
6. Какие методы используются для передачи информации от клиента серверу?
7. С помощью какого метода можно получить данные с сервера по инициативе клиента?
8. Как организовать постоянное отслеживание информации на сервере в приложении-клиенте?
9. Какое событие в приложении-сервере может быть использовано для определения того, что от клиента серверу послана информация?
10. Какие способы установления контакта с сервером Вы знаете?
11. Что нужно сделать, чтобы при запуске приложения-клиента автоматически запускалось и приложение-сервер?
1. Организовать пересылку текстовых сообщений между клиентом и сервером в обоих направлениях с постоянным отслеживанием информации.
2. Реализовать передачу координат курсора мыши между клиентом и сервером в обоих направлениях с постоянным отслеживанием координат.
3. Реализовать простейший “чат”.
4. Реализовать игру в “слова”, например по очереди называть названия городов.
5. Реализовать игру «крестики/нолики» в сети.
6. Реализовать игру «морской бой» в сети.
7. СОЗДАНИЕ СОБСТВЕННЫХ КОМПОНЕНТОВ
Процесс разработки собственного компонента (назовем его TMyComp) состоит из следующих этапов:1. Создание модуля для нового компонента.
2. Наследование производным классом для нового компонента уже существующего базового класса библиотеки VCL.
3. Добавление нужных свойств, событий и методов.
4. Регистрация компонента в среде C++Builder.
5. Отладка.
6. Инсталляция компонента на Палитру компонентов.
7. Сохранение файлов компонента.
Мастер компонентов способен выполнить автоматически создание файлов модуля, наследование компонентного класса, объявление нового конструктора и регистрацию компонента. Разработчик компонента "вручную" или с помощью имеющихся средств добавляет свойства, события, методы и устанавливает компонент на Палитру компонентов.
Рассмотрим подробнее действия, которые выполняются на каждом из перечисленных этапов.
Программный модуль компонента состоит из двух файлов МуСоmр.срр и MyComp.h, которые компилируются в объектный файл MyComp.obj. При paзработке компонента либо создают новый модуль, либо модифицируют существующий. Чтобы создать модуль, необходимо выполнить команду File|New и в открывшемся диалоговом окне New Items выбрать значок Unit. Чтобы добавить компонент к существующему модулю, нужно выполнить команду File|Open и в открывшемся диалоговом окне выбрать файл имя_модуля.cpp для модуля, в который будет добавлен компонент. Далее формируется заготовка файла МуСоmр.h:
#ifndef MyCompH #define MyCompH #include #include #include #include //class TMyComponent : public < базовый компонентный класс > class PACKAGE TMyComponent : public < базовый класс > public:
fastcall TMyComponent(TСomponent *Owner);
#endif Объявление нового класса компонента должно включать макрос PACKAGE. Функционально сходные компоненты группируются в пакеты – динамические библиотечные файлы с расширением.bpl. Как и обычные dll-библиотеки, пакеты содержат код, разделяемый многими приложениями. Пакетная организация ускоряет компиляцию и сборку приложений, позволяет получить более эффективные исполняемые коды за счет того, что к выполняемой программе VCL уже не загружается целиком.
Созданный компонент пока не отличается от своего родителя.
Любой компонент является производным от базового класса TComponent и его наследников (таких как TControl или TGraphicControl) или от существующего компонентного класса.
Простейший способ построить новый компонент – это изменить свойства существующего компонента. Для этого можно использовать любой абстрактный класс VCL, в название которого входит слово Custom. Например, можно создать новый компонент списка со специальными свойствами, которых нет в стандартном классе TListBox. Поскольку нельзя непосредственно модифицировать TListBox, то можно начать с его ближайшего предшественника в иерархии классов. Для этой цели подходит класс TCustomListBox, который реализует все мыслимые свойства производных компонентов списка, однако не выставляет всех их в секции _published. Наследуя компонент, нужно объявить в разделе _published те свойства, которые требуется включить в создаваемый компонент.
Все оконные компоненты являются производными от базового класса TWinControl. Стандартный элемент оконного управления характеризует так называемый "оконный дескриптор" (window handle), который заключен в свойстве Handle. Благодаря дескриптору, Windows идентифицирует данный компонент, в частности, она может принять фокус ввода. Хотя можно создать оригинальный оконный интерфейсный элемент (который не имеет существующих аналогов и никак не связан с ними), используя в качестве базового класса TWinControl, C++Builder предоставляет класс TCustomControl – специализированный оконный элемент управления, который упрощает рисование сложных визуальных изображений. Все компоненты стандартного оконного управления: кнопки, списки, текстовые поля (за исключением компонента TLabel, который никогда не принимает фокус ввода) – являются косвенными производными TWinControl.
В отличие от оконных компонентов, производных от класса TCustomControl, графические компоненты лишены оконного дескриптора и не могут принять фокус ввода. Графические компоненты обеспечивают отображение объектов без использования системных ресурсов.
Новые графические компоненты необходимо наследовать от базового абстрактного класса TGraphicControl (потомка TControl). Класс TGraphicControl предоставляет канву для рисования и обрабатывает сообщения WM_PAINT. Все, что нужно сделать, это переопределить метод рисования Paint в соответствии с заданными требованиями.
Все компоненты имеют общий абстрактный базовый класс TСomponent, однако, только невидимые компоненты можно наследовать непосредственно от класса TComponent. Невидимые компоненты используются в качестве интерфейсных элементов с другими компонентами (доступ к базам данных или диалоговым окнам).
7.3. Добавление свойств, событий и методов Свойства, в отличие от данных-членов, сами не хранят данные, однако методы чтения и записи организуют к ним доступ. Об этом необходимо помнить при создании или изменении компонентных свойств.
Событие – это связь между некоторым воздействием на компонент и кодом обработчика события, который реагирует на это воздействие. Обработчик события пишется прикладным программистом. Используя события, программист может приспособить поведение компонента к своим требованиям без необходимости изменения самих объектов. События, возникающие в результате типичных действий пользователя (например, движений мышью) встроены во все стандартные компоненты VCL, однако вы можете определить новые события. C++Builder реализует события как свойства.
Регистрация компонента – это процесс, который информирует C++Builder о том, какой компонент добавляется к VCL и на какой вкладке Палитры компонентов он должен появиться. Для регистрации компонента выполняются следующие действия:
1) Добавляется функция Register() в файле МуСоmр.срр. При этом функция заключается в пространство имен с именем, совпадающим с именем модуля компонента (при этом первая буква должна быть заглавной, а все остальные – строчными).
2) В теле функции Register объявляется массив типа TComponentClass, в который вводится имя класса регистрируемого компонента.
3) В теле функции Register вызывается функция RegisterComponents с тремя параметрами: названием вкладки Палитры компонентов, массивом компонентных классов и индексом последнего класса в этом массиве.
Например:
namespace Mycomp { void fastcall PACKAGE Register() TComponentClass classes[1] = {_classid(TMyComponent)};
RegisterComponents("Samples", classes, 0);} Листинг представляет включение в файл МуСоmр.срр кода для регистрации компонентf TMyComponent на вкладке Samples Палитры компонентов.
Когда компонента зарегистрирована, можно ее испытать и инсталлировать на Палитру компонентов.
7.5. Отладка неинсталлированного компонента Поведение компонента следует проверить до инсталляции на Палитру компонентов. По существу необходимо смоделировать действия, которые производит C++Builder, когда пользователь перемещает компонент из Палитры компонентов на форму. Процесс требует выполнения следующих шагов:
1) Включить файл модуля MyComp.h компонента в заголовочный файл некоторой формы: #include " MyComp.h " 2) Добавить объектный член данных, представляющий испытываемый компонент, в раздел объявлений public класса формы: TMyComponent *MyComponent1;.
3) Подсоединить обработчик к событию OnCreate формы.
4) Вызвать конструктор компонентного объекта из обработчика этого события, передав ему параметр, указывающий на владельца компонента.
Обычно это указатель this на объект, который содержит компонент (например, форма).
5) Сразу же за вызовом конструктора установить свойство Parent – родителя компонента. Обычно значением этого свойства является указатель this. Если компонент не является элементом управления, т.е. не наследовался от TControl, то этот шаг пропускается.
6) Инициировать значения других свойств компонента.
Ниже приводится листинг модуля формы, используемой для отладки компонента:
// Заголовочный файл TestForm.h #ifndef TestFormH #define TestFormH #include #include #include #include #include "MyComp.h" // class TForm1 : public TForm { published:
private:
public:
TMyComponent * MyComponent1; // fastcall TForm1 (TComponent* Owner); // extern PACKAGE TForm1 *Forml;
#endif // Файл TestForm.cpp модуля формы #include #pragma hdrstop #include "TestForm.h" #pragma package(smart_init) pragma resource "*.dfm" TForm1 *Forml;
fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) MyComponent1 = new TMyComponent(this); // MyComponent1->Parent = this; // MyComponentl->Left = 12; // Для отладки компонента необходимо выполнить компиляцию и запустить тестовое приложение. Если поведение компонента соответствует предъявляемым к ему требованиям, то можно перейти к его установке на Палитру компонентов.
7.6. Инсталляция компонента на Палитру компонентов Чтобы добавить к VCL компонент, необходимо выполнить следующие шаги:
1) С помощью команды Component|Install Component открывается диалоговое окно инсталляции компонент. Можно выбрать вкладку Into New Package, если компонент включается в новый пакет, или вкладку Into existing package, если используется существующий пакет.
2) Вводится имя модуля компонента MyComp.cpp и путь к нему в поле Unit file name. Далее вводится имя нового пакета (совпадающее с названием вкладки Палитры компонентов, на которую устанавливается новый компонент) в поле Package file name, а его краткое описание – в поле Package description. Щелчок на кнопке ОК закрывает диалоговое окно установки. Добавление компонента в существующий пакет выполняется аналогично.
3) С текущим содержимым пакета можно ознакомиться вь открывшемся окне Менеджера пакетов. Все файлы, составляющие рассматриваемый пакет, будут созданы (или перестроены), и новый компонент установлен на ту вкладку Палитры компонентов, которая была задана в качестве одного из параметров функции регистрации Register. C++Builder автоматически включает в проект системные файлы периода выполнения (с расширениями.bpi,.res), необходимые для сборки пакета.
4) Выбирается команда Install в Менеджере пакетов. В результате выполняется компиляция, перестройка VCL и установка нового компонента на Палитру компонентов.
5) Командой Component|Install Packages или Project|Options открывается список установленных пакетов. По щелчку на кнопке Components можно увидеть список всех компонентов, включенных в выбранный пакет. Если нужно, чтобы текущая конфигурация пакетов принималась по умолчанию в каждом новом создаваемом проекте, то необходимо установить флажок Default.
Чтобы удалить компонент из VCL, необходимо выполнить следующие действия:
1) Выполнить команду Component|Install Component, которая открывает диалоговое окно установки компонентов.
2) Найти удаляемый компонентный класс в списке Component classes выбранной группы Библиотеки и нажать кнопку Remove.
3) Нажать кнопку ОК. Библиотека будет перестроена и компонент удален из Палитры компонентов.
Чтобы перестроить Палитру компонентов, необходимо выполнить следующие действия:
1) Открыть диалог установки опций Палитры компонентов с помощью команд Component|Configure Palette или Options|Environment|Palette.
2) Нажать кнопку Add и выбрать имя для новой вкладки. Имя добавленной вкладки появится внизу списка Pages названий вкладок.
3) Перетащить мышью выбранный компонент в списке Components на нужную вкладку списка Pages.
4) Нажать кнопку ОК. Библиотека и Палитра компонентов будут перестроены.
7.7. Сохранение файлов нового компонента После окончания процесса разработки, компонент будет представлен следующими файлами:
объектный файл результата компиляции MyComp.obj;
файлы модуля компонента (MyComp.h, MyComp.cpp);
файлы пакета с именем имя_пакета и расширениями bpl, bpk, lib, bpi, cpp, res;
файл пиктограммы компонента для Палитры компонентов MyComp.dcr;
файл формы MyComp.dfm, если компонент использует форму;
желательно создать и сохранить контекстно-справочный файл MyComp.hlp.
По умолчанию C++Builder сохраняет компонентный пакетный файл с расширением bpl в каталоге \...\ProgramFiles\Borland\CBuilder6\ Projects\Bpl, а библиотечные файлы с расширениями lib и bpi – в каталоге \...\ProgramFiles\Borland\CBuilder6\Projects\Lib. Используя новый компонент в дальнейшем, нельзя забывать проверять вкладку Directories|Conditionals диалогового окна команды Project|Options, где должен быть указан путь к библиотечным каталогам.
8. ПРИМЕР РАЗРАБОТКИ ПРОСТОГО КОМПОНЕНТА
Перед тем, как приступить к разработке компонент, необходимо знать, что он должен делать и как будет реализовано его оригинальное поведение. Рассмотрим пример компонента, моделирующего бинарный индикатор, который меняет цвет при изменении состояния. Некоторое свойство компонента будет хранить его текущее состояние (true – индикатор включен, и false – в противном случае). Мы уже знаем, что желательно выбрать для наследования наиболее близкий в иерархии VCL базовый компонентный класс. Очевидно, что индикатор представляет собой графический компонент семейства TGraphicControl. Поскольку мы разрабатываем простой компонент, пусть он будет иметь форму круга, а не более хитроумный образ. Компонент TShape из вкладки Палитры компонентов Additional выглядит ближайшим родственным компонентом. При внимательном рассмотрении Tshape мы видим, что он имеет больше свойств и событий, чем нам требуется. Все что мы хотим изменить при наследовании от TShape – это форму индикатора и цвет кисти при его переключении. Перейдем к фактической разработке компонента:1. Создание формы тестового приложения Пока мы не убедились, что разрабатываемый компонент работает, его нельзя включать в VCL. Сначала следует создать тестовое приложение для формы с прототипом нового компонента MyComp:
а) С помощью команды File|New Application создайте пустую форму.
б) Разместите кнопку TButton на форме.
в) С помощью команды File|Save All сохраните форму и проект приложения в файлах под именами MyCompForm.cpp и MyCompProj.bpr.
2. Создание модуля компонента Мастер компонентов (Component Wizard) упрощает начальные шаги создания компонента:
а) Выполните команду Component|New и в открывшемся диалоговом окне Мастера компонентов заполните поля диалога указанными на рис.
26 значениями. Нажмите кнопку ОК.
б) С помощью команды File|Save As сохраните файл Unitl.cpp под именем MyComp.cpp.
Файл MyComp.cpp будет содержать пустой конструктор объекта и функцию Register для регистрации компонента. Созданный при этом файл MyComp.h будет содержать объявление нового компонентного класса с конструктором, а также несколько заголовочных файлов предкомпиляции.
3. Члены данных, свойства и методы Прежде всего, в файле MyComp.h опишем булеву переменную состояния индикатора и две переменные перечисляемого типа TColor для хранения цветов, отображающих оба состояния. Члены данных следует поместить в разделе private объявлений класса. Там же расположим прототипы методов записи соответствующих свойств, а сами свойства объявим в разделе _published.
Ниже приводится заголовочный файл модуля компонента:
// MyComp.h -----------------------------------------------------------ifndef MyCompH #define MyCompH #include #include #include #include //--------------------------------------------------------------------------class PACKAGE MyComp : public TShape private:
bool FOnOff;
TColor FOnColor;
TColor FOffColor;
void fastcall SetOnOff(const bool Value) ;
void fastcall SetOnColor(const TColor OnColor);
void fastcall SetOffColor (const TColor OffColor) ;
protected:
public:
fastcall MyComp(TComponent* Owner);
published:
property bool OnOff= { read= FOnOff,write= SetOnOff} ;
property ТСоlог OnColor= { read=FOnColor,write=SetOnColor} ;
property TColor OffColor={ read=FOff Color, write= SetOffColor} ;
//--------------------------------------------------------------------------endif Для добавления в файл MyComp.cpp необходимо написать три функции для присваивания значений свойств соответствующим членам данных и наполнить конструктор компонента инструкциями для инициализации переменных. Ниже приводится листинг файла MyComp.cpp после внесения изменений:
//MyComp.cpp #include #pragma hdrstop #include "MyComp.h" #pragma package(smart_init) //--------------------------------------------------------------------------ValidCtrCheck is used to assure that the components created // do not have any pure virtual functions.
static inline void ValidCtrCheck(MyComp *) void fastcall MyComp::SetOnOff(const bool Value) { FOnOff = Value;
Brush->Color= (FOnOff) ? FOnColor : FOffColor ;
void fastcall MyComp::SetOnColor(const TColor OnColor) { FOnColor = OnColor;
Brush->Color = (FOnOff) ? FOnColor : FOffColor;
void fastcall MyComp::SetOffColor(const TColor OffColor) { FOffColor = OffColor;
Brush->Color = (FOnOff) ? FOnColor : FOffColor;
//--------------------------------------------------------------------------fastcall MyComp::MyComp(TComponent* Owner) { Width = 15; //ширина по умолчанию Height = 15; // высота по умолчанию FOnColor = clLime; // зеленый, когда включен FOffColor = clRed; // красный, когда выключен FOnOff = false; // выключен по умолчанию Shape = stEllipse; //в форме эллипса по умолчанию Pen->Color = clBlack; // черный контур по умолчанию Pen->Width = 2; // ширина контура по умолчанию Brush->Color = FOffColor; // цвет заливки по умолчанию namespace Mycomp void fastcall PACKAGE Register() TComponentClass classes[1] = {classid(MyComp)};
RegisterComponents("Samples", classes, 0);
//--------------------------------------------------------------------------Установленные конструктором значения членов данных по умолчанию появятся в окне Инспектора объектов при создании объекта. Дейстительно, при помещении компоненты на форму конструктор вызывается автоматически. В результате появляется возможность менять значения свойств компонента не только во время выполнения программы, но и на стадии проектирования приложения.
4. Испытание компонента С помощью команды File|Save All сохраните все сделанные добавления.
Выбрав вкладку MyCompForm.cpp в окне Редактора кода включите строку #include "MyComp. h" в заголовочный файл формы. Добавьте описание объекта:
MyComp* MyComp1;
Это можно сделать в разделе public в файле MyCompForm.h.
Активизируйте форму Form1 и в окне Инспектора объектов дважды щелкните мышью в графе значений события OnCreate. С помощью Редактора кода введите обработчик этого события в файл MyCompForm.cpp. Следующий код создаст компонент MyComp динамически (определяя ее родителя Parent и помещая в центре родительской формы) во время выполнения тестового приложения:
voidfastcall TForm1::FormCreate(TObject *Sender) {MyComp1 = new MyComp(this);
MyComp1->Parent = this;
// Центрировать компонент по ширине формы MyCompl->Left = (Width/2)-(MyCompl->Width/2);
// Центрировать компонент по высоте формы MyCompl->Top = (Height/2)-(MyCompl->Height/2);
Чтобы кнопка управляла индикатором, дважды щелкните мышью в графе значений события OnClick объекта Button1 в окне Инспектора объектов. С помощью Редактора кода введите следующую инструкцию в тело обработчика события:
void fastcall TForm1::Button1Click(TObject *Sender) ( MyComp1->OnOff = !MyComp1->OnOff;
Скомпилируйте и запустите тестовое приложение командой Run|Run.
Если компилятор не выдаст ошибок, то в центре формы тестового приложения появится красный индикатор в состоянии "выключен". Нажав кнопку, вы включите индикатор и он окрасится зеленым цветом.
Осталось создать битовый образ пиктограммы, которой новый компонент будет представлена в Палитре компонентов. Из меню редактора изображений, открывающегося по команде Tools|Image Editor, выберите File|New|Resource File, a затем – Resource|New|Bitmap. В диалоге свойств битового образа установите размеры пиктограммы 2424 и число цветов VGA (16 Colors). Переименуйте битовый образ компонента (MyComp) по команде Resourse|Rename и дважды щелкните мышью на выбранном имени в древовидном списке ресурсных файлов, чтобы нарисовать подходящую картинку индикатора (например, зеленый кружок). Командой File|Save As сохраните ресурсный файл MyComp.res в рабочем каталоге и закройте Редактор изображений.
5. Инсталляция компонента Перед тем, как приступить к инсталляции нового компонента на Палитру компонентов, выполните еще раз команду File|Save All.
С помощью команды Component|Install Component откройте диалоговое окно инсталляции компонентов. Нажмите кнопку Add, которая открывает диалоговое окно добавления модуля. Найдите местоположение модуля MyComp.cpp, нажав на кнопку поиска Browse. Нажмите кнопку ОК и ждите окончания перестройки VCL и установки нового компонента на Палитру компонентов.
6. Проверка работы Выполните команду File|Close All, а затем File|New Application. Поместите новый компонент MyComp и кнопку TButton на форму. Снова определите обработчик события OnClick кнопки управления индикатором:
void fastcall TForm1::Button1Click(TObject *Sender) { MyCompl->OnOff = !MyCompl->OnOff;
Выполните команду Run|Run и вы увидите, что компонент действительно работает (рис. 27).
1. Опишите схему разработки собственных компонентов.
2. Как добавить свойства и события в проектируемый компонент ?
3. Как выполнить регистрацию компонента в среде C++Builder ?
4. Как выполняется предварительная отладка созданного компонента ?
5. Как поместить разработанный компонент на Палитру компонентов ?
6. Создайте усовершенствованный ползунок (базовый компонент TTrackBar с вкладки Win32 Палитры компонентов), в котором прорезь ползунка можно изобразить в виде тонкой линии. Добавить свойство, которое позволяет выводить ползунок как в привычной форме, так и с прорезью в виде тонкой линии.
1. Шамис, В.А. Borland C++Builder 6. Для профессионалов/В. А. Шамис.
СПб.:Питер, 2. Архангельский, А.Я. Программирование в C++Builder 6/А. Я. Архангельский.
М.:ЗАО «Издательство БИНОМ», 3. Глушаков, С.В. Программирование в среде Borland C++Builder 6/ С. В. Глушаков, В. Н. Зорянский, С. Н. Хоменко. Харьков:Фолио, 4. Сурков, К.А. Программирование в среде C++Builder/ К. А. Сурков, Д. А. Сурков, А. Н. Вальвачев. Мн.:ООО»Попурри»,
СОДЕРЖАНИЕ
ВВЕДЕНИЕ
1. C++BUILDER И ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ
ПРОГРАММИРОВАНИЕ2. КОМПОНЕНТЫ БИБЛИОТЕКИ VCL
3. СТРОКИ И ПОТОКИ ВВОДА/ВЫВОДА В С++BUILDER
4. ПОДДЕРЖКА ГРАФИКИ И ГРАФИЧЕСКИЕ КОМПОНЕНТЫ
5. РАБОТА С БАЗАМИ ДАННЫХ
7. СОЗДАНИЕ СОБСТВЕННЫХ КОМПОНЕНТОВ
8. ПРИМЕР РАЗРАБОТКИ ПРОСТОГО КОМПОНЕНТА
ПРОГРАММИРОВАНИЕ В С++ BUILDER
по курсу «МЕТОДЫ ПРОГРАММИРОВАНИЯ»G31 03 01 «Математика», G31 03 03 «Механика»
Подписано в печать..2006. Формат 6084/16. Бумага офсетная. Печать офсетная.
Лицензия на осуществление издательской деятельности №02330/0056804 от 02.03.2004.
Издательский центр «Белорусского государственного университета».
Лицензия на осуществление полиграфической деятельности №02330/0056850 от 30.04.2006.