我在VB6中创建了一个具有各种属性的类。
属性
PiccoId
OrderId
UserId
StockCode
Quantity
在课程的顶部,我已经声明了我正在使用的2个类实例。
Dim stkLine As CSOPSLine ' This is the class where the properties are declared and read
Private SOPSLines As cSLine ' This class creates the new objects and sets the property values
当用户在手持式条形码扫描仪上输入订单号时,我正在创建一个与此特定扫描仪关联的对象,如下所示:
Set SOPSLines = New cSLine
Set SOPSLines = getSOPSLine(ID, sOrder, "", "", 0)
在流程的下一个阶段,用户需要输入他们的用户ID,以便可以看到在项目中扫描了哪个用户。
我需要更新同一个对象的属性,但我不知道如何 - 目前我正在尝试在我的getSOPSLine
函数中执行此操作,如下所示:
Dim line As New CSOPSLine
Dim bFound As Boolean
bFound = False
For Each line In SOPSLines.Items
If line.PiccoId = ID Then
line.OrderId = OrderId
line.Quantity = Qty
line.StockCode = stock
line.UserId = UserId
Set getSOPSLine = line
bFound = True
Exit For
End If
Next
If bFound = False Then
Set line = SOPSLines.Add(ID, OrderId, UserId, stock, Qty)
Set getSOPSLine = line
End If
Set line = Nothing
但是,因为我没有在课程级别存储sOrder
(由于多个用户可能正在使用条形码扫描程序,因此订单ID无法保持在类级别,因为其他用户只会覆盖它),
我不确定一旦我获得了下一个变量(在这种情况下,userID
,以及此阶段之后的其他变量),我可以更新我刚刚创建的同一个对象。 / p>
我尝试过像
这样的事情Set stkLine = getSOPSLine(ID, stkLine.OrderId, pUser, "", 0)
但错误说
对象或带有块变量尚未设置
如何在不经常创建新对象的情况下更新stkLine
的属性?
修改
澄清:
当应用程序从手持式条形码扫描器接收数据时,会输入一个选择案例,每个输入的变量都有一个案例(例如订单ID,用户ID,股票代码等)。
第一种情况设置订单ID。
这里的代码是
Case FRAME_ORDER_SELECTION
On Error Resume Next
Dim sOrder As Long
sOrder = Picco.GetData(ID, 50)
If sOrder = 0 Then
Call Picco.Send(ID, FRAME_ORDER_SELECTION)
Exit Sub
Else
With Picco
Call .ClearForm(ID)
Call .Text(ID, LINE_1, "===== User ID =====")
Call .Text(ID, LINE_2, "")
Call .NewField(ID, 60, 5, FLD_LINE + SND_ENTER)
Call .Send(ID, FRAME_LINE_ADD)
Set SOPSLines = New cSLine
Set SOPSLines = getSOPSLine(ID, sOrder, "", "", 0)
End With
End If
frameid = FRAME_LINE_ADD
m_iLastFrameId = FRAME_ORDER_SELECTION
On Error GoTo Picco_DataArrived_Err
这是创建对象的地方。
下一种情况是用户将用户ID输入扫描仪后。
Case FRAME_LINE_ADD
On Error Resume Next
Dim pUser As String
pUser = ""
pUser = Picco.GetData(ID, 60)
If pUser = "" Then
Exit Sub
End If
On Error GoTo Picco_DataArrived_Err
With Picco
Call .ClearForm(ID)
Call .Text(ID, LINE_1, "===== Add Line =====")
Call .Text(ID, LINE_2, "")
Call .Text(ID, LINE_7, "Scan or type code")
Call .NewField(ID, FIELD_POS, 18, FLD_LINE + FLD_READER + SND_ENTER)
Call .Send(ID, FRAME_LINE_QTY)
End With
Set stkLine = getSOPSLine(ID, stkLine.OrderId, pUser, "", 0)
frameid = FRAME_LINE_QTY
m_iLastFrameId = FRAME_LINE_ADD
然后在填充其余所需值时会有2或3个案例。
我需要做的是,在第二种情况下(以及所有其他以下情况)更新在第一种情况下创建的对象的属性。
我正在使用getSOPSLine函数,因为这会获得具有匹配条形码扫描程序ID的对象(因为多个用户可能正在访问不同的订单,他们需要以这种方式保持独立),但我不知道如何更新扫描程序ID匹配的对象。
答案 0 :(得分:0)
我不确定你对此感到困惑;我认为你必须对哪些对象,变量和属性的误解阻止你以我理解的方式提出这个问题。我不确定您的代码如何与您的问题排成一行。但我会给出一个镜头:
Private SOPSLines As cSLine Set SOPSLines = New cSLine Set SOPSLines = getSOPSLine(ID, sOrder, "", "", 0)
这声明了一个类级变量,它可以容纳一个cSLine对象。这看似合理。然后创建一个新的cSLine实例来放入该变量。但我不知道为什么,因为你然后将变量完全指向另一个实例,这是从getSOPSLine函数返回的实例。这条中间线似乎没有做任何事情,而且我不确定你是怎么做的。
我尝试过像
这样的事情Set stkLine = getSOPSLine(ID, stkLine.OrderId, pUser, "", 0)
但错误说
对象或带有块变量尚未设置
那么,听起来stkLine
没有设置为对象。我没有看到任何代码尝试设置除该行之外的stkLine。因此,当您尝试获取stkLine.OrderId
时,没有一个对象可以获取OrderID属性,因此它会给您一个错误。
我需要更新同一个对象的属性,但我不确定如何
好吧,如果有一个你关心的对象,你可能会把它放在一个变量的某个地方。您可以使用variable.property = value
语法将 value 分配给当前存储在变量中的对象的属性。
但同样,我不确定您的困惑在哪里,因为您已经在代码中清楚地分配了对象的属性。
如果您不了解对象在VB中的工作方式,我建议您阅读文档的Working with Objects chapter。
如果你的困惑在其他地方,或许你可以提出一个更具体的问题,关于你正在尝试做什么?
答案 1 :(得分:0)
在每个案例中致电getSOPSLine
时,请为您未设置的变量输入一些临时值。
实施例;
在UserID案例中:stkLine = getSOPSLine(ID, 0, pUser, "", 0)
然后,在getSOPSLine()
函数中,更改它,以便不是自动设置值,而是仅在它们不等于0或“#34;"”时才更新它们,或者你使用的临时变量。
这样您就可以更新同一个对象,但不会存储可能被覆盖的数据。