Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];

Вниз

edit.keypress   Найти похожие ветки 

 
enZinger   (2007-01-07 12:35) [0]

Подскажите как в событии keypress TEdit сделать обработку, что бы можно было вводить только

!%*+-./=:[]^_{}@0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyzЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧС
МИТЬБЮЁйцукенгшщзхъфывапролджэячсмитьбюё


а в остальных случаях ничего не вводило

Я нашел как сделать наоборот, но это немного не подходит.
 if ((UpCase(Key) = ";")) then
 Key := #0;


 
PZ   (2007-01-07 12:49) [1]



Const
 S = "!%*+-./=:[]^_{}@0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"+
     "abcdefghijklmnopqrstuvwxyzЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧС"+
     "МИТЬБЮЁйцукенгшщзхъфывапролджэячсмитьбюё";

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
 If not (Pos(Key, S) > 0) then Key := #0;
end;


 
Юрий Зотов ©   (2007-01-07 17:40) [2]

> PZ   (07.01.07 12:49) [1]

Если сделать не строку, а множество и проверять через in, то будет работать раз в 100 быстрее. А код практически тот же.


 
PZ   (2007-01-07 19:42) [3]

>  [2] Юрий Зотов ©   (07.01.07 17:40)

Возможно в смысле скорости будет лучше, но мне показалось, так (как у меня) проще.


 
Loginov Dmitry ©   (2007-01-08 00:39) [4]

> Если сделать не строку, а множество и проверять через in,
> то будет работать раз в 100 быстрее.


Не то это место, где можно такую разницу в скорости уловить.
А насчет 100 раз - потестируйте. Возможно эта цифра уменьшится на один-два порядка.


 
Юрий Зотов ©   (2007-01-08 15:03) [5]

> PZ   (07.01.07 19:42) [3]

Не "возможно", а "точно". Что касается простоты, то скажите сами, какой вариант сложнее:
1. const S = "..."; if Pos(Key, S) > 0 then...
2. const S = [...]; if Key in S then...

Вам не кажется, что они одинаково просты?

> Loginov Dmitry ©   (08.01.07 00:39) [4]

1. Место тут ни при чем. Это стиль. Он либо грамотный, либо нет, независимо ни от каких мест.

2. Нет нужды тестировать то, что хорошо известно и без тестирования. Если же есть сомнения, то предлагаю Вам заняться тестированием самому, а результате убедиться (и запомнить), что я никогда ничего не говорю просто так. Чего и Вам желаю.


 
PZ   (2007-01-08 16:05) [6]

>  [5] Юрий Зотов ©   (08.01.07 15:03)

Да, безусловно  2. проще, но почему-то он у меня не работает, или я неправильно записываю:

procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char);
begin
 If not (Key in S) then Key := #0;
end;


 
PZ   (2007-01-08 16:06) [7]

S из [1]


 
Anatoly Podgoretsky ©   (2007-01-08 16:09) [8]

IN применимо только к множествам


 
PZ   (2007-01-08 16:13) [9]

Мне не понятно, как выражение из [1] представитеь в виде множества


 
Anatoly Podgoretsky ©   (2007-01-08 16:15) [10]

> PZ  (08.01.2007 16:13:09)  [9]

Множество представляется в квадратных скобка или через объявление set of type


 
PZ   (2007-01-08 16:21) [11]

Но я записываю
Const
 S = [!%*+-./=:[]^_{}@0123456789ABCD...];
и получаю ошибку Illegal character in input file: !


 
Anatoly Podgoretsky ©   (2007-01-08 16:24) [12]

> PZ  (08.01.2007 16:21:11)  [11]

[...[..]...];

