2016-01-20 1 views
1

Если у кого-то есть другие решения для достижения этого, мне было бы очень интересно услышать их.Температурный прогресс в VB.NET

Я пытаюсь создать программу проверки пароля для школьного проекта, но у меня возникают проблемы с моей панелью прогресса. В основном, когда сила пароля сильна (поэтому значение балла выше), progressbar работает отлично, но когда сила пароля невелика, индикатор прогресса не изменяется до нужного цвета или показывает значение.

Вот мой код:

Public Class PassCheck 

Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, 
                   ByVal wMsg As Integer, ByVal wParam As Integer, 
                   ByVal IParam As Integer) As Integer 

Dim Checked As Boolean 
Dim Password As String 
Dim PasswordLength As Integer 
Dim PasswordStrength As String 
Dim Score As Integer 
Dim ProgBarVal As Double 
Dim LengthScore As Integer 
Dim NumberScore As Integer 
Dim CapsScore As Integer 
Dim LowerScore As Integer 
Dim SymbolScore As Integer 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    hidepasswordOption.Checked = True 
    textboxPassword.PasswordChar = "*" 
End Sub 

Private Sub hidepasswordOption_Click(sender As Object, e As EventArgs) Handles hidepasswordOption.Click 
    hidepasswordOption.Checked = Not hidepasswordOption.Checked 
    If textboxPassword.PasswordChar = "*" Then 
     textboxPassword.PasswordChar = "" 
    Else 
     textboxPassword.PasswordChar = "*" 
    End If 
End Sub 

Private Sub buttonCheck_Click(sender As Object, e As EventArgs) Handles buttonCheck.Click 
    Score = 0 
    NumberScore = 0 
    SymbolScore = 0 
    LowerScore = 0 
    CapsScore = 0 

    Password = textboxPassword.Text 

    If String.IsNullOrEmpty(Password) Then 
     MsgBox("You must enter a password!", 16, "Error!") 
     Exit Sub 
    End If 

    Checked = True 

    Check_Password() 

    progressbarStrength.Value = 0 
    progressbarStrength.Maximum = 20 
    progressbarStrength.Minimum = 0 
    labelScoreText.Text = Score & "/20" 
    progressbarStrength.Value = Score 

    Progbar_calc() 

    labelStrengthText.Text = PasswordStrength 

End Sub 


Public Sub Progbar_calc() 

    If Score <= 10 Then 
     PasswordStrength = "Weak" 
     SendMessage(progressbarStrength.Handle, 1040, 2, 0) 
    ElseIf Score <= 15 Then 
     PasswordStrength = "Medium" 
     SendMessage(progressbarStrength.Handle, 1040, 3, 0) 
    ElseIf Score <= 20 Then 
     PasswordStrength = "Strong" 
     SendMessage(progressbarStrength.Handle, 1040, 1, 0) 
    End If 
End Sub 

Public Sub Check_Password() 
    Password = textboxPassword.Text 
    PasswordLength = Len(Password) 
    ImprovePass.Password = textboxPassword.Text 

    Dim array() As Char = Password.ToCharArray() 
    For i = 0 To array.Length - 1 
     If Char.IsUpper(array(i)) Then 
      If CapsScore >= 3 Then 
      Else 
       CapsScore = CapsScore + 1 
      End If 
     ElseIf Char.IsLower(array(i)) Then 
      If LowerScore >= 3 Then 
      Else 
       LowerScore = LowerScore + 1 
      End If 
     ElseIf Char.IsNumber(array(i)) Then 
      If NumberScore >= 3 Then 
      Else 
       NumberScore += 1 
      End If 
     ElseIf Char.IsSymbol(array(i)) Then 
      If SymbolScore >= 3 Then 
      Else 
       SymbolScore += 1 
      End If 
     End If 
    Next 

    Score += CapsScore 
    Score += LowerScore 
    Score += NumberScore 
    Score += SymbolScore 

    If PasswordLength >= 8 Then 
     Score += 8 
    Else 
     Score += PasswordLength 
    End If 

    If CapsScore = 0 Then 
     ImprovePass.listboxImprove.Items.Add("You should include some capital letters.") 
     ImprovePass.listboxImprove.Items.Add("-------------------------------------") 
    ElseIf CapsScore = 1 Then 
     ImprovePass.listboxImprove.Items.Add("You have included 1 capital letter,") 
     ImprovePass.listboxImprove.Items.Add("You should include some more capital letters.") 
     ImprovePass.listboxImprove.Items.Add("-------------------------------------") 
    ElseIf CapsScore >= 2 Then 
     ImprovePass.listboxImprove.Items.Add("You have included 2 or more capital letters!") 
     ImprovePass.listboxImprove.Items.Add("-------------------------------------") 
    End If 
    If LowerScore = 0 Then 
     ImprovePass.listboxImprove.Items.Add("You should include some lower case letters.") 
     ImprovePass.listboxImprove.Items.Add("-------------------------------------") 
    ElseIf LowerScore = 1 
     ImprovePass.listboxImprove.Items.Add("You have included 1 lower case letter,") 
     ImprovePass.listboxImprove.Items.Add("You should include some more lowercase letters.") 
     ImprovePass.listboxImprove.Items.Add("-------------------------------------") 
    ElseIf LowerScore >= 2 Then 
     ImprovePass.listboxImprove.Items.Add("You have included 2 or more lower case letters!") 
     ImprovePass.listboxImprove.Items.Add("-------------------------------------") 
    End If 
    If NumberScore = 0 Then 
     ImprovePass.listboxImprove.Items.Add("You should include some numbers.") 
     ImprovePass.listboxImprove.Items.Add("-------------------------------------") 
    ElseIf NumberScore = 1 Then 
     ImprovePass.listboxImprove.Items.Add("You have included 1 number,") 
     ImprovePass.listboxImprove.Items.Add("You should include some more numbers.") 
     ImprovePass.listboxImprove.Items.Add("-------------------------------------") 
    ElseIf NumberScore >= 2 Then 
     ImprovePass.listboxImprove.Items.Add("You have included 2 or more numbers!") 
     ImprovePass.listboxImprove.Items.Add("-------------------------------------") 
    End If 
    If SymbolScore = 0 Then 
     ImprovePass.listboxImprove.Items.Add("You should include some symbols.") 
     ImprovePass.listboxImprove.Items.Add("-------------------------------------") 
    ElseIf SymbolScore = 1 Then 
     ImprovePass.listboxImprove.Items.Add("You have included 1 symbol,") 
     ImprovePass.listboxImprove.Items.Add("You should include some more symbols.") 
     ImprovePass.listboxImprove.Items.Add("-------------------------------------") 
    ElseIf SymbolScore >= 2 Then 
     ImprovePass.listboxImprove.Items.Add("You have included 2 or more symbols!") 
     ImprovePass.listboxImprove.Items.Add("-------------------------------------") 
    End If 
    If PasswordLength <= 6 Then 
     ImprovePass.listboxImprove.Items.Add("You have only included" & Space(1) & PasswordLength & Space(1) & "characters,") 
     ImprovePass.listboxImprove.Items.Add("You should include at least 3 more to make your password more secure!") 
     ImprovePass.listboxImprove.Items.Add("-------------------------------------") 
    ElseIf PasswordLength <= 8 Then 
     ImprovePass.listboxImprove.Items.Add("You have only included" & Space(1) & PasswordLength & Space(1) & "characters,") 
     ImprovePass.listboxImprove.Items.Add("You should include at least 4 more to make your password more secure!") 
     ImprovePass.listboxImprove.Items.Add("-------------------------------------") 
    ElseIf PasswordLength >= 11 Then 
     ImprovePass.listboxImprove.Items.Add("You have included 11 or more characters!") 
     ImprovePass.listboxImprove.Items.Add("-------------------------------------") 
    End If 

    'MsgBox("Upper: " & CapsScore & "Lower: " & LowerScore & "Number: " & NumberScore & "Symbol: " & SymbolScore) 

End Sub 


Private Sub improvePassMenu_Click(sender As Object, e As EventArgs) Handles improvePassMenu.Click 
    ImprovePass.Show() 
    If textboxPassword.PasswordChar = "*" Then 
     ImprovePass.labelPassText.Text = "(Hidden)" 
    Else 
     ImprovePass.labelPassText.Text = Password 
    End If 
End Sub 

Private Sub textboxPassword_TextChanged(sender As Object, e As EventArgs) Handles textboxPassword.TextChanged 
    Score = 0 
    NumberScore = 0 
    SymbolScore = 0 
    LowerScore = 0 
    CapsScore = 0 
    Password = textboxPassword.Text 
    PasswordLength = Len(Password) 

    Select Case PasswordLength 
     Case < 6 
      buttonCheck.Enabled = False 
      labelScoreText.Text = "Too Short" 
      labelStrengthText.Text = "Too Short" 
     Case > 12 
      buttonCheck.Enabled = False 
      labelScoreText.Text = "Too Long" 
      labelStrengthText.Text = "Too Long" 
     Case Else 
      buttonCheck.Enabled = True 
      labelScoreText.Text = "" 
      labelStrengthText.Text = "" 
    End Select 

