Вопросы, возникающие от неумения читать книжки

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

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.

Понравилась статья? Поделиться с друзьями: