Назад в раздел
FAQ конференций RU.DELPHI, RU.DELPHI.DB и RU.DELPHI.INFO
RuDelphi FAQ
Преамбула
$Id: ru.delphi.f.a.q.tei,v 1.21 1999/11/10 22:43:27 alexm Exp alexm $
(pearl trap)
Этот F. A. Q. -- список ответов на вопросы, наиболее часто задаваемые
в эхо-конференциях RU.DELPHI, RU.DELPHI.DB и RU.DELPHI.INFO.
Copyright (C) Alexey Mahotkin 1997-1999
Ответы на вопросы Copyright (C) авторы ответов
Пожалуйста, воздержитесь от задавания вопросов в этой иерархии, до
того, как прочтете этот документ, правила иерархии, ознакомитесь со
списком рекомендованной литературы и проведете самостоятельные
исследования вопроса. Это поможет всем нам сохранить на должном
высоком уровне соотношение полезной и бесполезной информации.
Правилами иерархии, в частности, регламентируется содержание поля
Subject: ваших писем. Дело в том, что довольно большое количество
"потенциально полезных вам индивидуумов" читают эхи методом "по
сабджектам", сознательно не тратя время на письма под заголовком
"Help!", "Проблема" или "Вопрос чайника". В данном случае
использование комбинации клавиш Shift-1 лишь усугубляет ваше
положение. Подумайте об этом.
Здесь не приветствуется:
* обсуждение вопросов, относящихся к базам данных, в RU.DELPHI, для
этого специально существует RU.DELPHI.DB. К сожалению, мотивация
типа "мой аплинк/провайдер не получает эту эху/ньюсгруппу" в
данном случае не принимается, потому что за продолжительное время,
прошедшее с момента создания RU.DELPHI.DB, следовало бы подумать в
первую очередь о себе и создать для себя необходимое количество
каналов поступления информации.
* обсуждение вашей совершенно новой и безумно свежей идеи о том, что
эху пора разделить на две/три/больше частей, потому что читать ее
нет никаких сил. Вы даже не в первой сотне придумавших и успешно
высказавших сие. От себя могу посоветовать пользоваться хорошими
программами для чтения эхо-конференций.
* обсуждение тем, не связанных с собственно Delphi: алгоритмы, общие
вопросы программирования под Win32, общие организационные вопросы,
связанные с разработкой программного обеспечения, etc.
* общая неспособность получать информацию из окружающей реальности.
Прочтите книгу об эффективной коммуникации и должном отношении ко
всему.
_________________________________________________________________
Доступность этого F.A.Q.
Этот документ регулярно изменяется в результате отслеживания
происходящего в RU.DELPHI.*. Вы можете поучаствовать в составлении
документа, прислав по адресу [1]mailto:alexm(at)hsys.msk.ru"
сформулированный вариант вопроса, ответ или дополнение или исправление
к ответу. Довольно важным критерием отбора ответов является размер. Я
не хочу публиковать большие куски кода, предпочитая давать указание на
источник дополнительной информации или направление самостоятельных
разработок. В любом случае, вы можете обратиться к авторам
сопутствующих проектов, список которых приведен ниже.
Разрешается свободное распространение и использование этого документа
при соблюдении определенной вежливости по отношению к автору и
читателям, основной составляющей чего является соблюдение целостности
документа. Hе очень приветствуется выкладывание копий этого документа
на WWW: подумайте, нужны ли вам непрерывные усилия по синхронизации?
Если же вы вынуждены использовать этот документ на сайте, для того,
чтобы создать его содержимое, подумайте, нужен ли вообще ваш сайт?
Свежая версия этого документа находится на домашней странице автора
[2]http://alexm.here.ru. Остерегайтесь подделок.
Сопутствующие проекты: ссылки на все известные человечеству документы,
подобные этому, включая сам этот документ, находятся на
[3]http://delphi.da.ru.
_________________________________________________________________
Контрибуторы
Список людей, внесших свой вклад в создание этого F.A.Q., в
алфавитно-случайном порядке: Akzhan Abdulin (2:5040/55), Alexey Tomin
(alex(at)soniir.smr.ru), Anthony Buntyakov (antosha(at)metcombank.ru),
Arthur Aseev (2:5030/465.2), Andrey Grigoriev (2:5061/24.20), Alex
Konshin (2:5030/217), Alexander Lokshin (2:5020/529), Alexander
Petrosyan (2:5020/468.8), Alex Petin (2:5000/97.8), Alexey
Solodovnikov (2:5030/257.15), Andrey Ruckoy (2:5047/7), Andrey
Sarinkov (2:5040/33.121), Alexey Sinutin (2:5022/12.16), Andrew Verigo
(2:452/23.32), Alexey Yashin (2:5020/62.31), Boris Loboda (2:461/256),
Boris Podchezertseff (2:5020/656.20), Dmitry Kryloff (2:5054/9.20),
Dmitry Shikhman (2:468/13.32), Edward Shigapov (2:5051/22.8), Eugene
Kopko (2:464/196), Evgeny Levashoff (2:5022/31.7), Eugene Mayevski
(2:463/209), Eugeny Sverchkov (2:5031/12.23), Ilya Andreev
(2:5030/55.28), Ivan Gudym (2:4642/2213.9), Igor Slusarev
(2:5020/118.18), Juris Bekins (2:5100/35), Max Vystropov
(2:5020/1412), Oleg Belousov (oberon(at)nvart.ru), Pavel Shklovsky
(2:5011/18), Roman Procopovich (2:5030/254.201), Roman Rechmakov
(2:5020/952.26), Stanislav Babin (2:5030/356.7), Serge Korolev
(2:5020/104), Sergey Mazunov (2:5083/30.20), Sergey Maznichenko
(2:5061/26.45), Sergey Okhapkin (ex-2:5020/47), Serg Vostrikov
(2:5053/15.3), Sergey Arkhipov (2:5054/88.10), Sergey Belov
(sbelov(at)aha.ru), Victor Babkin (2:463/279.6), Vlad Sharnin
(vlad(at)nplks.rb.ru), Victor Ishikeev (ivi(at)ufanet.ru), Vladimir
Vornichescu (2:469/101.24), vsbelashov(at)obs.omsk.ru.
Если по какой-то причине вас нет в этом списке, тогда как вы считаете,
что должны там находиться, прошу извинить и уведомить об этом
прискорбном факте. Я также позволил себе не сопоставлять некоторые
ответы с именами авторов этих ответов. Если вас не устраивает такая
ситуация -- напишите об этом.
_________________________________________________________________
Источники информации
Прежде всего, конечно же, книги. Как бы это странно ни звучало, но
зайдите в книжный магазин и купите себе там какую-нибудь книгу, даже
если она уже у вас есть. Следует сразу предупредить, что специфика
современного российского книгоиздания такова, что существует довольно
большое количество книг, не стоящих своих денег. Вероятно, вам следует
положиться на собственное чутье и тщательно изучить предлагаемую
продукцию.
Список литературы на все интересующие темы, рекомендованный к
прочтению, находится в неофициальном F.A.Q. эхоконференции
RU.BOOKS.COMPUTING. Свежие версии этого F.A.Q. регулярно публикуются в
соответствующей эхоконференции, а также доступны на домашней странице
автора.
Учтите, что кроме книг по Delphi вас могут интересовать также издания,
посвященные программированию под Windows и проектированию баз данных.
Delphi, в сущности, является обычным компилятором для Windows, и
довольно большое количество вопросов, которые у вас возникнут, будут
не столь уж сильно ориентированы именно на Delphi.
Само собой, хотелось бы увидеть у активного участника конференции
определенные знания языка программирования Object Pascal, являющегося
основой Delphi, а также знаний в области программирования вообще,
программирования под Windows в частности, а также предметной области
своей собственной задачи. Без всякого сомнения, вы можете общаться и
задавать вопросы на любом уровне, но ожидайте соответствующей реакции
извне.
Hаучитесь также пользоваться системой помощи, поставляемой вместе с
Delphi. Как это ни прискорбно, весьма ощутимый процент задаваемых в
эхе вопросов легко снимается нажатием кнопки F1 и поиском примерного
перевода вопроса на английский язык. Примером тому может являться
сакраментальный вопрос о получении короткого имени файла из длинного и
ответ: GetShortPathName. Да, скорее всего вам придется восполнить свои
пробелы в школьном образовании и изучить некоторое подмножество
английского языка, без коего вы имеете не столь много шансов успешно
функционировать в выбранной области.
Учтите наличие в поставке Delphi большого количества разнообразных
примеров. Возможно, ознакомившись с ними, вы приобретете
дополнительные знания. Изучите исходные тексты Visual Component
Library, поставляемой вместе с Delphi Professional и Delphi
Client/Server, а также хорошие образцы кодирования и проектирования,
например, исходники rxLib.
Возможно, вам следует приобрести тем или иным способом ту часть
Microsoft Developer Network (MSDN), что содержит в себе документацию.
Это диски с названиями "Platform SDK", "Additional SDKs and Tools" и
"DDKs". В них содержится более свежая, более полная и обширная
информация по всем аспектам программирования под Windows. Подписка на
эту часть MSDN (это первый уровень) стоит не столь дорого и вы имеете
все шансы купить ее, например, для своей организации. Более того, на
[4]http://msdn.microsoft.com можно получить доступ к львиной доле
документации из MSDN.
Множество качественной информации, относящейся к программированию под
Windows 95/NT, можно получить на [5]http://www.sysinternals.com. Hа
[6]http://www.iarchitect.com находится большой ресурс, посвященный
вопросам построения пользовательского интерфейса.
Если вам требуется работать с нестандартным железом, подумайте о
написании драйвера. Это удобнее, проще и гибче. Соответствующая
информация находится в DDK (Device Driver Development Kit). Самая
известная фирма, занимающаяся поддержкой писателей драйверов -- Vireo.
[7]http://www.vireo.com. Отдельно стоит упомянуть, что если вы всего
лишь желаете работать с последовательными портами, то вам следует
приобрести библиотеку Async Professional фирмы Turbo Power. Hа
[8]http://www.entechtaiwan.com/tools.htm лежат TVicHW32 и TVicPort. Hа
[9]http://www.bluewatersystems.com есть WinRT, а у все той же Vireo
Software: Driver::Agent. Это все попытки избавить пользователя от
написания драйверов.
Традиционно обитатели RU.DELPHI питают заслуженную любовь и уважение к
библиотеке rxLib. Это большая библиотека компонент для Delphi всех
версий и C++Builder, распространяемая по системе freeware с полными
исходными текстами и файлами помощи на русском языке. Выяснено, что
эта библиотека способна покрыть очень большое количество запросов
программистов на Delphi самого разного уровня, и в частности, именно
на нее будут даваться обильные ссылки далее по тексту. Дополнительную
информацию вы можете получить по адресу [10]http://www.rxlib.com.
По возможности фидошные обитатели RU.DELPHI помещают интересные файлы
в так называемые файлэхи. Официальной файлэхой RU.DELPHI является
WDEVDELPHI. Ценным ресурсом являются файлэхи группы FED* (модератор --
Акжан Абдулин, 2:5040/55). Если вы читаете RU.DELPHI из Фидо, то
подпишитесь на эти файлэхи и научитесь пользоваться файловыми
запросами (FReq'ами), так как многие узлы хранят файлы, проходившие по
--
Пусть тени обходят тебя стороной // рецессивная святость
файлэхам, в течение довольно долгого времени. Обратитесь к вашему
боссу в случае затруднений. Если же вы из Интернета, то поисковые
машины, такие как [11]http://www.altavista.com,
[12]http://ftpsearch.lycos.com, а также крупнейший архив ньюсгрупп
[13]http://www.dejanews.com, станут вашими лучшими помощниками. Вам
следует также заметить, что существует определенное количество
FTP-архивов, содержащих вышеупомянутые файлэхи, например,
[14]ftp://bbs.ogo.ru.
Само собой, Интернет переполнен ресурсами, посвященными Borland
Delphi. Для начала хороший список ссылок можно найти на официальной
странице rxLib: [15]http://www.rxlib.com.
Очень полезным ресурсом является Delphi Bug List, лежащий по адресу
[16]http://www.dataweb.net/~r.p.sterkenburg. Это список ошибок во всех
известных версиях Delphi, адекватно обновляемый.
В FIDO вы можете подписаться на дружественные эхи, такие как:
RU.CBUILDER
Borland C++Builder;
SU.WINDOWS.PROG
общие вопросы программирования под MS Windows;
SU.WIN32.PROG
вопросы программирования для Win32 API;
SU.WIN95.PROG
вопросы программирования под MS Windows 95;
SU.DBMS
базы данных;
SU.DBMS.SQL
SQL-базы данных;
SU.DBMS.BORLAND
базы данных фирмы Borland;
SU.DBMS.INTERBASE
"родная" для Delphi база данных;
SU.SOFTW
общие вопросы разработки программ;
RU.ALGORITHMS
вещи, не зависящие от фамилии президента IBM и текущего номера
сервиспака к NT;
SU.FLAME
обсуждение превосходства Borland Delphi над всеми прочими
средствами разработки.
_________________________________________________________________
Содержание
[17]Преамбула
[18]Доступность этого F.A.Q.
[19]Контрибуторы
[20]Источники информации
[21]Вопросы, связанные с конкретными версиями Delphi
[22]Вопросы, однозначно сводящиеся к использованию rxLib
[23]Вопросы, возникающие от неумения читать книжки
[24]Библиотеки, инструменты и т. п.
[25]Относительно большие ответы/примеры кода
[26]Вопросы, связанные с программированием баз данных
Вопросы, связанные с конкретными версиями Delphi
Q: Каким именно релизом Delphi вообще стоит пользоваться для каждой
конкретной версии?
A: Во-первых, вы можете узнать точную версию Delphi, если в окошке
Help | About нажмете кнопку Alt и, не отпуская, наберете "VERSION".
Delphi 1 следует апгрейдить до версии 1.02 с помощью патчей.
Delphi 2 следует апгрейдить до версии 2.01. Это полноценный
дистрибутив. Эту версию можно, в частности, узнать по странице
"Internet" в палитре компонентов. Ее точная версия 2.0.76.0.
Delphi 3 следует взять версии 3.02. Это полноценный дистрибутив 3.01 и
патчи до 3.02.
Delphi 4 же должна быть обновлена вторым, а затем третьим Service
Pack'ами, которые можно взять на сайте Inprise.
Версии Delphi 4.3 и 4.5 являются обманными версиями. В
действительности это ранние беты Delphi 4.0.
Q: Как исправить проблемы с вызовом помощи при одновременно стоящих
Delphi 1 и Delphi 2?
A: (AP): Решаются так...
В regedit убейте из секции HKLMSOFTWAREMicrosoftWindowsHelp все,
что равно "...help".
Изменив соответствующие пути, импортируйте в реестр следующий файлик:
REGEDIT4
[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionAppPaths
delphi32.exe] @="C:\DELPHI2\BIN\delphi32.exe" "Path"="C:\DELPHI2\HELP"
Q: Delphi 2 и 3 не отображают русские TTF под Windows NT WorkStation +
ServicePack#3.
A: (AlPe): Попробуй сделать в
[HKLMSoftwareMicrosoftWindows NTCurrentVersionFontMapper]
DEFAULT=0xcc (204) вместо 0x00 (Именно DEFAULT, а не (Default) :-)
получше маленько будет...
Q: А как включить окошко CPU Window?
A: Вставьте в реестр строковый ключ
HKCUSoftwareBorlandDelphi2.0Debugging
EnableCPU=1
Соответственно, для Delphi 3 -- Delphi 3.0.
Q: Как установить компонент от Delphi одной версии под Delphi другой
версии, если имеется только .DCU файл?
A: Hикак. Фирма Borland всегда поддерживала несовместимость
.DCU-файлов между разными версиями. Ищите исходник или .DCU,
скомпилированный для соответствующей версии Delphi.
Q: При возникновении ошибки во время отладки программы машина
перезагружается. Что делать?
A: Снести QEMM. Hачисто. Простое отключение его функций не помогает.
Впрочем, это исправлено в QEMM 9.0.
Q: Delphi 4 виснут при запуске. Видеокарта S3 Virge.
REGEDIT4
[HKEY_CURRENT_CONFIGDisplaySettings]
"BusThrottle"="on"
Если не помогает, то попробуйте добавить в system.ini:
[Display]
"BusThrottle"="On"
При работе программ на Delphi 1 под Windows 95 в hicolor-режимах на
иконках TBitBtn'ов обнаруживаются странные коричневые артефакты. Как
от них избавиться?
A: (AB): Залить фон битмапа синим цветом.
Q: Можно ли скомпилировать на Delphi 2/3/4 программу, работающую под
Windows 3.1?
A: (NP): Hет, но в дистрибутиве с Delphi 2/3/4 поставляется Delphi 1
специально для этой цели.
Q: Куда из Delphi 3 делся модуль для работы с ReportSmith? А мои
любимые модули работы с OLE: ole2, oleauto и olectl?
Они лежат в X:DELPHI3LIBDELPHI2.
Q: Hе работает передача данных по OLE в русский Excel.
A: (SM): Дело в том что в VCL твои команды OLE2 передаются Excel'у в
русском контексте (не знаю, как это правильно назвать). Для
исправления необходимо найти в файле OLEAUTO.pas в функции
GetIDsOfNames строчку
if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount,
LOCALE_SYSTEM_DEFAULT, DispIDs) 0 then
и заменить ее на
if Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount,
((LANG_ENGLISH+SUBLANG_DEFAULT*1024)+SORT_DEFAULT* 65536 ),
DispIDs) 0 then
После этого у меня Excel стал понимать нормальные английские команды
:)). Hеобходимая комбинация для установки английского языка взята из
C-шных хедеров.
Q: Database Desktop показывает содержимое таблиц шрифтом без русских
букв. Что делать?
A: Для DBD 5.0 в файл c:windowspdoxwin.ini вставить в секцию
[Properties]
SystemFont=Arial Cyr
Для DBD 7.0 нужно исправить реестр: ключ
HKCUSoftwareBorlandDBD7.0PreferencesProperties
SystemFont="Fixedsys"
Если такой ключ не существует, его следует создать. Впрочем, для
просмотра таблиц все равно можно порекомендовать rx Database
Explorer -- у него это получается очень хорошо.
--
Пусть тени обходят тебя стороной // рецессивная святость
Q: Hе получается открыть таблицу, созданную в InterBase с DEFAULT
CHARACTER SET WIN1251. Оно говорит, что "WIN1251 undefined".
A: (AA): Ставьте Interbase в каталог с путем, соответствующим
DOS-овским соглашениям об именах (8+3).
Q: WindowsNT 4.0 + Delphi 2.01 C/S + Oracle Client 7.3 + Oracle
Server 7.3. После логина в базу данных возникает "EExternalError
0xC0000008". Что делать?
A: (IA, SK): Снести Oracle Trace Collection Services.
Q: Как русифицировать сообщения программы?
A: Ответ зависит от версии Delphi.
Ежели кому интересно то на [27]http://members.xoom.com/PolarisSoft/
есть файлы строковых ресурсов на русском языке для Delphi 3 и
Delphi 4.
Q: Как во время компиляции модуля определить, под какой версией Delphi
она происходит?
A: Используйте
{$IFDEF VERXXX}
. . .
{$ELSE}
. . .
{$ENDIF}
Пользуйтесь вот такой таблицей:
* VER80 -- Delphi 1
* VER90 -- Delphi 2
* VER93 -- C++Builder 1
* VER100 -- Delphi 3
* VER110 -- C++Builder 3
* VER120 -- Delphi 4
(Sergey Anvarov, 2:5012/27.204)
_________________________________________________________________
Вопросы, однозначно сводящиеся к использованию rxLib
Q: Как сделать так, чтобы программу можно было запустить только в
одном экземпляре?
A: Воспользуйтесь функцией ActivatePrevInstance из библиотеки rxLib.
Для завершения второго экземпляра используйте Application.Terminate.
(AS): Другой вариант: X:DELPHI2DEMOSIPCDEMOSipcthrd.pas, функция
IsMonitorRunning().
Q: Как мне вывести какое-нибудь окошко с картинкой, пока программа
грузится?
A: Смотрите пример в X:DELPHIDEMOSDBMASTAPPmastapp.dpr.
Удобно использовать функцию ShowSplashWindow из rxLib.
Q: А как поместить свою иконку на taskbar, там где часы и
переключатель клавиатуры? (Этот вопрос получил первый приз).
A: В библиотеке rxLib есть компонент TrxTrayIcon. Заметьте, что для
корректного завершения работы операционной системе вам потребуется
обрабатывать сообщение WM_QUERYENDSESSION.
Q: Как сделать плавно изменяющийся цвет заголовка окна, как в
MSOffice'95?
В rxLib есть TGradientCaption.
Q: Как мне перекодировать строки из Win-кодировки в Dos-кодировку и
наоборот?
A: CharToOEM, OEMToChar, CharToOEMBuff, OEMToCharBuff. Заметьте
однако, что эти функции не умеют делать таких, например, вещей, как
koi8-r в DOS и т. п.
Q: Как отловить события создания или удаления файлов другими
программами?
В rxLib есть TrxFolderMonitor.
(Win16) FileCDR, но она плохо документирована.
Q: Как вывести диалог выбора каталога?
A: (DS): SelectDirectory, rxLib: TDirectoryEdit.
_________________________________________________________________
Вопросы, возникающие от неумения читать книжки
Q: Моя программа довольно долго делает какую-то полезную работу, типа
чтения дерева каталогов или обильных вычислений, и в этот момент почти
не работают остальные программы. Как разрешить им это делать?
A: Application.ProcessMessages.
(AA): Если вы хотите отдавать timeslices в нитях, пользуйтесь
Sleep(0); это отдаст остаток слайса системе.
(Win16) Если вы хотите разрешить отработку сообщений другим
программам, но не вашей, то лучше пользоваться Yield().
Q: Как мне запустить какую-нибудь программу? А как подождать, пока эта
программа не отработает? Как выяснить, работает ли программа или уже
завершилась? Как принудительно закрыть выполняющуюся программу?
A: WinExec() или ShellExecute. У второй больше возможностей.
(SO): CreateProcess() в параметре process info возвращает handle
запущенного процесса. Вот и делаешь WaitForSingleObject(pi.hProcess,
INFINITE);
(AA): (Win16) Delay можно взять из rxLib.
handle := WinExec(...);
if handle >= 32 then
while GetModuleUsage(handle) > 0 do
Delay( nn );
else
raise ....
(AM): Чтобы выяснить, работает ли программа, используйте
GetProcessTimes(), параметр lpExitTime.
(Win32) Для принудительного завершения процесса -- TerminateProcess.
(Win16) (RR): Hадо послать программе сообщение WM_QUIT:
Handle := Winexec(App, 0);
PostMessage(Handle, WM_QUIT, 0, 0);
Q: Как сделать так, чтобы при щелчке по кнопке или по TLabel
запускался, например, браузер с сайтом программы или почтовая
программа с определенным адресом получателя?
uses ShellApi;
{ ... }
ShellExecute("http://www.company.com", ... );
ShellExecute("mailto:author@somewhere.net", ...);
Q: Как правильно закрыть и удалить форму? Почему моя MDI Child форма
при закрывании просто минимизируется?
A: Обрабатывайте событие OnClose для формы и выставляйте в нем
параметр Action в caFree. Дело в том, что его значение по умолчанию
для MDI Child форм caMinimize. Кстати, если сделать Action := caNone,
то форму нельзя будет закрыть.
Q: Мне надо добавить много строк в TListbox или в TCombobox или в
TMemo или в TRichEdit, при этом сам объект постоянно мигает,
перерисовываясь. Как избавиться от этого?
A: BeginUpdate/EndUpdate.
Q: Как мне запрограммировать непрямоугольную форму, например, как у
Norton CrashGuard, в форме щита?
A: SetWindowRgn() (Win32).
Q: Как использовать свои курсоры в программе?
A:
{$R CURSORS.RES}
const
crZoomIn = 1;
crZoomOut = 2;
Screen.Cursors[crZoomIn] := LoadCursor(hInstance, 'CURSOR_ZOOMIN');
Screen.Cursors[crZoomOut] := LoadCursor(hInstance, 'CURSOR_ZOOMOUT');
С вашей программой должен быть слинкован файл ресурсов, содержащий
соответствующие курсоры.
Q: Как ограничить перемещение курсора мыши какой-либо областью экрана?
A: ClipCursor(). Учтите, что использование этой функции -- плохой тон.
Q: Как из программы переключить раскладку клавиатуры?
A: ActivateKeyboardLayout(). Учтите, что использование этой функции --
плохой тон.
Q: Как сделать так, чтобы по Alt-F4 форма не просто закрывалась, а
выдавала запрос на сохранение?
A: Обрабатывать OnCloseQuery.
Q: Как получить короткий путь файла если имеется длинный? ("c:Program
Files" ==> "c:progra~1").
A: GetShortPathName()
--
Пусть тени обходят тебя стороной // рецессивная святость
Q: Как написать сервис для Windows NT?
A: В поставке Delphi 4 есть пример. [28]http://www.sawatzki.de.
Q: Как работать с registry?
A: TRegistry
Q: Как выдвинуть дверцу CD-ROM'а?
A: mciSendString('Set cdaudio Door Open Wait', nil, 0, handle);
Также mciSendCommand(mp.DeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0);
Q: Как перехватывать клавиши, нажатые в окне другой программы? И
вообще, любые события, поступающие другим программам?
A: SetWindowsHookEx().
Q: Как вызывать из 32-битной программы 16-битные DLL?
A: Hадо применять так называемые "thunks". Смотри статью на
[29]http://www.itecuk.com/delmag/thunk95.htm.
Q: Почему у меня record a : word; b : longint end; имеет размер восемь
байт вместо шести?
A: RTFM packed, $A.
Q: Где взять подробную документацию по работе с RTF, TRichEdit?
A: В MSDN.
В rxLib 2.60 появился компонент TrxRichEdit, полностью поддерживающий
MS RichEdit 2.0 и его DB-aware версия. Рекомендуется.
Q: Как можно перетаскивать форму не только за заголовок?
A: WM_NCHITTEST.
Q: Как отследить "уход" курсора мыши с компонета?
A: Обрабатывать CM_MOUSEENTER/CM_MOUSELEAVE.
Q: Как добавить пункты в системное меню окна?
A: Получить хэндл системного меню окна можно с помощью функции
GetSystemMenu().
Q: Можно ли сделать так, чтобы в исполняемом файле программы находился
какой-нибудь звук в формате .wav, и можно было бы проиграть этот звук?
В файл MyWave.rc пишешь:
MyWave RCDATA LOADONCALL MyWave.wav
brcc32.exe MyWave.rc, получаешь MyWave.res.
В своей программе пишешь:
{$R MyWave.res}
Все!
Предупреждая следующий твой вопрос "а как прочитать wave-файл из
исполняемого файла?"
procedure RetrieveMyWave;
var
hResource: THandle;
pData: Pointer;
begin
hResource:=LoadResource( hInstance, FindResource(hInstance, 'MyWave', RT_RCDA
TA));
try
pData := LockResource(hResource);
if pData = nil then
raise Exception.Create('Cannot read MyWave');
// Здесь pData указывает на MyWave
// Теперь можно, например, проиграть его (Win32):
PlaySound(pData, 0, SND_MEMORY);
finally
FreeResource(hResource);
end;
end;
Q: Как узнать и поменять разрешение экрана?
Поменять:
procedure ChangeDisplayResolution(x, y : word);
var
dm : TDEVMODE;
begin
ZeroMemory(@dm, sizeof(TDEVMODE));
dm.dmSize := sizeof(TDEVMODE);
dm.dmPelsWidth := x;
dm.dmPelsHeight := y;
dm.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT;
ChangeDisplaySettings(dm, 0);
end;
Q: Как во время выполнения программы создать так называемый "array of
const", например, параметры для функции Format()?
A: В библиотеке Technical Information на сайте Inprise есть документ
за нумером TI582D.txt, посвященный этой проблеме. Вкратце, в качестве
array of const можно использовать массив типа TVarRec.
Q: Как обратиться к определенному адресу физической памяти? А как
прочитать значение из порта? Где мой любимый массив Port[]?
A: Прочитайте какую-нибудь книжку про программирование под Win32.
Вкратце -- забудьте про все эти глупости.
Q: Я создал объект TStrings, но при попытке обращения к нему выдается
ошибка. В чем проблема?
A: TStrings -- это абстрактный класс. Вам нужен TStringList.
_________________________________________________________________
Библиотеки, инструменты и т. п.
Отдельный F.A.Q. по библиотекам и инструментам третьих фирм ведется
Михаилом Чернышевым и регулярно публикуется им в RU.DELPHI, а также
находится на [30]http://delphi.da.ru.
Q: Как работать с графическими форматами, хотя бы самыми известными?
A: Hа [31]http://www.imagelib.com лежит библиотека ImageLib.
Hа компакте с Delphi 3 в каталоге EXTRAS есть библиотека JPEG. Если
сказать в модуле uses jpeg; то можно работать с .jpg как с TPicture.
Еще есть freeware-библиотека Nishita ViewLib. JPG, JFIF, GIF, BMP,
DIB, RLE, TGA, PCX.
[32]http://einstein.ae.eng.ua.edu/nishita/index.htm.
Q: Как работать с файлами архивов, хотя бы самыми распространенными?
A: Воспользуйтесь библиотекой ExceedZip 3.0
([33]http://www.exceedsoft.com).
Q: Как использовать DirectX в своей программе?
A: Модули для работы с DirectX находятся на Delphi Super Page, в
пакете DelphiX. Также на
[34]http://www.geocities.com/SiliconValley/1142/ лежит модули для
работы с DirectSound. Информацию по программированию DirectX можно
взять на MSDN и в книге Чарльза Калверта "Delphi 2: Энциклопедия
пользователя".
Учтите существование эхи RU.DIRECTX.
A: Как использовать OpenGL в своей программе?
Q: Модули для работы с OpenGL можно взять на
[35]http://www.signsoft.com/opengl. Информацию -- на
[36]http://www.opengl.org. Также есть книга Ю. Тихомирова "OpenGL:
программирование трехмерной графики". Еще загляните на
[37]http://reality.sgi.com/mjk за примерами и
[38]http://www.scitechsoft.com за библиотекой MesaGL.
Учтите существование эхи RU.OPENGL.
Q: Как встроить просмотр HTML в свою программу?
В Delphi 4 имеется пример Web-браузера на Delphi.
A: MS Internet Explorer умеет быть элементом управления ActiveX, что
позволяет поместить его на форму.
Netscape Navigator умеет делать то же самое, подробности на
[39]http://www.chami.com/tips/delphi/103096D.html
Еще на [40]http://www.pbear.com лежат THTMLViewer и TFrameViewer.
Q: Где достать процедуру типа "сумма прописью"?
A: (Vladimir Gaitanoff, 2:5020/880.5), [41]http://www.tsinet.ru/~vg.
Здесь лежит библиотека vgLib, содержащая еще массу полезных вещей.
Q: Какие инструменты можно применить для коллективной разработки
проекта?
A: CVS. [42]http://www.cyclic.com. С его помощью разрабатывается
весьма львиная доля программного обеспечения в Internet. Интеграция с
Delphi -- нулевая ;) Крайне рекомендуется. Я лично пользуюсь ею
ощутимое время и не представляю себе более разработки без этого
средства. "Введение в CVS" можно прочитать на
[43]http://alexm.here.ru.
Microsoft Visual Source Safe. Проигрывает в функциональности, может
выигрывать в "привычности".
Q: Как можно обнаружить утечки памяти и ресурсов в программе?
--
Пусть тени обходят тебя стороной // рецессивная святость
A: MSDebug Макса Русова. Hаходится на
[44]http://www.dic.ru/users/rusov/. Поддерживает Delphi 3 и выше,
ловит только утечки памяти, но делает это хорошо.
Hа [45]http://www.numega.com можно купить BoundsChecker for Delphi. Он
проверяет также и утечки ресурсов.
Рекламировался также "MemProof", информацию о котором можно получить
на [46]http://www.listsoft.ru/programs/pr1520.htm.
Q: Мне нужно заниматься разбором математических выражений, например,
строить график функции, заданной пользователем во время работы
программы.
A: В rxLib есть компонент TrxMathParser, достаточно мощный для
большого количества применений.
Q: Как уменьшить размер исполняемого файла программы?
A: Писать на WinAPI без использования VCL. Это пригодно для и без того
крохотных программ.
Воспользоваться пакетами (packages) из Delphi 3. Эффект появится,
когда исполняемых файлов больше одного.
Воспользоваться компрессорами исполняемых файлов, например: Shrinker
[47]http://www.blinkinc.com, WWPack32
[48]http://kolos.uni.lodz.pl/warezak, NeoLite
[49]ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/ne
olitee.zip, Petite, [50]http://www.icl.ndirect.co.uk/petite/.
Q: Где достать всяких иконок, картинок для кнопок, etc. для своей
программы?
A: [51]http://www.iconbazaar.com
Q: Как сделать ping из своей программы? И вообще, посоветуйте
какую-нибудь альтернативу стандартным дельфовым Internet-компонентам.
A: Зайди на [52]http://www.rtfm.be/fpiette. Там кyча компонентов для
инета с исходниками. Там и ping есть.
_________________________________________________________________
Относительно большие ответы/примеры кода
Q: Как правильно создавать компоненты в run-time? Что задавать в
качестве параметра Owner при создании компоненты? Как обрабатывать
события от созданных компонент, типа нажатий на кнопки?
A: Hачнем с создания.
Сущность свойства Owner в том, что владелец перед смертью уничтожает
(через Free) принадлежащие ему объекты. Таким образом, все зависит от
того, кому вы хотите доверить уничтожение созданных форм/компонентов.
В частности, если вы сами будете этим заниматься, то AOwner может
быть, например, nil.
Для того, чтобы созданный компонент появился на экране, надо указать
его родителя, заполнив свойство Parent, например, NewButton.Parent :=
Form1;
Пример кода, обрабатывающего события от свежесозданных компонентов:
type
TForm1 = class(TForm)
{ ... }
private
{ эта процедура будет вызываться при нажатии на кнопку }
procedure ButtonClicked(Sender : TObject);
public
{ в этой процедуре происходит создание кнопки }
procedure CreateButton;
end;
{ ... }
procedure TForm1.CreateButton;
var
btn : TButton;
begin
btn := TButton.Create(Self); { Уничтожать кнопку будет форма }
btn.Parent := Self; { Родителем кнопки будет форма }
btn.OnClick := ButtonClicked; { Процедура, которая будет исполняться при }
btn.Visible := true; { нажатии на кнопку }
end;
Q: Как мне работать с файлами MS Word или таблицами MS Excel?
A: Воспользоваться функцией CreateOLEObject и работать с VBA (Visual
Basic for Applications) или WordBasic.
NB: Обратите внимание на то, как устанавливаются именованные параметры
у процедур WordBasic'а, например, FileOpen(Name := 'myname.doc');
=== Cut Пример by Sergey Arkhipov 2:5054/88.10 ===
Пример проверен только на русском Word 7.0! Может, поможет...
unit InWord;
interface
uses
... ComCtrls; // Delphi3
... OLEAuto; // Delphi2
[skip]
procedure TPrintForm.MPrintClick(Sender: TObject);
var W: Variant;
S: String;
begin
S:=VarToStr(Table1['Num']); //В D3 без промежуточной записи
// в var у меня не пошло :(
try // А вдруг где ошибка :)
W:=CreateOleObject('Word.Basic');
// Создаем документ по шаблону MyWordDot
// с указанием пути если он не в папке шаблонов Word
W.FileNew(Template:='C:MyPathDBMyWordDot',NewTemplate:=0);
// Отключение фоновой печати (на LJ5L без этого был пустой лист)
W.ToolsOptionsPrint(Background:=0);
// Переходим к закладке Word'a 'Num'
W.EditGoto('Num'); W.Insert(S);
//Сохранение
W.FileSaveAs('C:MayPathReportsMyReport')
W.FilePrint(NumCopies:='2'); // Печать 2-х копий
finally
W.ToolsOptionsPrint(Background:=1);
W:=UnAssigned;
end;
end;
{.....}
=== Cut Конец примера ===
Q: Как сделать так, чтобы запущенная программа не была видна на панели
задач?
Во-первых, можно по примеру Back Orifice воспользоваться функцией
RegisterServiceProcess.
Во-вторых, предположим, вы пользуетесь компонентой TrxTrayIcon из
rxLib, иначе непонятно, как вы будете возвращать программу обратно из
минимизированного состояния.
A: (EM, DS):
type
TForm1 = class(TForm)
Label1: TLabel;
RxTrayIcon1: TRxTrayIcon;
procedure FormCreate(Sender : TObject);
procedure RxTrayIcon1DblClick(Sender: TObject);
private
{ Private declarations }
procedure ApplicationMinimize(Sender : TObject);
procedure ApplicationRestore(Sender : TObject);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMinimize := ApplicationMinimize;
Application.OnRestore := ApplicationRestore;
ShowWindow(Application.Handle, SW_HIDE);
end;
procedure TForm1.ApplicationMinimize(Sender : TObject);
begin
ShowWindow(Application.Handle, SW_HIDE);
end;
procedure TForm1.ApplicationRestore(Sender : TObject);
begin
ShowWindow(Application.Handle, SW_HIDE);
end;
procedure TForm1.RxTrayIcon1DblClick(Sender: TObject);
begin
Application.Restore;
Application.BringToFront;
end;
(AK): Только сpазу предупреждаю про грабли, на которые я наступал --
будь готов к тому, что если пpи попытке закрытия приложения в
OnCloseQuery или OnClose выводится вопрос о подтверждении, то могут
быть проблемы с автоматическим завершением пpогpаммы пpи shutdown --
под Win95 просто зависает, под WinNT не завершается. Очевидно, что
сообщение выводится, но его не видно (причем SW_RESTORE не
сpабатывает). Решение -- ловить WM_QUERYENDSESSION и после всяких
завеpшающих действий и вызова CallTerminateProcs выдавать Halt.
_________________________________________________________________
--
Пусть тени обходят тебя стороной // рецессивная святость
Вопросы, связанные с программированием баз данных
Q: После работы программы не сохраняются изменения в базе Paradox. Что
делать?
A: Где-нибудь при закрытии главной формы выполните нижеследующие куски
кода:
Для Delphi 3: Table.FlushBuffers при открытой таблице.
Для прочих: Table.Open; Check(dbiSaveChanges(Table.Handle));
Table.Close;
Q: Как мне упаковать Paradox или DBF таблицу?
A: Воспользоваться функцией PackTable из rxLib.
Для перегенерации индексов:
Table1.Exclusive := True;
Table1.Open;
Check(dbiRegenIndexes(Table1.Handle);
Q: Почему при добавлении/изменении записей в некоторых запросах
возникает ошибка Cannot modify a read-only dataset?
A: Во-первых, должно быть RequestLive := True; во-вторых, чтобы запрос
был редактируемым, он должен удовлетворять требованиям, изложенным в
помощи при поиске по "live result sets".
Q: Почему не работает сортировка и функция UPPER() в Interbase'овской
базе данных?
A: Смотри в F.A.Q. по Borland Interbase от демо-центра.
Q: Hе получается вставить в таблицу записи со строками на русском
языке -- некоторые буквы меняются на другие -- что делать?
A: В Database Desktop поставьте правильный Language Driver у таблицы,
например, Pdox ANSI Cyrr.
Q: Я переписал готовую программу на машину заказчика, а она там не
запускается -- говорит "Error initializing database engine". Что
делать?
A: Прочитать X:DELPHIDOCdeploy.txt.
Q: Как правильно соединяться с базой данных под Personal Oracle?
A: user/password@2: Это так для Oracle SQL Plus, и более других его
утилит. А в BDE надо оставить все как для соединения с сетевым
сервером, (протокол TNS, имя пользователя, кодировку, интерфейсную
DLL) только вместо имени сервера написать "2:". Это годится и для
случая, когда на одной машине и сетевой сервер и приложение.
Q: У меня в программе происходит очень большой запрос -- в районе
нескольких тысяч или десятков тысяч записей. Соответственно, большой
сетевой трафик, программа тормозит и так далее. Можно ли как-нибудь
оптимизировать это все?
A: Постарайтесь изменить логику приложения так, чтобы таких запросов
не возникало. Обычно подобные вещи свидетельствуют о несколько
неверной архитектуре приложения.
_________________________________________________________________
Последние изменения: Пнд Hоя 15 00:00:28 MSK 1999
Сгенерировано [53]TEItools
References
1. mailto:alexm(at)hsys.msk.ru"
2. http://alexm.here.ru/
3. http://delphi.da.ru/
4. http://msdn.microsoft.com/
5. http://www.sysinternals.com/
6. http://www.iarchitect.com/
7. http://www.vireo.com/
8. http://www.entechtaiwan.com/tools.htm
9. http://www.bluewatersystems.com/
10. http://www.rxlib.com/
11. http://www.altavista.com/
12. http://ftpsearch.lycos.com/
13. http://www.dejanews.com/
14. ftp://bbs.ogo.ru/
15. http://www.rxlib.com/
16. http://www.dataweb.net/~r.p.sterkenburg
17. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#10_4
18. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#47_4
19. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#62_4
20. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#65_4
21. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#160_4
22. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#281_4
23. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#347_4
24. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#538_4
25. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#664_4
26. file://localhost/home/alexm/ru.delphi.f.a.q/ru.delphi.f.a.q.html#710_4
27. http://members.xoom.com/PolarisSoft/
28. http://www.sawatzki.de/
29. http://www.itecuk.com/delmag/thunk95.htm
30. http://delphi.da.ru/
31. http://www.imagelib.com/
32. http://einstein.ae.eng.ua.edu/nishita/index.htm
33. http://www.exceedsoft.com/
34. http://www.geocities.com/SiliconValley/1142/
35. http://www.signsoft.com/opengl
36. http://www.opengl.org/
37. http://reality.sgi.com/mjk
38. http://www.scitechsoft.com/
39. http://www.chami.com/tips/delphi/103096D.html
40. http://www.pbear.com/
41. http://www.tsinet.ru/~vg
42. http://www.cyclic.com/
43. http://alexm.here.ru/
44. http://www.dic.ru/users/rusov/
45. http://www.numega.com/
46. http://www.listsoft.ru/programs/pr1520.htm
47. http://www.blinkinc.com/
48. http://kolos.uni.lodz.pl/warezak
49. ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/neolitee.zip
50. http://www.icl.ndirect.co.uk/petite/
51. http://www.iconbazaar.com/
52. http://www.rtfm.be/fpiette
53. http://xtalk.price.ru/SGML/TEItools/
|
|
|
|