Форма Open & Close Обработка - PullRequest
0 голосов
/ 25 апреля 2018

Я вызываю форму, которая, как я ожидаю, автоматически запускает некоторый код, а затем снова закрывается. Когда я вызываю Close() в форме после ее успешного запуска во время отладки, он возвращает меня к основному приложению, в котором я запускал форму, и выдает следующее исключение:

System.ObjectDisposedException: 'Невозможно получить доступ к удаленному объекту. Имя объекта: 'ShippingLabelPrintApp'. '

Основной модуль:

Module Main

    Sub Main()
        'Add save folder if it doesn't exist
        If (Not System.IO.Directory.Exists(savePath)) Then
            System.IO.Directory.CreateDirectory(savePath)
        End If

        'saveString = getImagePath()

        'Establish whether we are auto or manual packing clamshells.
        'packMode = ???

        'If we are manually packing clamshells, send to the manual pack station shipping printer (ZEBRA)
        'System.Windows.Forms.Application.Run(New ShippingLabelPrintApp)
        Dim manualShipForm As New ShippingLabelPrintApp
        manualShipForm.saveString = "\\Warhawk\users\username\Desktop\Label #794661031570.PNG"
        manualShipForm.ShowDialog()

        'If we are auto packing clamshells, send to the auto pack shipping printer (SATO)
        'convertImage(saveString)
        'transmitImage(saveString)

        Environment.Exit(0)
    End Sub

End Module

Форма:

Imports System.Drawing.Printing

Public Class ShippingLabelPrintApp
    Public saveString As String

    Public Sub New()
        ' The Windows Forms Designer requires the following call.
        InitializeComponent()
        print()
    End Sub

    ' Specifies what happens when the user clicks the Button.
    Private Sub print()
        Dim margins As New Margins(70, 0, 35, 0)
        Dim paperSize As New PaperSize("Custom Paper Size", 400, 600)
        Try
            printDocument.PrinterSettings.PrinterName = "Manual Ship Printer"
            'Set internally at the printer
            'printDocument.DefaultPageSettings.PaperSize = paperSize
            'printDocument.DefaultPageSettings.Margins = margins
            printDocument.Print()
        Catch ex As Exception
            MsgBox("An error occurred while printing",
               ex.ToString())
        Finally
            Close()
        End Try
    End Sub

    ' Specifies what happens when the PrintPage event is raised.
    Private Sub printDocument_PrintPage(sender As Object, ev As PrintPageEventArgs) Handles printDocument.PrintPage

        ' Draw a picture.
        ev.Graphics.DrawImage(System.Drawing.Image.FromFile(saveString),
           ev.Graphics.VisibleClipBounds)

        ' Indicate that this is the last page to print.
        ev.HasMorePages = False
    End Sub

End Class

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

1 Ответ

0 голосов
/ 25 апреля 2018

Очевидно, вы вызываете ваш метод print() в конструкторе формы, а не событие Load формы, как вы изначально заявили.Что это меняет?Что ж, с этим есть две проблемы:

  1. Вы устанавливаете значение saveString после вызова конструктора формы (New ShippingLabelPrintApp), поэтому метод print() вызывается без saveString инициализирован и ev.Graphics.DrawImage(Image.FromFile(saveString),.. не удастся.Однако это не имеет никакого отношения к исключению ObjectDisposedException.
  2. Как объяснено выше, ваш метод print() выполняется после создания экземпляра формы (с использованием New ShippingLabelPrintApp).И поскольку метод print() закрывает (то есть удаляет) форму, метод print может завершиться очень быстро, вызывая Form.Close() и вызывая удаление формы еще до ShowDialog() (или Show())называется (это именно то, что происходит в вашем случае).

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

Private Sub ShippingLabelPrintApp_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    print()
End Sub

Или вы можете установить уровень доступа для метода print на Public или Friend и вызвать его напрямуюиз Sub Main:

Public Class ShippingLabelPrintApp
    Friend Sub print()
        '
        '
    End Sub
End Class

Sub Main()
    Dim manualShipForm As New ShippingLabelPrintApp
    manualShipForm.saveString = "Your\Path\To\The\Image\File.png"
    manualShipForm.Show() 'In this case, don't use ShowDialog so that the next line gets
    '                      executed which takes care of the blocking instead of ShowDialog.
    manualShipForm.print()

    'Application.Exit()
End Sub

И последнее: вам не нужно звонить Application.Exit, так как приложение автоматически закроется, как только достигнет конца Sub Main().

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