| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Проблемы русского языка в Delphi |
| Автор: Oleg 30.3.2003, 00:23 |
| У меня прога, созданная в делфях (все шрифты форм по умолчанию, язык русский), в некоторых аккаунтах винды2000 пишет вместо русских слов |
| Автор: serious 30.3.2003, 00:39 |
| Может в винде дело? Какая винда-то, кстати? SP или еще чего? |
| Автор: Alex 31.3.2003, 15:44 |
| Если вам высвечиваются вместо букв знаки вопроса то это проблема Unicode возможно какие-то из компонентов, которые вы используете, ее не поддерживают. Проблема очень хорошо известна пользователям ХР, она возникает при копировании русского текста к примеру из Delphi в блокнот в том случае когда установлена английская раскладка клавиатуры. Чтобы скопировать текст нормально нужно перед копированием переключиться на русскую раскладку и спокойно копировать все будет нормально. Да кстати, а какая Delphi |
| Автор: Oleg 31.3.2003, 19:22 |
| Borland Delphi7, Microsoft Windows 2000 v 5.00.2195 ServicePack 3. Да ничего я вроде экзотического не использую. Я ж говорю, во всех формах проекта, начиная с главной такая вот белибердень. |
| Автор: SmaLL 31.3.2003, 19:41 |
| У меня дома всЁ стоит аналогичное и всЁ - ОК А на работе Д6, так перенос у меня никаких проблем не вызывает. Если формы сохранены как текст, то как это дело в фаре отображается или в блокноте?? Посмотри в настройках какой используется шрифт для отображения в ID. И ещЁ, типа можно попробовать в реестре в NLS/Codepages поменять 1252 на 1251... |
| Автор: 3D-Dragon 3.4.2003, 17:57 | ||||
| патч реестра вылечит ... 9x.ME.reg
NT.2k.XP.reg
|
| Автор: Alexeis 13.7.2006, 14:28 |
| Заново поднимаю эту тему! Указанный патч не безапасен если в системе установленно кроме руского и английского языков какой нибудь еще. При этом нарушается правельное определенияе раскладок клавиатуры. Если у вас установлено три или более языков ни в коем случае не делайте такой патч - я таким образом попортил реестры на двух компах, один из которых мой |
| Автор: Yanis 13.7.2006, 14:33 |
| Добавлю только, что Snowy очень хорошо отписался о решении этой проблемы. http://forum.vingrad.ru/index.php?showtopic=82093 alexeis1 Ручами можно исправить там где испорчено |
| Автор: Alexeis 13.7.2006, 14:52 |
| Yanis, Эту тему я хорошо знаю, но этот пач лечил не только свои, но и чужие проги имеющие те же проблемы! А мне не свою лечить надо было! Оказывается не лечил, а калечил винду. <offtop>это понятно но догадался кто виноват я лишь тогда, когда узнал, что на втором компе те же глюки что и у меня!</offtop> |
| Автор: Snowy 13.7.2006, 15:13 |
| Нужна только эта строчка. Остальные трогать не нужно. Кроме того, выставить в региональных настройках русский для неюникодных программ. Если это не подходит, то писать лаунчер, который будет делать SetThreadLocale для запускаемоу программы. |
| Автор: Alexeis 13.7.2006, 15:48 |
т.е. так createpocess(...,...,'some.exe',somethreadID,.... ); SetThreadLocale(somethreadID,1251); |
| Автор: Snowy 13.7.2006, 16:03 |
| Угу. Правда не разу не пробовал, но по логике должно работать. Запускаемая программа на дельфи? |
| Автор: Alexeis 13.7.2006, 16:10 |
думаю нет, да речь идет не только об одной проге, такая ситуация появляется довольно часто с недоотлажеными прогами. Тема немного откланилась я попробую как сказал Snowy, как получится отпишусь... |
| Автор: Alexeis 14.7.2006, 09:42 |
| Очередной раз убеждаюсь windows хорошо работает, только если на него ничего не установлено и поставлен он с настройками по умалчанию Найти "концы" я так и не смог, но хоть и криво но все поправил! Однако (теперь по теме), обнаружил, что SetThreadLocale - работает только с текущим потоком, а это значит, что без заморочки с хуками здесь не обойтись - получится совсем криво Может кто знает такую же функцию (SetThreadLocale), но только для внесения изменений в чужой поток? |
| Автор: Alexeis 14.7.2006, 10:34 |
| Yanis че`т я не понял последнего поста. Про MSDN я и сам знаю, по нему и писал пост....????? Так лаунчер это друрой поток, свой поток (лаунчера) он настроит, а вот поток приложения (для него чужой) который запустит лаунчер я не могу настроить, при помощи этой функции. |
| Автор: Yanis 14.7.2006, 11:13 |
| alexeis1, Snowy имел ввиду запуск дочернего (или не дочернего) процесса и уже "из него" вызвать SetThreadLocale путём вызова CreateRemoteThread(hRemouteProc, ..... Тока перед этим надобно память выделить в процессе кажется |
| Автор: Alexeis 14.7.2006, 11:22 |
Это что-то новенькое, про дочерний поток я слышал, а проэто нет! Так как же я могу это сделать из него - он же чужая программа, не встраивать же в него свой код! А вот про CreateRemoteThread тоже не слышал - сейчас буду разбираться! Добавлено @ 11:31 Ух-ты CreateRemoteThread - это серьезно буду пробовать, а вот этого в helpe я не увидел! |
| Автор: Yanis 14.7.2006, 11:43 |
| alexeis1 Я в этом советчик не очень хороший. Но сам посуди - мы вызываем функцию о которой процесс и не знает, причём ещё и параметры нуна передавать ему. На сколько я понимаю проще всего сделать внедрение dll. По этому поводу есть хороший пример у роуза на его сайте. http://forum.vingrad.ru/index.php?act=Search&CODE=show&searchid=0239ef6752fa8e2b3eb5c67989895be2&search_in=posts&result_type=topics&flag=search&debug=&highlite=%E2%ED%E5%E4%F0%E5%ED%E8%E5+and+%EA%EE%E4&skipped= |
| Автор: Alexeis 14.7.2006, 12:16 |
| Понял! память нужна если мы хотим передать что-то этому "присосавшемуся" потоку, а если нет, то я думаю можно обойтись nil Спасибо Yanis! |
| Автор: Yanis 14.7.2006, 13:25 |
| alexeis1 Могу накатать пример с получением командной строки чужого процесса. Суть тут та же: вызов функции GetCommandLine из чужого процесса, т.к. GetCommandLine позволяет получать только "свою" коммандную строку. Правда без CreateRemouteThred, но довольно показательный пример. P. S. мона и через CreateRemouteThred извратиться, т.к. GetCommandLine возврящает всего 4 байта |
| Автор: bems 14.7.2006, 13:53 |
| Тут еще попутно такой вопрос, а не знает кто, как в консоли русский текст нормально выводить? |
| Автор: Snowy 14.7.2006, 14:09 |
| Знаем. Или перекодировать в OEM (AnsiToOEM) или выводить в юникоде. |
| Автор: Yanis 14.7.2006, 14:34 |
| bems В чужой консоли? |
| Автор: Alexeis 14.7.2006, 14:52 |
| Yanis, Не он в своей, в чужой-то он ничего не выведет |
| Автор: Snowy 14.7.2006, 14:54 |
| SetConsoleCP SetConsoleOutputCP |
| Автор: bems 17.7.2006, 08:45 |
| Вот это и интригует. Вроде функции специально для этого предназанчены, но чтобы заработало так и не вышло А это как понимать? |
| Автор: Alexeis 17.7.2006, 09:02 |
Я понял, что русский теткст не выводится в консоли написаной вами, а не в программе написанной другим человеком, другими словами вы пытаетесь исправить свои ошибки, а не ошибки автора чужой программы. Вопрос был задан потому, что тема была поднята, как попытка исправить недароботки в чужих программах. |
| Автор: Alexeis 17.7.2006, 09:37 | ||
|
| Автор: Ramin 17.7.2006, 11:02 | ||
не читал посты который ответили тебя но ты посмотри на Языке и Регионалы... какой чзык там у тя стоит? |
| Автор: Yanis 17.7.2006, 11:47 |
| Ramin Я думаю, что вопрос 3-х летней давности уже решён. |
| Автор: bems 17.7.2006, 12:05 |
| Yanis, alexeis1, в своей Хотелось бы русифицировать саму консоль и писать обычным Writeln. Вот SetConsoleOutputCP по описанию - то что надо, но в моих кривых руках не работает. |
| Автор: Alexeis 17.7.2006, 13:12 |
| bems, Я прогнал 2100 страниц - от 1 до 2100 Все одно и тоже, эти функции не меняют кодировку |
| Автор: Alexeis 17.7.2006, 13:54 | ||
А вот так можно все кодировки просмотреть - результат анологичний
|