Автор | Сообщение |
|
| постоянный участник
|
Пост N: 191
Зарегистрирован: 27.01.07
|
|
Отправлено: 29.11.09 22:34. Заголовок: Просветите: RU866, gtwvt (Harbour) и буфер обмена Windows.
HB_gtInfo( HB_GTI_CLIPBOARDDATA ): 1. Внутри программы копирует через буфер правильно. 2. Из винды (к примеру, Word) в программу - тоже правильно. 3. А вот из программы в винду (любое приложение) - бредятина. HB_OemToAnsi() и HB_AnsiToOem() мало меняют что-либо. Русские буквы не появляются. Запутался вобщем... Подскажите.
|
|
|
Ответов - 22
, стр:
1
2
All
[только новые]
|
|
|
| постоянный участник
|
Пост N: 121
Зарегистрирован: 06.02.07
|
|
Отправлено: 29.11.09 22:56. Заголовок: У меня тоже при эксп..
У меня тоже при экспорте в Эксел получались (при копировании-вставке через буфер обмена из баз в "RU866") "крокозябры". Поборол правкой в реестре (понятно, что это как-то "через одно место" - но срабатывает): ------- для Win98 HKLM\System\CurrentControlSet\Control\Nls\Codepage у 1252 значение поменял с "cp_1252.nls" на "cp_1251.nls" ------- для WinXP - в соотв.месте (не помню точно сейчас написание - вроде без "_") Нехороших "побочных эффектов" ни я, ни пользователи (пока) не заметили (а тому уж года 2-3).
|
|
|
|
| постоянный участник
|
Пост N: 192
Зарегистрирован: 27.01.07
|
|
Отправлено: 29.11.09 23:21. Заголовок: Спасибо, но не помог..
Спасибо, но не помогло. Что еще можно попробывать?
|
|
|
|
| постоянный участник
|
Пост N: 122
Зарегистрирован: 06.02.07
|
|
Отправлено: 29.11.09 23:44. Заголовок: Тогда кусочек кода &..
Тогда кусочек кода "в студию" :) (как и что для примера берешь в клипбоард, как и куда вставляешь) Я использовал из МиниГУИ CopyToClipboard(cText) store cText in Windows clipboard RetriveTextFromClipboard() ->cText retrieve text from Windows clipboard Function CopyRtfToClipboard(cRtfText) store cRTFText in Windows clipboard Авось получится разобраться (не обещаю - но вдруг?..) В свое время тоже помучался...
|
|
|
|
| Администратор
|
Пост N: 1239
Зарегистрирован: 23.05.05
|
|
Отправлено: 30.11.09 10:37. Заголовок: Терминал, если для н..
Терминал, если для него используется oem-шрифт, при чтении из буфера обмена использует формат CF_OEMTEXT. При этом система автоматически выполняет перекодировку ansi->oem. Это работает. При записи в буфер обмена терминал также использует формат CF_OEMTEXT. Приложение windows (excel) читает буфер обмена с форматом CF_TEXT. Судя по мануалам, при этом система аналогично должна выполнять перекодировку oem->ansi. Но почему-то этого не происходит. Кстати, far корректно читает такие даные из клипбоард. Но он скорее всего сам выполняет перекодировку.
|
|
|
|
| постоянный участник
|
Пост N: 194
Зарегистрирован: 27.01.07
|
|
Отправлено: 30.11.09 10:45. Заголовок: gustow пишет: Тогда..
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 пишет фигню. :(
|
|
|
|
| Администратор
|
Пост N: 1242
Зарегистрирован: 23.05.05
|
|
Отправлено: 30.11.09 11:45. Заголовок: Если из терминала Ha..
Если из терминала Harbour отправить текст в буфер обмена, и затем просмотреть clipboard с помощью программы: http://www.nirsoft.net/utils/inside_clipboard.html то видно, что с использованием форматов CF_TEXT и CF_UNICODETEXT данные считываются верно. Почему приложения MS их неверно перекодируют - непонятно.
|
|
|
|
| постоянный участник
|
Пост N: 196
Зарегистрирован: 27.01.07
|
|
Отправлено: 30.11.09 11:55. Заголовок: Да. Так и есть...
Да. Так и есть.
|
|
|
|
| Администратор
|
Пост N: 1243
Зарегистрирован: 23.05.05
|
|
Отправлено: 30.11.09 12:00. Заголовок: Хм... VFP и vfp-прог..
Хм... VFP и vfp-программы правильно читают clipboard харбора
|
|
|
|
| Администратор
|
Пост N: 1244
Зарегистрирован: 23.05.05
|
|
Отправлено: 30.11.09 12:05. Заголовок: Вывод из всего этого..
Вывод из всего этого: можно, конечно, исправить терминал, и писать в буфер обмена с использованием формата CF_TEXT, предварительно перекодировав текст из oem в ansi Но хотелось бы понять причину, почему не срабатывает CF_OEMTEXT
|
|
|
|
| постоянный участник
|
Пост N: 197
Зарегистрирован: 27.01.07
|
|
Отправлено: 30.11.09 12:21. Заголовок: Че-та вааще непонятн..
Че-та вааще непонятно: в буфере нормально читается строка формата C_TEXT и не читается C_OEMTEXT. Т.е., получается, что преобразование прошло нормально. Может быть где-то хранится признак, что данные записаны в буфер из терминала и некоторые проги делают преобразование еще раз? Вот в Far при создании файла (Shift-F4) кодовая страница стоит "Автоматически". Откуда он берет данные?
|
|
|
|
| Администратор
|
Пост N: 1245
Зарегистрирован: 23.05.05
|
|
Отправлено: 30.11.09 14:37. Заголовок: Ага, я разобрался Ха..
Ага, я разобрался Харбор копирует текст с форматом CF_OEMTEXT, а office читает с форматом CF_UNICODETEXT При этом системе надо указать дополнительно язык по умолчанию (русский) командой SetClipboardData(CF_LOCALE, ..), иначе она берет английский, и неправильно перекодирует в unicode Поправлю.
|
|
|
|
|
| постоянный участник
|
Пост N: 199
Зарегистрирован: 27.01.07
|
|
Отправлено: 30.11.09 14:41. Заголовок: Pasha пишет: Поправ..
Pasha пишет: Где? На SVN?
|
|
|
|
| Администратор
|
Пост N: 1246
Зарегистрирован: 23.05.05
|
|
Отправлено: 30.11.09 15:25. Заголовок: Нет, на xHarbour CVS..
Нет, на xHarbour CVS На Harbour SVN я думаю перенесут
|
|
|
|
| постоянный участник
|
Пост N: 203
Зарегистрирован: 27.01.07
|
|
Отправлено: 30.11.09 15:26. Заголовок: Pasha пишет: На Har..
Pasha пишет: цитата: | На Harbour SVN я думаю перенесут |
| Да, было б неплохо. Спасибо!
|
|
|
|
| Администратор
|
Пост N: 1247
Зарегистрирован: 23.05.05
|
|
Отправлено: 30.11.09 15:46. Заголовок: в модуле src\rt..
в модуле src\rtl\gtclip.c в функции hb_gt_winapi_setClipboard() после строки SetClipboardData( uFormat, hglbCopy ); надо вставить: 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); }
|
|
|
|
| постоянный участник
|
Пост N: 206
Зарегистрирован: 27.01.07
|
|
Отправлено: 30.11.09 16:14. Заголовок: Паша, it works! Спас..
Паша, it works! Спасибо! :) Петр, можно Вас попросить на SVN это выложить? Спасибо!
|
|
|
|
| постоянный участник
|
Пост N: 125
Зарегистрирован: 06.02.07
|
|
Отправлено: 30.11.09 17:42. Заголовок: Спасибо за то, что р..
Спасибо за то, что разобрались! Еще, значит, багом меньше :) И нам всем лучше (можно будет нормально буфером обмена пользоваться - без "бубнов").
|
|
|
|
| постоянный участник
|
Пост N: 213
Зарегистрирован: 27.01.07
|
|
Отправлено: 30.11.09 18:01. Заголовок: Эээээээхххххх... ран..
Эээээээхххххх... рано я обрадовался... :) В буфер, вроде бы, нормально сохраняется. А теперь обнаружил, что не из всех программ вставляется корректно. Тот же notepad дает в кучу вопросительных знаков. Паш, может глянешь, а?... :)
|
|
|
|
| Администратор
|
Пост N: 1252
Зарегистрирован: 23.05.05
|
|
Отправлено: 30.11.09 19:47. Заголовок: Тогда сегодня уже не..
Тогда сегодня уже не буду сбрасывать на CVS, завтра еще посмотрю
|
|
|
|
| Администратор
|
Пост N: 1253
Зарегистрирован: 23.05.05
|
|
Отправлено: 01.12.09 09:20. Заголовок: Проверил notepad, вс..
Проверил notepad, вставляет из БО правильно, если указать шрифт с кириллическим набором символов. Если шрифт Terminal с кодировкой OEM/DOS, то вставляет текст все равно в кодировке 1251, т.е. неправильно, но отображаются не вопросительные знаки. Т.е. я ваш результат не получил. Еще я заметил, что язык (CF_LOCALE) надо указывать и для CF_TEXT, т.е. в условии надо добавить CF_TEXT: if( uFormat == CF_TEXT || uFormat == CF_OEMTEXT )
|
|
|
|
| Администратор
|
Пост N: 1255
Зарегистрирован: 23.05.05
|
|
Отправлено: 01.12.09 09:47. Заголовок: Из любопытства, попр..
Из любопытства, попробуйте передать русский текст из любой не-unicode программы в unicode, к примеру из vfp в ms office или outlook express Только чтобы в момент передачи (нажатие Ctrl+C) стояла английская раскладка клавиатуры Вы увидите, что unicode-приложение получит данные неправильно. Чтобы копировать правильно, надо или конвертировать текст в unicode и передавать с форматом CF_UNICODETEXT, или указывать CF_LOCALE. В общем случае для терминала харбора лучше указывать CF_LOCALE, поскольку все-таки терминал не работает в unicode Ну а блокнот... при кодировке oem он аналогично неправильно принимает данные из БО из любого приложения.
|
|
|
|
|
| постоянный участник
|
Пост N: 214
Зарегистрирован: 27.01.07
|
|
Отправлено: 01.12.09 10:12. Заголовок: Сейчас попробывал с ..
Сейчас попробывал с несколькими приложениями: Notepad, Mozilla Firefox, MS Word и Excel, Openoffice Writer, Acrobat Reader. Результат один: если в момент копирования из приложения в БО включена английская раскладка, получаем фигню, а если русская - все нормально копируется из любого приложения. Ну, с такой фичей можно смириться. :) Паша, спасибо большое! :)
|
|
|
Ответов - 22
, стр:
1
2
All
[только новые]
|
|