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),其中包含一个带有一些标记的文本