Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.10.04;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.014 c
2-1249405228
xyz
2009-08-04 21:00
2009.10.04
настройка datetimepicker а


15-1248830322
sm1t
2009-07-29 05:18
2009.10.04
Буржуи уже хоронят РФ


2-1248693315
evgenij
2009-07-27 15:15
2009.10.04
Access violation после выгрузки dll


2-1245821819
Elun
2009-06-24 09:36
2009.10.04
AlphaControls+TImage


3-1227778244
vegarulez
2008-11-27 12:30
2009.10.04
Вопрос про ZeosDBO. (Zquery.Fields[i].AsDatetime)