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