Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: Для новичков > В мемо отображется ????? вместо слов |
Автор: RinOSpro 5.11.2007, 20:56 |
Когда в мемо копируют из блокнота вместо букв одни ????????????? вопросы? Что это такое? И как это исправить? |
Автор: Alexeis 5.11.2007, 21:12 |
Или использовать юникодные контролы, который пока что нет в делфях ![]() |
Автор: RinOSpro 5.11.2007, 21:56 |
Нет у меня нормально. Я дал другу прогу. Он говорит типа копирует из блокнота в мемо ctrl-c ctrl-v и вот такие закарючки. У меня все норм. Я както давно слышал что вроде в реестр чтото надо добавить. Только что и куда хз. |
Автор: Alexeis 5.11.2007, 23:57 |
RinOSpro, не не поможет тут реестр. Винда должна знать при помощи какой кодовой таблицы юникод в анси перекодировать. Где-то тут я показывал решение проблемы с ручным извлечением из буфера текста. |
Автор: RinOSpro 7.11.2007, 00:00 | ||||
Дай пожалуста ссылочку не найду никак. Добавлено через 10 минут и 15 секунд
Да это оно. Только как это программно лечить? Это случайно не то: function GetKeyboardState(var KeyState: TKeyboardState): BOOL; stdcall; function SetKeyboardState(var KeyState: TKeyboardState): BOOL; stdcall; |
Автор: WaReZMEN 7.11.2007, 08:18 |
Проблема решается просто нужно в реестре в ключе HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Nls\CodePage заменить с параметр 1251 по 1255 значение поставить c_1251.nls. Перезапустить комп и рабоватся ![]() |
Автор: Rennigth 7.11.2007, 15:19 | ||
гм... а
тут не поможет? Добавлено через 49 секунд http://forum.vingrad.ru/forum/topic-82093/hl/setthreadlocale/index.html |
Автор: RinOSpro 7.11.2007, 15:49 | ||
А никаких последствий не будет. Типа другие приложения начнут показывать ???? ?????? ???? ????? |
Автор: Rennigth 7.11.2007, 16:05 |
RinOSpro, попробуй SetThreadLocale, все должно быть пучком ![]() ![]() |
Автор: WaReZMEN 8.11.2007, 02:11 |
Rennigth, проблем не будет... более того я тебе скажу что это не тока с memo косяк такои получается но и фотошоп руские буквы не видет пока в реестре не подправиш... |
Автор: Bose 8.11.2007, 13:24 | ||
Ты не поверишь, но помимо русских кодовых страниц существует масса других. И именно их ты и похеришь своими правками в реестре. |
Автор: Snowy 8.11.2007, 13:55 |
WaReZMEN, таким "мастерам" нужно руки отрывать. После такого "исправления" в 98-х виндах не будет и ???. Вообще никаких знаков не будет. В частности в том же фотошопе. Только пустота, вместо русских символов (и не только русских). И во вторых, тебя пользователь просил менять ЕГО настройки системы? Нужно подстраивать программу под систему, а не систему под свою программу. |
Автор: Alix 8.11.2007, 14:40 | ||
Ты не прав. Для 5 и 6го фотошопа под 98 виндой это был реально рабочий метод добавить ему поддержку кириллицы при написании надписей (а, возможно, и названий слоев). Версии CS* (8-10) под XP никаких исправлений не требуют. В остальном я с тобой согласен. |
Автор: Snowy 8.11.2007, 15:17 | ||
В 9х файлы называются не c_1251.nls, а cp_1251.nls (или что-то в этом роде.) Соответственно, указывая c_1251.nls мы указываем то, чего нет. И получаем соответствующий эффект... И как итог - угробим систему. Откуда юзеру знать, что в таком-то месте реестра не хватает буквочки? Ему придётся сносить винду и радостно в матерной форме благодарить автора программы. Не знали об этом? Тогда мой вам совет - лучше не трогайте систему - не создадите проблем. Пользователь вообще может не знать русского. А просто захотел запустить - посмотреть что там. И после этого его немецкая винда будет оккупирована кирилицей. Вот радость то... |
Автор: Alexeis 8.11.2007, 16:54 |
Вот тут есть тот метод http://forum.vingrad.ru/index.php?show_type=forum&showtopic=82093&st=30&hl=%D0%BE%D0%B1%D0%BC%D0%B5%D0%BD%D0%B0# |
Автор: Akella 8.11.2007, 21:27 | ||||||
WinXP + SP D2007 + Upd3 re1 это TcxRichEdit, в котором находится русский текст tlf2 типа string
![]()
Не помогает Добавлено через 7 минут и 53 секунды помогло это:
всё-таки приходится подстраивать систему под программу :( |
Автор: WaReZMEN 12.11.2007, 01:12 | ||||
Наконецто бан сняли....
Вот вот... А все начали кричать я просто дал совет как я с этим борюсь. Я не говорил что это панацея от всех бед... Но в результате правки в реестре ни разу за 5 лет касиков не видел... Если ему мои способ не понравится пусть не пользуется... Я канечно согласен что систему под программу не стоит настраивать.... но иногда нужно... |
Автор: aktuba 12.11.2007, 03:17 | ||
А теперь попробуй, дай программу тому, у кого используется 1252-кодировка. Много нового о себе узнаешь ![]()
А я видел. Когда за границей мою программу запустили. И скажу, что это очень не хорошо! Пишешь для себя и никаких проблем? Ок. Но не надо плохому учить других!!! |
Автор: WaReZMEN 12.11.2007, 09:07 |
aktuba, речи не было о том что на другом компе ему запускать.... он спросил про свои комп... И если ты за границу пишеш то нахрен на руском??? с Английскои кодировкокой то все ок. |
Автор: Akella 12.11.2007, 09:07 |
aktuba, ![]() ![]() ![]() Добавлено через 3 минуты и 38 секунд WaReZMEN, программы в основном создаются НЕ для своего компа, но всё равно на др. компах, как правило установлены точно такие же ОСи. Уважаемые, а может вернёмся к теме? Может всё-таки есть варианты для более старших версий Delphi, нежели 5-7 Добавлено через 3 минуты и 51 секунду хотелось бы поиметь для 2007 |
Автор: WaReZMEN 12.11.2007, 09:17 |
Akella, Спасибо за поддержку. ![]() |
Автор: MetalFan 12.11.2007, 09:36 |
афигенные проблемы будут у пользователя, если понадобится работать с кодовыми страницами, которые "добрые" программисты таким образом похерили. я уже столкнулся с такой проблемой. самый не травмирующий ОС вариант |
Автор: Alexeis 12.11.2007, 11:49 | ||
Я тоже, у меня были проблемы с румынским языком. Ручное извлечение совсем не изящное :( , но работает. Изящно только на KOL с использованием юникодных контролов. |
Автор: aktuba 12.11.2007, 12:52 | ||||
Может все-таки начнем читать другие посты в топе тоже? Этот всего лишь 4-й... А насчет за границу по-русски... Видишь ли, и за рубежом иногда живут русские ;) Вроде как дали уже хороший способ ;) Еще один способ - использовать юникодные контролы. Хватит? Аналогично. Akella, WaReZMEN, из 11 человек, которые отписали в этом топе - 3 сталкивались с проблемой после правки реестра. 3/11 = 27%, как мне кажеться весомый аргумент против данного способа. |
Автор: Akella 12.11.2007, 21:44 |
я согласен, что весомые, а также согласен, что нехорошо менять 1252 на 1251 ![]() Но программа (снимок см. выше) работает со сравнительно большими объемами текстов, как минимум 5 метров в каждом файле. А файлов нужно обработать около 4-5 за одно утро. Файл нужно загрузить в мемо, потом пробежаться по всем строкам мемо и нужные выдернуть в нижнюю таблицу. Поэтому оперирование данными через буфер замедлит работы программы ещё больше. |
Автор: WaReZMEN 13.11.2007, 01:20 |
Народ ну скажите деиствующий способ!!!! не меняя 1252 на 1251. |
Автор: Alexeis 13.11.2007, 02:10 |
Akella, то что у тебя это просто глюк какой-то. Может в мемо просто чарсет не руский стоит и все. |
Автор: WaReZMEN 13.11.2007, 04:30 |
У меня такои косят был не только когда в мемо вставляеш... но и просто в редактор кода на Дельфе... |
Автор: aktuba 13.11.2007, 05:10 |
Автор: WaReZMEN 13.11.2007, 09:47 |
Не вы скажите как исправит чтоб showmessege не показывал "???? ??????????" |
Автор: Alexeis 13.11.2007, 10:28 | ||
Можно до посинения вопить, но такие проблемы по-любому будут для контролов созданных при помощи функции CreateWindowA/CreateWindowExA и в делфи и вижаулке шестой и во многих других мемах. в системах NT анси строки приводятся к юникоду, а при получении от них результата (если это функции оканчивающиеся а "А") происходить обратное преобразование Юникод -> Анси, вот тут то и происходят все проблемы, поскольку в юникоде букав многа а в анси мало, потому как их интерпретировать зависит от чарсета. Чарсет определяет какой же символ будет у символа с данным кодом. 1) При работе с буфером обмена чарсет определяется текущим языком. 2) В мемо и др. компонентах чарсет можно установить (свойство Font). Если чарсет не верный, то вместо русских символов будут символы другой кодировкой. Если в системе нет такого РУССКОГО шрифта, то винде рисовать будет нечего, в лучшем случае она попытается заменить его другим кирилистическим шрифтом, но не всегда. SetThreadLocale устанавливает дефолтную локаль для преобразования юникод -> Анси, это тоже что и установка в реестре. 3) ShowMessage это тоже VCL форма, т.е. Windows окно, потому решение см. 2 |
Автор: Snowy 13.11.2007, 12:45 | ||||
|
Автор: Akella 14.11.2007, 09:15 | ||||||
RUSSIAN_CHARSET Добавлено через 3 минуты и 24 секунды
а я не работаю с буфером обмена Добавлено через 5 минут и 49 секунд Значит такая идея возникла: 1. вначале работы процедуры запоминаем язык 2. переключаемся на русский программно 3. выполняем процедуру 4. переключаемся обратно Недостаток: если нет русского, могут будут проблемы, может быть даже AV из-за того, что нет русского. У кого-нибудь ещё есть предложения? Добавлено через 6 минут и 29 секунд
так установлено ещё в дизайнере при проектировании приложенияч |
Автор: Alexeis 14.11.2007, 10:18 |
Akella, попробуй шрифт сменить на какой-нибудь стандартный. |
Автор: Akella 14.11.2007, 10:28 | ||
у меня так получилось, используя http://www.cyberguru.ru/programming/win32/win32-keyboard-functions-page15.html
Добавлено @ 10:37 т.е. по идее если даже нет в системе русского, то LoadKeyboardLayout загрузит и активирует, возможно что только для данного сеанса программы, а это именно то, что нам и нужно так можно узнать http://www.delphisources.ru/pages/faq/base/keyboard_layouts.html |
Автор: Rennigth 14.11.2007, 11:16 |
http://msdn2.microsoft.com/ru-ru/library/ms646296.aspx |
Автор: Akella 14.11.2007, 12:19 |
кстати сам шрифт, используемый в контроле тоже влияет, я вот вышеописанный пример попробовал с разными, нормально работает с Lucidia Console Добавлено через 49 секунд Rennigth, ![]() ![]() |
Автор: Rennigth 14.11.2007, 13:19 | ||
Как-то так:
|
Автор: Akella 18.11.2007, 16:08 | ||
Вот ещё пример вставки текста из буфера обмена. Очень похож на предыдущий.
|
Автор: Akella 21.11.2007, 11:05 |
при объявлении строковых типом можно ещё воспользоваться не String, а Widestring |