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 есть пример.
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.