2015-01-16 2 views
1

В VBA Я поставил Application.ScreenUpdating и другие параметры приложения, используя следующий класс:Хороший шаблон дизайна для установки Excel.Application.ScreenUpdating с VB.NET?

Option Explicit 

Private Sub Class_Initialize() 
    Application.Cursor = xlWait 
    Application.ScreenUpdating = False 

    ae = Chr(228) 
    ao = Chr(229) 
    oe = Chr(246) 
    aeCap = Chr(196) 
    aoCap = Chr(197) 
    oeCap = Chr(214) 
End Sub 

Private Sub Class_Terminate() 
    Application.Cursor = xlDefault 
    Application.ScreenUpdating = True 
End Sub 

Я реализовал ее в каждой точке входа в мой код с:

Sub GetFilePathButton() 
    Dim runState As New cRunState 
    Set runState = New cRunState 

    'My Other Code 
End Sub 

Я был очень рад с этим. Application.ScreenUpdating позаботились. Мне не нужно было думать о том, что произойдет, когда будут выброшены ошибки или когда одна функция вызовет другую. В конце вещей процедура входа в класс завершится, а настройки приложения будут сброшены.

Я попытался использовать один и тот же шаблон проектирования в VB.NET

Public Class mApplicationSettings 
    Dim ExlApp As Excel.Application = CType(AddinModule.CurrentInstance, MyProject.AddinModule).ExcelApp.Application 
    Dim ScreenUpdating As Boolean 

    Public Sub New() 
     MyBase.New() 
     ScreenUpdating = ExlApp.ScreenUpdating 
     ExlApp.ScreenUpdating = False 
    End Sub 

    Protected Overrides Sub Finalize() 
     MyBase.Finalize() 
     ExlApp.ScreenUpdating = ScreenUpdating 
    End Sub 
End Class 

И называть его функций с:

Sub Test() 
    Dim appSet mApplicationSettings = mApplicationSettings 
    'My Other Code 
End Sub 

Это не очень хорошо работает. Sub New() вызывается и работает отлично. Но Sub Finalize() никогда не запускается. Поэтому настройки приложения никогда не будут сброшены.

У меня есть два вопроса, связанные с этим:

  • Как вы думаете, это хороший шаблон дизайна для обработки параметров приложения в Excel?
  • У меня нет работы, как я описал. Можете ли вы показать мне, что не так, или рекомендовать лучший дизайн?
+2

Это хороший дизайн для VBA. Не так много для VB.Net, так как вы не знаете, когда вызывается (или если) финализаторы. Вам необходимо восстановить экранирование вручную непосредственно перед «End Sub». Поиск try..fain или dispose pattern – adrianm

+0

В VBA выключение экрана не является постоянным - при завершении выполнения VBA установка экрана всегда возвращается к True. Не знаю, так ли это при использовании VB.NET –

ответ

0

Вы можете создать класс, который реализует IDisposable.

В новом методе положить материал, когда объект будет построен.

В методе dispose помещайте материал в конец инструкции using.

Public Class DisableScreenUpdating 
    Implements IDisposable 

    Public Sub New() 
     ScreenUpdating = ExlApp.ScreenUpdating 
    End Sub 

    Public Sub Dispose() 
     ExlApp.ScreenUpdating = ScreenUpdating 
    End Sub 
End Class 

Sub Test() 
    Dim appSet mApplicationSettings = mApplicationSettings 
    Using New DisableScreenUpdating 
     'My Other Code 
    End Using 
End Sub 
+0

Это пример использования шаблона размещения. (например, упомянутый выше адрианм) – Derek