Читаем Виртуальная библиотека Delphi полностью

Мне нужно использовать clipboard для сохранения данных в собственном формате и я хочу для этого написать набор процедур ввода/вывода с использованием потоков (streams). Возможно ли создать объект TMemoryStream, эаполнить его и поместить в Clipboard?

Не только возможно, именно так поступают функции Clipboard.GetComponent и Clipboard.SetComponent. Сначала вы должны зарегистрировать свой собственный формат данных для Clipboard с помощью функции RegisterClipboardFormat:

CF_MYFORMAT := RegisterClipboardFormat('My Format Description'); Далее вы должны выполнить шаги:

1. Создать поток (memory stream) и записать туда данные.

2. Создать глобальный буфер в памяти и скопировать поток туда.

3. Вызвать Clipboard.SetAsHandle(), чтобы поместить буфер в Clipboard.

Пример:

var 

  hBuf: THandle; 

  Bufptr: Pointer; 

  MStream: TMemoryStream; 

begin 

  MStream := TMemoryStream.Create; 

  try 

  { write your data to the stream } 

    hBuf := GlobalAlloc(GMEM_MOVEABLE, MStream.Size); 

    try 

      BufPtr := GlobalLock(hBuf); 

      try 

        Move(MStream.Memory^, BufPtr^, MStream.Size); 

        Clipboard.SetAsHandle(CF_MYFORMAT, hBuf); 

      finally 

        GlobalUnlock(hBuf); 

      end

    except 

      GlobalFree(hBuf); 

      raise

    end

  finally 

    MStream.Free; 

  end

end

Внимание: не уничтожайте буфер, созданный с GlobalAlloc. Поскольку вы поместили его в Clipboard, это уже дело clipboard'а его уничтожить. Опять же, получая буфер из Clipboard, не уничтожайте этот буфер - просто сделайте копию содержимого.

Для обратного получения потока и данных, сделайте что-нибудь вроде этого:

var 

  hBuf: THandle; 

  BufPtr: Pointer; 

  MStream: TMemoryStream; 

begin 

  hBuf := Clipboard.GetAsHandle(CF_MYFORMAT); 

  if hBuf <> 0 then 

  begin 

    BufPtr := GlobalLock(hBuf); 

    if BufPtr <> nil then 

    try 

      MStream := TMemoryStream.Create; 

      try 

        MStream.WriteBuffer(BufPtr^, GlobalSize(hBuf)); 

        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. Как программно спрятать или показать заголовок у формы?

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных