我发现了如何创建类的属性,如下所示:
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
(姓名,生日,电话......),因为我不知道用户会选择哪个字段,我想创建一个类将是最好的选择。
在我创建上面的类之后,如何通过这个类来循环检查用户选择了哪个字段?
对我的情况有任何更好的选择,请告诉我......
答案 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
属性,如果选中该复选框,则将该字段添加到数组中。