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

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

edit.keypress [D7, WinXP]


Страницы:   1 2

enZinger ©   (2007-01-07 12:35:00) 

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

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


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

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


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


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

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


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

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

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

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


Palladin   (2007-01-08 22:47:00) [3]


> [20] Loginov Dmitry ©

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


Loginov Dmitry   (2007-01-08 22:40:00) [4]

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


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


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

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


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

> PZ   (08.01.07 16:52) [17]

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

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

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

 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 16:52:00) [7]

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

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


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

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


Anatoly Podgoretsky   (2007-01-08 16:34:00) [9]

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

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


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

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

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

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


Anatoly Podgoretsky   (2007-01-08 16:27:00) [11]

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


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

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

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

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


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

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


Anatoly Podgoretsky   (2007-01-08 16:15:00) [14]

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

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


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

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


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

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


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

S из [1]


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

>  [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;


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

> 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. Нет нужды тестировать то, что хорошо известно и без тестирования. Если же есть сомнения, то предлагаю Вам заняться тестированием самому, а результате убедиться (и запомнить), что я никогда ничего не говорю просто так. Чего и Вам желаю.


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

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


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


Страницы:   1 2

Наверх

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