Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.12;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.061 c
2-1140711582
13
2006-02-23 19:19
2006.03.12
проблема с XPMAN


2-1140698392
macpm
2006-02-23 15:39
2006.03.12
Печать содержимого PaintBox


2-1140589417
Bratskiy
2006-02-22 09:23
2006.03.12
Почему не выводится текст?


15-1139220980
lak__b
2006-02-06 13:16
2006.03.12
Подскажите пожалуйста на счет мобил


15-1140418427
Бугага
2006-02-20 09:53
2006.03.12
Нет ли у кого этих двух книг в электронном варианте?