Нужно разорвать бесконечный цикл, когда Form4 закрыта - PullRequest
0 голосов
/ 18 апреля 2019

Form4 содержит PictureBox код обновления, который обновляет выбранные изображения один за другим с интервалом в 2 секунды. Это стало возможным благодаря присвоению циклу значения 1000, в то время как переменная увеличивается на 10. Этот цикл должен прерваться при закрытии Form4. ListBox1 элементы содержат путь к изображениям, выбранным с помощью openfiledialogue. ожидание и обновление изображений работает нормально.

Я пытался всеми возможными способами определить, закрыта ли форма или закрыто приложение. Те очень плохо. Но я верю, что есть способ разорвать цикл, когда пользователь возвращается к form1 [Главное меню].

Попробовал Application.openforms.count способ, и его невозможно добавить в каждый цикл, так как он дает значение 0.

Также возможно не иметь здесь сообщений и отображать только что отображенный текст в richtextbox, но при закрытии приложения Windows Form приложение будет работать до g = 1000 и будет активным в диспетчере задач.

Следовательно, для цикла do while необходим перерыв.

Do Until g = 1000
                For Each Item In ListBox1.Items
                    PictureBox1.Image = Image.FromFile(Item)
                    PictureBox1.Refresh()
                    PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
                    '  g = g + 10
                   ' MsgBox(Item)

                    CreateObject("WScript.Shell").Popup(Item, 1, "Title")
                    wait(2)


                Next
                ' need to break here if the form is closed. 
Loop

 Private Sub wait(ByVal seconds As Integer)
        For i As Integer = 0 To seconds * 100
            System.Threading.Thread.Sleep(10)
            Application.DoEvents()
        Next
 End Sub

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

Ответы [ 3 ]

1 голос
/ 18 апреля 2019

Вы пробовали компонент таймера?Добавьте компонент Timer к вашей форме.Установите для свойства Interval значение (в миллисекундах) 2000. Оно перестанет тикать, когда ваша форма закроется;не о чем беспокоиться.

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    Static Index As Integer 'Static preserves the value between calls to the method
    If Index > ListBox1.Items.Count - 1 Then
        Index = 0 'will start the display over again
        'If you want to stop at the final image just Timer1.Enabled = False
    End If
    Dim Item = ListBox1.Items(Index).ToString

    PictureBox1.Image = Image.FromFile(Item.ToString)
    PictureBox1.Refresh()
    PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
    'Option Strict does not like the following line
    CreateObject("WScript.Shell").Popup(Item, 1, "Title")
    Index += 1
End Sub
0 голосов
/ 18 апреля 2019
If Me.IsDisposed Then
                    Exit Do
                End If

Это в

Do Until g = 1000


                For Each Item In ListBox1.Items
                    ' If tf.Contains("WindowsApplication6.Form4, Text: Form4") Then
                    PictureBox1.Image = Image.FromFile(Item)

                    PictureBox1.Refresh()
                    PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
                    g = g + 10
                    'MsgBox(Item)
                    RichTextBox1.Text = System.IO.Path.GetFileName(Item)

                    'RichTextBox1.SelectionAlignment = HorizontalAlignment.Center
                    '  RichTextBox1.BackColor = Color.AliceBlue
                    '  RichTextBox1.Font = New Font(RichTextBox1.Font, FontStyle.Bold)
                    'CreateObject("WScript.Shell").Popup(Item, 1, "Title")
                    wait(2)


                Next
               ' here 
                If Me.IsDisposed Then
                    Exit Do
                End If
            Loop

Магически это было необходимо только в коде, чтобы правильно сломаться.Спасибо всем, кто поддержал меня в решении этой проблемы вашими ценными комментариями.

0 голосов
/ 18 апреля 2019

В вашем классе Form4 определите приватную переменную bool, а затем определите метод Dispose вашего класса следующим образом:

Public Class Form4
    Private _isFormClosed = False
    'rest of your code here
    Public Overloads Sub Dispose(disposing As Boolean)
        MyBase.Dispose(disposing)
        _isFormClosed = True
    End Sub
End Class

Тогда просто используйте переменную bool в вашем цикле, чтобы разорвать ее.

Другой способ - использовать FormClosing событие и установить значение логической переменной там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...