2015-04-16 22 views
0

У меня возникла странная проблема с этой программой VB, над которой я работаю. Я честно не совсем уверен, почему я столкнулся с этой проблемой, потому что я сделал другие задания с легкостью, которые были относительно похожи на это. Программа предназначена для того, чтобы я мог добавлять определенные фильмы из магазина (левый список) в корзину (правый список). Вы можете видеть, что я добавил Человека-паука два раза (потому что кто не любит Человека-паука ?), и он правильно отображал имя и $ 2 каждый раз. Однако первый блок ярлыка внизу должен накапливаться каждый раз, когда я добавляю фильм в окно, но он остается устойчивым в первом фильме, который я выбираю. Если бы я выбрал любой из других фильмов, которые все дороже, он все равно останется в первом фильме, который я выбрал.Visual Basic Movie Program

EDIT: Я должен добавить, у меня была такая же проблема, прежде чем я переместил некоторые части кода в свои соответствующие функции.

enter image description here

Открытый класс MainForm

Public strMovies() As String = 
     {"Spider-Man", "Daredevil", "Hulk", "The Punisher", "Spider-Man 2", 
     "Fantastic Four", "Spider-Man 3", "Iron Man", "The Amazing Spider-Man", "The Wolverine"} 
Public intMoviePrices() As Integer = 
    {2, 4, 6, 8, 10, 12, 14, 16, 18, 20} 

Dim X As Integer 
Dim Y As Integer 
Dim moviecost As Integer 
Dim movietax As Double 
Dim numberdvds As Integer 
Dim shippingcharge As Double 
Dim netcost As Double 
Dim movieChoice As String 


Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles lstCom.SelectedIndexChanged 

End Sub 


Public Function calculateTotals(movieChoice) As Integer 



    moviecost = moviecost + intMoviePrices(movieChoice) 
    movietax = (moviecost * 1.04) - moviecost 
    If numberdvds >= 5 Then 
     shippingcharge = 5 
    Else 
     shippingcharge = numberdvds 
    End If 
    netcost = movietax + moviecost + shippingcharge 

    lblgrosscost.Text = moviecost 
    lblsalestax.Text = FormatNumber(movietax, 2) 
    lblshipping.Text = shippingcharge 
    lblnetcost.Text = netcost 

    Return moviecost 
    Return movietax 

End Function 

Public Function addMovie() As String 




    movieChoice = lstCom.SelectedIndex 

    For X = LBound(strMovies) To UBound(strMovies) 
     If lstCom.SelectedIndex = X Then 
      lstCom2.Items.Add(strMovies(X) & " $" + intMoviePrices(movieChoice).ToString) 
      numberdvds += 1 
      Call calculateTotals(movieChoice) 

     End If 
    Next 

End Function 

Public Function removeMovie() As String 



    For X = LBound(strMovies) To UBound(strMovies) 
     If lstCom2.SelectedIndex = X Then 
      lstCom2.Items.Remove(lstCom2.SelectedItem) 
      numberdvds -= 1 
      Call calculateTotals(movieChoice) 

     End If 
    Next 





End Function 

Private Sub mainForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load 




    lstCom.Items.Add("Spider-Man") 
    lstCom.Items.Add("Daredevil") 
    lstCom.Items.Add("Hulk") 
    lstCom.Items.Add("The Punisher") 
    lstCom.Items.Add("Spider-Man 2") 
    lstCom.Items.Add("Fantastic Four") 
    lstCom.Items.Add("Spider-Man 3") 
    lstCom.Items.Add("Iron Man") 
    lstCom.Items.Add("The Amazing Spider-Man") 
    lstCom.Items.Add("The Wolverine") 
    lstCom.SelectedIndex = 0 


End Sub 

Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click 

    Call addMovie() 

End Sub 

Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click 

    Me.Close() 

End Sub 

Private Sub btnRemove_Click(sender As Object, e As EventArgs) Handles btnRemove.Click 

    Call removeMovie() 
End Sub 

End Class

+1

Возможно, вы захотите изменить свой тег на VBA на VB.Net или используемую вами производную Visual Basic, а не на форму VBA :). –

+1

@ Dan Donoghue это просто может быть на стероидах ... – Codexer

+0

Спасибо, Дэн, возможно, поэтому я получал downvotes или потому, что это был глупый вопрос. Я ценю вашу помощь. Сейчас я играю с вашим ответом! –

ответ

0

Добавление другого ответа, как это второй вопрос. Я изменил ваш код, но не могу проверить, так как у меня нет проекта.

Пожалуйста, проверьте и сообщите об этом. Обратите внимание, что вам нужно поместить некоторые smarts в процедуру removeMovie, чтобы выработать стоимость и налог, обратитесь к тому, что я сделал с функцией addMovie, чтобы получить представление.

Подсчитать итоговую процедуру в основном просто форматирует и публикует данные, фактические числа разрабатываются при добавлении/удалении вещей. Я удалил переменную MovieChoice, переданную в нее, поскольку она больше не актуальна.

Public strMovies() As String = 
     {"Spider-Man", "Daredevil", "Hulk", "The Punisher", "Spider-Man 2", 
     "Fantastic Four", "Spider-Man 3", "Iron Man", "The Amazing Spider-Man", "The Wolverine"} 
Public intMoviePrices() As Integer = 
    {2, 4, 6, 8, 10, 12, 14, 16, 18, 20} 

