设置对象后设置对象属性

问题描述 投票:1回答:2

我在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,以及此阶段之后的其他变量)我可以更新我刚刚创建的同一个对象。

我试过做类似的事情

Set stkLine = getSOPSLine(ID, stkLine.OrderId, pUser, "", 0) 

但它错误地说

尚未设置object或with block变量

如何在不经常创建新对象的情况下更新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匹配的位置。

class object properties vb6
2个回答
0
投票

在每个案例中调用getSOPSLine时,请为您未设置的变量输入一些临时值。

例;

在UserID案例中:stkLine = getSOPSLine(ID, 0, pUser, "", 0)

然后,在getSOPSLine()函数中,更改它,以便不是自动设置值,而是仅在它们不等于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) 

但它错误地说

尚未设置object或with block变量

好吧,那听起来好像stkLine没有设置为一个对象。我没有看到任何代码尝试设置除该行之外的stkLine。因此,当您尝试获取stkLine.OrderId时,没有一个对象可以获取OrderID属性,因此它会给您一个错误。

我需要更新同一个对象的属性,但我不确定如何

好吧,如果有一个你关心的对象,你可能在一个变量的某个地方。您可以使用variable.property = value语法为当前存储在变量中的对象的属性赋值。

但同样,我不确定你的困惑在哪里,因为你已经明确地在代码中分配了对象的属性。

如果您不了解对象在VB中的工作方式,我建议您阅读文档的Working with Objects chapter

如果你的困惑在其他地方,也许你可以提出一个更具体的问题,关于你想要做什么?

© www.soinside.com 2019 - 2024. All rights reserved.