1

我发现了如何创建类的属性,如下所示:

  private m_Name as string

  public property get Name() as string
    Name = m_Name
  end sub
  public property let Name(sval as string)
    m_name = sval
  end sub

用户将创建一个文档并fields在该文档中选择一些(姓名,生日,电话......),因为我无法确切知道用​​户将选择哪些字段,我认为创建一个类将是最好的选择.

在我创建了上面的类之后,我如何通过这个类来检查用户选择了哪些字段?

对于我的情况有什么更好的选择,请告诉我...

4

4 回答 4

1

如果我理解正确,您想知道用户使用/初始化了哪些字段(在许多现有字段中)?

我看到了几种方法:1)如果你的变量没有默认值并且必须有一个非空/非零值,那么你可以简单地检查一个变量是空的还是零。如果是,它还没有被初始化。

If m_name = "" Then MsgBox "Variable is not initialized"

2)为您拥有的每个字段创建一个布尔值fieldName_Initialized,因此为每个字段创建一个布尔值,您将拥有如下内容:

  private m_Name as string
  private m_name_Initialized as Boolean

  public property get Name() as string
    Name = m_Name
  end sub
  public property let Name(sval as string)
    m_name = sval
    m_name_Initialized = True
  end sub

3)您可以有一个列表,并在变量初始化时将它们添加到列表中:确保添加Microsoft Scripting Runtime到您的引用以使字典工作。

  Dim initialized As Dictionary
  Set initialized  = New Dictionary

  private m_Name as string
  private m_name_Initialized as Boolean

  public property get Name() as string
    Name = m_Name
  end sub
  public property let Name(sval as string)
    m_name = sval
    initialized.Add "m_name", True
  end sub

然后,检查 var 是否已初始化:

If initialized.Exists("m_name") Then 
    ' Var is initialized

4) 类似于#3,除了使用布尔数组。将特定 var 绑定到特定索引,例如m_name索引 0。这样您就可以避免控制变量名称的麻烦(据我所知,您无法获取变量名称,这会增加维护原因)

就个人而言,#1 是最简单的,但在某些情况下可能无法实现。如果#1 不适用,我个人会选择#2,除非有人能弄清楚如何从变量本身获取变量名的字符串表示,那么首选#3。

于 2013-10-22T17:23:49.313 回答
1

我想你需要的是一种可以为空的行为。是的,您可以在 VB6 中使用数据类型 Variant 执行此操作。然后你可以使用函数“IsEmpty()”来检查一个属性是否已经设置。一个小代码示例:

Option Explicit  
Private m_Vars()  
'0 : Name
'1 : Birthday
'2 : Phone
Private Sub Class_Initialize()
    ReDim m_Vars(0 To 2)
End Sub

Public Property Get Name() As String
    Name = m_Vars(0)
End Property
Public Property Let Name(RHS As String)
    m_Vars(0) = RHS
End Property

Public Property Get Birthday() As Date
    Birthday = m_Vars(1)
End Property
Public Property Let Birthday(RHS As Date)
    m_Vars(1) = RHS
End Property

Public Sub DoSomething()
    Dim i As Integer
    For i = 0 To UBound(m_Vars)
        Dim v: v = m_Vars(i)
        If IsEmpty(v) Then
            MsgBox "is empty"
        Else
            MsgBox v
        End If
    Next
End Sub
于 2013-10-22T23:30:23.217 回答
1

如果我理解正确,用户会将标签或其他内容添加到文档(例如[Name])中,并且您想知道如何将您的班级成员映射到这些标签。要做到这一点,你真的不想循环遍历类成员,而是要通过文档标签找出需要的内容。当您找到“标签”时,将其提交给您的班级以填写空白。

第 1 部分是用于查找标签的解析器……我的 VB6 非常生锈,因此使用伪代码:

 Const TagStart = "["            ' "$[" is better as it is not likely to appear
 Const TagStop = "]"             ' "]$"  "    "   "

 ' make this a loop looking for tags
 i = Instr(docScript, TagStart)
 j = Instr(docScript, TagStop)
 thisTag = Mid(docScript, TagStart, TagEnd )
 ' not correct, but the idea is to get the text WITH the Start and Stop markers
 ' like [Name] or [Address]

 ' get the translation...see below
 docText = MyClass.Vocab(thisTag)

 ' put it back
 Mid(docScript, TagStart, TagEnd) = docText

实际上,最好查找Instr(docScript, "[Name]")存储在数组中的每个可能的合法标签(即 ),但您可能必须在 2 个循环中执行此操作,以允许多次请求给定标签。

第 2 部分提供来自 MyClass 的替换文本:

 Friend Function Vocab(tag as string) As String
     Dim Ret as string

     Select Case tag
          Case "$[NAME]$"
              ret = "Name:  " & m_Name 
              ' if the caption is part of the "script" then just:
              'ret = m_Name

          Case "$[ADDRESS]$"
              ret = "Address:  " & m_Addr

          ' if not found, return the tag so you can add new Vocab items
          ' or user can fix typos like '[NMAR]'
          Case Else
              ret = tag

          ...
      End Select
      Return Ret
  End Function

第 1 部分中的解析例程也可以是您的类中处理调用私有词汇的文档“脚本”的方法。

编辑

“脚本”的一部分可能如下所示:( Customer's Name:| $[CUST_FNAME]$ $[CUST_LNAME]$ 忽略竖线 (|),它是表格单元格标记)

解析器通过字符串查找“$[”,当它找到时,它会隔离相关的标签$[CUST_FNAME]$。如果你有一个很大的数字,第一部分(CUST)可以用作路由器将它发送到正确的类。接下来,调用获取翻译的方法:

  newText = Cust.Vocab(thisTag)

Cust Class 只查看标签并返回“Bob”或其他内容,解析循环将标签替换为数据: Customer's Name:| Bob $[CUST_LNAME]$

然后继续,直到所有标签都被替换。

使用“仅”22 个词汇项目,您可以为其创建一个专用类:

   Vocab.Translate(tag ...) as string

        Case "$[CUST_FNAME]$"
            return Cust.FirstName

...或者

您是否正在尝试通过办公室的 DOC 对象找到一种方法?以上更多的是从头开始的文档组合类型的事情。对于办公室,我认为您只需要某种替换文本的集合。

高温高压

于 2013-10-22T13:35:04.647 回答
0

如果用户有一个表单来创建他们的文档,为什么不使用简单的复选框控件,一个用于每个可能的字段?如果您想使用循环来检查选定的字段,请将复选框设置为控制数组并循环遍历数组。您可以将字段名称分配给Tag属性,然后如果选中该复选框,则将该字段添加到数组中。

复选框

于 2013-10-22T22:49:19.463 回答