|
|
|
WEB-БИБЛИОТЕКА |
|
Для просмотра сайта
рекомендуется :
-Разрешение : 800*600 -Броузер : Internet Explorer -Для более эффективного просмотра нажмите F11. |
Неофициальный F.A.Q. эхо-конференции RU.DELPHI СодержаниеВопросы, связанные с
конкретными версиями Delphi Вопросы, связанные с конкретными версиями DelphiQ: Каким именно релизом 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 убейте из секции HKLM\SOFTWARE\Microsoft\Windows\Help все, что равно "...\help". Изменив соответствующие пути, импортируйте в реестр следующий файлик:
Q: Delphi 2 и 3 не отображают русские TTF под Windows NT WorkStation + ServicePack#3. A: (AlPe): Попробуй сделать в [HKLM\Software\Microsoft\Windows NT\ Q: А как включить окошко CPU Window? A: Вставьте в реестр строковый ключ
Соответственно, для Delphi 3 -- Delphi 3.0. Q: Как установить компонент от Delphi одной версии под Delphi другой версии, если имеется только .DCU файл? A: Никак. Фирма Borland всегда поддерживала несовместимость .DCU-файлов между разными версиями. Ищите исходник или .DCU, скомпилированный для соответствующей версии Delphi. Q: При возникновении ошибки во время отладки программы машина перезагружается. Что делать? A: Снести QEMM. Начисто. Простое отключение его функций не помогает. Впрочем, это исправлено в QEMM 9.0. Q: Delphi 4 виснут при запуске. Видеокарта S3 Virge.
Если не помогает, то попробуйте добавить в system.ini:
При работе программ на Delphi 1 под Windows 95 в hicolor-режимах на иконках TBitBtn'ов обнаруживаются странные коричневые артефакты. Как от них избавиться? A: (AB): Залить фон битмапа синим цветом. Q: Можно ли скомпилировать на Delphi 2/3/4 программу, работающую под Windows 3.1? A: (NP): Нет, но в дистрибутиве с Delphi 2/3/4 поставляется Delphi 1 специально для этой цели. Q: Куда из Delphi 3 делся модуль для работы с ReportSmith? А мои любимые модули работы с OLE: ole2, oleauto и olectl? Они лежат в X:\DELPHI3\LIB\DELPHI2. Q: Не работает передача данных по OLE в русский Excel. A: (SM): Дело в том что в VCL твои команды OLE2 передаются Excel'у в русском контексте (не знаю, как это правильно назвать). Для исправления необходимо найти в файле OLEAUTO.pas в функции GetIDsOfNames строчку
Q: Database Desktop показывает содержимое таблиц шрифтом без русских букв. Что делать? A: Для DBD 5.0 в файл c:\windows\pdoxwin.ini вставить в секцию
Для DBD 7.0 нужно исправить реестр: ключ
Если такой ключ не существует, его следует создать. Впрочем, для просмотра таблиц все равно можно порекомендовать 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. Ежели кому интересно то на http://members.xoom.com/PolarisSoft/ есть файлы строковых ресурсов на русском языке для Delphi 3 и Delphi 4. Q: Как во время компиляции модуля определить, под какой версией Delphi она происходит? A: Используйте
Пользуйтесь вот такой таблицей:
(Sergey Anvarov, 2:5012/27.204) Вопросы, однозначно сводящиеся к использованию rxLibQ: Как сделать так, чтобы программу можно было запустить только в одном экземпляре? A: Воспользуйтесь функцией ActivatePrevInstance из библиотеки rxLib. Для завершения второго экземпляра используйте Application.Terminate. (AS): Другой вариант: X:\DELPHI2\DEMOS\IPCDEMOS\ipcthrd.pas, функция IsMonitorRunning(). Q: Как мне вывести какое-нибудь окошко с картинкой, пока программа грузится? A: Смотрите пример в X:\DELPHI\DEMOS\DB\MASTAPP\mastapp.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.
(AM): Чтобы выяснить, работает ли программа, используйте GetProcessTimes(), параметр lpExitTime. (Win32) Для принудительного завершения процесса -- TerminateProcess. (Win16) (RR): Надо послать программе сообщение WM_QUIT:
Q: Как сделать так, чтобы при щелчке по кнопке или по TLabel запускался, например, браузер с сайтом программы или почтовая программа с определенным адресом получателя?
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:
С вашей программой должен быть слинкован файл ресурсов, содержащий соответствующие курсоры. 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 есть пример. 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: Надо применять так называемые "thunks". Смотри статью на 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 пишешь:
brcc32.exe MyWave.rc, получаешь MyWave.res. В своей программе пишешь:
Все! Предупреждая следующий твой вопрос "а как прочитать wave-файл из исполняемого файла?"
Q: Как узнать и поменять разрешение экрана? Поменять:
Q: Как во время выполнения программы создать так называемый "array of const", например, параметры для функции Format()? A: В библиотеке Technical Information на сайте Inprise есть документ за нумером TI582D.txt, посвященный этой проблеме. Вкратце, в качестве array of const можно использовать массив типа TVarRec. Q: Как обратиться к определенному адресу физической памяти? А как прочитать значение из порта? Где мой любимый массив Port[]? A: Прочитайте какую-нибудь книжку про программирование под Win32. Вкратце -- забудьте про все эти глупости. Q: Я создал объект TStrings, но при попытке обращения к нему выдается ошибка. В чем проблема? A: TStrings -- это абстрактный класс. Вам нужен TStringList. Вопросы, которые ни в каких книжках не описаныQ: Как использовать в качестве обработчика сообщения обычную процедуру, а не метод объекта? A: У этой процедуры должен быть еще один дополнительный параметр, например:
Библиотеки, инструменты и т. п.Отдельный F.A.Q. по библиотекам и инструментам третьих фирм ведется Михаилом Чернышевым и регулярно публикуется им в RU.DELPHI, а также находится на http://delphi.da.ru/. Q: Как работать с графическими форматами, хотя бы самыми известными? A: На 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. http://einstein.ae.eng.ua.edu/nishita/index.htm. Q: Как работать с файлами архивов, хотя бы самыми распространенными? A: Воспользуйтесь библиотекой ExceedZip 3.0 (http://www.exceedsoft.com/). Q: Как использовать DirectX в своей программе? A: Модули для работы с DirectX находятся на Delphi Super Page, в пакете DelphiX. Также на http://www.geocities.com/SiliconValley/1142/ лежит модули для работы с DirectSound. Информацию по программированию DirectX можно взять на MSDN и в книге Чарльза Калверта "Delphi 2: Энциклопедия пользователя". Учтите существование эхи RU.DIRECTX. A: Как использовать OpenGL в своей программе? Q: Модули для работы с OpenGL можно взять на http://www.signsoft.com/opengl. Информацию -- на http://www.opengl.org/. Также есть книга Ю. Тихомирова "OpenGL: программирование трехмерной графики". Еще загляните на http://reality.sgi.com/mjk за примерами и http://www.scitechsoft.com/ за библиотекой MesaGL. Учтите существование эхи RU.OPENGL. Q: Как встроить просмотр HTML в свою программу? В Delphi 4 имеется пример Web-браузера на Delphi. A: MS Internet Explorer умеет быть элементом управления ActiveX, что позволяет поместить его на форму. Netscape Navigator умеет делать то же самое, подробности на http://www.chami.com/tips/delphi/103096D.html Еще на http://www.pbear.com/ лежат THTMLViewer и TFrameViewer. Q: Где достать процедуру типа "сумма прописью"? A: (Vladimir Gaitanoff, 2:5020/880.5), http://www.tsinet.ru/~vg. Здесь лежит библиотека vgLib, содержащая еще массу полезных вещей. Q: Какие инструменты можно применить для коллективной разработки проекта? A: CVS. http://www.cyclic.com/. С его помощью разрабатывается весьма львиная доля программного обеспечения в Internet. Интеграция с Delphi -- нулевая ;) Крайне рекомендуется. Я лично пользуюсь ею ощутимое время и не представляю себе более разработки без этого средства. "Введение в CVS" можно прочитать на http://alexm.here.ru/. Microsoft Visual Source Safe. Проигрывает в функциональности, может выигрывать в "привычности". Q: Как можно обнаружить утечки памяти и ресурсов в программе? A: MSDebug Макса Русова. Находится на http://www.dic.ru/users/rusov/. Поддерживает Delphi 3 и выше, ловит только утечки памяти, но делает это хорошо. На http://www.numega.com/ можно купить BoundsChecker for Delphi. Он проверяет также и утечки ресурсов. Рекламировался также "MemProof", информацию о котором можно получить на http://www.listsoft.ru/programs/pr1520.htm. Q: Мне нужно заниматься разбором математических выражений, например, строить график функции, заданной пользователем во время работы программы. A: В rxLib есть компонент TrxMathParser, достаточно мощный для большого количества применений. Q: Как уменьшить размер исполняемого файла программы? A: Писать на WinAPI без использования VCL. Это пригодно для и без того крохотных программ. Воспользоваться пакетами (packages) из Delphi 3. Эффект появится, когда исполняемых файлов больше одного. Воспользоваться компрессорами исполняемых файлов, например: Shrinker http://www.blinkinc.com/, WWPack32 http://kolos.uni.lodz.pl/warezak, NeoLite ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/neolitee.zip, Petite, http://www.icl.ndirect.co.uk/petite/. Q: Где достать всяких иконок, картинок для кнопок, etc. для своей программы? Q: Как сделать ping из своей программы? И вообще, посоветуйте какую-нибудь альтернативу стандартным дельфовым Internet-компонентам. A: Зайди на http://www.rtfm.be/fpiette. Там кyча компонентов для инета с исходниками. Там и ping есть. Относительно большие ответы/примеры кодаQ: Как правильно создавать компоненты в run-time? Что задавать в качестве параметра Owner при создании компоненты? Как обрабатывать события от созданных компонент, типа нажатий на кнопки? A: Начнем с создания. Сущность свойства Owner в том, что владелец перед смертью уничтожает (через Free) принадлежащие ему объекты. Таким образом, все зависит от того, кому вы хотите доверить уничтожение созданных форм/компонентов. В частности, если вы сами будете этим заниматься, то AOwner может быть, например, nil. Для того, чтобы созданный компонент появился на экране, надо указать его родителя, заполнив свойство Parent, например, NewButton.Parent := Form1; Пример кода, обрабатывающего события от свежесозданных компонентов:
Q: Как мне работать с файлами MS Word или таблицами MS Excel? A: Воспользоваться функцией CreateOLEObject и работать с VBA (Visual Basic for Applications) или WordBasic. NB: Обратите внимание на то, как устанавливаются именованные параметры у процедур WordBasic'а, например, FileOpen(Name := 'myname.doc');
Q: Как сделать так, чтобы запущенная программа не была видна на панели задач? Во-первых, можно по примеру Back Orifice воспользоваться функцией RegisterServiceProcess. Во-вторых, предположим, вы пользуетесь компонентой TrxTrayIcon из rxLib, иначе непонятно, как вы будете возвращать программу обратно из минимизированного состояния. A: (EM, DS):
(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. Для перегенерации индексов:
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:\DELPHI\DOC\deploy.txt. Q: Как правильно соединяться с базой данных под Personal Oracle? A: user/password@2: Это так для Oracle SQL Plus, и более других его утилит. А в BDE надо оставить все как для соединения с сетевым сервером, (протокол TNS, имя пользователя, кодировку, интерфейсную DLL) только вместо имени сервера написать "2:". Это годится и для случая, когда на одной машине и сетевой сервер и приложение. Q: У меня в программе происходит очень большой запрос -- в районе нескольких тысяч или десятков тысяч записей. Соответственно, большой сетевой трафик, программа тормозит и так далее. Можно ли как-нибудь оптимизировать это все? A: Постарайтесь изменить логику приложения так, чтобы таких запросов не возникало. Обычно подобные вещи свидетельствуют о несколько неверной архитектуре приложения.
|
Сайт основан 20.02.2003
Использование материалов возможно только при ссылке на webbibl.narod.ru
Статьи, программы и изображения принадлежат их авторам.