|
Программирование >> Перегруженные имена функций и идентификаторы
SysFreeMem( mem ); return Result; Если список классов, которые надо создавать по имени, не очень велик, то можно так: TControl* CreateControlByName(AnsiString ClassName, TComponent *Owner) TMetaClass *c=GetClass(ClassName); if(c==NULL) throw Exception( Unregistered class. ); if(c== classid(TButton)) return new TButton(Owner); if(c== classid(TEdit)) return new TEdit(Owner); return NULL; Почему функция isdigit (да и остальные is*) возвращает некорректные значения для аргумента в виде русской буквы? Напиши #undef isdigit, будет вызываться функция с правильным кастингом. Почему при сборке в CB3 с включенным Build With Runtime Packages все работает, а если отключить, то вылетает с ошибкой, не доходя до Application->Initialize()? В IDE есть глючек, в результате которого порядок .lib в строке LIBRARIES .bpr-файла оказывается неправильным (первым обязательно должен идти vcl35.lib). Из-за этого нарушается порядок инициализации модулей и глобальных VCL-объектов. В результате при запуске программы имеем стабильный Access Violation. Для его устранения необходимо поправить строку ALLLIB .bpr-файла: ALLLIB = vcl35.lib $(LIBFILES) $(LIBRARIES) import32.lib cp32mt.lib Есть функция, которая производит длительные вычисления в цикле. Хотелось бы иметь возможность ее прервать. Естественно, что пока вычисления не выходят из цикла никакие контролы не работают... Вставить в цикл, в котором происходят вычисления, вызов Application->ProcessMessages(); Т.е.: for(..... здесь выполняются вычисления Application->ProcessMessages(); Также вынести вычисления в отдельный thread. Я переписываю BDE-приложение на другой компьютер, а оно отказывается работать. Что делать? 1. Использовать инсталляционный пакет, например InstallShield или Wise. 2. Не использовать его. В этом случае нет универсального решения. Оно будет варьироваться в зависимости от использования BDE в локальном или серверном режиме, для доступа к Paradox- или DBF-таблицам, использования локального SQL, версии BDE, и так далее... Здесь приведен пример для наиболее общего варианта - пятая версия BDE, локальные таблицы, без использования локального SQL, стандартная кодировка ANSI. Нужно добавить следующие файлы из папки BDE к вашему исполняемому модулю: blw32.dll, idapi32.dll, idr20009.dll, idpdx32.dll для Paradox-таблиц или iddbas32.dll для DBF-таблиц, bantam.dll, charset.cvb, usa.btl. Доступ к таблицам надо настроить не через псевдонимы (aliasы), а через пути в файловой системе. В идеале все таблицы храните в папке программы, тогда нужно только указать имя таблицы без пути. Приготовленный таким образом дистрибутив запускается на любой машине без необходимости инсталляции BDE, максимально устойчив и нечувствителен к смене имен папок/переинсталляции системы/порчи реестра/влиянии на другие BDE-приложения. Добавка к основному модулю составляет дя этих семи dll-библиотек ~1030 КБ, после упаковки ~470 КБ. Для того, чтобы установить программу, которая требует BDE, есть несколько базовых путей, в частности: 1. Создать полноценную программу инсталляции с помощью продуктов Install Shield, Wise или подобных. Указанные продукты используются чаще всего и оба позволяют включить в инсталляцию BDE + базовые настройки (алиасы и пути). 2. Для разных целей можно сделать инсталляцию BDE отдельным пакетом (в Insta11 Shie1dе это делается более чем элементарно - в проект не надо добавлять ничего, кроме поддержки BDE). Удобно в процессе написания программы для одного пользователя. Первый раз устанавливаешь и настраиваешь BDE, а затем носишь только новые версии программ. Так же можно при установке Дельфи/Билдеpа с компашки снять флажки отовсюду кроме BDE - в этом случае будет установлена только BDE. 3. Есть возможность инсталлировать BDE ручками. Первый этап - копирование файлов, второй - прописывание реестра. Теперь к вопросу о том, почему установка BDE - это не просто прописать одну опцию в проекте. Дело в том, что BDE - это не просто несколько библиотек динамического доступа (DLL), это - целый engine, достаточно хорошо продуманный для того, чтобы быть и универсальным и расширяемым. Занимает он в запакованном виде две дискеты, а в распакованном (+ файлы, которые включать в поставку не нужно) - более десяти! Естественно, не для всех задач подходит именно BDE (благодаря своим особенностям). Во-первых, возникают проблемы при работе с DBF форматов C1ipper и Fox. Во-вторых, не для всех программ требуются все возможности BDE, а быть они должны как можно меньше. Как из Buildera можно работать с последовательными портами? Существует компонент ZComm (free for persona1 use), поддерживает все порты, все скорости, hard/soft flow control, in/out буферизацию. Передача/прием данных вынесены в отдельную нитку. Еще один вариант: fastcall TComPort::TComPort(TComponent* Owner) : TComponent(Owner) OverlappedStructure.Offset = 0; OverlappedStructure.OffsetHigh = 0; OverlappedStructure.hEvent = 0; iComNumber = 2; iBaudRate = 9600;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |