在vb6中使用类

时间:2013-10-22 11:59:18

标签: class vb6

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

  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 个答案:

答案 0 :(得分: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部分中的解析例程也可以是您的类中处理调用私有Vocab的文档“script”的方法。

修改

“脚本”的一小部分可能如下所示:    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对象来解决这个问题?以上是更多来自于文件组成类型的东西。对于办公室,我认为你只需要某种替换文本的集合。

HTH

答案 1 :(得分: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,除了使用布尔数组。将特定索引绑定到特定索引,如m_name是索引0.这样就省去了控制变量名称的麻烦(据我所知,你不能得到变量的名称,这会增加维护原因)< / p>

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

答案 2 :(得分:1)

我猜你需要的是一种Nullable行为。是的,您可以使用数据类型Variant在VB6中执行此操作。然后,您可以使用函数“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

答案 3 :(得分:0)

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

checkboxes