|
|
|
WEB-БИБЛИОТЕКА |
|
Для просмотра сайта
рекомендуется :
-Разрешение : 800*600 -Броузер : Internet Explorer -Для более эффективного просмотра нажмите F11. |
Выборочный FAQ по некоторым интересным вопросам. Часть 2 "Новый" пополняемый FAQ Вопрос: Как можно проиграть звуки закрепленные за событиями Windows, такими как Вход в ситему, завершение работы и др.? Ответ: API: unit mmsystem PlaySound('SystemExit', null, SND_SYNC); или sndPlaySound('SystemExit', SND_SYNC); Вопрос:
Как отловить клик мыши вне компонента, например, панели? Ответ: SetCapture( YouPanel.Handle ); После этого все клики мышью приведут к OnMouseDown твоей панельки. Там проверь - в ней ли мышь, если не в ней - ReleaseCapture и Visible := FALSE; Вопрос:
Перехват нажатия на системные кнопки формы (закрытие , минимизация окна и т.д.) Ответ: Сообщение WM_SYSCOMMAND приходит перед выполнением соответствующей команды, что дает возможность переопределить код. Описание : WM_SYSCOMMAND uCmdType = wParam; // type of system command requested xPos = LOWORD(lParam); // horizontal postion, in screen coordinates yPos = HIWORD(lParam); // vertical postion, in screen coordinates Например, перехват события минимизации окна приложения: Type TMain = class(TForm) .... protected Procedure WMGetSysCommand(var Message : TMessage); message WM_SYSCOMMAND; end; ..... //---------------------------------------------------------------- // Обработка сообщения WM_SYSCOMMAND (перехват минимизации окна) //---------------------------------------------------------------- Procedure TMain.WMGetSysCommand(var Message : TMessage) ; Begin IF (Message.wParam = SC_MINIMIZE) Then Main.Visible:=False Else Inherited; End; Вопрос:
Ограничение на размеры формы Ответ: Используется обработка Windows сообщения WM_GETMINMAXINFO Например, ограничение на уменьшение размера формы и на увеличение ее по высоте: //----------------------------------------------------- // ограничение на изменение размера формы //----------------------------------------------------- procedure TFormBarParity.WMGetMinMaxInfo(var Message : TMessage); type PTMinMaxInfo = ^TMinMaxInfo; begin with PTMinMaxInfo(Message.LParam)^.ptMinTrackSize do begin x := 400; y := 45; end; with PTMinMaxInfo(Message.LParam)^.ptMaxTrackSize do begin y := 45; end; inherited; end; Вопрос:
Проверка нажатых функциональных клавиш Ответ: Функция GetKeyState (Win32API) возвращает статус кнопки клавиатуры, переданной ей в качестве параметра. Статус определяет, что кнопка нажата(down), отпущена(up) или переключена(on/off, как например клавиши NumLock или CapsLock). Если старший разряд возвращаемого значения равен 1, то кнопка нажата, иначе она отпущена. Если младший разряд равен 1, то кнопка включена(состояние On), иначе кнопка выключена(off). SHORT GetKeyState( int nVirtKey ); Например: IF GetKeyState(VK_NUMLOCK) = 1 Then ...// Кнопка "NumLock" включена (on) Вопрос:
Убрать из формы Caption. Ответ: SetWindowLong (Main.Handle,GWL_STYLE, GetWindowLong(Main.Handle, GWL_STYLE) AND NOT WS_CAPTION OR WS_SIZEBOX); Вопрос:
Событие при потере и установке фокуса для формы. Ответ: Примечание: В данном примере при потере фокуса формой, PanelCaption окрашивается в цвет неактивного заголовка, в случае получения фокуса формой - в цвет активного заголовка. То есть цвет панели повторяет изменение цвета Caption самой формы. Type TMain = class(TForm) .... protected Procedure LastFocus(var Mess : TMessage) ; message WM_ACTIVATE; End; //-------------------------------------------------------------- Procedure TMain.LastFocus(var Mess : TMessage) ; Begin IF Mess.wParam = WA_INACTIVE Then PanelCaption.Color:=clInactiveCaption Else PanelCaption.Color:=clActiveCaption; Inherited; End; Вопрос:
Добавить свой пункт в системное меню приложения. Ответ: Добавить пункт в системное меню, написать обработчик его выбора и перехватить сообщение о выборе пункта из системного меню. Примечание: Константа WM_USER используется в приложении для определения собственных сообщений. Значения от 0 до (WM_USER-1) зарезервированы для системных сообщений. type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure OnMyMenu; private procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND; end; var Form1: TForm1; implementation {$R *.DFM} const SC_MyMenuItem = WM_USER + 1; //---------------------------------------------------- procedure TForm1.FormCreate(Sender: TObject); begin // добавление своего пункта в системное меню приложения AppendMenu(GetSystemMenu(Handle, FALSE), MF_SEPARATOR, 0, ''); AppendMenu(GetSystemMenu(Handle, FALSE), MF_STRING, SC_MyMenuItem, 'Новый пункт в меню'); end; //---------------------------------------------------- procedure TForm1.OnMyMenu; Begin // Обработка нажатия на новый пункт меню End; //---------------------------------------------------- procedure TForm1.WMSysCommand(var Msg: TWMSysCommand); begin // перехват события выбора нового пункта меню if Msg.CmdType = SC_MyMenuItem then OnMyMenu else inherited; end; //---------------------------------------------------- Вопрос:
Можно ли сделать так, чтобы в исполняемом файле программы находился какой-нибудь звук в формате .wav, и можно было бы проиграть этот звук? Ответ: В файл MyWave.rc надо записать: MyWave RCDATA LOADONCALL MyWave.wav brcc32.exe MyWave.rc, получаешь MyWave.res. Непосредственно в программе: {$R a.res} Все! Пpедупpеждая следующий вопpос 'а как пpочитать вавчик из EXE?': 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 // Тепеpь можно, напpимеp, пpоигpать его (Win32): PlaySound('MyWave', 0, SND_MEMORY); finally FreeResource(hResource); end; end; Вопрос:
Как правильно создавать компоненты в run-time? Что задавать в качестве параметра Owner при создании компоненты? Как обрабатывать события от созданных компонент, типа нажатий на кнопки? Ответ: Hачнем с создания. Для того, чтобы созданный компонент появился на экране, надо указать его родителя, заполнив свойство Parent, например, NewButton.Par |