Форум: "Основная";
Текущий архив: 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