2015-10-26 7 views
2

Я новичок в VB6 и пытаюсь написать макрос, используемый для CorelDraw.VBA - Передача переменной между модулями

У меня есть переменная, что нужно передать из класса модуля в стандартный модуль, в моем модуле класса «SaveOptClass» Я публичная переменная называется IsSaved и он установлен на модуле класса:

Public IsSaved As Boolean 

Public Sub SaveFile() 
If <some triggers> Then 
    IsSaved = True 
End If 

В Стандартный модуль:

Sub DoSave() 
Dim SaveClass As SaveOptClass 
Set SaveClass = New SaveOptClass 

If SaveClass.IsSaved = True Then 
    ActiveDocument.Save 
Else 
    Form1.Show 
End If 
End Sub 

в основном я пытаюсь передать «IsSaved» логическое значение от класса модуля к стандарту. (Если IsSaved имеет значение true, сохраните документ или покажите форму.)

Я тестировал, что логическое значение имеет значение «Истина», когда я выполнял код, но я не могу передать состояние другому модулю.

Есть ли что-то, что я пропущу здесь? Заранее спасибо.

+0

То, что у вас есть, синтаксически корректно и будет делать то, что вы думаете, но не логически корректно (если вы не опустили что-то), поскольку вы никогда не вызываете SaveFile() - поэтому после создания нового экземпляра класса IsSave всегда будет false по умолчанию ... –

+1

Это потому, что вы инициализируете экземпляр 'SaveOptClass' в' DoSave' и, возможно, другие методы тоже. Я бы предложил переместить объявление ('public saveClass as SaveOptClass') и инициализацию (' Set SaveClass = New SaveOptClass') в место, где он будет выполняться только один раз (скажем, в базовом модуле). Таким образом, все другие методы будут совместно использовать один экземпляр. – shahkalpesh

ответ

0

Как уже ответил @shahkalpesh, проблема в том, что вы не используете осмысленный экземпляр из SaveOptClass.

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

В вашем случае это приводит к этому переписывания:

' in someOtherModule 
Public Sub DoSave(saveOptObj as SaveOptClass) 
    If saveOptObj.IsSaved Then ' = True is unnecessary 
     ActiveDocument.Save 
    Else 
     Form1.Show 
    End If 
End Sub 

клиентский код может быть:

private saveOptObj as SaveOptClass 

Public Sub SaveFile() 

    If <some triggers> Then 
     saveOptObj.IsSaved = True  
    End If 

    ' ....  
    someOtherModule.DoSave(saveOptObj)  
    ' ... 

Рассмотрим также, на данный момент, переименование DoSave, учитывая, что действия, предпринятые предложить другую семантику. В подобных случаях предпочтительнее перемещать логику If Else в вызывающем абоненте . В любом случае, если вы предпочитаете группировать действия с другой семантикой в ​​одной и той же рутине, вам лучше использовать названия, такие как DoSaveOr<SomethingElse>.

Смежные вопросы