Форум: "Начинающим";
Текущий архив: 2009.10.04;
Скачать: [xml.tar.bz2];
Внизlistbox не ловит нажатие Del Найти похожие ветки
← →
xyz (2009-07-27 18:44) [0]Если в событии ListBox1KeyPress написать обработчик:
if (key=#8) then
for i:=listbox1.Items.Count-1 downto 0 do
if listbox1.Selected[i] then listbox1.Items.Delete(i);
то код, следующий после then получит управление. Если же написать:
if (key=#46) then...
то условие не выполняется. Но у клаввиши Delete ведь код 46? Почему тогда не работает?
← →
Юрий Зотов © (2009-07-27 18:51) [1]> xyz (27.07.09 18:44)
> у клаввиши Delete ведь код 46?
Нет. Эта клавиша вообще не имеет ASCII-кода и в OnKeyPress не обрабатывается. Используйте OnKeyDown и код клавиши VK_DELETE.
← →
Юрий Зотов © (2009-07-28 00:32) [2]Надо, наверное, немного пояснить (потому что VK_DELETE действительно равно 46 и может возникнуть путаница). Подробности опускаю, оставляю лишь суть.
При нажатии любой клавиши клавиатура генерирует ее аппаратный код - так называемый скэн-код. Далее скэн-код транслируется системой в виртуальный код и возникает событие OnKeyDown, куда этот виртуальный код и передается в виде параметра типа word.
Существуют клавиши, которые имеются в таблице ASCII. Это все символьные клавиши, Backspace (8), Tab (9), Enter (13), Esc (27), пробел (32) - вот, пожалуй, и все. Виртуальный код таких клавиш численно совпадает с их ASCII-кодом и для них после события OnKeyDown возникает еще и событие OnKeyPress, куда передается ASCII-код в виде параметра типа char. Нажатие таких клавиш можно обрабатывать и в OnKeyDown, и в OnKeyPress.
Остальные клавиши в таблице ASCII отсутствуют - то есть символьного ASCII-кода не имеют. Для них событие OnKeyPress не возникает, поэтому нажатие таких клавиш можно обрабатывать только в OnKeyDown.
В Вашем случае при нажатии клавиши Delete в OnKeyDown поступает виртуальный код VK_DELETE, который действительно равен 46, но к ASCII-коду #46 (символ "точка") не имеет никакого отношения. Событие OnKeyPress для этой клавиши не возникает, поэтому она там и не ловилась. А вот если бы Вы нажали "точку", то Ваш код сработал бы - но вряд ли это то, чего Вы хотели.
:o)
← →
turbouser © (2009-07-28 00:48) [3]
> Юрий Зотов © (28.07.09 00:32) [2]
> Остальные клавиши в таблице ASCII отсутствуют - то есть
> символьного ASCII-кода не имеют.
Вот тут самое интересное.. Почему? я не знаю...
← →
KilkennyCat © (2009-07-28 00:59) [4]Потому что "Консулы" были без дополнительной навигации :)
← →
Юрий Зотов © (2009-07-28 01:10) [5]> turbouser © (28.07.09 00:48) [3]
ASCII - это код обмена информацией (American Standard Code of Information Interchange). Разрабатывался еще во времена телетайпов.
Клавиатура - это устройство для ввода информации.
Клавиша Delete и ей подобные (управление курсором, навигация по тексту и пр.) нужны для ввода информации, но к обмену информацией отношения не имеют. Поэтому на клавиатура они есть, а в таблице ASCII их нет.
← →
Юрий Зотов © (2009-07-28 01:21) [6]Вот здесь - подробности:
http://ru.wikipedia.org/wiki/ASCII
← →
turbouser © (2009-07-28 01:23) [7]
> Юрий Зотов © (28.07.09 01:10) [5]
Ясно.. Спасибо за ликбез
p.s.
а в институтах такого не преподают :(
по крайней мере в тех, в которых довелось обучаться...
Эх... :(
← →
Юрий Зотов © (2009-07-28 01:34) [8]> turbouser © (28.07.09 01:23) [7]
Кто кодил в стародавние времена - тот знает, что такое КОИ-7 (семибитный код обмена информацией на основе 7-битного варианта ASCII, восьмой бит использовался для контроля четности (или нечетности), а в национальных кодировках недостающие буквы вводились взамен, например, строчных английских букв).
Да даже и не в такие уж стародавние. Например, под DOS скэн-код транслировался либо в один байт (для ASCII-клавиш), либо в последовательность из двух байт (для остальных).
← →
Kolan © (2009-07-28 13:28) [9]По сабжу полезно прочесть Джоэла: http://joelonsoftware.com/articles/Unicode.html
← →
jack128_ (2009-07-28 20:36) [10]
>
> Кто кодил в стародавние времена - тот знает, что такое КОИ-
> 7
ага, относительно недавно узнал про кои-8, точнее про то, почему кириллица в этой кодировке по дебильному расположена. Именно для того, чтобы при передаче по 7ми битным каналам русский текст оставался читабельным. Подробнее - http://ru.wikipedia.org/wiki/%D0%9A%D0%9E%D0%98-8 . Прикольно. -)
← →
Anatoly Podgoretsky © (2009-07-28 20:44) [11]> jack128_ (28.07.2009 20:36:10) [10]
Вообще то эта легенда притянута за уши, по факту.
А реально связано это было с KOI7 и надписями на клавиатуре, вот и весь секрет.
← →
jack128_ (2009-07-28 21:16) [12]
> Вообще то эта легенда притянута за уши, по факту.
не знаю. Я спецом прогу писал, чтоб проверить. Несколько случайно выдуманных фраз прогонял с потерей старшего бита - смысл понять мона было.
> А реально связано это было с KOI7 и надписями на клавиатуре
а ссылку какую нить?? более подробно чтоб, причем тут надписи на клаве??
← →
Anatoly Podgoretsky © (2009-07-28 21:23) [13]> jack128_ (28.07.2009 21:16:12) [12]
Это длинная история и не для этой ветки.
Но суть простая, вместо малых английских были использованы большие русские буквы на тех же места, отсюда совпадение кодов и рисунков по 7 битам, и отсюда и по КОИ-8 при обрезание одного бита, а не цель. Тут за цель выдают следствие. Историю лучше поискать в Сети, но не на Вики, немного есть здесь http://www.podgoretsky.com/OtherParts/QA/2001/qa58.aspx#Toc_1_1
← →
Игорь Шевченко © (2009-07-29 01:24) [14]Anatoly Podgoretsky © (28.07.09 21:23) [13]
> немного есть здесь http://www.podgoretsky.com/OtherParts/QA/2001/qa58.
> aspx#Toc_1_1
Где ж ты раньше был ? :) Я как раз пару недель назад с почтой развлекался, своего робота отлаживал.
← →
brother © (2009-07-29 05:50) [15]дык там и был)
> своего робота отлаживал.
не спам? ;)
← →
Anatoly Podgoretsky © (2009-07-29 08:38) [16]> Игорь Шевченко (29.07.2009 01:24:14) [14]
Я здесь был с 2001 года
← →
oldman © (2009-07-29 23:46) [17]
> Юрий Зотов © (27.07.09 18:51) [1]
> Нет. Эта клавиша вообще не имеет ASCII-кода
давным давно я на Clipper писал:
if inkey(0)=7
И думал, что 7 это ASCII-код для Delete
И работало!
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.10.04;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.007 c