Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Копирование потока компонент в буфер обмена

Delphi , ОС и Железо , Буфер обмена

Копирование потока компонент в буфер обмена

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

{ 
  Clipboard has  methods  GetComponent and SetComponent but we need 
  to stream multiple components to the clipboard to include copy paste type 
  of feature. 

  Die Zwischenablage hat die Methoden GetComponent and SetComponent 
  aber wir wollen mehrere Komponenten in die 
  Zwischenablage speichern und wieder auslesen. 
}


 procedure CopyStreamToClipboard(fmt: Cardinal; S: TStream);
 var
   hMem: THandle;
   pMem: Pointer;
 begin
   S.Position := 0;
   hMem       := GlobalAlloc(GHND or GMEM_DDESHARE, S.Size);
   if hMem <> 0 then
    begin
     pMem := GlobalLock(hMem);
     if pMem <> nil then
      begin
       S.Read(pMem^, S.Size);
       S.Position := 0;
       GlobalUnlock(hMem);
       Clipboard.Open;
       try
         Clipboard.SetAsHandle(fmt, hMem);
       finally
         Clipboard.Close;
       end;
     end { If }
     else
      begin
       GlobalFree(hMem);
       OutOfMemoryError;
     end;
   end { If }
   else
     OutOfMemoryError;
 end; { CopyStreamToClipboard }


 procedure CopyStreamFromClipboard(fmt: Cardinal; S: TStream);
 var
   hMem: THandle;
   pMem: Pointer;
 begin
   hMem := Clipboard.GetAsHandle(fmt);
   if hMem <> 0 then
    begin
     pMem := GlobalLock(hMem);
     if pMem <> nil then
      begin
       S.Write(pMem^, GlobalSize(hMem));
       S.Position := 0;
       GlobalUnlock(hMem);
     end { If }
     else
       raise Exception.Create('CopyStreamFromClipboard: could not lock global handle ' +
         'obtained from clipboard!');
   end; { If }
 end; { CopyStreamFromClipboard }

Вот перевод текста на русский язык:

Это фрагмент кода на Delphi, демонстрирующий, как копировать и вставлять потоки данных между буфером обмена и объектом TStream. Процедуры CopyStreamToClipboard и CopyStreamFromClipboard копируют потоки данных из объекта TStream в буфер обмена и обратно.

CopyStreamToClipboard

  • Устанавливает позицию входного потока (S) в 0.
  • Выделяет память с помощью GlobalAlloc с флагами GHND (общая память, не переносимая) и GMEM_DDESHARE (общая память, делимая DDE). Если выделение не удалось, то поднимает исключение OutOfMemoryError.
  • Закрывает память с помощью GlobalLock. Если это не удалось, то поднимает исключение.
  • Копирует содержимое входного потока в блок памяти с помощью S.Read.
  • Устанавливает позицию входного потока обратно в 0.
  • Открывает память с помощью GlobalUnlock.
  • Открывает буфер обмена с помощью Clipboard.Open.
  • Устанавливает handle буфера обмена на выделенную память с помощью Clipboard.SetAsHandle с указанием формата, заданного параметром fmt.
  • Закрывает буфер обмена с помощью Clipboard.Close.

CopyStreamFromClipboard

  • Получает handle из буфера обмена с помощью Clipboard.GetAsHandle с указанием формата, заданным параметром fmt.
  • Проверяет, является ли handle валидным. Если нет, то поднимает исключение.
  • Закрывает память с помощью GlobalLock. Если это не удалось, то поднимает исключение.
  • Копирует содержимое блок памяти в выходной поток (S) с помощью S.Write.
  • Устанавливает позицию выходного потока обратно в 0.
  • Открывает память с помощью GlobalUnlock.

Код использует тип THandle для представления handle и тип PPointer для представления указателя на блок памяти. Функции GlobalAlloc, GlobalFree и GlobalLock/GlobalUnlock используются для управления общей памятью.

Обратите внимание, что код предполагает, что входной поток (S) не равен null, и что формат, заданный параметром fmt, является валидным. Возможно, вам нужно добавить проверку или обработку ошибок для этих случаев, если это необходимо.

Также помните, что этот код использует устаревшую версию API Delphi для работы с буфером обмена. Если вы планируете использовать этот код в новом проекте, вам может потребоваться обновить его до использования новых API.

Копирование потока компонент в буфер обмена: описано процедуры CopyStreamToClipboard и CopyStreamFromClipboard для записи и чтения множественных компонентов из буфера обмена.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Буфер обмена ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-26 17:53:56/0.0037271976470947/0