![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
former |
|
|||
![]() MEMS Expert ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1166 Регистрация: 1.3.2006 Где: Россия Репутация: 5 Всего: 17 |
При обработке события OnKeyPress нет реакции на русские символы. Кто-нибудь сталкивался?
Использую следующий код:
-------------------- Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами. |
|||
|
||||
Rrader |
|
|||
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 70 Всего: 191 |
Компилятор ведь ругается. Цифры фильтруешь? Так измени код на противоположный, с учетом warning'а
|
|||
|
||||
Keeper89 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 20 Всего: 58 |
former, у меня реагирует и на кириллицу (не печатает) - (D2007).
|
|||
|
||||
Rrader |
|
|||
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 70 Всего: 191 |
Keeper89, потому что там Char = AnsiChar. В 2009 получаем:
|
|||
|
||||
Keeper89 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 20 Всего: 58 |
Rrader, пардон, не увидел в теме сообщение версию Delphi. Тогда, действительно, нужно изменить код.
|
|||
|
||||
former |
|
||||||
![]() MEMS Expert ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1166 Регистрация: 1.3.2006 Где: Россия Репутация: 5 Всего: 17 |
Компилятор не ругается.
D2009, поэтому проблема с юникодом. Rrader, попробовал следующий код, но результата нет
-------------------- Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами. |
||||||
|
|||||||
Rrader |
|
|||
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 70 Всего: 191 |
Хм, AnsiChar(Key) некорректно обрабатывает кириллицу. И по CPU понятно, почему так, и знаю обходные пути, но не знаю, это баг Delphi или нет? Не смог ничего нагуглить.
|
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
Нет, это не баг, учите матчасть ;)
По-определению множества в Паскале - в нём не может быть больше 256 элементов. Вопрос: ну и как же вы уложите в множество 65536 элементов (WideChar)? А никак. Отсюда следует, что такой вещи как set of WideChar не существует в природе. Откуда снова следует, что в "Key in ['А'..'Я']" равно как и "CharInSet(Key, ['А'..'Я'])" участвует что угодно, кроме WideChar-ов. Про множества пора забывать. Использовать их можно только с латиницей, со всем остальным - другие функции (LastDelimiter, Ord, >= и т.п.). См. также. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
former |
|
||||
![]() MEMS Expert ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1166 Регистрация: 1.3.2006 Где: Россия Репутация: 5 Всего: 17 |
CodeMonkey, вот цитата из твоей ссылки:
Нет, все таки проблема с кириллицей.
![]() -------------------- Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами. |
||||
|
|||||
Rrader |
|
|||
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 70 Всего: 191 |
CodeMonkey, я немного не о том. Понятно, что множество не может быть из WideChar. Я о том, что преобразование AnsiChar('а') дает '0'. Т.е. если в Key идет кириллический символ, то он не может нормально преобразоваться. Вот это баг или нет?
![]() Просто так все работает, если преобразовать магически:
|
|||
|
||||
former |
|
|||
![]() MEMS Expert ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1166 Регистрация: 1.3.2006 Где: Россия Репутация: 5 Всего: 17 |
Rrader, спасибо. +
-------------------- Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами. |
|||
|
||||
Rrader |
|
||||
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 70 Всего: 191 |
Да не за что.
Этот код демонстрирует баг (или фичу ![]() Так...Посмотрел в CPU, одно отличие:
Неудивительно, но как это изменить? Просто интересно. Это сообщение отредактировал(а) Rrader - 24.5.2009, 18:16 |
||||
|
|||||
Rrader |
|
|||
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 70 Всего: 191 |
Вот так можно:
|
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
2 Rrader:
Чёрт, к сожалению, сейчас нет возможности погонять (нет Delphi под рукой). Вот, кстати, похожий (а может и связанный) случай с Unicode-символами в старых Delphi. Эй, не вздумайте это использовать - это ни разу не решение! Вопрос-наводка: как это будет работать с языком для не-unicode программ <> русского ;) По поводу решения - я бы в первую очередь прошерстил бы Character.pas - там должна быть куча функций диагностики, я бы поискал что-то вроде IsCharInCategory(Char, Cyrillic) - как я уже сказал, сейчас не могу посмотреть сам. Далее, если бы это не сработало, я проверил бы по таблице символов, какие коды имеет кирилица в Unicode и обнаружил бы, что они также лежат монолитным диапазоном, как и в Ansi (да, с отдельной "Ё"), поэтому: if (Ord(Char) >= Ord('А')) and (Ord(Char) <= Ord('Я')) then (+ по аналогии на 'а'..'я' и 'Ё', 'ё'). Далее, если с диапазонами было бы плохо (скажем, не кирилицу проверяем), то я бы выписал фильтруемые символы в строку и: if LastDelimiter('абвгдеёжзийклмн...', Char) >= 0 then. Добавлено через 2 минуты и 46 секунд Сказал же: забудьте про множества. Не будет это работать для не латиницы. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
former |
|
|||
![]() MEMS Expert ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1166 Регистрация: 1.3.2006 Где: Россия Репутация: 5 Всего: 17 |
В моем случае исключительно русский. Но, спасибо за совет. К сожалению, сейчс тоже нат среды под рукой. Завтра вечером посмотрю. -------------------- Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами. |
|||
|
||||
Rrader |
|
|||
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 70 Всего: 191 |
||||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
В том, что такая проверка не будет работать корректно. Вроде как: у, Delphi 2009 - теперь и с поддержкой unicode! А реально мы проверкой "if AnsiString(Key)[1] in ['а', 'б', {etc}] then" убиваем весь хвалёный unicode на корню. В этом был смысл моего сообщения: пора забыть про множества и использовать другие механизмы. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
Rrader |
|
|||
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 70 Всего: 191 |
Т.е. проблема в том, что мы начинаем городить кривой код-огород. Очень тонко у вас эта мысль прослеживалась.
|
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
Ну не знаю, меня почему-то часто неверно понимают
![]() Хотя, по-моему, я ровно это же сказал ещё в первом сообщении. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
former |
|
|||
![]() MEMS Expert ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1166 Регистрация: 1.3.2006 Где: Россия Репутация: 5 Всего: 17 |
CodeMonkey, используя функции, на которые ты ссылался,
получается, что будут блокироваться символы независимо от регистра, т.е. непосредственно сами клавиши. Это сообщение отредактировал(а) former - 26.5.2009, 11:22 -------------------- Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами. |
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
Если писать так, как вы - так конечно...
![]() Будьте внимательнее и вдумчивее. Кнопочка F1 ещё полезная есть. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |