none
Использование глобальных переменных RRS feed

  • Вопрос

  • Написала код на форму 1:
     
    Public Class Form1
        Dim PokazSec As Integer
        Dim PokazMin As Integer
        Public Pokaz As Integer
        Dim Inter As Integer
        Dim Intersec As Integer
        Dim Intermin As Integer
        Public ZnachInterval As Integer
    
        Public Sub GroupBox2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles GroupBox2.Click
            PokazSec = Val(TxtPokaz.Text)
            PokazMin = Val(TxtPokaz.Text)
            Select Case Pokaz
                Case RBPocazsec.Checked = True
                    ZnachPokaz = PokazMin * 1000 * 60
                Case RBPocazmin.Checked = True
                    ZnachPokaz = PokazSec * 1000
            End Select
        End Sub
    End Class
    

    И хотелось чтобы значение переменной  ZnachPokaz вводилось в форму 2. Но не работает. Пробовала через модуль, все однофигственно, как сделать чтобы данная переменная работала в форме 2?

    Форма 2:
    Public Class Form2
    
        Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.TransparencyKey = BackColor
            PictureBox1.Visible = False
            Timer1.Interval = ZnachPokaz
            Timer2.Interval = 2000
            Timer1.Start()
        End Sub
    
        Dim i As Integer = 1
    
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            Timer1.Stop()
            Timer2.Start()
            PictureBox1.Visible = True
            PictureBox1.Image = System.Drawing.Image.FromFile("images\0" & i & ".gif")
        End Sub
        Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
            Timer2.Stop()
            i += 1
            If (i <= 5) Then
                Timer1.Start()
            End If
            PictureBox1.Visible = False
        End Sub
    
    End Class

    Прописала описание переменной в модуле. Самое интересное, что эта переменная видна на форме 1 и форме 2 но при запуске на исполнении пишется что значение interval не может быть = 0. Но в текстовое поле я ввожу числовое значение, дополнительно через лейбл проверила что формула работает. В чем моя  ошибка тогда?
    • Перемещено SachinW 1 октября 2010 г. 22:18 MSDN Forums Consolidation (От:Начинающие разработчики)
    12 января 2010 г. 14:36

Ответы

  • Все таки попробуйте задать дефолтное значение

    Module Module1
        Public ZnachPokaz As Single = 6000
    End Module
    

    хотя и без него след. код работает

    Module Module1
        Public ZnachPokaz As Single
    End Module
    
    Public Class Form1
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            ZnachPokaz = Val(TxtPokaz.Text)
            Dim frm As New Form2()
            frm.ShowDialog(Me)
        End Sub
    End Class
    
    Public Class Form2
        Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Timer1.Interval = ZnachPokaz
            Timer1.Start()
        End Sub
    End Class

    • Предложено в качестве ответа I.Vorontsov 14 января 2010 г. 7:47
    • Помечено в качестве ответа I.Vorontsov 15 января 2010 г. 11:46
    13 января 2010 г. 8:59

