コレクションについて


VB  2008-09-26 09:40:31  No: 101129  IP: 192.*.*.*

コレクションを使ってある情報のかたまりを作り、
必要に応じてテキストやリストに表示する機能を作っています。

コレクションについて色々なサイトを調べてみたのですが、
あまり良くわかりませんでした。

よろしければ、コレクションについて分かりやすく書いているサイトなどを教えてください。
環境は、VB6.0です。

よろしくお願いします。

編集 削除
ガッ  2008-09-26 09:48:08  No: 101130  IP: 192.*.*.*

> コレクションについて色々なサイトを調べてみたのですが、
> あまり良くわかりませんでした。
具体的な使い方なのか,それとも使い所がわからないのか,
経験不足による分からない症候群なのか,よくわかりませんが,
VB中学校様がいいかもしれません:
http://homepage1.nifty.com/rucio/main/shokyu/jugyou23.htm

編集 削除
VB  2008-09-26 10:01:24  No: 101131  IP: 192.*.*.*

ガッさん、ありがとうございます。

VB中学校は、以前調べていたのですが、今回使いたい処理とは
違うようです。

コレクションの具体的な情報は、氏名、生年月日、住所、電話番号等をコレクションとしてもっておき、住所が東京都の人の情報だけを、
リストに表示(氏名、生年月日、住所)させたいです。

コレクションについて分からないポイントは、
・具体的な使い方
・コレクションの使いどころについて    です。

                                    
よろしくお願いします。

編集 削除
ガッ  2008-09-26 10:28:49  No: 101132  IP: 192.*.*.*

うーん,残念ながら
氏名、生年月日、住所、電話番号等をコレクションとして扱うサンプル
を紹介しているサイトは知りません.

コレクションはサイズ可変長で,動的に値を追加/削除可能な配列だと考える事が出来ます.
例として,以下の4つのクラスを使うアプリケーションが浮かびました.
何かの参考になれば嬉しいです.

---------------------------
'Record.cls
'氏名、生年月日、住所、電話番号をレコードとして持つクラス
Public Name As String
Public BirthDay As Date
Public PostalAddress As String
Public PhoneNumber As String

---------------------------
'IFilter.cls
'Collectionをフィルタリングするインターフェイス
Public Function Filter(ByVal col As Collection) As Collection
End Function

---------------------------
'AndohFilter.cls
'RecordのNameが安藤から始まる人だけを選択するフィルタ
Implements IFilter
Private Function IFilter_filter(ByVal item As Record) As Boolean
    If item.Name Like "安藤*" Then
        IFilter_filter = True
    Else
        IFilter_filter = False
    End If
End Function

---------------------------
'Records.cls
'Recodクラスをコレクションとして扱うクラス
Private col_ As Collection

Private Sub Class_Initialize()
    Set col_ = New Collection
End Sub

Public Sub add(ByVal v As Record)
    col_.add v
End Sub

Public Sub add2(ByVal Name As String, ByVal BirthDay As Date, ByVal PostalAddress As String, ByVal PhoneNumber As String)
    Dim rec As Record
    Set rec = New Record
    With rec
        .Name = Name
        .BirthDay = BirthDay
        .PostalAddress = PostalAddress
        .PhoneNumber = PhoneNumber
    End With
    col_.add rec
End Sub

Public Function Filtering(ByVal filter As IFilter) As Records
    Dim rec As Records
    Dim item As Record
    Set rec = New Records
    For Each item In col_
        If filter.filter(item) Then
            rec.add item
        End If
    Next
    Set Filtering = rec
End Function

Public Function getCollection() As Collection
    Set getCollection = col_
End Function

---------------------------
'Form1.frm
'Recodsクラスを使ったサンプル
Private Sub Form_Load()
    Dim recs As Records
    Set recs = New Records
    recs.add2 "安藤A", #1/1/1954#, "住所1", "000-1111-111"
    recs.add2 "安藤B", #2/2/1954#, "住所2", "000-2222-222"
    recs.add2 "佐藤A", #3/3/1954#, "住所3", "000-3333-333"
    recs.add2 "佐藤B", #4/4/1954#, "住所4", "000-4444-444"
    
    Dim rec As Record
    'recsに含まれるレコード全体を表示
    For Each rec In recs.getCollection()
        Debug.Print rec.Name
    Next
    
    'recsに含まれるレコードの内,名前が安藤から始まるものだけを表示
    For Each rec In recs.Filtering(New AndohFilter).getCollection()
        Debug.Print rec.Name
    Next
    
End Sub

編集 削除
 2008-09-26 11:41:00  No: 101133  IP: 192.*.*.*

ガッ氏の
>コレクションはサイズ可変長で,動的に値を追加/削除可能な配列だと考える事が出来ます.
が端的に特徴を表している気がするが、その他にも(書かれたコード上には存在するが)
For Eachで要素数等を気にすることなくループ検索等が出来る事などが挙げられると思う
あと、基本的に何でも(と言うと語弊があるか?)入れられるので、例えばコントロールへの参照を
コレクションに入れておいて、内部的にコントロールのグループを作ってみたり
なんて事も出来るはず

ちなみにVB6の場合、以前調べてみた感じだとコレクションのIndexは1からみたいで、
途中を削除しても(当然かもしれないが)空き番は生じず、詰められる

編集 削除