Dim X As Integer 
Dim Y As Integer 
Dim moviecost As Integer 
Dim movietax As Double 
Dim numberdvds As Integer 
Dim shippingcharge As Double 
Dim netcost As Double 
Dim movieChoice As String 


Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles lstCom.SelectedIndexChanged 

End Sub 


Public Function calculateTotals() As Integer 
    If numberdvds > 4 Then 
     shippingcharge = 5 
    Else 
     shippingcharge = numberdvds 
    End If 
    netcost = movietax + moviecost + shippingcharge 
    lblgrosscost.Text = moviecost 
    lblsalestax.Text = FormatNumber(movietax, 2) 
    lblshipping.Text = shippingcharge 
    lblnetcost.Text = netcost 
End Function 

Public Function addMovie() As String 
    movieChoice = lstCom.SelectedIndex 
    moviecost = moviecost + intMoviePrices(movieChoice) 
    movietax = movietax + (intMoviePrices(movieChoice) * 0.04) 
    For X = LBound(strMovies) To UBound(strMovies) 
     If lstCom.SelectedIndex = X Then 
      lstCom2.Items.Add (strMovies(X) & " $" + intMoviePrices(movieChoice).ToString) 
      numberdvds = numberdvds + 1 
      Call calculateTotals() 
     End If 
    Next 
End Function 

Public Function removeMovie() As String 
    'Need to add code to remove cost and tax here 
    For X = LBound(strMovies) To UBound(strMovies) 
     If lstCom2.SelectedIndex = X Then 
      lstCom2.Items.Remove (lstCom2.SelectedItem) 
      numberdvds = numberdvds - 1 
      Call calculateTotals() 
     End If 
    Next 
End Function 

Private Sub mainForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    For X = LBound(strMovies) To UBound(strMovies) 
     lstCom.Items.Add (strMovies(X)) 
    Next 
End Function 

Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click 
    Call addMovie 
End Function 

Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click 
    Me.Close() 
End Function 

Private Sub btnRemove_Click(sender As Object, e As EventArgs) Handles btnRemove.Click 
    Call removeMovie 
End Function 
+1

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

+1

@CullinMcGrath вы можете попросить его номер в банке или, может быть, обратиться, чтобы отправить дюжину пива: D – DnR

+0

Все хорошие друзья, рад, что я могу вам помочь. –

2

Вы сброса стоимости MOVIE каждый раз, когда вы вычислить, как она относится только к этой функции.

Переместить это:

Dim moviecost As Integer 

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

Также вы можете заменить все это:

If lstCom.SelectedIndex = 0 Then 
    lstCom2.Items.Add ("Spider-Man " + "$" + intMoviePrices(movieChoice).ToString) 
    Call calculateTotals(movieChoice) 
ElseIf lstCom.SelectedIndex = 1 Then 
    lstCom2.Items.Add ("Daredevil " + "$" + intMoviePrices(movieChoice).ToString) 
ElseIf lstCom.SelectedIndex = 2 Then 
    lstCom2.Items.Add ("Hulk " + "$" + intMoviePrices(movieChoice).ToString) 
ElseIf lstCom.SelectedIndex = 3 Then 
    lstCom2.Items.Add ("The Punisher " + "$" + intMoviePrices(movieChoice).ToString) 
ElseIf lstCom.SelectedIndex = 4 Then 
    lstCom2.Items.Add ("Spider-Man 2 " + "$" + intMoviePrices(movieChoice).ToString) 
ElseIf lstCom.SelectedIndex = 5 Then 
    lstCom2.Items.Add ("Fantastic Four " + "$" + intMoviePrices(movieChoice).ToString) 
ElseIf lstCom.SelectedIndex = 6 Then 
    lstCom2.Items.Add ("Spider-Man 3 " + "$" + intMoviePrices(movieChoice).ToString) 
ElseIf lstCom.SelectedIndex = 7 Then 
    lstCom2.Items.Add ("Iron Man " + "$" + intMoviePrices(movieChoice).ToString) 
ElseIf lstCom.SelectedIndex = 8 Then 
    lstCom2.Items.Add ("The Amazing Spider-Man " + "$" + intMoviePrices(movieChoice).ToString) 
ElseIf lstCom.SelectedIndex = 9 Then 
    lstCom2.Items.Add ("The Wolverine " + "$" + intMoviePrices(movieChoice).ToString) 
End If 

С этим:

For X = LBound(strMovies) To UBound(strMovies) 
    If lstCom.SelectedIndex = X Then 
     lstCom2.Items.Add (strMovies(X) & " $" + intMoviePrices(movieChoice).ToString) 
     Call calculateTotals(movieChoice) 
    End If 
Next 

Затем поместите это в верхней части этой функции:

Dim X As Integer 
+0

Могу ли я попросить совета по наилучшему способу расчета из корзины? Ваши рассуждения имеют смысл для меня. –

+0

На самом деле сэкономьте некоторое время. 1) Сделайте MovieCost переменной уровня модуля (перемещайте ее вне любых функций или подсайтов). 2) Когда добавляется фильм, сделайте это: moviecost = moviecost + intMoviePrices (movieChoice) 3) когда фильм удален, выполните следующее: moviecost = moviecost - intMoviePrices (movieChoice). Должны исправить все проблемы для вас. Наконец, всегда делайте это lblgrosscost.Text = moviecost при изменении MovieCost –

+0

Также проверьте мое изменение в моем ответе. Я расколол этот массивный, если для вас. –