Главная страница
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.038 c
15-1140355402
Ruban
2006-02-19 16:23
2006.03.12
Ctrl+Z


3-1137764603
UnDISCOvery
2006-01-20 16:43
2006.03.12
ADOConnection не отпускает БД Access после Close!


2-1140430400
Елизавета
2006-02-20 13:13
2006.03.12
CheckBox как столбец компонента TStringGrid


2-1140780704
Ландграф Павел
2006-02-24 14:31
2006.03.12
Получить из относительного пути абсолютный


15-1140374398
ArtemESC
2006-02-19 21:39
2006.03.12
Как "замереть" по таймеру...