Форум: "Начинающим";
Текущий архив: 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ÉÖÓÊÅÍÃØÙ ;ÇÕÚÔÛÂÀÏÐÎËÄÆ& #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 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.04 c