Большой архив статей, книг, документации по программированию, вебдизайну, компьютерной графике, сетям, операционным системам и многому другому
 
<Добавить в Избранное>    <Сделать стартовой>    <Реклама на сайте>    <Контакты>
  Главная Документация Новости ИТ Программы Книги Games   Обои   Экспорт RSS E-Books
 
Поиск по сайту

TOP-10 программ
Symantec Norton Ghost 9.0
Partition Magic 8.0.2 Pro
Xilisoft 3GP Video Converter v3.1.7.0616b
Norton AntiVirus 2005
Xilisoft 3GP Video Converter v2.1.52.831b
Антивирус Касперского Personal 5.0.303 beta 2
RAR Password Cracker 4.12
ABBYY PDF Transformer v1.00.820
Windows Movie Maker 2.6
MP3 To Ringtone Gold v3.02
 
Наши сервисы
Рассылка новостей. Подпишитесь на рассылку сейчас и вы всегда будете в курсе последних событий в мире информационных технологий.
Новостные информеры. Поставьте наши информеры к себе и у вас на сайте появится дополнительный постоянно обновляемый раздел.
Добавление статей. Если вы являетесь автором статьи или обзора на тему ИТ присылайте материал нам, мы с удовольствием опубликуем его у себя на сайте.
 
 

   Программирование -> Delphi / Pascal -> FAQ по Delphi


Delphi FAQ - 1

Вопросы, связанные с конкретными версиями 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.
К оглавлению


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

Отдельный 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.

Q: Как использовать OpenGL в своей программе?

A: Модули для работы с 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: Постарайтесь изменить логику приложения так, чтобы таких запросов не возникало. Обычно подобные вещи свидетельствуют о несколько неверной архитектуре приложения.
К оглавлению

1-я страница 2-я страница 3-я страница 4-я страница


 
Популярные книги

SQL для "чайников", 5-е издание

Подробнее

Общая информатика. Универсальный курс

Подробнее

Photoshop CS2 для пользователя

Подробнее


 
Новости ИТ
10.01.2009  Skype появился на Android и готовится к покорению iPhone
10.01.2009  Студенты-хакеры улучшат безопасность бостонского метро
09.01.2009  Exeda -- корпоративный цифровой ассистент с Android Linux
09.01.2009  Правительство Вьетнама массово переходит на Open Source
09.01.2009  Windows 7 build 7000
09.01.2009  Silicon Power представила скоростную SDHC
09.01.2009  CES 2009: RealView 360 3D Desktop Scanner - настольный 3D-сканер, один из первых в мире
09.01.2009  W90 - очень быстрый мультимедийный ноутбук ASUS «Ultimate-уровня»
09.01.2009  CES 2009: SanDisk представила семейство G3 - самых быстрых SSD-накопителей на флэш-памяти MLC
09.01.2009  ZOTAC GeForce GTX 285 и GTX 285 AMP! Edition - 3D-ускорители для геймеров на новом GPU NVIDIA
09.01.2009  Net Applications: в декабре доли Firefox и Chrome росли за счет IE
09.01.2009  Imation говорит о «новом классе» SSD и первом в отрасли полном наборе для модернизации на основе SSD
09.01.2009  Маршрутизатор D-Link Xtreme N DIR-685 может играть роль NAS, сервера печати... и цифровой фоторамки
09.01.2009  Очень тонкая фотокамера Pentax Optio P70 имеет разрешение 12 Мп
09.01.2009  pureSilicon 1TB Nitro - первый в мире 2,5-дюймовый SSD объемом 1 ТБ
09.01.2009  Дебютировали мобильные GPU ATI Mobility Radeon HD 4000
09.01.2009  NVIDIA GeForce GTX 285 и GTX 295 представлены официально
09.01.2009  Scythe выпустила процессорный кулер Mugen 2
09.01.2009  Optio E70 - новая компактная камера Pentax начального уровня
09.01.2009  Новый iPhone получит четырехъядерный процессор?
 
Полезно

 
Copyright © CompDoc.Ru
При цитировании и перепечатке ссылка на www.compdoc.ru обязательна. Карта сайта.
 
Rambler's Top100