Читать «Виртуальная библиотека Delphi» онлайн - страница 110

Unknown

        MStream.Position := 0;

      { read your data from the stream }

      finally

        MStream.Free;

      end;

    finally

      GlobalUnlock(hBuf);

    end;

  end;

end;

20. Что означает Key<>#0 ? 

В исходном тексте одного из компонентов третьих фирм я увидел строку:

if Key <> #0 then inherited KeyPress(#0);

В Windows виртуальные коды находятся в диапазоне 1-145 (Dec). Зачем нужна такая проверка?

В соответствии с соглашением Windows код клавиши #0 означает отсутствие реального нажатия. Управление в данную точку программы могло попасть, например вследствие прямого вызова, а не нажатия клавиши или же нажатие уже было обработано предком, вследствие чего код нажатой клавиши был сброшен в 0.

21. Аналог процедуры TP/BP Delay.

procedure TForm1.Delay(MSecs: Longint);

var

  FirstTick: Longint;

begin

  FirstTick := GetTickCount;

  repeat

    Application.ProcessMessages;

  until GetTickCount - FirstTick >= MSecs;

end;

В Win32 API существуют также функции Sleep и SleepEx.

22. Каким образом создать форму, которую можно таскать за поле?

Как сделать форму (окно), которое перетаскивается не за заголовок (Сaption), а за все поле ?

Нужно обрабатывать сообщение WM_NCHITTEST:

type

  TForm1 = class(TForm)

  ...

  private

    procedure WMNCHitTest(var M: TWMNCHitTest); message WM_NCHITTEST;

  end;

procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);

begin

  inherited;                  { вызов унаследованного обработчика      }

  if M.Result = htClient then{ Мышь сидит на окне?                    }

     M.Result := htCaption;   { Если да - то пусть Windows думает, что }

                              { мышь на caption bar                    }

end;

Примечание: окно можно сделать вообще без Сaption.

23. Как программно спрятать или показать заголовок у формы?

Как программно спрятать или показать заголовок (Caption) у формы?

Вы можете попробовать следующее:

procedure TForm1.HideTitlebar;

var

  Save: Longint;

begin

  if BorderStyle=bsNone then Exit;

  Save := GetWindowLong(Handle, GWL_STYLE);

  if (Save and WS_CAPTION) = WS_CAPTION then

  begin

    case BorderStyle of

      bsSingle, bsSizeable:

        SetWindowLong(Handle, GWL_STYLE, Save and (not WS_CAPTION) or WS_BORDER);

     bsDialog:

        SetWindowLong(Handle, GWL_STYLE, Save and (not WS_CAPTION) or DS_MODALFRAME or WS_DLGFRAME);

    end;

    Height := Height-GetSystemMetrics(SM_CYCAPTION);