Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.02.2023, 17:26   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 623
По умолчанию Не вставляется текст из буфера

Пытаюсь вставить текст скопированный из клиента телеграм. Не вставляется ни через сторонние кнопки програмно ни напрямую через ctrl+V в Memo, или Edit

При этом если я вставлю текст в блокнот, а потом выделю текст и заново Ctrl+C - после этого нормально будет вставляться

Версия Delphi 7
Kronos913 вне форума Ответить с цитированием
Старый 07.02.2023, 18:35   #2
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 623
По умолчанию

Кстати, если попробовать в процессе редактирования программы нажать ctrl+V, то тоже 0 реакции
Но опять же, в самый примитивный блокнот все нормально заходит
Kronos913 вне форума Ответить с цитированием
Старый 07.02.2023, 18:43   #3
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 623
По умолчанию

Код:
  If Clipboard.HasFormat(CF_TEXT) then begin
    label1.Caption:='+';
    label2.Caption:=IntToStr(Length(Clipboard.AsText));
  end else begin
    label1.Caption:='-';
  end;
Выдает "+" и нулевую длину

Хотя, опять же, в блокнот текст заходит
Kronos913 вне форума Ответить с цитированием
Старый 07.02.2023, 19:20   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Если посмотреть содержимое буфера обмена с помощью clipview (http://www.peterbuettner.de/develop/tools/clipview/), то оно отличается после копирования из телеграма и из блокнота. Наверное, блокнот анализирует содержимое и в других форматах (CF_UNICODETEXT, CF_OEMTEXT), а в Дельфи 7 берется только CF_TEXT.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 08.02.2023, 00:46   #5
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 623
По умолчанию

И как сделать так, чтобы моя программа смогла прочитать содержимое буфера?
Может быть, можно как-то просто получить содержимое буфера как набор данных и самостоятельно расшифровать?
Kronos913 вне форума Ответить с цитированием
Старый 08.02.2023, 01:12   #6
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 623
По умолчанию

Через программу по ссылке определил формат:
13: CF_UNICODETEXT

Как его прочитать теперь?
Kronos913 вне форума Ответить с цитированием
Старый 08.02.2023, 01:52   #7
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Код:
var
  buf: array of Byte;
  siz, len: LongInt;
begin
   siz := 10240; // Количество байт в буфере
   SetLength(buf, siz); // Выделили память под массив байт
   len := Clipboard.GetTextBuf(PChar(@buf[0]), siz); // Получили символы из буфера обмена
// siz - длина буфера в символах AnsiChar (1 байта на символ)
// len - Количество записанных в буфер символов (AnsiChar)
Чтобы определить заранее длину буфера можно получить handle и с помощью функции GlobalSize получить длину в байтах. Но т.к. GlobalSize это WinAPI, то на Linux она не доступна. Для решения проблемы определения размера данных в буфере обмена можно, например, в цикле читать данные из буфера, увеличивая буфер пока len=siz.
Код:
var
  buf: array of Byte;
  siz, len: LongInt;
begin
   siz := 0;
   repeat
      inc (siz, 10240);
      SetLength(buf, siz);
      len := Clipboard.GetTextBuf(PChar(@buf[0]), siz);
   until len < siz;
ADD: После buf: array of Byte; надо без преобразования превратить в строку WideChar. Например так: PWideChar(@buf[0]);

Последний раз редактировалось macomics; 08.02.2023 в 01:59.
macomics вне форума Ответить с цитированием
Старый 08.02.2023, 16:37   #8
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 623
По умолчанию

После долгих поисков нашел такой код:

Код:
function GetStringFromClipboard: WideString;
var
  Data: THandle;
begin
  if not IsClipboardFormatAvailable(CF_UNICODETEXT) then begin
    Result := Clipboard.AsText;
  end 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;
Вопрос: есть ли у него какие-то моменты, которые могут стать непредвиденным сюрпризом? Пока что работает
Kronos913 вне форума Ответить с цитированием
Старый 08.02.2023, 16:39   #9
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 623
По умолчанию

Но надо чтобы код мог нормально вставить и обычный и юникодовский текст...
Пока что я делаю
Код:
s:=Clipboard.AsText;
if s='' then s:=GetStringFromClipboard
И вопрос в том нужна ли такая подстраховка, или нет?

Последний раз редактировалось Kronos913; 08.02.2023 в 16:48.
Kronos913 вне форума Ответить с цитированием
Старый 13.02.2023, 02:22   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
есть ли у него какие-то моменты
Код GetStringFromClipboard - калька с геттера TClipboard.GetAsText, так что проблем быть не должно.
Цитата:
Сообщение от Kronos913 Посмотреть сообщение
нужна ли такая подстраховка, или нет?
Скорее, нужно продумать желаемый алгоритм обработки. GetStringFromClipboard опять может вызвать Clipboard.AsText в текущем виде.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В richtextbox не вставляется весь текст. Обрезается на определённом месте Samyrro Windows Forms 0 28.04.2020 17:05
[РЕШЕНО][Delphi] При копировании из редактора кода или текстовых полей разработанного приложения русский текст вставляется крокозябрами / в испорченной кодировке. Вадим Мошев Общие вопросы Delphi 3 11.12.2018 18:04
Не вставляется картинка Yulia Belka HTML и CSS 6 06.09.2016 21:23
неформатированный текст из буфера в TWebBrowser? element Компоненты Delphi 0 09.12.2007 11:46
Как извлечь текст из буфера в строку? Brother Win Api 3 13.11.2007 20:19