Все ответы

  • Form1:

    Public Class Form1
        Public ZnachPokaz As Integer
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            ZnachPokaz = Val(TxtPokaz.Text)
            Dim frm As New Form2()
            frm.ShowDialog(Me)
        End Sub
    End Class

    Form2:

    Public Class Form2
        Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim _owner As Form1 = Owner
            Timer1.Interval = _owner.ZnachPokaz
            Timer1.Start()
        End Sub
    End Class

    13 января 2010 г. 8:05
  • А разве если переменная описана в модуле она не должна быть видима во всех формах проекта?
    Module Module1
    
        Public ZnachPokaz As Single
    
    End Module
    13 января 2010 г. 8:28
  • Я прост с VB мало знаком, но у вас две формы сразу открываются?
    Может быть стоит задать начальное значение:

    Module Module1
        Public ZnachPokaz As Single = 6000
    End Module

    Наверное во второй форме считывается дефолтное значение 0, поетому вылетает ошибка.
    +я бы посоветовал для ввода интервала использовать NumericUpDown вместо TextBox :)

    13 января 2010 г. 8:35
  • Нет, сначала запускается 1 форма на ней кнопка Старт с нее запускается 2 форма она невидимая и на ней по таймеру слова отображаются а 1 уходит в невидимость.
    Я тут привела только кусочек кода, так как большой весь.
    А TextBox для возможности пользователю самостоятельно ввести интервал показа и между показами
    13 января 2010 г. 8:52
  • Все таки попробуйте задать дефолтное значение

    Module Module1
        Public ZnachPokaz As Single = 6000
    End Module
    

    хотя и без него след. код работает

    Module Module1
        Public ZnachPokaz As Single
    End Module
    
    Public Class Form1
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            ZnachPokaz = Val(TxtPokaz.Text)
            Dim frm As New Form2()
            frm.ShowDialog(Me)
        End Sub
    End Class
    
    Public Class Form2
        Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Timer1.Interval = ZnachPokaz
            Timer1.Start()
        End Sub
    End Class

    • Предложено в качестве ответа I.Vorontsov 14 января 2010 г. 7:47
    • Помечено в качестве ответа I.Vorontsov 15 января 2010 г. 11:46
    13 января 2010 г. 8:59
  • Короче добавила как сказали: форма 1
    Public Class Form1
        Public PokazSec As Integer
        Public PokazMin As Integer
        Public Pokaz As Integer
        Dim Inter As Integer
        Dim Intersec As Integer
        Dim Intermin As Integer
        Public ZnachInterval As Integer
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            PokazSec = Val(TxtPokaz.Text)
            PokazMin = Val(TxtPokaz.Text)
            Dim frm As New Form2()
            frm.ShowDialog(Me)
            Form2.Show()
            Me.Hide()
    
        End Sub
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Form2.Hide()
        End Sub
    
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            End
        End Sub
    
        Public Sub GroupBox2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles GroupBox2.Click
            Select Case Pokaz
                Case RBPocazsec.Checked = True
                    ZnachPokaz = PokazMin * 1000 * 60
                Case RBPocazmin.Checked = True
                    ZnachPokaz = PokazSec * 1000
            End Select
        End Sub
    
    End Class
    
    и форма 2:
    Public Class Form2
    
        Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.TransparencyKey = BackColor
            PictureBox1.Visible = False
            Timer1.Interval = ZnachPokaz
            Timer2.Interval = 2000
            Timer1.Start()
        End Sub
    
        Dim i As Integer = 1
    
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            Timer1.Stop()
            Timer2.Start()
            PictureBox1.Visible = True
            PictureBox1.Image = System.Drawing.Image.FromFile("images\0" & i & ".gif")
        End Sub
    
        Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
            Dim KolVo As Integer
            KolVo = System.IO.Directory.GetFiles("images\").Length
            Timer2.Stop()
            i += 1
            If (i <= KolVo) Then
                Timer1.Start()
            End If
            PictureBox1.Visible = False
        End Sub
    
    End Class
    И не хочет работать....:-(
    13 января 2010 г. 9:20
  • В моем случае форма2 создавалась только после того как считывалось значение для ZnachPokaz:

    Public Class Form1
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            ZnachPokaz = Val(TxtPokaz.Text)
            Dim frm As New Form2()
            frm.ShowDialog(Me)
        End Sub
    End Class
    

    у вас же форма2 уже существует до того как вы считали значение, поетому в ней загружалось в интервал таймера значение 0

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Form2.Hide()
    End Sub
    

    Вы пробовали изменить нач значение?

    Module Module1
        Public ZnachPokaz As Single = 6000
    End Module
    


    13 января 2010 г. 9:30
  • Пробовала, но тогда значение не меняется все время с интервалом 6000 работает
    13 января 2010 г. 9:36
  • потому что вы своим Form2.Show() считываете один раз значение из переменной и все. не создавайте форму2 до того как изменили значение в текстбоксе.
    Чтобы открыть форму с изменненным значением сделайте так:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ZnachPokaz = Val(TxtPokaz.Text)
        Dim frm As New Form2()
        frm.Show(Me)
    End Sub
    

    Но последующие изменения значения в текстбоксе не приведут к изменению интервала таймера, для етого необходимо использовать событие, изменяющее сразу значение интервала
    Или попробовать вот так:

    Module Module1
        Public ZnachPokaz As Single = 6000
    End Module
    
    
    Public Class Form1
        Dim PokazSec As Integer
        Dim PokazMin As Integer
        Public Pokaz As Integer
        Dim Inter As Integer
        Dim Intersec As Integer
        Dim Intermin As Integer
        Public ZnachInterval As Integer
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            PokazSec = Val(TxtPokaz.Text)
            PokazMin = Val(TxtPokaz.Text)
            Form2.Show()
            Me.Hide()
        End Sub
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Form2.Hide()
        End Sub
        '...
    End Class
    
    
    Public Class Form2
    
        Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.TransparencyKey = BackColor
            PictureBox1.Visible = False
            Timer1.Interval = ZnachPokaz
            Timer2.Interval = 2000
            Timer1.Start()
        End Sub
    
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            Timer1.Interval = ZnachPokaz
            Timer1.Stop()
            Timer2.Start()
            PictureBox1.Visible = True
            PictureBox1.Image = System.Drawing.Image.FromFile("images\0" & i & ".gif")
        End Sub
        '...
    End Class
    

    т.е. при каждом тике таймера 1 обновлять значение интервала из переменной ZnachPokaz
    13 января 2010 г. 9:54
  • Чего то я запуталась совсем...:-)
    А если форма изначально создана в проекте и на ней существуют объекты  с определенными свойствами?
    И не понятно зачем каждый раз с тиком обновлять значение интервала? мне просто нужно чтобы это значение установилось когда оно было вписано пользователем в textBox.

    Может как-нить можно по простому сослаться из модуля на конкретную переменную?
    13 января 2010 г. 10:08
  • я прост начал думать что вы создаете две формы и хотите динамически менять значение для таймера с первой формы :)
    Если надо прост из первой формы передать значение во вторую, то чем не подходит метод из первого моего поста ?
    13 января 2010 г. 10:14
  • Просто не понятно почему значение присвоенное
    ZnachPokaz
    в форме 1 не передается в форму 2. Раньше в VB было просто достаточно прописать как глобальную переменную чтобы ее было видно в других объектах проекта. У меня еще 12 переменных в 1 форме которые будут влиять на значение в форме 2 и что? так мудрить со всеми переменными? :-/
    13 января 2010 г. 10:25
  • Повторюсь, код в этом посте работает, и значение нормально передается из формы1 в форму2 через глобальную переменную. Скорее всего, вы все также создаете форму2 до изменения соответствующей переменной.
    13 января 2010 г. 18:42
  • Да, получилось что форма 2 создается раннее чем вводиться значение в переменную.
    Решила данную проблему немножко другим путем, но за совет большое спасибо... :-)
    На будущее взяла себе на заметку.
    14 января 2010 г. 18:43