Выбрать главу

  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: