Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1248680807
ford
2009-07-27 11:46
2009.10.04
TWordApplication выдает ошибку - "вызов был отклонен"


2-1249219399
bag
2009-08-02 17:23
2009.10.04
список из случайных неповторяющихся чисел


15-1249292576
@!!ex
2009-08-03 13:42
2009.10.04
Как сделать ICQ Логирование?


1-1218291861
lordalex
2008-08-09 18:24
2009.10.04
Не отображает иврит


15-1249070497
тимохов
2009-08-01 00:01
2009.10.04
Кто интересуется пассажирской авиацией?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский