2017-12-20 39 views
1

VB6でさまざまなプロパティを持つクラスを作成しました。オブジェクトの設定後にオブジェクトのプロパティを設定する

性質は、私は私が使用しているクラスの2つのインスタンスを宣言したクラスの先頭に StockCode Quantity

PiccoId OrderId UserIdです。

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 

しかし、私は「として多くのユーザーがバーコードスキャナを使用する可能性があるため、他のユーザーが単に上書きするため、注文IDをクラスレベルで保存することはできません)

次の変数(この場合はuserIDとこの段階の後の他の変数)を取得すると、私が作成したのと同じオブジェクト。

は私が

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

ような何かをしようとしましたが、それエラーが

オブジェクトまたはWithブロック変数が、私はプロパティを更新するにはどうすればよい

を設定されていないと言ってstkLineの場合、常に新しいオブジェクトを作成する必要はありませんか?明確にするため

EDIT

:アプリケーションは、ハンドヘルドバーコードスキャナからのデータを受信すると

、選択場合は、入力された変数のそれぞれに対して1つの場合(例:注文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つのケースが発生します。

私が行う必要があるのは、2番目のケース(およびそれ以外のすべてのケース)では、最初のケースで作成されたオブジェクトのプロパティが更新されます。

これは、一致するバーコードスキャナIDを持つオブジェクトを取得するため、getSOPSLine関数を使用しています(複数のユーザーが異なる注文にアクセスする可能性があるため、このように別々に保管する必要があります)。スキャナIDが一致するオブジェクトを更新します。

+0

投稿したコードブロック:Set SOPSLines =新しいcSLineに続いてSet SOPSLines = getSOPSLine(...)は意味をなさない。最初のステートメントはオブジェクトを作成します。 2番目のステートメントは、そのオブジェクトを直ちに別のステートメントに置き換えます。最初の行は必要ありません。 – DaveInCaz

答えて

0

各ケースでgetSOPSLineを呼び出すときは、設定していない変数の一時的な値を入力します。

例; getSOPSLine()機能でstkLine = getSOPSLine(ID, 0, pUser, "", 0)

その後、彼らは「0等しい、または」いない場合代わりに、自動的に値を設定するので、それはだけではなく、それらを更新するように変更し、または:ユーザーIDの場合

あなたが使用する一時変数。

あなたは同じオブジェクトを更新していますが、上書きされる可能性のあるデータは保存していません。

+0

より簡単な方法とより良い方法がありますが、これはまもなく回避策です。 – David

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) 

ような何かをしようとしたが、

オブジェクトまたはWithブロック変数がまあ

を設定されていないと言って、それはエラーstkLineがオブジェクトに設定されていないようです。私はその行以外のstkLineを設定しようとしているコードは見当たりません。したがって、stkLine.OrderIdを取得しようとすると、OrderIDプロパティを取得するオブジェクトがないため、エラーが発生します。

私はこの同じオブジェクトのプロパティを更新する必要がありますが、私はあなたが気にオブジェクトがあるかどう

さて、あなたはおそらくどこかの変数にそれを持っているかわかりません。 variable.property = value構文を使用して、を、変数に現在格納されているオブジェクトのプロパティに割り当てます。

あなたの混乱はどこにあるのか分かりません。コード内のオブジェクトのプロパティを明確に割り当てているからです。

オブジェクトがVBでどのように動作するのかわからない場合は、ドキュメントのWorking with Objects chapterを読むことをおすすめします。

あなたの混乱が他の場所にある場合、おそらくあなたは何をしようとしているかについてより具体的な質問をまとめることができますか?

+0

最初の点に応答して、変数の新しいインスタンスを作成する途中の行があり、エラーが返されないためです。このコードの構造は、アプリケーションがハンドヘルドバーコードスキャナからデータを受け取ると、選択されたケースに進み、それぞれのケースが入力されているデータ(ユーザーID、注文IDなど)になります。これをもっと明確にするために質問をすばやく更新してください。 – David

+0

@David私は、あなたがgetSOPSLineとその外側の両方でクラスレベルの変数を変更しているという混乱がたくさんあると思います。クラスレベルの変数を更新する代わりに、変更する値を渡してください。 VB6デバッガでコードをステップ実行して、各行が何をしているのかを理解します。それはかなり良いデバッガです。 –

関連する問題