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)?
Следующий код показывает как обрабатывать это событие. Обрабатываются имена всех "брошенных" файлов. Для загрузки каждого файла вызывается CreateChild(FName). В обработчике OnCreate данной формы вы должны вызвать DragAcceptFiles.
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;
N := DragQueryFile(HDrop, $FFFF, nil, 0);
for I := 0 to (N-1) do
begin
Size := DragQueryFile(HDrop, I, nil, 0);
if Size < 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 для того чтобы определить, в каком состоянии запускается приложение, и модифицируйте ее как вам необходимо:
procedure TForm1.FormCreate(Sender: TObject);
begin
if CmdShow = SW_SHOWMINNOACTIVE then WindowState := wsMinimized;
end;
Например, если необходимо запускать приложение либо минимизированным, либо максимизированным, используйте следующий код:
procedure TForm1.FormCreate(Sender: TObject);
begin
if CmdShow = SW_SHOWMINNOACTIVE then WindowState := wsMinimized
else WindowState := wsMaximized;
end;
16. Объясните разницу в помещении uses в секцию interface или implementation.
Секция interface — интерфейсная. Туда попадают объявления констант, типов (в т.ч. и объектов или классов) переменных, процедур и функций. Поэтому для этой части uses должен содержать ссылки на те модули, которые используются для объявлений в этой части.
Секция implementation — описание реализации интерфейсной части, здесь в uses должны быть упомянуты те модули, которыми вы пользуетесь для написания кода. Например, Вы хотите в модуле пользоваться функциями API Windows, для этого добавьте в объявлении implementation строку uses WinTypes, WinProcs; или uses Windows;. Таким образом, вы явно указываете что данными модулями будете пользоваться только в секции реализации.
Конечно, можно упоминать модули только в части interface, но правильная расстановка имен модулей в соответствующем uses гарантирует исключение циклических ссылок, а также улучшает читаемость программы.
17. Как спрятать окна MDI Child?
Я пытаюсь это сделать, выставляя Form1.Visible := False, но это не помогает.
Windows не позволяет прятать окна MDI Child.
18. Как убрать заголовок у формы MDIChild?
Как убрать заголовок (Caption) из MDIChild?
Для MDIChild установка свойства BorderStyle := bsNone не убирает заголовок. Это можно сделать так:
procedure TMDIChildForm.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.Style := Params.Style and (not WS_CAPTION);
end;
19. Сохранение данных в Clipboard.
Мне нужно использовать clipboard для сохранения данных в собственном формате и я хочу для этого написать набор процедур ввода/вывода с использованием потоков (streams). Возможно ли создать объект TMemoryStream, эаполнить его и поместить в Clipboard?
Не только возможно, именно так поступают функции Clipboard.GetComponent и Clipboard.SetComponent. Сначала вы должны зарегистрировать свой собственный формат данных для Clipboard с помощью функции RegisterClipboardFormat: