Активная форма в приложении Windows? - PullRequest
1 голос
/ 07 октября 2009

Я занимаюсь разработкой приложения Windows Forms . У меня есть четыре формы, которые унаследованы от Baseform в другом проекте. Во всех четырех формах я использую метку для отображения количества транзакций в зависимости от состояния сети. Я реализовал поток, который получает активную форму приложения и настройки текста. Код работает нормально, если экран приложения активен. Если я сверну и открою любое другое приложение, я получу исключение нулевой ошибки.

Как получить активную форму заявки?

Private Sub StartThread() 
    pollThread =New Thread(AddressOf PollfileStatus) 
    pollThread.IsBackground =True
    running =True
    pollThread.Start()
End Sub

Private Sub PollfileStatus() 
    While (running)
        Try
            For Each e As Control In Me.ActiveForm.Controls 
                If (e.Name = "pbStatus") Then
                    e.Invoke(New SetTextCallback(AddressOf Settext), 
                        New Object() {e, 10}) 
                End If
            Next
        Catch ex As Exception 
            Throw New ApplicationException(ex.Message) 
        End Try
        Thread.Sleep(6000)
    End While
End Sub 

Ответы [ 5 ]

3 голосов
/ 25 ноября 2009

Понятно, что Me.ActiveForm пуст, так как сворачивание вашей формы делает ее неактивной. У вас есть два варианта:

  • Проверьте, является ли Me.ActiveForm пустым, и если это так, не обновляйте метку. Это будет эффективно «приостанавливать» обновления меток, пока пользователь снова не восстановит окно.

  • Создайте свойство в своем классе, содержащее ваш поток, чтобы передать ссылку на форму, которую вы должны обновить. Таким образом, метка в данной форме будет обновляться, даже если она не является активной формой. Это может быть лучшим вариантом, он будет обновляться, даже если форма неактивна в фоновом режиме, например.

1 голос
/ 08 октября 2009

Вы должны посмотреть в Application.OpenForms общее свойство. Он содержит коллекцию всех форм в вашем приложении.

РЕДАКТИРОВАТЬ : Поскольку вы работаете с .net 1.1 и не имеете доступа к Application.OpenForms, вот несколько советов:

  • Реализуйте свой собственный общий класс (модуль), который содержит ArrayList форм. Затем можно создать базовый класс, унаследованный от Form, обработать событие Load, чтобы добавить текущую форму в список форм, и событие Closed, чтобы удалить его. Когда у вас есть этот класс, все ваши реальные формы получаются из него. Кстати, это (почти), как это делается в .Net 2.0.
  • Переверните проблему и заставьте рабочий поток вызывать события при изменении значений, которые вы можете обрабатывать в каждой форме для ее обновления.
0 голосов
/ 16 марта 2017

У вас есть много решений для этой ситуации:

  • Прежде всего вам следует проверить, не имеет ли текущая форма значение NULL, прежде чем предпринимать какие-либо действия.
  • секунда: если это условие выполнено, рекомендуется сохранить ссылку на последнюю активную форму.
0 голосов
/ 16 марта 2017

Это очень просто, как это в vb.net

Dim MYFormName As String = Me.Name.ToString
0 голосов
/ 02 августа 2015

Старый вопрос, но я подумала, что предложу также предложение: вы могли бы реализовать Public Shared CurrentForm As Form, который вы задали в событии Form.Activated базового класса форм, от которого наследуются все ваши формы. После этого вы можете использовать CurrentForm для доступа к нужной форме.

...