Фильтрация ввода

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Gigahard
Бывалый
Бывалый
 
Сообщения: 253
Зарегистрирован: 24.07.2002 (Ср) 11:15
Откуда: Russia

Фильтрация ввода

Сообщение Gigahard » 15.03.2003 (Сб) 0:28

Как говорят "новые русские":
- Фильтруй базар
:) Но Это не об этом :)

А проблем такой:

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

Главная проблема заключается в том, что текстбокс служит и для ввода, и для отображения информации... В связи с этим даже если отсеиватель нежелательных символов работает нормально, то в текстбоксе все же промелькивает запрещенный символ, что очень раздражает.

Если кто сталкивался с подобной задачей/проблемой, то я очень надеюсь на вашу помощь!

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 15.03.2003 (Сб) 6:42

'Вот так:
'На форме должен быть текстбокс txtText

Private Sub txtText_KeyPress(KeyAscii As Integer)
Dim Temp As String

Temp= "The"
'Символы из Temp не печатаются

If InStr(1, Temp, Chr(KeyAscii)) > 0 Then
KeyAscii = 0
End If
End Sub

Gigahard
Бывалый
Бывалый
 
Сообщения: 253
Зарегистрирован: 24.07.2002 (Ср) 11:15
Откуда: Russia

Сообщение Gigahard » 15.03.2003 (Сб) 15:34

2Amed: Спасибо! Пример работает как надо!

Но вот только мне полезней было бы, чтоб вводились только РАЗРЕШЕННЫЕ по шаблону символы. Так как вариант с исключением будет исползоваться лишь изредка, а с разрешением часто. Так как сделать второй вариант?

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 15.03.2003 (Сб) 17:27

'Вот так:
'На форме должен быть текстбокс txtText

Private Sub txtText_KeyPress(KeyAscii As Integer)
Dim Temp As String

Temp= "The"
'Символы из Temp печатаются

If InStr(1, Temp, Chr(KeyAscii)) = 0 Then
KeyAscii = 0
End If
End Sub

'Мог бы и сам догадаться :lol:

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 17.03.2003 (Пн) 11:33

Не KeyPress только, а Change так как первое событие не вызввается при вставке текста из Clipboard.

Vitaly1
Брехман
Брехман
 
Сообщения: 1578
Зарегистрирован: 30.12.2002 (Пн) 16:35
Откуда: Russia, Mosсow

Сообщение Vitaly1 » 17.03.2003 (Пн) 18:12

А с Change нужно так:

Private Sub txtText_Change
Dim Temp As String

Temp= "The"
'Символы из Temp печатаются
s =temp
s1 =txtText.text
while s<>""
sim =mid(s,1,1)
s2=""
for i=1 to len(s1)
if sim = mid(s1,i,1) then
s2=s2+mid(s1,i,1)
end if
next i
s1=s2
s=mid(s,2)
wend
txtText.text =s1
End Sub

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 17.03.2003 (Пн) 18:20

Ага. Только надо не забыть еще сохранить selection:



Код: Выделить всё
s =temp
s1 =txtText.text

ss = txtText.SelStart
sl = txtText.SelLength

...
...
...

txtText.SelStart =ss
txtText.SelLength =sl




Иначе ввести ничего нельзя будет в текстбокс - при изменеии проперти .Text курсор будет перескаивать на первую позицию автоматически.

Firestorm
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 946
Зарегистрирован: 02.05.2002 (Чт) 14:36
Откуда: Russia

Сообщение Firestorm » 21.03.2003 (Пт) 22:32

можно еще использовать SendKeys на back space, при вводе непрваильного символа... 8)
...просто гламурный падонак...
_________________
reborn! v.2 :twisted:
_________________

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 22.03.2003 (Сб) 12:26

Если вешать на Change, то текст будет моргать, к тому же придется использовать флаг, чтобы избежать рекурсии.
KeyPress обрабатывает не все клавиши.

Лучше обрабатывать KeyDown, несколько сложнее, но зато правильнее. А чтобы избежать вставки текста из буфера, перехватывать ее через API; сообщение EM_CANPASTE, если нужно заблокировать совсем.
Lasciate ogni speranza, voi ch'entrate.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 23.03.2003 (Вс) 18:37

Ну ты, alibek и даешь :o

ничего не мограет с Change сто раз уже проверено. Самый простой и надежный способ.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 24.03.2003 (Пн) 12:22

Может и простой, но не самый лучший.

Попробуй сделать выделение "назад", т.е. нажимая Shift+Left. Такое выделение программно ты не установишь, т.к. правильно было бы использовать наподобие:
Text1.SelStart=10
Text1.SelLength=-5
но это невозможно, т.к. SelLength не может быть отрицательным. Другими словами, Selection ты не восстановишь (вернее, Selection восстановишь, но позиция курсора будет другой).
Кроме того, такая обработка будет вызываться два раза -- первый раз, когда пользователь введет символ, а второй раз -- когда сама обработка изменит содержимое TextBox.
А моргать будет (из-за перерисовки Selection), попробуй на медленном компе и увидишь.

Фильтрация должна осуществляться ДО ввода, а не после, поэтому правильно использовать KeyPress или KeyDown. А то, что предложил Amed на событие Change -- это не фильтрация, а обработка.
Lasciate ogni speranza, voi ch'entrate.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 24.03.2003 (Пн) 12:35

Что то ч тебя не до конца понимаю... SelStart и SleLength всегда позволяют корректно установить позицию курсора. Потому что нельзя изменить selection не сдвигая курсор. И восстанавливается все как надо. Как бы ты его не двигал :) Двойной вызов обработки предотвращается простым введением флага, способ избитый но рабочий. Ну а то что комп медленный, так это уж, звиняй - ему и положено тормозить.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 24.03.2003 (Пн) 12:49

Э... ну постараюсь выразить по другому.

Текст можно выделить слева-направо (например, Shift+Right, тогда курсор мерцает в конце выделения) и справа-налево (мышкой или Shift+Left, и тогда курсор моргает в самом начале выделения). Но программно можно выделять только слева-направо. Не получится выделить текст так, чтобы курсор моргал в начале или в середине выделения (хотя технически это возможно).

А что касается тормозного компа -- при моем способе обработчик и на медленной машине не тормозит.
Lasciate ogni speranza, voi ch'entrate.

Jenizix
Географ
Географ
Аватара пользователя
 
Сообщения: 545
Зарегистрирован: 20.04.2004 (Вт) 20:52
Откуда: Москва

Фильтрация ввода

Сообщение Jenizix » 04.05.2004 (Вт) 1:33

А так:
Код: Выделить всё
Text1.Text = Replace$(Text1.Text, "мат", "censured")


В файле filter.txt записаны слова:
<слово (или буква) которое нужно заменить>,<слово (или буква) на которое нужно заменить>
Вложения
censured.rar
Вот тебе наглядный пример :
(1.44 Кб) Скачиваний: 20

Gigahard
Бывалый
Бывалый
 
Сообщения: 253
Зарегистрирован: 24.07.2002 (Ср) 11:15
Откуда: Russia

Сообщение Gigahard » 04.05.2004 (Вт) 11:01

Теме уже больше года.
Format, хватит трупокопательством заниматься :)

В общем если это читают админы, то прошу эту тему закрыть, в связи с тем, что все проблемы уже давно разрешились.
Старый глюк лучше новых двух!

Jenizix
Географ
Географ
Аватара пользователя
 
Сообщения: 545
Зарегистрирован: 20.04.2004 (Вт) 20:52
Откуда: Москва

Сообщение Jenizix » 04.05.2004 (Вт) 19:48

Ну а может еще каму надо?
Я посмотрел у вас тут все очень закручено!!!
А у меня всего одна строчка в коде!!!
:D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D

Jenizix
Географ
Географ
Аватара пользователя
 
Сообщения: 545
Зарегистрирован: 20.04.2004 (Вт) 20:52
Откуда: Москва

Сообщение Jenizix » 04.05.2004 (Вт) 19:48

Ну а может еще каму надо?
Я посмотрел у вас тут все очень закручено!!!
А у меня всего одна строчка в коде!!!
:D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.10.2004 (Пт) 21:05

Оппа! А тема-то не закрыта!
Значит, админы её не читали :-)
:-D :-D :-D
Изображение

FaKk2
El rebelde gur&#250;
El rebelde gur&#250;
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 16.10.2004 (Сб) 4:45

Или надо пинать ногами чаще :mrgreen: :)
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, PetalBot и гости: 21

    TopList  
cron