Вопрос
А как загнать программу в трей?
Ответ
#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
Вопрос
Надо сравнить два Вордовских документа на идентичность (пробелы, шрифты и т.д.). Как это можно сделать, с помощью каких компонентов?
Ответ
Для решения этой задачи, можно:
- Воспользоваться теми возможностями, которые предоставляет сервер автоматизации Microsoft Word. C помощью приложения, разработанного в BСВ, через использование компонентов с закладки Servers (программа будет выступать в качестве клиента автоматизации), можно 2 раза динамически создать новый документ и поместить в него тексты, которые нужно сверять. Для полноценного использования OLE-автоматизации надо знать как можно больше о возможностях и интерфейсах того приложения, функциональностью которого вы решили воспользоваться. Кроме того, для корректного выполнения всех функций разрабатываемого приложения необходимо, чтобы на компьютере было установлено соответствующее приложение, т.е. Microsoft Word.
- На форму поместить 2 RichEdit'a в которые загнать .rtf — документы и построчно сравнивать.
- Применить программу 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 — не работает.
Ответ
Ну, начнем…
- Запускаем InstallShield
- Может появиться, а может и не появиться окошко с вопросом о том, что будем делать: редактировать старый проект установки либо создавать новый (точно не помню, т.к. после 1-го появления я его отключил).В данном случае, я так понимаю, нужно создать новый. Если окошка нет — делаем File\New.
- Появляется окно New Project, в котором надо выбрать директорию для создаваемого проекта установки и дать название этому проекту. Сделали — жмем Enter.
- Имеем перед собой Setup Checklist,на котором много кнопок с треугольничками. Будем их нажимать. И начнем с самой верхней — Application Information. Видим окно Set the Visual Design с 3-мя закладками.
- App Info — на ней поле Application Name — уже заполнено тем названием, что мы дали нашему проекту в самом начале. Поле Application Executable ждет нас — давим кнопку Browse и показываем, где лежит ехе-файл программы, которую мы хотим инсталлировать. Поля Version & Company — заполняются по желанию. Поле Default Destination Directory — здесь пишем, куда будет инсталлироваться наша программа. По умолчанию — в каталог ProgramFiles.
- Закладка Main Window — что и где будет отображаться на экране при инсталляции (по умолчанию — текст — название проекта; если рисунок — откуда брать), логотип — можно не ставить, позиция текста (рисунка), цвет фона.
- Закладка Features — подключать или нет авто-деинсталлятор. Прошли эти 3 закладки — ОК — на Setup Checklist должны появиться красные птички напротив кнопок, одноименных закладкам.
- Далее — Specify InstallSheldObjects…
- Нажмем General Options. Снова видим окно с закладками. Здесь выбираем, какие дополнительные компоненты подключать в инсталл. пакет. (в зависимости от того, что у нас делает программа). Я думаю, что Standard VCL Packages не помешает в любом случае.
- Если что-то было выбрано на предыдущей закладке, то Advanced покажет, где оно лежит и куда поместится после инсталляции. Выбрали — снова ОК — снова птички.
- Следующее действие — Specify Components — 3 закладки
- Groups and Files — можем посмотреть, какие файлы мы выбрали, где они находятся и добавить новую(ые) группу(ы) с новыми файлами в этот проект по нашему хотению.
- Components — добавляем (если нужно) — папку, где будут лежать еще какие-либо нужные нам компоненты.
- Setup Types — показывает, какие компоненты входят в наш пакет для Complet Setup — ОК
- Select Dialog Boxes — выбираем в Settings For — что будет появляться на экране при инсталляции (Readme, лицензия и т.д.). Для некоторых выбираемых вещей есть настройки (т.е. откуда их берем). Если у нас несколько групп и компонентов, можно предусмотреть возможность выбора Typical-Compact-Custom инсталляции (тогда можно будет указать, для какого типа инсталляции какие компоненты и файлы). — ОК)
- Make Registry Changes — если работаем с реестром, то с какими ключами(Keys) и данными(Values), добавляем новые или модифицируем старые. — ОК
- Specify Folders and Icons — откуда запускать будем программу(ехе-файл) после инсталляции, назначим горячие клавиши для быстрого запуска, иконку и т.п. — ОК
- Run Disk Builder — наконец-то делаем инсталляционные диски. Иногда не получается из-за того, что пропустили или неправильно выполнили какое-то из вышеописанных действий — тогда надо внимательно себя перепроверить, пройдясь по пунктам создания инсталляции.
- Test Run — проводит тестовую инсталляцию на наш компьютер, после которой можно проверить, все ли прописалось там, где нужно и с теми ли параметрами.
- 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 Сообщество Чайников
Контактная информация