1

次のように、クラスのプロパティを作成する方法を見つけました。

  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

ユーザーはドキュメントを作成し、fieldsこのドキュメント内でいくつか (名前、誕生日、電話など) を選択します。ユーザーがどのフィールドを選択するのか正確にはわからないため、クラスを作成することが最良のオプションであると考えました。 .

上記のようなクラスを作成した後、このクラスをループして、ユーザーが選択したフィールドを確認するにはどうすればよいですか?

私の状況に適したオプションがあれば教えてください...

4

4 に答える 4

1

私の理解が正しければ、(多くの既存のフィールドのうち) ユーザーが使用/初期化したフィールドを知りたいですか?

1) 変数にデフォルト値がなく、空でない値またはゼロでない値が必要な場合は、変数が空かゼロかを簡単に確認できます。ある場合は、初期化されていません。

If m_name = "" Then MsgBox "Variable is not initialized"

2)フィールドごとにブール値を作成して、fieldName_Initializedフィールドごとに次のようにします。

  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 Scripting Runtimeます。辞書が機能するように、必ず参照に追加してください。

  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 と同様ですが、ブール値の配列を使用します。インデックス 0のように、特定の var を特定のインデックスにm_name関連付けます。このようにして、変数名を制御する手間を省きます (変数の名前を取得できないことがわかっている限り、メンテナンスの原因が増えます)。

個人的には #1 が最もシンプルですが、特定の状況では不可能な場合があります。#1 が当てはまらない場合、私は個人的に #2 を選びます。変数自体から変数名の文字列表現を取得する方法を誰かが理解できない場合は、#3 が優先されます。

于 2013-10-22T17:23:49.313 に答える
1

必要なのは一種の Nullable 動作だと思います。はい、データ型 Variant を使用して 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
于 2013-10-22T23:30:23.217 に答える
0

ユーザーがドキュメントを作成するために何かを行うフォームを持っている場合、可能なフィールドごとに 1 つの単純なチェックボックス コントロールを使用してみませんか? ループを使用して選択したフィールドをチェックする場合は、チェックボックスをコントロール配列にして、配列をループします。フィールド名をプロパティに割り当てることができTag、チェックボックスがチェックされている場合は、フィールドを配列に追加します。

チェックボックス

于 2013-10-22T22:49:19.463 に答える