设置对象后设置对象属性

时间:2017-12-20 17:13:28

标签: class object properties vb6

我在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匹配的对象。

2 个答案:

答案 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;"”时才更新它们,或者你使用的临时变量。

这样您就可以更新同一个对象,但不会存储可能被覆盖的数据。