Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Копирование русских символов в буфер обмена


Автор: Anti-Food 19.4.2005, 01:52
Произвожу копирование в буфер из переменной:
Clipboard.AsText:=S;

После чего в буфер пишутся вместо русских символов знаки вопроса, как с этим бороться? smile

Автор: Anti-Food 19.4.2005, 01:55
Да, кстати, при переключении на русскую раскладку тоже не робит.

Автор: Петрович 19.4.2005, 08:25
Какая версия Delphi?

Автор: Anti-Food 20.4.2005, 03:21
Шестая, но на седьмой тоже не работает.

Автор: Петрович 20.4.2005, 07:11
Странно. На 7 уже было подправлено. А ты абсолютно уверен что в S у тебя русская строка?

Все дело в том, что любое значение CF_TEXT (кодировка ANSI), хранящееся буфере обмена, Windows, позоляет прочитать в форматах CF_UNICODETEXT и CF_OEMTEXT. Естественно, если приложение помещавшее CF_TEXT не поместила значения CF_UNICODETEXT и CF_OEMTEXT, то они продуцируются автоматически. Для этого, производится преобразование ANSI->UNICODE и ANSI->OEM. Однако, для таких преобразований, необходимо знать какой кодовой странице принадлежат символы исходной строки. Эту информацию, Windows определяет по состоянию регистра ввода на момент копирования CF_TEXT в буфер обмена. Если в момент копирования клавиатура на русском регистре, то все будет хорошо, а вот если на аглицком, то, беда.
В принципе, уже давно известно как это "лечить". Достаточно выполнить такой REG-файл:
Код
REGEDIT4
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage]
"1250"="c_1251.nls"    ;"c_1250.nls" 
"1251"="c_1251.nls"    ;"c_1251.nls"
"1252"="c_1251.nls"    ;"c_1252.nls"

Тогда, независимо от установленной раскладки (1250,1251 или 1252), винды будут считать что у тебя в ANSI-строке символы русской кодовой страницы (1251).

Но, всегда есть вероятность наткнуться у пользователя на подобную проблему. Поэтому, я в своих программах, не доверяю эту работу виндам. Для копирования текста в клипбоард, я написал свою функцию:
Код

procedure CopyToClipboard (const Text :String);

  procedure SetTextBuffer (Format :Word; const Buffer; Size :Cardinal);
  var
    Data    :THandle;
    DataPtr :Pointer;
  begin
    Data := GlobalAlloc(GMEM_MOVEABLE+GMEM_DDESHARE, Size);
    try
      DataPtr := GlobalLock(Data);
      try
        Move(Buffer, DataPtr^, Size);
        SetClipboardData(Format, Data);
      finally
        GlobalUnlock(Data);
      end;
    except
      GlobalFree(Data);
      raise;
    end;
  end;

begin
  if not OpenClipBoard(0) then
    raise Exception.Create('Не могу открыть буфер обмена');

  try
    EmptyClipBoard;
    SetTextBuffer(CF_TEXT,                   Text [1], (Length(Text)+1)*SizeOf(    Char));
    SetTextBuffer(CF_UNICODETEXT, WideString(Text)[1], (Length(Text)+1)*SizeOf(WideChar));
  finally
    CloseClipBoard;
  end;
end;

Как использовать, думаю понятно.

На Delphi7, эту функцию использовать необязательно, поскольку там уже стандартный объект Clipboard поступает аналогично.

Но, поскольку ты пишешь:
Цитата
Да, кстати, при переключении на русскую раскладку тоже не робит.

то, у тебя похоже другая проблема. Однако, все равно проверь.

Автор: Anti-Food 21.4.2005, 07:17
Спасибо, сёдня попробую. Да кстати, вчера всё бился с этой проблеммой, так оказывается, что в breed2r всё отлично вставляется, русскими буквами, так что думаю проблемма в кодировке.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)