Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  14:17[Войти] | [Зарегистрироваться]
Ответ на вопрос № 37007

24-10-2005 02:24
Hi all.
Есть String взятый из TMemo. Помещаю его в clipboard формат CF_TEXT. При копировании в блокнот - козябры (для символов русской раскладки). Для нормального функционирования так же в clipboard нужно поместить данные форматов CF_LOCALE и CF_UNICODE. Как мне string преобразовать в WideString? Для преобразования нужно CodePage (я так понимаю это и есть CF_LOCALE). Где мне взять данные для CF_LOCALE и от чего она зависит?

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

21-05-2010 14:48 | Вопрос к автору: запрос дополнительной информации
Вопросы дабы не поднимать новую тему:

Ситуация1. Открываем нашу программу (форма и мемо). переключаем раскладку на русский. пишем текст. переключаем обратно на англ. копируем в буфер. вставляем в блокнот. результат: "?" и абракадабра...

Ситуация2. Открываем блокнот Windows. переключаем раскладку на русский. пишем текст. переключаем обратно на англ. копируем в буфер. вставляем в мемо в нашу программу (форма и мемо). результат: "?" и абракадабра...

Требуется:

1. Корректное (не "?" и не абракадабра) копирование/вставка русского текста в Windows Vista, 7, 2008, 2000, XP в/из контролов (TEdit, TMemo, TCombobox) Delphi в/из буфер обмена Windows с помощью нажатий клавиш Ctrl+C (Ins), Ctrl+V(Shift+Ins).

2. Условия: нельзя переключать раскладки клавиатуры, нужно выполнение именно по нажанию комбинация системных клавиш Ctrl+C (Ins), Ctrl+V(Shift+Ins)

нужен рабочий код

18-06-2009 02:55 | Комментарий к предыдущим ответам
>>> А я пользуюсь более коротким вариантом
Вы смешиваете вызовы API и высокоуровневой обертки - TClipboard. В данном случае ничего страшного не произойдет, но вообще лучше делать все на одном уровне. У меня, обратите внимание, все сделано на WinAPI. На базе TClipboard тот же код выглядел бы короче.

17-06-2009 23:35
А я пользуюсь более коротким вариантом:

    Clipboard.Open;
    Clipboard.AsText := AText;
    hClipbrd := Clipboard.GetAsHandle(CF_TEXT);
    if hClipbrd = INVALID_HANDLE_VALUE then
      Result := False
    else  SetClipboardData(CF_LOCALE, hClipbrd);
    Clipboard.Close;


08-03-2008 15:30 | Комментарий к предыдущим ответам
>>> чтобы получить в немецкой виндос русский текст?
Абсолютно никак. Это Вам к компании Promt. Я переводчиками не занимаюсь.

17-02-2008 01:47 | Вопрос к автору: запрос дополнительной информации
ув. Python, скажите пожалуста, как применять вашу процедуру PureClip чтобы получить в немецкой виндос русский текст? в ней ведь нет передаваемых параметров
спасибо

14-03-2006 01:30 | Комментарий к предыдущим ответам
Приведенный код - то же самое, что и я привел (первая версия), только использует объект Clipboard, а я - только WinAPI

20-02-2006 06:32
Я делаю вот так:


//язык берём по-умолчанию
LangID:= GetUserDefaultLangID;
hMemLocale:= GlobalAlloc(GMEM_MOVEABLE or GMEM_DDESHARE or GMEM_ZEROINIT, 4);
Win32Check(hMemLocale <> 0);
try
  pMemLocale:= GlobalLock(hMemLocale);
  Win32Check(pMemLocale <> nil);
  try
    Move(LangID, pMemLocale^, 4);
  finally
    GlobalUnLock(hMemLocale);
  end;
  Clipboard.SetAsHandle(CF_LOCALE, hMemLocale);
except
  GlobalFree(hMemLocale);
end;

hMemUniversal:= GlobalAlloc(GMEM_MOVEABLE or GMEM_DDESHARE or GMEM_ZEROINIT, Length(Data));
Win32Check(hMemUniversal <> 0);
try
  pMemUniversal:= GlobalLock(hMemUniversal);
  Win32Check(pMemUniversal <> nil);
  try
    Move(Data[1], pMemUniversal^, Length(Data));
  finally
    GlobalUnLock(hMemUniversal);
  end;
  Clipboard.SetAsHandle(CF_TEXT, hMemUniversal);
except
  GlobalFree(hMemUniversal);
end;



03-02-2006 02:48 | Комментарий к предыдущим ответам
To Сергей Рощин:
Это ты мне? Ну... строго говоря, ничего тут особенного в этом коде и нет, просто надоело копировать текст в Блокнот, чтобы удалить из него все форматирование...

02-02-2006 07:49 | Комментарий к предыдущим ответам
Может, уже назрела необходимость написать статью в сокровишницу???

01-02-2006 07:56
Вот, довел функцию до конца. Вытаскивает чистые текстовые данные из любого буфера:

procedure PureClip;
function ValidText(P:PWideChar;Size:cardinal):boolean;
// проверяет, что текст не нуждается в перекодировке
var I:cardinal;
begin
Result:=false; // текст нуждается в перекодировке - умолчание
For I:=0 to pred(Size) do if PChar(P)[2*I+1]<>#0 then exit;
  // если обнаружен не локальный символ, выходим
Result:=true; // если нелокальные символы не найдены -
  // текст в перекодировке не нуждается
end;
var Data,NewSize,NewData,CodePage:integer;
    DataPtr,NewPtr:pchar;
    DataPtrW:PWideChar;
begin
if OpenClipboard(GetForegroundWindow) then begin // монопольно пользовать буфер
  CodePage:=$419;
  Data:=GetClipboardData(CF_UNICODETEXT); // сохранить прежние текстовые данные
  if Data<>0 then begin // существуют текст в юникоде
  DataPtrW:=GlobalLock(Data);
  if ValidText(DataPtrW,GlobalSize(Data) div 2) then begin
    // текст не нуждается в перекодировке
    GlobalUnlock(Data);
    Data:=GetClipboardData(CF_TEXT); // получаем обычный текст
    if Data=0 then begin CloseClipboard;exit;end;
    NewSize:=GlobalSize(Data);
    DataPtr:=GlobalLock(Data);
    NewData:=GlobalAlloc(GMEM_MOVEABLE+GMEM_DDESHARE,NewSize);
    NewPtr:=GlobalLock(NewData);
    MoveMemory(NewPtr,DataPtr,NewSize); // копируем на новое место
    GlobalUnlock(Data);
  end else begin
    NewSize:=WideCharToMultiByte(0,WC_COMPOSITECHECK,DataPtrW,-1,nil,0,nil,nil);
    Assert(NewSize<>0,'NewSize must not be zero!'); // ошибка?
    NewData:=GlobalAlloc(GMEM_MOVEABLE+GMEM_DDESHARE,NewSize);
    // узнали размер перекодированной строки
    NewPtr:=GlobalLock(NewData);
    if WideCharToMultiByte(0,WC_COMPOSITECHECK,DataPtrW,-1,NewPtr,NewSize,nil,nil)=0 then raiselastoserror;
    // перекодировали
    GlobalUnlock(Data);
  end;
  end else begin // не найдена юникодовая страница
  Data:=GetClipboardData(CF_TEXT);
  if Data=0 then begin CloseClipboard;exit;end; // текстовых данных нет
  NewSize:=GlobalSize(Data);
  DataPtr:=GlobalLock(Data);
  NewData:=GlobalAlloc(GMEM_MOVEABLE+GMEM_DDESHARE,NewSize);
  NewPtr:=GlobalLock(NewData);
  MoveMemory(NewPtr,DataPtr,NewSize); // скопировали на новое место
  GlobalUnlock(Data);
  end;
  GlobalUnlock(NewData); // разблокировали новые данные
  EmptyClipboard; // убить буфер
  Data:=GlobalAlloc(GMEM_MOVEABLE+GMEM_DDESHARE,4);  // Назначить кодовую страницу для буфера обмена
  DataPtr:=GlobalLock(Data);
  MoveMemory(DataPtr,@CodePage,4);
  GlobalUnlock(Data);
  SetClipboardData(CF_LOCALE,Data); // записать кодовую страницу
  SetClipboardData(CF_TEXT,NewData); // вернуть новые данные для буфера обмена
  CloseClipboard; // закрыть буфер
