Форум » [x]Harbour » Просветите: RU866, gtwvt (Harbour) и буфер обмена Windows. » Ответить

Просветите: RU866, gtwvt (Harbour) и буфер обмена Windows.

PSP: HB_gtInfo( HB_GTI_CLIPBOARDDATA ): 1. Внутри программы копирует через буфер правильно. 2. Из винды (к примеру, Word) в программу - тоже правильно. 3. А вот из программы в винду (любое приложение) - бредятина. HB_OemToAnsi() и HB_AnsiToOem() мало меняют что-либо. Русские буквы не появляются. Запутался вобщем... Подскажите.

Ответов - 22, стр: 1 2 All

gustow: У меня тоже при экспорте в Эксел получались (при копировании-вставке через буфер обмена из баз в "RU866") "крокозябры". Поборол правкой в реестре (понятно, что это как-то "через одно место" - но срабатывает): ------- для Win98 HKLM\System\CurrentControlSet\Control\Nls\Codepage у 1252 значение поменял с "cp_1252.nls" на "cp_1251.nls" ------- для WinXP - в соотв.месте (не помню точно сейчас написание - вроде без "_") Нехороших "побочных эффектов" ни я, ни пользователи (пока) не заметили (а тому уж года 2-3).

PSP: Спасибо, но не помогло. Что еще можно попробывать?

gustow: Тогда кусочек кода "в студию" :) (как и что для примера берешь в клипбоард, как и куда вставляешь) Я использовал из МиниГУИ [pre2]CopyToClipboard(cText) store cText in Windows clipboard RetriveTextFromClipboard() ->cText retrieve text from Windows clipboard Function CopyRtfToClipboard(cRtfText) store cRTFText in Windows clipboard [/pre2]Авось получится разобраться (не обещаю - но вдруг?..) В свое время тоже помучался...


Pasha: Терминал, если для него используется oem-шрифт, при чтении из буфера обмена использует формат CF_OEMTEXT. При этом система автоматически выполняет перекодировку ansi->oem. Это работает. При записи в буфер обмена терминал также использует формат CF_OEMTEXT. Приложение windows (excel) читает буфер обмена с форматом CF_TEXT. Судя по мануалам, при этом система аналогично должна выполнять перекодировку oem->ansi. Но почему-то этого не происходит. Кстати, far корректно читает такие даные из клипбоард. Но он скорее всего сам выполняет перекодировку.

PSP: gustow пишет: Тогда кусочек кода "в студию" Пожалуйста: FUNCTION GetCopyPaste( nMode ) LOCAL o := GetActive() LOCAL c IF ISNIL( o ) RETURN NIL END // IF IF nMode == 1 // Copy IF ! ISNIL( o:Buffer ) HB_GTInfo( HB_GTI_CLIPBOARDDATA, AllTrim( o:Buffer ) ) END // IF ELSEIF nMode == 2 // Paste c := HB_GTInfo( HB_GTI_CLIPBOARDDATA ) IF ! ISNIL( c ) .and. ! Empty( c ) .and. ! ISNIL( o:Buffer ) KEYBOARD SubStr( c, 1, Len( o:Buffer ) ) o:Display() END // IF END // IF RETURN NIL Функция назначена на горячую клавишу в SetKey(). Работает, если активен какой-либо GET. Pasha пишет: Кстати, far корректно читает такие даные из клипбоард У меня и Far пишет фигню. :(

Pasha: Если из терминала Harbour отправить текст в буфер обмена, и затем просмотреть clipboard с помощью программы: http://www.nirsoft.net/utils/inside_clipboard.html то видно, что с использованием форматов CF_TEXT и CF_UNICODETEXT данные считываются верно. Почему приложения MS их неверно перекодируют - непонятно.

PSP: Да. Так и есть.

Pasha: Хм... VFP и vfp-программы правильно читают clipboard харбора

Pasha: Вывод из всего этого: можно, конечно, исправить терминал, и писать в буфер обмена с использованием формата CF_TEXT, предварительно перекодировав текст из oem в ansi Но хотелось бы понять причину, почему не срабатывает CF_OEMTEXT

PSP: Че-та вааще непонятно: в буфере нормально читается строка формата C_TEXT и не читается C_OEMTEXT. Т.е., получается, что преобразование прошло нормально. Может быть где-то хранится признак, что данные записаны в буфер из терминала и некоторые проги делают преобразование еще раз? Вот в Far при создании файла (Shift-F4) кодовая страница стоит "Автоматически". Откуда он берет данные?

Pasha: Ага, я разобрался Харбор копирует текст с форматом CF_OEMTEXT, а office читает с форматом CF_UNICODETEXT При этом системе надо указать дополнительно язык по умолчанию (русский) командой SetClipboardData(CF_LOCALE, ..), иначе она берет английский, и неправильно перекодирует в unicode Поправлю.

PSP: Pasha пишет: Поправлю Где? На SVN?

Pasha: Нет, на xHarbour CVS На Harbour SVN я думаю перенесут

PSP: Pasha пишет: На Harbour SVN я думаю перенесут Да, было б неплохо. Спасибо!

Pasha: в модуле src\rtl\gtclip.c в функции hb_gt_winapi_setClipboard() после строки SetClipboardData( uFormat, hglbCopy ); надо вставить: [pre2] if( uFormat == CF_OEMTEXT ) { HGLOBAL hglbLocale = GlobalAlloc(GMEM_MOVEABLE, 4); DWORD lcid = (DWORD) GlobalLock(hglbLocale); lcid = LOCALE_USER_DEFAULT; GlobalUnlock(hglbLocale); SetClipboardData(CF_LOCALE, hglbLocale); }[/pre2]

PSP: Паша, it works! Спасибо! :) Петр, можно Вас попросить на SVN это выложить? Спасибо!

gustow: Спасибо за то, что разобрались! Еще, значит, багом меньше :) И нам всем лучше (можно будет нормально буфером обмена пользоваться - без "бубнов").

PSP: Эээээээхххххх... рано я обрадовался... :) В буфер, вроде бы, нормально сохраняется. А теперь обнаружил, что не из всех программ вставляется корректно. Тот же notepad дает в кучу вопросительных знаков. Паш, может глянешь, а?... :)

Pasha: Тогда сегодня уже не буду сбрасывать на CVS, завтра еще посмотрю

Pasha: Проверил notepad, вставляет из БО правильно, если указать шрифт с кириллическим набором символов. Если шрифт Terminal с кодировкой OEM/DOS, то вставляет текст все равно в кодировке 1251, т.е. неправильно, но отображаются не вопросительные знаки. Т.е. я ваш результат не получил. Еще я заметил, что язык (CF_LOCALE) надо указывать и для CF_TEXT, т.е. в условии надо добавить CF_TEXT: if( uFormat == CF_TEXT || uFormat == CF_OEMTEXT )



полная версия страницы