ЧАСТНОЕ ФОТО
па главную подписаться на рассылку сайта cделать стартовой
WEB-БИБЛИОТЕКА
Статьи на сайте

DELPHI

HTML

WINAPI

БЕЗОПАСНОСТЬ

JAVA

CLIPART

FAQ по Delphi

Неофициальный F.A.Q. эхо-конференции RU.DELPHI

Выборочный FAQ по некоторым интересным вопросам. Часть 1

Выборочный FAQ по некоторым интересным вопросам. Часть 2

FAQ: от Turbo/Borland Pascal к Delphi

 Разное
На главную
Написать письмо
Подписаться на рассылку
Cделать стартовой
ОБРАТНАЯ СВЯЗЬ

Для просмотра сайта рекомендуется :
-Разрешение : 800*600
-Броузер : Internet Explorer
-Для более эффективного
просмотра нажмите F11.

Неофициальный F.A.Q. эхо-конференции RU.DELPHI

Содержание

Вопросы, связанные с конкретными версиями Delphi
Вопросы, однозначно сводящиеся к использованию rxLib
Вопросы, возникающие от неумения читать книжки
Вопросы, которые ни в каких книжках не описаны
Библиотеки, инструменты и т. п.
Относительно большие ответы/примеры кода
Вопросы, связанные с программированием баз данных

Вопросы, связанные с конкретными версиями 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 убейте из секции HKLM\SOFTWARE\Microsoft\Windows\Help все, что равно "...\help".

Изменив соответствующие пути, импортируйте в реестр следующий файлик:

REGEDIT4

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\
CurrentVersion\AppPaths\
delphi32.exe] @="C:\\DELPHI2\\BIN\\delphi32.exe" 
"Path"="C:\\DELPHI2\\HELP"

Q: Delphi 2 и 3 не отображают русские TTF под Windows NT WorkStation + ServicePack#3.

A: (AlPe): Попробуй сделать в

[HKLM\Software\Microsoft\Windows NT\
CurrentVersion\FontMapper]

DEFAULT=0xcc
(204) вместо 0x00
(Именно DEFAULT, а не (Default) :-) получше маленько будет...

Q: А как включить окошко CPU Window?

A: Вставьте в реестр строковый ключ

HKCU\Software\Borland\Delphi\2.0\Debugging\
EnableCPU=1

Соответственно, для 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.

REGEDIT4
[HKEY_CURRENT_CONFIG\Display\Settings]
"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): Нет, но в дистрибутиве с 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 строчку

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 стал понимать нормальные английские команды :)). Необходимая комбинация для установки английского языка взята из C-шных хедеров.

Q: Database Desktop показывает содержимое таблиц шрифтом без русских букв. Что делать?

A: Для DBD 5.0 в файл c:\windows\pdoxwin.ini вставить в секцию

[Properties] 
SystemFont=Arial Cyr

Для DBD 7.0 нужно исправить реестр: ключ

HKCU\Software\Borland\DBD\7.0\Preferences\Properties\
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.

Ежели кому интересно то на 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:\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.

handle := WinExec(...);
if handle >= 32 then 
  while GetModuleUsage(handle) > 0 do 
    Delay( nn );
else
 raise ....

(AM): Чтобы выяснить, работает ли программа, используйте GetProcessTimes(), параметр lpExitTime.

(Win32) Для принудительного завершения процесса -- TerminateProcess.

(Win16) (RR): Надо послать программе сообщение 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 есть пример. 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 пишешь:

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_RCDATA)); 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.


Вопросы, которые ни в каких книжках не описаны

Q: Как использовать в качестве обработчика сообщения обычную процедуру, а не метод объекта?

A: У этой процедуры должен быть еще один дополнительный параметр, например:

procedure MyEventHandler
(PseudoSelf : TObject; Sender : TObject); begin { ... } end;


Библиотеки, инструменты и т. п.

Отдельный 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. для своей программы?

A: http://www.iconbazaar.com/

Q: Как сделать ping из своей программы? И вообще, посоветуйте какую-нибудь альтернативу стандартным дельфовым Internet-компонентам.

A: Зайди на http://www.rtfm.be/fpiette. Там кyча компонентов для инета с исходниками. Там и ping есть.


Относительно большие ответы/примеры кода

Q: Как правильно создавать компоненты в run-time? Что задавать в качестве параметра Owner при создании компоненты? Как обрабатывать события от созданных компонент, типа нажатий на кнопки?

A: Начнем с создания.

Сущность свойства 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:\MyPath\DB\MyWordDot',NewTemplate:=0); // Отключение фоновой печати
//(на LJ5L без этого был пустой лист) W.ToolsOptionsPrint(Background:=0); // Переходим к закладке Word'a 'Num' W.EditGoto('Num'); W.Insert(S); //Сохранение W.FileSaveAs('C:\MayPath\Reports\MyReport') 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:\DELPHI\DOC\deploy.txt.

Q: Как правильно соединяться с базой данных под Personal Oracle?

A: user/password@2: Это так для Oracle SQL Plus, и более других его утилит. А в BDE надо оставить все как для соединения с сетевым сервером, (протокол TNS, имя пользователя, кодировку, интерфейсную DLL) только вместо имени сервера написать "2:". Это годится и для случая, когда на одной машине и сетевой сервер и приложение.

Q: У меня в программе происходит очень большой запрос -- в районе нескольких тысяч или десятков тысяч записей. Соответственно, большой сетевой трафик, программа тормозит и так далее. Можно ли как-нибудь оптимизировать это все?

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

 


--------------------------------------------------------------------
Куртка зимняя
--------------------------------------------------------------------
Hosted by uCoz