Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Копирование русских символов в буфер обмена, ... 
:(
    Опции темы
Anti-Food
Дата 19.4.2005, 01:52 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Произвожу копирование в буфер из переменной:
Clipboard.AsText:=S;

После чего в буфер пишутся вместо русских символов знаки вопроса, как с этим бороться? smile
  Вверх
Anti-Food
Дата 19.4.2005, 01:55 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Да, кстати, при переключении на русскую раскладку тоже не робит.
  Вверх
Петрович
Дата 19.4.2005, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



Какая версия Delphi?


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Anti-Food
Дата 20.4.2005, 03:21 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Шестая, но на седьмой тоже не работает.
  Вверх
Петрович
Дата 20.4.2005, 07:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



Странно. На 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 поступает аналогично.

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

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

Это сообщение отредактировал(а) Петрович - 20.4.2005, 07:12


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Anti-Food
Дата 21.4.2005, 07:17 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо, сёдня попробую. Да кстати, вчера всё бился с этой проблеммой, так оказывается, что в breed2r всё отлично вставляется, русскими буквами, так что думаю проблемма в кодировке.
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0969 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.