Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Указание кодировки текста в буфере обмена


Piter ©   (2006-02-09 18:52:00) 

Есть известный глюк - если копировать русский 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;   //  


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

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

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

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


begin...end   (2006-02-09 21:26:00) [2]

Попробуй http://www.delphimaster.ru/cgi-bin/forum.pl?id=1139210575&n=0(сообщение [7]).


Наверх

Титульная страница Поиск, карта сайта Написать письмо