Это можно сделать так:
type
TMainForm = class(TForm)
...
procedureFormCreate(Sender: TObject);
private
procedureDropFiles( varMsg : TWMDropFiles); messageWM_DROPFILES;
end;
procedureTMainForm.DropFiles( varMsg : TWMDropFiles);
begin
DragQueryPoint(Msg.Drop, Point);
NrOfFiles := DragQueryFile(Msg.Drop, Word(-1), FileName, BufSize);
DragQueryFile(Msg.Drop, 0, FileName, BufSize);
end;
procedureTMainForm.FormCreate(Sender: TObject);
begin
DragAcceptFiles(Handle, True);
end;
Подробнее о перехвате событий Windows см. Главу 7 руководства Component Writers Guide.
11. Как обрабатывать WM_DROPFILES (Drag/Drop)?
Следующий код показывает как обрабатывать это событие. Обрабатываются имена всех "брошенных" файлов. Для загрузки каждого файла вызывается CreateChild(FName) . В обработчике OnCreate данной формы вы должны вызвать DragAcceptFiles .
type
TFrameForm = class(TForm)
...
protected
procedureWMDropFiles( varMsg: TMessage); messageWM_DROPFILES;
end;
procedureTFrameForm.WMDropFiles( varMsg : TMessage);
var
I, N, Size: Word;
FName: string;
HDrop: Word;
begin
HDrop := Msg.WParam;
N := DragQueryFile(HDrop, $FFFF, nil, 0);
forI := 0 to(N-1) do
begin
Size := DragQueryFile(HDrop, I, nil, 0);
ifSize < 255 then { 255 char. string limit - not really a problem }
begin
FName[0] := Chr(Size);
DragQueryFile(HDrop, I, @FName[1], Size+1);
CreateChild(FName);
end;
end;
Msg.Result := 0;
inherited;
end;
12. Как может выделить время CPU другим задачам , подобно "DoEvents" в VB?
Эквивалент в Delphi — Application.ProcessMessages .
Если вы выполняете долгие вычисления, то вызов данного метода позволит в Win 16 выполняться параллельно другим приложениям, а в Win 32 - корректно перерисовываться вашему приложению.
13. В каком порядке происходят события при создании и показе окна?
При создании окна обработчики событий выполняются в следующем порядке:
• OnCreate
• OnShow
• OnPaint
• OnActivate
• OnResize
• OnPaint (снова)
14. UpCase для русского языка.
Данная функция (UpCase) производит преобразование только латинских символов в верхний регистр. Для правильного преобразования необходимо использовать функции Windows API, поскольку именно Windows должна "знать" о кодировке национальных символов. Причем к конфигурации BDE кодровка Windows не имеет никакого отношения — имея английские Windows без русификатора и выставив в BDE кодировку Paradox ANSII Cyrillic нормальных русских букв получить не удастся.
А функции для преобразования следующие — OemToAnsi, AnsiToOem, OemToAnsiBuf, AnsiToOemBuf в Win16 (модуль WinProcs) и OemToChar, CharToOem, OemToCharBuf и CharToOemBuf в Win32 (модуль Windows)..
15. Приложение, написанное на Delphi, не запускается минимизированным.
Проверьте глобальную переменную CmdShow для того чтобы определить, в каком состоянии запускается приложение, и модифицируйте ее как вам необходимо:
procedureTForm1.FormCreate(Sender: TObject);
begin
ifCmdShow = SW_SHOWMINNOACTIVE thenWindowState := wsMinimized;
end;
Например, если необходимо запускать приложение либо минимизированным, либо максимизированным, используйте следующий код:
procedureTForm1.FormCreate(Sender: TObject);
begin
ifCmdShow = SW_SHOWMINNOACTIVE thenWindowState := wsMinimized
elseWindowState := wsMaximized;
end;
16. Объясните разницу в помещении uses в секцию interface или implementation.
Секция interface — интерфейсная. Туда попадают объявления констант, типов (в т.ч. и объектов или классов) переменных, процедур и функций. Поэтому для этой части usesдолжен содержать ссылки на те модули, которые используются для объявлений в этой части.
Секция implementation — описание реализации интерфейсной части, здесь в usesдолжны быть упомянуты те модули, которыми вы пользуетесь для написания кода. Например, Вы хотите в модуле пользоваться функциями API Windows, для этого добавьте в объявлении implementationстроку uses WinTypes, WinProcs;или uses Windows;. Таким образом, вы явно указываете что данными модулями будете пользоваться только в секции реализации.
Читать дальше