Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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.


Наверх

Титульная страница Поиск, карта сайта Написать письмо