end;
end;


Прошу обо всех глюках сообщать либо здесь, либо мне в СЛС.

28-01-2006 05:21 | Комментарий к предыдущим ответам
Ой, извините, автор вопроса писал мне в личную почту, что такое PasteOnPureClip, так это не нужно, прочто я выдрал код из рабочей программы. Надо так (это уже не автору, а для потомков):

procedure PureClip;
var Data,NewSize,NewData,CodePage:integer;
    DataPtr,NewPtr:pchar;
begin
CodePage:=$419;
if OpenClipboard(GetForegroundWindow) then begin // монопольно пользовать буфер
  Data:=GetClipboardData(CF_TEXT); // сохранить прежние текстовые данные
  if Data=0 then begin CloseClipboard;exit;end;
  NewSize:=GlobalSize(Data);
  DataPtr:=GlobalLock(Data);
  NewData:=GlobalAlloc(GMEM_MOVEABLE+GMEM_DDESHARE,NewSize);
  NewPtr:=GlobalLock(NewData);
  MoveMemory(NewPtr,DataPtr,NewSize);
  EmptyClipboard; // убить буфер
  Data:=GlobalAlloc(GMEM_MOVEABLE+GMEM_DDESHARE,4);  // Назначить кодовую страницу для буфера обмена
  DataPtr:=GlobalLock(Data);
  MoveMemory(DataPtr,@CodePage,4);
  GlobalUnlock(Data);
  SetClipboardData(CF_LOCALE,Data);
  GlobalUnlock(NewData);
  SetClipboardData(CF_TEXT,NewData); // вернуть новые данные для буфера обмена
  CloseClipboard; // закрыть буфер
end;
end;


Это для русской Windows. Для зарубежных надо скорее всего использовать Unicode.

10-12-2005 09:02
Вот так я уничтожаю информацию о кодировке в имеющемся буфере:

procedure PureClip;
var Data,NewSize,NewData,CodePage:integer;
    DataPtr,NewPtr:pchar;
begin
CodePage:=$419;
if OpenClipboard(GetForegroundWindow) then begin // монопольно пользовать буфер
  Data:=GetClipboardData(CF_TEXT); // сохранить прежние текстовые данные
  if Data=0 then begin CloseClipboard;exit;end;
  NewSize:=GlobalSize(Data);
  DataPtr:=GlobalLock(Data);
  NewData:=GlobalAlloc(GMEM_MOVEABLE+GMEM_DDESHARE,NewSize);
  NewPtr:=GlobalLock(NewData);
  MoveMemory(NewPtr,DataPtr,NewSize);
  EmptyClipboard; // убить буфер
  Data:=GlobalAlloc(GMEM_MOVEABLE+GMEM_DDESHARE,4);  // Назначить кодовую страницу для буфера обмена
  DataPtr:=GlobalLock(Data);
  MoveMemory(DataPtr,@CodePage,4);
  GlobalUnlock(Data);
  SetClipboardData(CF_LOCALE,Data);
  GlobalUnlock(NewData);
  SetClipboardData(CF_TEXT,NewData); // вернуть новые данные для буфера обмена
  CloseClipboard; // закрыть буфер
  if PasteOnPureclip then begin // вставить, если необходимо
  Wait(DelayCopy,GetForegroundWindow);
  SendHotkey(HotPaste);
  Wait(1,GetForegroundWindow);
  end;
end;
end;


24-10-2005 06:22
Используйте CF_UNICODETEXT, тогда программно можно преобразовать русский текст в юникод и работать уже с ним.

WText:=WideString(Text);


см. также AnsiToUtf8Ex, MultiByteToWideChar

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Жили у бабуси два веселых гуся. Один белый, другой КАКОЙ?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования