![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
edit.keypress [D7, WinXP]
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 раз - потестируйте. Возможно эта цифра уменьшится на один-два порядка.