Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];

Вниз

Указание кодировки текста в буфере обмена   Найти похожие ветки 

 
Piter ©   (2006-02-09 18:52) [0]

Есть известный глюк - если копировать русский ANSI текст из одного приложения в буфер обмена и вставить в другое (например, из TEdit русский текст скопировать и вставить в поле ввода на WWW-страничке в Internet Explorer) - то русские символы превращаются в кракозябры.
Если копировать во время включения русской раскладки - то все ок. А если включена английская - беда :(

Беда связана с тем, что Windows не может распознать на каком языке хранится текст (принимает его за язык текущей раскладки)... И, видимо, при вставке в unicode контролы происходит искажение. Решение проблемы, видимо - это указание непосредственно на каком языке находится текст в буфере обмена.

Есть решение: http://forum.sources.ru/index.php?showtopic=93641
Но оно кривое, у меня не работает. Там такое:

procedure CopyStringToClipboard(const s: string);
var Locale: word;
begin
   //Set CF_TEXT & CF_LOCALE
   CopyDataToClipboard(CF_TEXT, s);
   Locale := GetSystemDefaultLangID;  //Get it as you please. even hard-coded ;) $0419 = LANG_RUSSIAN (f.e.)
   CopyDataToClipboard(CF_LOCALE, Chr(Lo(Locale))+Chr(Hi(Locale)));
end;

procedure CopyDataToClipboard(fmt: word; s: string);
var
   hg: THandle;
   P: PChar;
begin
   hg:=GlobalAlloc(GMEM_DDESHARE or GMEM_MOVEABLE, Length(S)+1);
   P:=GlobalLock(hg);
   StrPCopy(P, s);
   GlobalUnlock(hg);
   Clipboard.Open;
   SetClipboardData(fmt, hg); // fmt = CF_UNICODETEXT | CF_OEMTEXT | CF_TEXT | CF_LOCALE
   Clipboard.Close;
   GlobalFree(hg);
end;


У меня при вызове SetClipboardData получается, что "Неправильный указатель". А вот Jack128 утверждает, что у него все нормально. Не знаю с чем связано :(
Я поместил строчку Clipboard.Open первой:

procedure CopyDataToClipboard(fmt: word; s: string);
var
   hg: THandle;
   P: PChar;
begin
   Clipboard.Open;   //  <-----------
   hg:=GlobalAlloc(GMEM_DDESHARE or GMEM_MOVEABLE, Length(S)+1);
   P:=GlobalLock(hg);
   StrPCopy(P, s);
   GlobalUnlock(hg);    
   SetClipboardData(fmt, hg); // fmt = CF_UNICODETEXT | CF_OEMTEXT | CF_TEXT | CF_LOCALE
   Clipboard.Close;
   GlobalFree(hg);
end;


Вроде заработало, все ок. Но потом обнаружилось, что все ОК только при первом копировании. Если данный кусок кода использовать для копирования второй строчки, то уже ничего не копируется. Вообще ничего :( Что есть в буфере обмена - то и остается. Причем, SetClipboardData отрабатывает нормально, возвращает не ноль... Ничего не понимать :(

Соответственно - ищется стабильный, нормальный, проверенный годами способ установить кодировку текста в буфере обмена.


 
begin...end ©   (2006-02-09 21:26) [1]

Попробуй http://delphimaster.net/view/1-1139210575/ (сообщение [7]).


 
Piter ©   (2006-02-10 00:24) [2]

begin...end ©   (09.02.06 21:26) [1]

ага, спасибо - что надо.

Но интересно все таки - а как указать конкретный язык. Приведенный способ, как я понимаю, просто кодирует содержимое буфера в UNICODE в соответствении с настройками локали. А если локаль английская, то как указать, что текст в буфере русский? Только использовать UNICODE?



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.013 c
15-1139905285
Думкин
2006-02-14 11:21
2006.03.12
Про Асю.


5-1126694158
Juice
2005-09-14 14:35
2006.03.12
Вложенный компонент


2-1140412396
Bratskiy
2006-02-20 08:13
2006.03.12
Выравнивание по ширине строки


2-1140514284
VitV
2006-02-21 12:31
2006.03.12
ListBox+DblClick-проблема.


1-1139325958
t0mk4
2006-02-07 18:25
2006.03.12
TabControl1





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский