2016-02-06 2 views
-1

Я пытаюсь сделать программу выполняемой несколько раз (а не только один раз при загрузке формы); Я попытался сделать это через кнопку, нажав кнопку, или таймер, который снова выполнит программу после того, как она «отметит».Ошибка: вызов подпрограммы из другого подпрограммы в VB

Я закомментирована код с ошибками:

Public Class Forml 

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

    End Sub 

    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint 
     Randomize() 
     Dim i As Integer 
     Dim z As Integer 
     z = Rnd() * 25 
     For i = 0 To 2 
      Dim intx As Integer = Rnd() * 420 
      Dim inty As Integer = Rnd() * 420 
      Dim tempBrush As Brush = New SolidBrush(Color.FromArgb(Rnd() * 255, Rnd() * 255, Rnd() * 255)) 
      e.Graphics.FillEllipse(tempBrush, intx, inty, 2, 2) 
     Next 
    End Sub 

    'Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick 
    ' Call Form1_Paint() 
    'End Sub 

    'Private Sub btn1_Click(sender As Object, e As EventArgs) Handles btn1.Click 
    ' Call Form1_Paint() 
    'End Sub 

End Class 
+0

'я включил картину моего code' пожалуйста не делать - нам нужен реальный код * здесь, в * вопрос. См.: [Спросить]. Помогите нам помочь вам, не отправив нас в другом месте. – Plutonix

+0

'call' - синтаксис VB6 (и VBA imho). Вы вызываете sub/function, просто записывая его имя с помощью скобок: 'Foo()'. Я рекомендую инкапсулировать вашу логику из обработчика краски в собственный суб и называть ее всякий раз, когда вам это нужно. –

+0

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

ответ

0

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

  • Form1.Paint событие возникает, когда форма считается нужен повторно краску, например, если она была покрыта другой форме. Для этого упражнения вы можете не беспокоиться о появлении большего количества точек, чем кажется на первый взгляд. Я не буду рассматривать этот вопрос здесь.

  • Объект e.Graphics не то, что вы хотите, если хотите сохранить графику, вместо этого вы хотите использовать объект, полученный от Control.CreateGraphics.

  • Рекомендуется использовать платформу .NET Random class вместо VB's Rnd().

  • Некоторые классы используют ресурсы, которые должны быть конкретно disposed, и поэтому у них есть метод .Dispose(). Графические объекты имеют тенденцию быть подобными (также операции с базами данных и файлами). Вы можете использовать блок Using, чтобы позаботиться о вызове Dispose для вас.

И очень важный момент:

  • Использование Option Strict On. Это поможет вам написать код, который работает, указывая на любые ошибки, которые он может обнаружить. Установите его как значение по умолчанию для новых проектов.

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

Для таких вещей, как таймеры, где вы можете перетащить таймер на поверхность чертежа, мне лучше создать его в коде. Таким образом, вам не нужно переключаться между конструктором и окнами кода для изменения параметров, и вы не задаетесь вопросом, откуда взялось что-то вроде «Timer1».

В конце концов, я придумал (не обязательно очень хорошо) код:

Option Infer On 
Option Strict On 

Public Class Form1 

    Dim rand As New Random 
    Dim tim As Timer 

    Sub DrawDots(sender As Object) 
     ' This sub could have been called with anything as sender, so check that 
     ' it is actually a Control 
     Dim self As Control = TryCast(sender, Control) 
     If self Is Nothing Then 
      Exit Sub 
     End If 

     Using g = self.CreateGraphics() 

      Dim nDots = rand.Next(1, 26) 
      Dim circleRadius = 20 

      For i = 1 To nDots 
       Dim xLoc = rand.Next(0, 420) 
       Dim yLoc = rand.Next(0, 420) 
       Dim col = Color.FromArgb(rand.Next(0, 256), rand.Next(0, 256), rand.Next(0, 256)) 

       Using br As New SolidBrush(col) 
        g.FillEllipse(br, xLoc, yLoc, circleRadius, circleRadius) 
       End Using 

      Next 
     End Using 

    End Sub 

    Sub DrawDotsOnTimerTick(sender As Object, e As EventArgs) 
     DrawDots(Me) 

    End Sub 

    Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles MyBase.Paint 
     DrawDots(sender) 

    End Sub 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     DrawDots(Me) 

    End Sub 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     tim = New Timer 
     tim.Interval = 2000 
     AddHandler tim.Tick, AddressOf DrawDotsOnTimerTick 
     tim.Start() 

    End Sub 

End Class 
+0

вы можете передать 'e.Graphics' из события paint в DrawDots() вместо использования' CreateGraphics'. В другом месте, а не при вызове DrawDots, просто аннулируйте форму (в этот момент DrawDots не требуется, потому что это код Paintevent). , Использование события paint - это то, что делает рисунок продолжающимся. – Plutonix

Смежные вопросы