|
Тема
|
проверка на входящи данни
|
|
Автор |
Sargonlll () |
Публикувано | 12.09.12 13:11 |
|
Направих си една програма, която ми върши отлична работа. Сега се опитвам да я облагородя малко. Искам да вградя проверка за коректност на входящите данни. Повечето от тях трябва да са положителни числа. Използвам VB 2008 Express Edition, който незнайно защо е с изключително орязан вътрешен хелп.
Данните се извличат от текстови полета, напр. DTB.Text. Забелязва се, че букви и др. подобни се възприемат като 0, а ако има число с някаква буква след него, се възприема само числото. Направих няколко проби, но все още не съм доволен от резултата. Това е базовия код за проверка:
If Val(DTB.Text) <> DTB.Text Or Val(DTB.Text) <= 0 Then
MsgBox("Incorrect input data!", vbExclamation)
DTB.BackColor = Color.Red
Exit Sub
Else
DTB.BackColor = Color.White
End If
Така получавам съобщение за грешка в първия ред при въвеждане на буква (вместо цифра): Conversion from string "i" to type 'Double" is not valid. Добре, това е разбираемо. Но, след като не желае да преобразува буквите в число, защо без проверка ги възприема за 0 и програмата смята с тях (вместо още тогава да даде грешка).
Друг вариант, който опитах, е (промяна на само първия ред):
If Str(Val(DTB.Text)) <> DTB.Text Or Val(DTB.Text) <= 0 Then
Логиката беше, че след преобразуване на буква в число, тя ще се превърне в 0, после в стринг "0". Който вече ще е различен от първоначалната буква, напр. "I". Но, започна да излиза съобщение за некоректност, независимо какво въвеждам...
Накрая, опитах и (промяна на сомо първия ред):
If Str(Val(DTB.Text)) <> Str(DTB.Text) Or Val(DTB.Text) <= 0 Then
Получих съобщение за грешка: Argument 'Number' cannot be converted to a numeric value.
Просто не знам вече какво точно да направя. Целта е, ако се въведе нещо различно от положително число, да се изведе съобщение, да се оцвети фона за въвеждане и да не се продължи с изчисленията.
| |
Тема
|
Re: проверка на входящи данни
[re: Sargonlll]
|
|
Автор |
nepukis (минаващ) |
Публикувано | 21.09.12 13:54 |
|
пробвай нещо от сорта. дори и да не тръгне на твоята версия експериментирай
On Error GoTo greda
if DTB.Text*1 >0 then
DTB.BackColor = Color.White
else
greda
end if
Exit Sub
greda:
MsgBox("Incorrect input data!", vbExclamation)
DTB.BackColor = Color.Red
Resume Next
| |
|
Не съм особено обнадежден, но ще го пробвам, щом се почувствам по-свободен. Например към края на седмицата.
| |
Тема
|
Re: проверка на входящи данни
[re: Sargonlll]
|
|
Автор |
nedoga (непознат
) |
Публикувано | 24.10.12 21:08 |
|
За разлика от по-старите версии на VB, новите такива вече не позволяват неявно конвертиране на типове. Т.е. не може да се присвои текст директно на числова променлива, дори и да съдържа само цифри и обратното. Също така се получава грешка при конвентирането на текст в число, когато текста не представлява валидно число. Най-добре направи цикъл, който извлича отделните символи от текста и проверява дали са цифри, ",", "." "+", "-" или евентуално "E" ако числата са с плаваща запетая. Можеш да използваш функцията Asc() за да извлечеш ASCII кода на символа . Нещо подобно на
Private Function CheckText(Text As String) As Boolean
Dim I As Long, N As Long, A As Long
N = Len(Text)
For I = 1 To N
A = Asc(Mid$(Text, I, 1))
If A < 43 Or A > 57 Or A = 47 Then
CheckText= False
Exit Function
End If
Next I
CheckText= True
End Function
Една такава проверка би могла дори да връща точно къде е грешката и дори да маркира некоректния символ в текстовото поле за да може потребителя лесно да го види и изтрие. Ето ти едно допълнително удобство.
Редактирано от nedoga на 24.10.12 21:09.
| |
|
|
|
|