Сериализация компонента Delphi

По моему опыту String.fromCharCode(e.keyCode) ненадежна. String.fromCharCode ожидает кодировки unicode в качестве аргумента; e.keyCode возвращает коды кода javascript. Коды javascript и кодовые обозначения юникода - это , а не то же самое! В частности, клавиши номерной панели возвращают разные keycode из обычных цифровых клавиш (поскольку они являются разными клавишами), в то время как тот же keycode возвращается как для букв upper, так и lowercase (вы нажали ту же клавишу в обоих случаев), несмотря на то, что они имеют разные charcodes.

Например, обычная цифровая клавиша 1 генерирует событие с keycode 49, в то время как клавиша 1 цифровой клавиатуры (с включенным Numlock) генерирует keycode 97. Используется с String.fromCharCode, мы получаем следующее:

String.fromCharCode(49) returns "1"
String.fromCharCode(97) returns "a"

String.fromCharCode ожидает кодировки Unicode, а не коды javascript. Ключ a генерирует событие с keycode из 65, независимым от случая символа, который он сгенерировал (есть также модификатор, если нажата клавиша Shift и т. Д.). Символ a имеет юникод charcode 61, тогда как символ A имеет charcode из 41 (согласно, например, http://www.utf8-chartable.de/ ). Тем не менее, это hex значения, преобразование в десятичную дает нам charcode из 65 для «A» и 97 для «a». [1] Это согласуется с тем, что мы получаем из String.fromCharCode для этих значений.

Мое собственное требование было ограничено обработкой чисел и обычными буквами (принятие или отклонение в зависимости от позиции в строке) и разрешение управляющих символов ( F-ключи, Ctrl-что-то). Таким образом, я могу проверить управляющие символы, если это не контрольный символ, который я проверяю на диапазон, и только тогда мне нужно получить фактический символ. Учитывая, что меня не беспокоит случай (я все равно меняю буквы на прописные буквы) и уже ограничил диапазон кодов клавиш, мне нужно только беспокоиться о клавишах с цифровой клавиатурой. Для этого достаточно:

String.fromCharCode((96 <= key && key <= 105)? key-48 : key)

В общем случае функция надежного возврата символа из charcode была бы большой (возможно, как плагин jQuery), но у меня нет времени напишите это сейчас. Извините.

Я также упомянул e.which (если вы используете jQuery), который нормализует e.keyCode и e.charCode, так что вам не нужно беспокоиться о том, какой ключ был нажат. Проблема с объединением его с String.fromCharCode остается.

[1] Некоторое время я был смущен. все документы говорят, что String.fromCharCode ожидает unicode charcode, в то время как на практике он, похоже, работает для ASCII-кодировок, но я думаю, из-за необходимости конвертировать в десятичный код из шестнадцатеричного кода в сочетании с тем, что ASCII-символы и unicode decimal charcodes перекрываются для обычных латинских букв.

6
задан menjaraz 6 January 2012 в 16:33
поделиться

3 ответа

Встроенная основанная на RTTI система для сериализации опубликованных свойств уязвима для изменений в компонентах. Продвижения управляемы, пока старые свойства сохранены в новых объектах. Т.е. Вы оставляете интерфейс свойства, как, но может отказаться от содержания, если Вам нравится. Движение назад хуже - поскольку сохраненное свойство более новой версии не может быть открыто в более старой загрузке версии, и это будет проблемой.

Существуют компоненты / освобождает (http://www.torry.net/quicksearchd.php?String=RTTI&Title=Yes), который может добавить сериализацию в формате XML, и это может помочь немного, поскольку можно принять решение пропустить содержание, которое Вы не знаете.

Все еще необходимо быть внимательными о том, как Вы разрабатываете свое опубликованное содержание и должны, вероятно, найти способ "проигнорировать, но распространить" содержание, которое не понимает Ваша текущая версия. Это позволит Вам открывать и изменять файл в более новом формате при попытке сохранить более новые атрибуты, вместо того, чтобы разделить их.

3
ответ дан 17 December 2019 в 18:21
поделиться

Форматы определенно изменятся, поскольку поставщики добавят опции к своим компонентам. Сериализация просто циклы по всем опубликованным свойствам и сохраняет их к потоку. Когда они будут считаны назад, каждое из свойств, которое читается из потока, будет задержано к компоненту. Если свойство больше не существует, у Вас есть проблема. Я не думаю, что можно сделать что-либо об этом помимо некоторой основной обработки исключений.

Лучший способ гарантировать совместимость состоит в том, чтобы сделать Вашу собственную сериализацию.

0
ответ дан 17 December 2019 в 18:21
поделиться

Спасибо за ответ. Я старался избегать пользовательской сериализации, и используйте в своих интересах каждый метод сериализации компонента, но с личными делами персонала отсутствия любой способ "исправить" обновление нового формата компонента я предполагаю, что пользовательская сериализация является единственным методом.

0
ответ дан 17 December 2019 в 18:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: