СообЧа > База Знаний > Программирование > C, С++ > Borland C++ Builder

Вопрос

А как загнать программу в трей?

Ответ

#define WM_TRAYNOTIFY (WM_APP+100) NOTIFYICONDATA nid;
заполняешь nid и вызываешь ZeroMemory(&nid,sizeof(NOTIFYICONDATA));
nid.cbSize=sizeof(NOTIFYICONDATA);
nid.hWnd=hWnd; nid.uCallbackMessage=WM_TRAYNOTIFY;
nid.uFlags|=NIF_MESSAGE;
nid.hIcon=LoadIcon(GetModuleHandle(0),(LPCTSTR)lpIconName);
nid.uFlags|=NIF_ICON;
lstrcpyn(nid.szTip,lpcszToolTip,(lLen<64)? lLen:63);
nid.szTip[64]=0;
nid.uFlags|=NIF_TIP;
Shell_NotifyIcon(NIM_ADD,&nid));
на выходе из проги Shell_NotifyIcon(NIM_DELETE,&nid));
LRESULT CALLBACK WndProcMainDialog(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{ switch (message)
{ … case WM_TRAYNOTIFY: switch (LOWORD(lParam))
{ case WM_LBUTTONDOWN: WINDOWPLACEMENT wndpl;
wndpl.length=sizeof(WINDOWPLACEMENT);
GetWindowPlacement(hWnd,&wndpl);
if (wndpl.showCmd==SW_HIDE
|| wndpl.showCmd==SW_MINIMIZE
|| wndpl.showCmd==SW_SHOWMINIMIZED)
{ ShowWindow(hWnd,SW_SHOW);
ShowWindow(hWnd,SW_SHOWNORMAL);
}else{
ShowWindow(hWnd,SW_MINIMIZE);
} PostMessage(hWnd,WM_NULL,0,0);
break; case WM_RBUTTONDOWN: //POINT Point;
SetForegroundWindow(hWnd);
//GetCursorPos(&Point);
//TrackPopupMenu(hMenu, TPM_RIGHTBUTTON, Point.x,Point.y,0,hWnd, NULL);
PostMessage(hWnd,WM_NULL,0,0);
break;
} break;
… } return 0; }


Это все выдернуто из проекта, поэтому потребуется небольшая переделка, а вообще лучше это оформить классом, очень удобно.

Из конференции Expert_FAQ

в C++Builder 6 есть компенет «TrayIcon» в закладке «Simple»

1989mka

Вопрос

Откуда можно скачать хороший учебник по Borland C++ Builder? Или пару конкретных хороших ссылок по программированию БД в Билдэре. Желательно по локальным БД.

Ответ

Можете зайти на сайт Архангельского
www.builder.com , автора многих хороших книг по Builder, можете найти отличную большую книгу «Программирование в BuilderC++".

Очень много книг и полезных статей на
www.rusdoc.ru и www.infocity.com.ua Также много чего на inprise.narod.ru
www.greeb.spb.ru
http://www.pingwin.ru/
www.halyava.ru
www.richplum.co.uk
cbuilder.da.ru
www.boom.newmail.ru
bubble.pdc.ru
www.bcb.dax.ru
www.torry.net

shadow

www.hrenozol.boom.ru

Вопрос

Подскажите, пожалуйста, где можно скачать русский help для C++ Builder?

Ответ

Все, на самом деле, элементарно просто!

Заходишь в «Яндекс» и пишешь «справка по С++ Builder» Первая же(!) найденная ссылка ведет на любопытный сайт:
http://delphiplus.nagano.ru/docscbuilder.html (привожу его адрес, поскольку там ссылки не только на справку)

Ссылка на русскоязычный файл справки вот:
http:/http://delphiplus.nagano.ru/downloads/doc/cb/cb4_help.zip Также можно найти русскую справку здесь:
http://delci.h1.ru/help.htm, а здесь
http://www.download.ru/russian/sp/8742.htm есть «условно-бесплатная» (стоит 100руб). Однако не знаю, стоит ли, когда есть полностью бесплатные версии.

Из конференции Expert_FAQ

Вопрос

Надо сравнить два Вордовских документа на идентичность (пробелы, шрифты и т.д.). Как это можно сделать, с помощью каких компонентов?

Ответ

Для решения этой задачи, можно:

  1. Воспользоваться теми возможностями, которые предоставляет сервер автоматизации Microsoft Word. C помощью приложения, разработанного в BСВ, через использование компонентов с закладки Servers (программа будет выступать в качестве клиента автоматизации), можно 2 раза динамически создать новый документ и поместить в него тексты, которые нужно сверять. Для полноценного использования OLE-автоматизации надо знать как можно больше о возможностях и интерфейсах того приложения, функциональностью которого вы решили воспользоваться. Кроме того, для корректного выполнения всех функций разрабатываемого приложения необходимо, чтобы на компьютере было установлено соответствующее приложение, т.е. Microsoft Word.
  2. На форму поместить 2 RichEdit'a в которые загнать .rtf — документы и построчно сравнивать.
  3. Применить программу Araxis Merge (правда, она показывает не буквы, а их коды для документов Word, но пробелы и т.п. — без проблем).


shadow

Вопрос

У меня есть БД, в ней определенные фирмы, можно ли как-то сделать, чтоб велась автоматическая рассылка по выбранным e-mail (по фирмам) с определенным сообщением.

Ответ

Выбираешь пункт Help\C++Builder Help\Index и вводишь «MailMessage». Там есть example (но с edit'ами) — думаю, разберешься.
Для того, чтобы выбрать твои фирмы из БД — либо формируешь SQL-запрос,либо делаешь для них постоянную отдельную таблицу с колонками "Фирма"Сообщение" и берешь все оттуда.

shadow

Вопрос

Подскажите пожалуйста, как в Buildere 5 работать с ini файлами? Например у меня имеется доступ к MySQL базе и для каждого юзера есть свои права. Нужно, чтобы программа сохраняла настройки пользователя в ini файле и что бы каждый раз заново не заполнять поля и не выполнять подключение к базе.

Ответ

Это очень просто, подключаете #include <inifiles.hpp> и пользуетесь методами класса TIniFile.

Например:

TIniFile *pif;
pif = new TIniFile(put+"user.ini");
Top=pif->ReadInteger("SETUP","Top",10);
pif->WriteString("SETUP","Font",SGrid1->Font->Name);
delete pif;

В хелпе все описано элементарно.

Из конференции Expert_FAQ

Вопрос

В ВСВ 6 нужно в компоненте Edit ввести число типа double. Обрабатывается так:

double a=Edit->Text.ToDouble();

При запуске приложения в окошке Edit вводится целое число(к примеру 18) — все в порядке, ошибок нет, а если ввести число с запятой (например 5.1248), то вываливается в отладчик с сообщением: 5.1248 is not a valid floating point value. Подскажите, пожалуйста, где и что я делаю не так? Основная цель — считать несколько цифр, подставить их в формулу и вывести результат. А может мне вообще другим компонентом воспользоваться?

Ответ

Попробуй вместо точки ввести запятую. если не вылетит — значит дефолтовый разделитель в твоей системе запятая. Тогда тебе надо будет делать так — определяешь дефолтовый десятичный разделитель

char DecimalDefault = ""; char Buffer[2] = {0}; if (GetLocaleInfo(GetThreadLocale(), LOCALE_SDECIMAL, Buffer, 2) > 0) DecimalDefault = Buffer[0]; else DecimalDefault = ".";

далее — смотришь, есть ли в строчке из Edit->Text символы '.' или ',' и если они есть, то заменяешь из на DecimalDefault потом конвертишь все с помощью функции FloatToStr

Из конференции Expert_FAQ

Вопрос

Как запихнуть avi-шку для компонента Animate в exe-шник?

Ответ

сперва надо вставить в ресурсы ехешника эту авишку какой-нить программой, например, Restorator-ом

Потом, у TAnimate есть свойство ResHandle, ему нужно будет присвоить значение, возвращаемое после вызова FindResource(NULL, «имя_ресурса», 0);

Из конференции Expert_FAQ

Вопрос

Необходимо использовать в своей программе регулярные выражения. Как?

Ответ

В дискуссии www.linux.org.ru были названы следующие линки:
библиотека PCRE — www.pcre.org объектная оболочка к ней — ftp://ftp.daemon.de/scip/apps/pcre++/ поддерживает диалект POSIX Regexp — www.boost.org bazar.conectiva.com.br download.sourceforge.net www.geocities.com

Из конференции Expert_FAQ

Вопрос

Как сделать, чтобы при минимизации второй формы (в то время, как главная форма скрыта) минимизировалось все приложение. А то в том случае, когда нажимаешь кнопку «свернуть» на второй форме, она становится маленьким прямоугольником и показывается над панелью задач.

Ответ

в Form2.onMinimize:

Aplication.Minimize.

Из конференции Expert_FAQ

Вопрос

Использую C++Builder 6.0 под Windows 2000. Нужно в программе определять сколько пикселов приходится на 1 мм экрана по горизонтали и по вертикали. С помощью каких функций это можно сделать?

Ответ

Это называется aspect ratio. В частности, с этим коэффициентом должны сжиматься круги (в эллипсы), чтобы продолжать выглядть кругами.
Я _не_ знаю, какие функции для этого есть в BCB и W2k, но могу посоветовать следующее:
все современные компьютерные мониторы (да и большинство телевизоров) имеют соотношение сторон 4:3 (кстати, я замерял площадь экрана у 17-дюймового ЭЛТ-монитора, получилось 32 на 24 см, для ЖКД соотношение тоже сохраняло свою силу). В принципе, сейчас уже есть не только телевизоры для домашних кинотеатров с соотношением 16:9, но и дисплеи, но пока это экзотика. Так вот, зная текущее разрешение экрана, можно вычислить aspect ratio с учJтом соотношения 4:3. Например, для разрешения 1024x768 ratio будет 1:1, а для 1280x1024 ratio равен 5:4.

Впрочем, если тебе нужен именно физический размер пикселя, то, скорее всего, нигде этой информации не найдJшь — даже если в винде где-то и доступна информация о диагонали и соотношении сторон монитора, то ведь там не учитываются, например, поля (которые существенно влияют на размер видимой области). Например, для 17-дюймовой ЭЛТ номинальные размеры должны быть 34.5 на 25.9 см, а не 32 на 24 см. У ЖКД тоже возможны небольшие вариации…

Из конференции Expert_FAQ

Вопрос

Как перевести данные из Excel и Acces в БД Builder?

Ответ

Самый простой и быстрый способ это сделать — воспользоваться BDE администратором и подключить базы так же, как и стандартную по умолчанию для Билдера базу Paradox'а (.dbf), только выбрав для каждой свой драйвер (Excell — .xls; Access — .mdb). Можно воспользоваться ODBC. Принципы работы с базой данных то этого не меняются.

KOnST

Вопрос

Друг собирается писать програмку. Посылаешь на сервер номер, а он присылает определенный документ. Монимаю, что это минимум информации, но посоветуйте что-нибудь. В крадце какую-нибцдь функцию нужную опишите, или особенность алгоритма.

Ответ

Для передачи файла я рекомендую TransmitFile, она оптимизированна для обеспечения наивысшей скорости передачи. Из особенностей алгоритма:

1. Нужно устанавливать соединенние, во всяком случае для передачи.

2. Проверять длинну входного буфера, а буфер выделять динамически.

Вообще то что пишет твой друг очень похоже на веб сервер, там тоже в ответ на запрос отправляется файл, только в качестве входного параметра там имя файла (зачастую) и параметры. Надо предусмотреть возможность проверки подлинности, чтобы документы не попали в чужие руки.

Если в планах чтобы прога могла обрабатывать несколько клиентских запросов одновременно, то самый лучший вариант это использование портов завершения ввода-вывода (CreateIoCompletionPort только для НТ) или многопоточность, или можно использовать асинхронные сообщения на окно (WSAAsyncSelect).

Короче особенностей много, ИМХО проще и маштабируемее будет использовать вместо номеров имена файлов или вообще использовать веб сервер.

Из конференции Expert_FAQ

Вопрос

Я слышал, что программы написанные на си++, не используют никакие библиотеки и работают просто одним экзешником. Но когда я запускаю свою программу на компе, где нет Билдера, выдается такая ошибка.

Ответ

Есть опция «Run time libraries» (Build with runtime packages). Ее нужно отключить. Делается это в меню Component\install Packages.

******

Этот ответ не совсем полный. Полный ответ в картинках смотри на
http://kos-f1.front.ru

sag

Вопрос

Нужно сделать прогу для массовой отправки почтовых сообщений подписчикам. Как реализовать такое, с помощью каких компонентов?

Ответ

Начиная с 5-ой версии BCB, есть такой компонент как SMTP (Simple Mail Transfer Protocol).
Там все просто — задаешь адрес сервера, от кого, кому и вперед… Далее см. хелп

Eugene

Вопрос

Как сделать конечный продукт (программу) с помощью InstallShield Express for Builder5, или без него? Потому как программ — если нет Buildera — не работает.

Ответ

Ну, начнем…

  1. Запускаем InstallShield
  2. Может появиться, а может и не появиться окошко с вопросом о том, что будем делать: редактировать старый проект установки либо создавать новый (точно не помню, т.к. после 1-го появления я его отключил).В данном случае, я так понимаю, нужно создать новый. Если окошка нет — делаем File\New.
  3. Появляется окно New Project, в котором надо выбрать директорию для создаваемого проекта установки и дать название этому проекту. Сделали — жмем Enter.
  4. Имеем перед собой Setup Checklist,на котором много кнопок с треугольничками. Будем их нажимать. И начнем с самой верхней — Application Information. Видим окно Set the Visual Design с 3-мя закладками.
  5. App Info — на ней поле Application Name — уже заполнено тем названием, что мы дали нашему проекту в самом начале. Поле Application Executable ждет нас — давим кнопку Browse и показываем, где лежит ехе-файл программы, которую мы хотим инсталлировать. Поля Version & Company — заполняются по желанию. Поле Default Destination Directory — здесь пишем, куда будет инсталлироваться наша программа. По умолчанию — в каталог ProgramFiles.
  6. Закладка Main Window — что и где будет отображаться на экране при инсталляции (по умолчанию — текст — название проекта; если рисунок — откуда брать), логотип — можно не ставить, позиция текста (рисунка), цвет фона.
  7. Закладка Features — подключать или нет авто-деинсталлятор. Прошли эти 3 закладки — ОК — на Setup Checklist должны появиться красные птички напротив кнопок, одноименных закладкам.
  8. Далее — Specify InstallSheldObjects…
  9. Нажмем General Options. Снова видим окно с закладками. Здесь выбираем, какие дополнительные компоненты подключать в инсталл. пакет. (в зависимости от того, что у нас делает программа). Я думаю, что Standard VCL Packages не помешает в любом случае.
  10. Если что-то было выбрано на предыдущей закладке, то Advanced покажет, где оно лежит и куда поместится после инсталляции. Выбрали — снова ОК — снова птички.
  11. Следующее действие — Specify Components — 3 закладки
  12. Groups and Files — можем посмотреть, какие файлы мы выбрали, где они находятся и добавить новую(ые) группу(ы) с новыми файлами в этот проект по нашему хотению.
  13. Components — добавляем (если нужно) — папку, где будут лежать еще какие-либо нужные нам компоненты.
  14. Setup Types — показывает, какие компоненты входят в наш пакет для Complet Setup — ОК
  15. Select Dialog Boxes — выбираем в Settings For — что будет появляться на экране при инсталляции (Readme, лицензия и т.д.). Для некоторых выбираемых вещей есть настройки (т.е. откуда их берем). Если у нас несколько групп и компонентов, можно предусмотреть возможность выбора Typical-Compact-Custom инсталляции (тогда можно будет указать, для какого типа инсталляции какие компоненты и файлы). — ОК)
  16. Make Registry Changes — если работаем с реестром, то с какими ключами(Keys) и данными(Values), добавляем новые или модифицируем старые. — ОК
  17. Specify Folders and Icons — откуда запускать будем программу(ехе-файл) после инсталляции, назначим горячие клавиши для быстрого запуска, иконку и т.п. — ОК
  18. Run Disk Builder — наконец-то делаем инсталляционные диски. Иногда не получается из-за того, что пропустили или неправильно выполнили какое-то из вышеописанных действий — тогда надо внимательно себя перепроверить, пройдясь по пунктам создания инсталляции.
  19. Test Run — проводит тестовую инсталляцию на наш компьютер, после которой можно проверить, все ли прописалось там, где нужно и с теми ли параметрами.
  20. Copy to Floppy — записываем нашу инсталляшку на диски.


shadow

Вопрос

BCB-6

Есть форма, две кнопки (Start and Exit) и метка, которая показывает кол-во нажатий на кнопку Start. Все хорошо. Но я пытаюсь сделать, чтобы кол-во не обнулялось после перезапуска программы, а ума не хватает. Помогите пожалуйста.

Ответ

Я предложил использовать статические переменные — есть такой тип данных в языке С — static — они хранят свое значение в коде программы, таким образом не обнуляясь от запуска к запуску.

Из конференции Expert_FAQ

Ответ не верен! Значения хранятся не а коде программы, а в ПАМЯТИ. static — переменная, это переменная, которая одна на все экземпляры объекта (функции, класса). Так можно узнать, сколько раз создавались экземпляры класса, сколько раз вызвана функция, но НЕ СКОЛЬКО РАЗ _ЗАПУСКАЛАСЬ_ ПРОГРАММА! Для этого используйте реестр, ini-файлы и т.п.

pavel_kikoz

Вопрос

Каким образом можно статически связать библиотечные функции и exe-файл под Builder C++ 5. Если отключить в опциях Linker'а динамическое связывание с dll-библиотеками, то все равно на компьютере, где не установлен Билдер, программа будет запрашивать библиотеку vcl50.bpl Как можно этого избежать ?

Ответ

Если exe-файл получается небольшой, возможно вы используете пакеты, поэтому и требуются библиотеки. Надо просто отключить пакетный режим сборки, при этом размер exe вырастет раз в 5, но он будет автономен.

1. Открыть проект File->Open Project …

2. Открыть свойства проекта Project -> Options …

3. Выбрать закладку Packages

4. Убрать галочку с Build with runtime packages

5. Нажать кнопку ОК

Из конференции Expert_FAQ

Вопрос

1. Какая текущая (т.е. последняя) версия C++ Builder?
2. Скоро ли будет следующая или можно смело покупать текущую?
3. В текущая версия поддерживает .NET или это будет только в следующей версии?

Ответ

Последняя версия BCB — 6.0

Следующая будет через несколько месяцев, но по моему лучше брать 6.0, т.к. в седьмой версии ничего хорошего не ожидается (ты видел как оги над делфями извратились?)

Текущая версия держит .NET — архитектуру

Из конференции Expert_FAQ

Вопрос

Какими средствами Builder создать базу данных в сети, и каков принцип ее размещения на компах можно считать оптимальным, я имею ввиду вот что: допустим, на одном компе наша БД, к ней должен быть доступ, т.е данные пересылаются другому компу (вызывающему) и он их редактирует, а затем пересылает обратно, или он смотрит данные прямо на главном компе и там то, что надо, изменяет, дополняет и т.д.

Ответ

Создавать БД для сети можно, используя SQL Explorer, SQL Monitor, закладки в Builder'е — DataAccess, DataControls, InterBase, internet. Что касается принципов размещения — однозначного ответа дать нельзя. Здесь нужно учитывать и мощность компьютеров — сервера и пользователей, пропускную способность сети, тип и название используемой БД и т.д. и т.п.
Почитай специальную литературу, посети сайты для работающих на Builder'е.

shadow

Вопрос

Прошу великодушно простить, подскажите пожалуйста литературу в инете для начала изучения ВСВ и С++ Для человека, который не имеет даже елементарных знаний в программировании

Ответ

http://borland.xportal.ru/
http://www.firststeps.ru/
http://bcdev.narod.ru/


Из конференции Expert_FAQ

Вопрос

Я в Борланд СИ++ 3.0 замутил с помошью delay() и sound() будилку, но у нее есть глюк: цикл в ней останавливается по нажатию любой клавиши, а если просто закрыть окно в Виндоус, то писк останется, пока не перезагрузишь комп. В чем суть?

Ответ

Посмотри исходники RTL BC++ файлы delay.cas и sound.cas. Функции delay() и sound() работают с системным таймером 8253/8254. sound() программирует 2-й канал таймера и разрешает выход на speaker (порт 61h). nosound() отключает работу 2-го канала и выход его на speaker: outportb(0x61, inportb(0x61) & 0xfc); Когда закрываешь окно в Windows до вызова nosound(), таймер продолжает работать, и комп продолжает пищать. Глуши его nosound().

Подробно и доходчиво работа с микросхемой таймера описана здесь: http://www.lcard.ru:8105/~nail/frolov/bsp/v02/ch5.htm
если не хватит, то:
http://www.ya.ru/yandsearch?text=port+43h+61h

Sudbin

Вопрос

В главной форме есть меню NEW, типа как в Worde, при нажатии на которое появляется дочернее окно, еще раз нажмете — появится еще одно, получается это таким путем:
TForm2 *F=new TForm2(this);
но когда я хочу закрывать эти окна, они просто свертываются, но не закрываются. В чем дело, подскажите.

Ответ

Фишка в том, что в MDI приложениях Билдер по умолчанию не закрывает дочернюю форму, а сворачивает ее. Борются с этим так:
__fastcall TChildForm::OnClose(TObject* Sender, TCloseAction &Action)
{

Action=caFree; //(по умолчанию caMinimize, фиг знает зачем)

}

Вот и все, теперь дочерние окна закрываются.

7UP

Вопрос

Почему мои проги не работают на других компах? Пишут типа библиотеки не хватает?

Ответ

Типа потому что не хватает. Сделай так:

пункт меню Project|Options
закладка Packages
снимаешь галку Build with runtime packages
+ поставляешь со своей программой
borlndmm.dll
cc3250mt.dll

(поищи на своем компутере, должны быть по пути

"D:\Program Files\Borland\CBuilder5\Bin\" или куда ты там Билдер поставил)

Из конференции Expert_FAQ

Вопрос

Есть программа: синхронизация потоков с использованием КРИТИЧЕСКИХ РАЗДЕЛОВ.

Требуется пример программы синхронизации потоков с использованием МЬЮТЕКСОВ.

Ответ

с uinc.ru

Пример. Допустим, в программе используется ресурс, например, файл или буфер в памяти. Функция WriteToBuffer() вызывается из разных потоков. Чтобы избежать коллизий при одновременном обращении к буферу из разных потоков, используем мьютекс. Прежде чем обратиться к буферу, ожидаем <освобождения> мютекса.

HANDLE hMutex;
int main()
{
hMutex = CreateMutex( NULL, FALSE, NULL);
// Создаем мьютекс в свободном состоянии …
// Создание потоков, и т.д. … } BOOL WriteToBuffer()
{
DWORD dwWaitResult;
// Ждем освобождения мьютекса перед тем как обратиться к буферу.
dwWaitResult = WaitForSingleObject( hMutex, 5000L);
// 5 секунд на таймаут љ if (dwWaitResult == WAIT_TIMEOUT)
// Таймаут. Мьютекс за это время не освободился.
{
return FALSE;
} else
// Мьютекс освободился, и наш поток его занял. Можно работать.
{ Write_to_the_buffer(). … ReleaseMutex(hMutex);
// Освобождаем мьютекс.
} return TRUE;
}


Из конференции Expert_FAQ

Вопрос

Что такое CORBA?

Ответ

Common Object Request Broker Architecture.
Упрощенно — с помощью CORBA можно писать многоплатформенные приложения типа клиент-сервер, т.е. которые будут выполняться не только под Win.
Для более полного ответа на этот вопрос запусти ВСВ, нажми Help\C++Builder Help\Index и введи CORBA.

shadow

Вопрос

Что такое алиас, обязательно ли он нужен, нельзя ли без него, если можно то, как?

Ответ

Если ты работаешь с базами данных (БД), то используешь таблицы, в которых хранится информация. Путь к каждой БД можно прописать через BDE. Алиас — псевдоним для конкретной таблицы в некоторой БД. Чтобы при каждом обращении к этой таблице не писать что-то типа
С:\Мои Базы\База1\таблица22.dbf
в BDE прописывается один раз путь и псевдоним — алиас(например Table22).
Без алиасов, конечно, можно работать, но тогда нужно или прописывать полные пути к таблицам, или все таблицы хранить в папке программы,а не в отдельном каталоге, тогда достаточно только указать имя таблицы без пути.

shadow

Без алиаса очень легко обойтись, используя TADOConnection (для подсоединения к базе данных), TADOQuery (для запросов). Предлагается использовать TDataSource. Работа с TADOQuery и TADOConnection аналогична работе с TConnection и TQuery т.к. они «произошли» от одних и тех же предков.

pavel_kikoz



Copyright © 2000-2004 Сообщество Чайников
Контактная информация