Class 使用vb6中带有用户选定字段的类

Class 使用vb6中带有用户选定字段的类,class,vb6,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 private m_Name as string private m_name_Initialized as Boole

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

  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
  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
用户将创建一个文档并在该文档中选择一些
字段
(姓名、生日、电话……),因为我不知道用户将选择哪些字段,我认为创建一个类将是最好的选择

在我创建了如上所述的类之后,如何通过该类进行循环以检查用户选择了哪些字段


对于我的情况,如果有更好的选择,请告诉我……

如果我理解正确,用户将向文档(例如,
[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部分提供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的文档“脚本”的方法

编辑

“脚本”的一小部分可能如下所示:
客户名称:|$[CUST\u FNAME]$$[CUST\u LNAME]$
(忽略管道(|)它是一个表格单元格标记)

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

  newText = Cust.Vocab(thisTag)
Cust类只查看标记并返回“Bob”或其他任何内容,解析循环用数据替换标记:
客户名称:| Bob$[CUST\u LNAME]$

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

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

   Vocab.Translate(tag ...) as string

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

您是否正在尝试通过office中的文档对象来实现此目的?以上内容更多地是从底层文档组成类型开始的。对于office,我认为您只需要一些替换文本的集合


HTH

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

我看到了几种方法: 1) 如果您的变量没有默认值,并且必须具有非空/非零值,则只需检查变量是空的还是零。如果是空的,则表示尚未初始化

If m_name = "" Then MsgBox "Variable is not initialized"
2) 对于您拥有的每个字段,创建一个布尔值
fieldName\u Initialized
,因此对于每个字段,您将有如下内容:

  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
  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脚本运行时
添加到参考中,以便字典正常工作

  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#u name
is index 0。这样就省去了控制变量名的麻烦(增加了维护的原因,据我所知,您无法获取变量名)


就个人而言,#1是最简单的,但在某些情况下可能不适用。如果#1不适用,我个人会选择#2,除非有人能想出如何从变量本身获取变量名的字符串表示形式,那么#3是首选。如果用户有一个表单,他们可以做一些事情来创建文档,w为什么不使用简单的复选框控件,每个可能的字段一个?如果要使用循环检查所选字段,请将复选框设置为控制数组并在数组中循环。您可以将字段名称指定给
标记
属性,然后如果选中复选框,则将字段添加到数组中


我想您需要的是一种可为空的行为。是的,您可以在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

您如何知道哪些字段由用户选择?只需更改它们的值?然后在类变量上创建另一组变量(这些变量实际上不是全局变量-您的注释不正确),如“私有m_Name_更改为布尔值”,并在“Property Let”中为其赋值方法。或者-如果选择字段意味着为其分配非空值-您只需检查哪些字段不是空的。@Arvo字段意味着(姓名、电话、地址等)等值。它实际上是表中的字段,用户需要文档中这些字段的值…因此,当用户选择一个字段时,它将在文档中显示为“”,然后我将检查是否有类似“”的内容然后用记录集替换字段名的值,知道吗?嗯,我拒绝理解,你的类与你的问题有什么关系?如果你有记录集,那么你可以扫描记录集字段集合并检查,请求的字段是否存在,如果存在,从记录集中读取并赋值。没有其他类是此任务所必需的。@Arvo我有22个可能的
字段
,供用户选择。我不能说哪个字段或这些字段中有多少字段将被选择。因此,我需要知道的是,有一个包含这些可能性的列表,并检查其中哪些已被选择,你知道吗?或者你的建议是创建一个具有该可能性的新表s然后循环检查记录集是否为?我不知道它是否为x。我将创建一个文档(.PDF或.DOC),其中包含一个带有一些
标记的文本