End Sub 
End Class 

Прогресс бар работает, когда сила сильна:

enter image description here

Прогресс бар работает на среде только тогда, когда он является первым (или, возможно, второй) проверка поскольку программа была открыта:

enter image description here

Когда это не первый (или, возможно, второй) проверить это не работает:

enter image description here

Прогресс бар работает на слабый только тогда, когда он является первым (или, возможно, второй) проверить, так как программа была открыта:

enter image description here

Когда это не первый (или, возможно, второй) проверить это не работает:

enter image description here

Мне нужно это, чтобы работать КАЖДОЕ ВРЕМЯ независимо от того, сколько паролей вы вводите.

Любые идеи, почему это может не работать? Спасибо,

+0

Что это такое? 'SendMessage (progressbarStrength.Handle, 1040, 2, 0)' Я не знаю, что такое сообщение 1040. –

+0

@EricJ. Это код для изменения цвета панели результатов. Я не совсем уверен, что означает 1040, поскольку я получил эту строку кода от друга, который делает тот же проект, для которого он работает. Есть ли лучший способ, с помощью которого я мог бы изменить цвет прогрессивной панели? –

+0

Подпись PInvoke не совсем правильная. см. http://stackoverflow.com/a/33438255/1070452 – Plutonix

ответ

2

If anyone has any other solutions...

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

Простой прямоугольный метр с помощью PictureBox:

'form level variables: 
Private pValue As Double 
Private pColor1 As Color 

Затем, когда вы оцениваете счет (я использовал бар трек):

pValue = track1.Value/20 

    Select Case track1.Value 
     Case Is <= 10 
      pColor1 = Color.Red   
     Case Is <= 15 
      pColor1 = Color.Yellow  
     Case Else 
      pColor1 = Color.LimeGreen 
    End Select 
    ' pb2 is the picturebox 
    pb2.Invalidate() 

Тогда в случае краски:

If pValue = 0 Then Exit Sub 

Dim rect = New Rectangle(0, 0, 
         Convert.ToInt32(pb2.Width * pValue), 
         pb2.Height) 
' single color version 
Using br As New SolidBrush(pColor1) 
    e.Graphics.FillRectangle(br, rect) 
End Using 

Его вид неуловимого, потому что он всегда красный для первой ПОЛОВИНЫ заливки, желтого или зеленого около 25% (но я оставил свое масштабирование в одиночку).

Для градиента - никоим образом ваш учитель не подумает, что вы это поняли - вам нужны небольшие изменения.В вары:

Private pColor1 As Color 
Private pColor2 As Color 
Private pValue As Double 

оценки:

pValue = track1.Value/20 
Select Case track1.Value 
    Case Is <= 10 
     pColor1 = Color.Red 
     pColor2 = Color.MistyRose 

    Case Is <= 15 
     pColor1 = Color.Red 
     pColor2 = Color.Yellow 

    Case Else 
     pColor1 = Color.Yellow 
     pColor2 = Color.LimeGreen 

End Select 
pb2.Invalidate() 

pColor1 является градиентом старт цвет, pcolor2 конец цвета. Играйте с ними, чтобы увидеть, что выглядит лучше всего. Событие рисования:

If pValue = 0 Then Exit Sub 

Dim rect = New Rectangle(0, 0, 
         Convert.ToInt32(pb2.Width * pValue), 
         pb2.Height) 

Using br As New LinearGradientBrush(rect, pColor1, pColor2, LinearGradientMode.Horizontal) 
    e.Graphics.FillRectangle(br, rect) 
End Using 

Результат:

enter image description here

По моему, у меня также есть индикатор текста для результата. Он по-прежнему остается Red/WEAK на 50%, а не в 33% случаев. Простота масштабирования, если вы хотите.

+0

Это похоже на действительно хорошую альтернативу. (Кстати, я никогда не собирался рассказывать своему учителю, что я сам это понял), я, конечно, расскажу ей, что у меня была какая-то помощь из переполнения стека). Хотя, как вы думаете, вы сможете показать мне (путем редактирования мой код), где будет идти каждый бит кода? К сожалению, я не очень хорошо разбираюсь в Visual Basic. xD Еще раз спасибо. –

+0

Нет, я не могу отредактировать вопрос, чтобы исправить его. Вары поднимались вверху с вашими утверждениями «Дим». Оценка их установки заменяет ваш код ProgressBar. часть чертежа находится в событии PaintBox. Откройте меню в верхней части редактора кода - выберите изображение справа, событие рисования справа – Plutonix

+0

Хорошо, я попробую, спасибо –