2009-10-07 3 views
1

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

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

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 
+0

(Обновлено мой ответ, основанный на ваш комментарий) –

ответ

1

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

EDIT: Так как вы работаете с .NET 1.1 и не имеют доступа к Application.OpenForms, вот несколько советов:

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

Привет Julien Пулен, Но я использую .NET 1.1 работы кадров, где Application.OpenForms не поддерживается – user173223

3

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

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

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

0

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

0

Это очень легко, как это в vb.net

Dim MYFormName As String = Me.Name.ToString 
0

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

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