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

Поместить или получить строку из буфера обмена (заплатка к стандартным)

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



Автор: VID
WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Поместить/получить строку из буфера обмена (Заплатка к стандартным)

Под Win2k попытка вставить русскую строку в Clipboard ClipBoard.AsText:='Проба'
с последующей вставкой в Word'е показывает кракозябрики..
Расследование показало, что виноваты мелкомягкие (как обычно :) )
С целью нивелирования различий между всеми Win-платформами были написаны эти 2 ф-ции..
Принимают на вход/возвращают строку в Unicode - WideString..
но не надо беспокоиться, Дельфи сам вставит при необходимости
конвертацию в/из AnsiString.

Если платформа поддерживает уникод (NT), то используется этот формат,
иначе вызываются стандартные процедуры/ф-ции.
Удачи!

Зависимости: ClipBrd
Автор:       Shaman_Naydak, shanturov@pisem.net
Copyright:   Shaman_Naydak
Дата:        26 июня 2002 г.
***************************************************** }

procedure PutStringIntoClipBoard(const Str: WideString);
var
  Size: Integer;
  Data: THandle;
  DataPtr: Pointer;
begin
  Size := Length(Str);
  if Size = 0 then
    exit;
  if not IsClipboardFormatAvailable(CF_UNICODETEXT) then
    Clipboard.AsText := Str
  else
  begin
    Size := Size shl 1 + 2;
    Data := GlobalAlloc(GMEM_MOVEABLE + GMEM_DDESHARE, Size);
    try
      DataPtr := GlobalLock(Data);
      try
        Move(Pointer(Str)^, DataPtr^, Size);
        Clipboard.SetAsHandle(CF_UNICODETEXT, Data);
      finally
        GlobalUnlock(Data);
      end;
    except
      GlobalFree(Data);
      raise;
    end;
  end;
end;

function GetStringFromClipboard: WideString;
var
  Data: THandle;
begin
  if not IsClipboardFormatAvailable(CF_UNICODETEXT) then
    Result := Clipboard.AsText
  else
  begin
    Clipboard.Open;
    Data := GetClipboardData(CF_UNICODETEXT);
    try
      if Data <> 0 then
        Result := PWideChar(GlobalLock(Data))
      else
        Result := '';
    finally
      if Data <> 0 then
        GlobalUnlock(Data);
      Clipboard.Close;
    end;
  end;
end;

Программная библиотека на языке Delphi, которая предоставляет два функционала: PutStringIntoClipBoard и GetStringFromClipboard. Эти функции позволяют вставлять строку в системный буфер обмена или извлекать строку из буфера.

Каждая функция имеет тип входного/выходного параметра WideString, что позволяет обрабатывать строковые данные с использованием кодировки Unicode.

PutStringIntoClipBoard

  • Принимает WideString в качестве входного параметра и помещает его в системный буфер обмена.
  • Если платформа поддерживает Unicode (Windows NT), функция использует формат CF_UnicodeText для хранения строки в буфере. В противном случае она переходит к использованию свойства AsText компонента Clipboard, которое конвертирует строку в ANSI перед ее хранением в буфере.

GetStringFromClipboard

  • Извлекает строку из системного буфера обмена и возвращает ее в виде WideString.
  • Если платформа поддерживает Unicode (Windows NT), функция проверяет, содержит ли буфер текст в формате CF_UnicodeText. Если это так, она извлекает текст с помощью GetClipboardData и конвертирует его в WideString с использованием GlobalLock. Если буфер не содержит текст в формате Unicode, функция переходит к извлечению текста в виде ANSI с помощью свойства AsText компонента Clipboard.

Код включает обработку ошибок для случаев, когда память не может быть выделена или при попытке блокировки/разблокировки памяти.

В примере ниже показано, как можно использовать эти функции:

procedure TForm1.Button1Click(Sender: TObject);
begin
  PutStringIntoClipBoard('Hello, World!');
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  str: WideString;
begin
  str := GetStringFromClipboard;
  if str <> '' then
    ShowMessage(str)
  else
    MessageDlg('No text found in clipboard', mtError, [mbOK], 0);
end;

В этом примере первый кнопка вызывает PutStringIntoClipBoard с строкой 'Hello, World!', а вторая кнопка вызывает GetStringFromClipboard, чтобы извлечь строку из буфера. Если извлеченная строка не пуста, она отображается в сообщении; иначе, отображается ошибка.

Код на Delphi, позволяющий поместить или получить строку в буфер обмена, решающий проблемы с русскими символами и работой под разными версиями Windows.


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

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




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


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


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-07-12 11:08:14/0.0064940452575684/0