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

Вниз

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

Наверх




Память: 0.52 MB
Время: 0.098 c
11-1144628785
Snipet
2006-04-10 04:26
2007.01.28
TreeView/ListView


2-1168550672
Beavercrazy
2007-01-12 00:24
2007.01.28
Проблема при работе с Аксесовской таблицей


1-1165418608
newbie2
2006-12-06 18:23
2007.01.28
Модераторы почему закрыли тему?


15-1168256520
Empleado
2007-01-08 14:42
2007.01.28
Что можно показать иностранцам?


2-1168356392
vitv
2007-01-09 18:26
2007.01.28
FireBird1.5-не работает запрос