пытаюсь перехватить ошибку ввода в TextBox

Программирование на Visual Basic for Applications
Glan
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 06.02.2007 (Вт) 12:04

пытаюсь перехватить ошибку ввода в TextBox

Сообщение Glan » 06.02.2007 (Вт) 12:16

Господа, помогите понять, как реализовать задачку.

условие:
Имеется некий TextBox который пользователь руками вводит число. Число может быть как целое, так и дробное. По событию after update введеный текст преобразуется в число при помощи CSng и используется в расчетах.

задача:
необходимо перехватить случай, когда пользователь водит в качестве разделителя не запятую, а точку тем самым вызывая type mismatch.
Перехватив же, необходимо эту точку заменить на запятую и продолжить выполнение кода.

что делалось:
пытался всячески преобразовывать вводимый текст. Избежать ошибки и остановки выполнения удалось только при использовании CVal но при это отрезается дробная часть, что недопустимо.
Тщательно рассматривались методы и свойства TextBox, однако среди них не найдено подходящего.

Прошу высказывать мысли.
Заранее благодаю.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 06.02.2007 (Вт) 12:47

Первоначально, пожалуйста, свою мысль в виде кода с указанием что и где не получилось.
Весь мир матрица, а мы в нем потоки байтов!

Чудовище под кроватью
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 27.11.2006 (Пн) 14:46
Откуда: А из ника не ясно?

Re: пытаюсь перехватить ошибку ввода в TextBox

Сообщение Чудовище под кроватью » 06.02.2007 (Вт) 12:56

Если есть возможность, просто ставь на форму вместо Textbox'а Microsoft Masked Edit Control. Это по сути то же самое, с той лишь разницей, что можно в свойствах задать маску ввода. Просто поставишь нужную маску и все.
Что касается текстбокса:
Во-первых, почему CSng? Что за странный выбор типа?
Во-вторых, ошибка отслеживается:
Код: Выделить всё

'отключаем сообщения об ошибках
On Error Resume Next
'тут пишешь свою строку, которая может вызывать ошибку
'...
'проверяем, возникла ли ошибка:
If Err<>0 Then
'ну и далее твоя обработка ошибки
У-у-у!!

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 06.02.2007 (Вт) 12:56

может так ?:

Код: Выделить всё
Private Sub TextBox1_Change()
    With TextBox1
        Select Case IsNumeric(.Text)
        Case False: If Len(.Text) > 1 Then .Text = Left(.Text, Len(.Text) - 1) Else .Text = Empty
        Case Else: .Text = CStr(Replace(.Text, ",", "."))
        End Select
    End With
End Sub
Привет,
KL

Чудовище под кроватью
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 27.11.2006 (Пн) 14:46
Откуда: А из ника не ясно?

Сообщение Чудовище под кроватью » 06.02.2007 (Вт) 13:18

KL
Кстати! А не знаешь, где можно нормальную версию Masked Edit скачать? А то у меня на форму он отказывается лезть.
У-у-у!!

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 06.02.2007 (Вт) 13:38

Чудовище под кроватью писал(а):KL
Кстати! А не знаешь, где можно нормальную версию Masked Edit скачать? А то у меня на форму он отказывается лезть.


Если не ошибаюсь, это лицензионный контрол в составе пакетов Visual Basic 6.0 и/или Visual Studio.
Привет,
KL

Glan
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 06.02.2007 (Вт) 12:04

Сообщение Glan » 06.02.2007 (Вт) 13:52

значится вот как это выглядит
вот обрабатываем событие и перехватываем ошибку с пустой строкой
Private Sub TextBox1_AfterUpdate()
If TextBox1.Value <> "" Then
Call p_update
End If
End Sub

потом зовем p_update, которая пересчитывает результаты расчетов.

Private Sub p_update()
rate = CSng(TextBox1.Value) ' если введна точка, затыкается тут с ошибкой type mismatch
profit = CSng(TextBox2.Value) / 100 + 1
.....
дальше неинтересно, там просто расчеты.

а Single выбрал исходя из того, что оно покороче, места жерт меньше.
В принципе все равно какое число, лишь бы не целое и чтоб не текст был иначе потом на него делить не получится.

с Masked Edit Control никогда не работал. Сейчас пойду искать что это такое

KL думал об этом. Есть загвоздка - неизвестно сколько будет знаков до и после запятой. А кроме того Change срабатывет всякий раз когда пользователь вводит новую цифру.. это ж пока наберешь условно говоря "175,67" шесть раз пересчитает. Ужас.

Чудовище под кроватью
а если написать if error = 17 оно будет отлавливать именно type mismatch?
мда... остается придумать, как отловить точку в строке. Это уже легче. Но все равно надо думать.

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 06.02.2007 (Вт) 17:56

Про точку и запятую:
http://bbs.vbstreets.ru/viewtopic.php?t=30044
Salus populi suprema lex

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 06.02.2007 (Вт) 20:03

Glan писал(а):KL думал об этом. Есть загвоздка - неизвестно сколько будет знаков до и после запятой.


и... не вижу в чем проблема :-(

Glan писал(а):А кроме того Change срабатывет всякий раз когда пользователь вводит новую цифру.. это ж пока наберешь условно говоря "175,67" шесть раз пересчитает. Ужас.


а что, долго считает? ты на всякий пожарный попробуй - вдруг понравится ;-)
Привет,
KL

Glan
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 06.02.2007 (Вт) 12:04

Сообщение Glan » 08.02.2007 (Чт) 13:10

победил вот таким образом, основываясь на рекомендации уважаемого KL.


Private Sub TextBox1_Change()
With TextBox1
Select Case IsNumeric(.Text)
Case False: .Text = CStr(Replace(.Text, ".", ","))
End Select
End With

End Sub


Вернуться в VBA

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 90

    TopList