Кроме того что за типы [!%*+-./ по твоему?


 
Anatoly Podgoretsky ©   (2007-01-08 16:27) [13]

Ты бы почитал книгу по основам Паскаля, так далеко не уедешь или как минимум справку, хотя бы по теме set constructors


 
PZ   (2007-01-08 16:32) [14]

> [12] Anatoly Podgoretsky ©   (08.01.07 16:24)

Скорее всего это тип Word.

Вы можете конкретно выражение из [0] представить в виде множества. Я этого не в состоянии сделать.


 
Anatoly Podgoretsky ©   (2007-01-08 16:34) [15]

> PZ  (08.01.2007 16:32:14)  [14]

Ты справку прочитал, там есть пример или его надо сюда скопировать?


 
Юрий Зотов ©   (2007-01-08 16:36) [16]

const
S = ["!", "%", "*", "+", "-", ".", "/", "=", ":", "[", "]", "^", "_", "{", "}", "@",
   "0".."9", "A".."Z", "a".."z", "А".."Я", "а".."я","Ё", "ё"];


 
PZ   (2007-01-08 16:52) [17]

>  [16] Юрий Зотов ©   (08.01.07 16:36)

Изящно получается. Спасибо.


 
Юрий Зотов ©   (2007-01-08 17:34) [18]

> PZ   (08.01.07 16:52) [17]

Это просто язык Паскаль.

Кстати, самому стало интересно и тест я таки провел. Вариант с Set работает быстрее приблизительно в 25 раз.

const
 AString = "!%*+-./=:[]^_{}@0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"+
   "abcdefghijklmnopqrstuvwxyzÉÖÓÊÅÍÃØ&#217 ;ÇÕÚÔÛÂÀÏÐÎËÄÆ& #221;ß×Ñ"+
   "ÌÈÒÜÁÞ¨éöóêåí& #227;øùçõúôûâàïðî&#2 35;äæýÿ÷ñìèòüáþ&#184 ;";

 ASet = ["!", "%", "*", "+", "-", ".", "/", "=", ":", "[", "]", "^", "_", "{", "}", "@",
   "0".."9", "A".."Z", "a".."z", "À".."ß", "à".."ÿ","¨", "¸"];

 Count = 10000000;

procedure TForm1.Button1Click(Sender: TObject);
var
 T: DWORD;
 i: integer;
begin
 Randomize;
 Caption := "";
 T := GetTickCount;
 for i := 1 to Count do
   if Pos(Char(1 + Random(256)), AString) > 0 then;
 Caption := IntToStr(GetTickCount - T)
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 T: DWORD;
 i: integer;
begin
 Randomize;
 Caption := "";
 T := GetTickCount;
 for i := 1 to Count do
   if Char(1 + Random(256)) in ASet then;
 Caption := IntToStr(GetTickCount - T)
end;


 
PZ   (2007-01-08 18:16) [19]

У меня получается 21-22 раза


 
Loginov Dmitry ©   (2007-01-08 22:40) [20]

> Вариант с Set работает быстрее приблизительно в 25 раз.


Ну вот. А говорили 100
:))))


 
Palladin ©   (2007-01-08 22:47) [21]


> [20] Loginov Dmitry ©

это от машины зависит, я уверен что на 486 именно 100 и будет, если не больше...


 
Юрий Зотов ©   (2007-01-08 23:18) [22]

> Loginov Dmitry ©   (08.01.07 22:40) [20]

Извините, Дмитрий, ошибся, навскидку ведь прикидывал.
:o)

Действительно, не в 100 раз, а меньше. Но не на порядок и не на два. Так кто же сильнее ошибся?
:o)


 
Германн ©   (2007-01-09 02:09) [23]


> Юрий Зотов ©   (08.01.07 17:34) [18]
>
> > PZ   (08.01.07 16:52) [17]
>
> Это просто язык Паскаль.
>
> Кстати, самому стало интересно и тест я таки провел. Вариант
> с Set работает быстрее приблизительно в 25 раз.
>

Порадовало. Самый любимый мой тип при передаче данных в/из внешних устройств на основе 51-семейства. :)



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.083 c
2-1167984561
bmw
2007-01-05 11:09
2007.01.28
процеси и потоки


2-1168723096
DiX
2007-01-14 00:18
2007.01.28
Отправка почты


15-1167997829
DelphiLexx
2007-01-05 14:50
2007.01.28
Бесплатна ли библиотека JVCL


15-1168127114
AntiUser
2007-01-07 02:45
2007.01.28
Великая тайна воды


2-1168546687
CaLL|ok
2007-01-11 23:18
2007.01.28
заполнение ПрогрессБара за заданный промежуток времени





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский