inherited;
end;
Вызов inherited метода очень важен. Обратите внимание также на то, что для функций, объявленных с директивой message (обработчиков событий Windows) после inherited нет имени наследуемой процедуры, потому что она может быть неизвестна или вообще отсутствовать (в этом случае вы в действительности вызываете процедуру DefaultHandler).
8. Как обработать события от других приложений?
Попробуйте сделать это следующим образом:
type
TForm1 = class(TForm)
...
private
procedure WMNCActivate(var Msg: TMessage); message WM_NCACTIVATE;
end;
procedure TForm1.WMNCActivate(var Msg: TMessage);
begin
{ здесь обработка принятых событий }
end;
9. Как перехватить сообщения Windows и обработать их перед тем, как выполнится строка Application.Run?
Пример проекта показывает, как получить сообщения Windows в данном случае. Это редкий случай, в большинстве случаев переопределение процедуры
program Project1;
uses
Forms,
Unit1 in 'UNIT1.PAS'
Messages, WinTypes, WinProcs,
var
OldWndProc: TFarProc;
function NewWndProc(hWndAppl: HWnd; Msg, wParam: Word; lParam: Longint): Longint; export;
begin
Result := 0;
Result := CallWindowProc(OldWndProc, hWndAppl, Msg, wParam, lParam);
end;
begin
Application.CreateForm(TForm1, Form1);
OldWndProc := TFarProc(GetWindowLong(Application.Handle, GWL_WNDPROC));
SetWindowLong(Application.Handle, GWL_WNDPROC, Longint(@NewWndProc));
Application.Run;
end.
10. Проблема с DragDrop для внешних программ.
Я пишу небольшую программку — "мусорную корзину". В
Это можно сделать так:
type
TMainForm = class(TForm)
...
procedure FormCreate(Sender: TObject);
private
procedure DropFiles(var Msg : TWMDropFiles); message WM_DROPFILES;
end;
procedure TMainForm.DropFiles(var Msg : TWMDropFiles);
begin
DragQueryPoint(Msg.Drop, Point);
NrOfFiles := DragQueryFile(Msg.Drop, Word(-1), FileName, BufSize);
DragQueryFile(Msg.Drop, 0, FileName, BufSize);
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
DragAcceptFiles(Handle, True);
end;
Подробнее о перехвате событий Windows см. Главу 7 руководства Component Writers Guide.
11. Как обрабатывать WM_DROPFILES (Drag/Drop)?
Следующий код показывает как обрабатывать это событие. Обрабатываются имена всех "брошенных" файлов. Для загрузки каждого файла вызывается
type
TFrameForm = class(TForm)
...
protected
procedure WMDropFiles(var Msg: TMessage); message WM_DROPFILES;
end;
procedure TFrameForm.WMDropFiles(var Msg : TMessage);
var
I, N, Size: Word;
FName: string;
HDrop: Word;
begin
HDrop := Msg.WParam;