タブ式テキストエディタ(5) "最近使ったファイル"コレクション

 最近使ったファイルコレクションのクラスをつくる前に、専用のタブページをつくってしまいます。リッチテキストボックスがフォームに表示される流れは次のようになります。

 @ ユーザーがメニューの新規作成、ファイルを開くを選択
     (または、ファイルのドラッグ&ドロップ操作)
 A リッチテキスト(ExpandedTextクラス)のインスタンスを作成
 B タブページ(TextPageクラス)のインスタンスを作成
 C AをBに追加
 D Bをタブコントロール(コントロール名:TC1)に追加

 @とAはつくりました。@のメニューはコードがまだですが、後の回で設定することにします。Dのタブコントロールもフォームに配置済みです。今回は、残るBのタブページの派生クラスをつくります。といっても、ファイルの読み書きだけです。これだけならフォームの方にコーディングしても十分間に合います。まあ、後々拡張しやすいように専用クラス化してみました。

TextPage クラス

 コンストラクタでリッチテキストボックス(実際は派生クラスのExpandedText)を自動的に追加しています。あとは、"LoadFile"メソッドでファイルを読み込み、"SaveFile"メソッドでファイルに書き出しています。いずれもファイルのパス名を引数に取ります。拡張子rtfに対応するようにしていますが、テキスト形式のファイル専用のエディタなので、これは余計かもしれません。
 今回は付けませんでしたが、もし付け加えるなら、エンコード機能があると便利だと思います。

Public Class TextPage
    Inherits System.Windows.Forms.TabPage

    ' 変数
    Friend WithEvents EditBox As ExpandedTextControl

    ' New コンストラクタ
    Public Sub New()
        MyBase.New()
        EditBox = New ExpandedTextControl()
        EditBox.Dock = DockStyle.Fill
        Me.Controls.Add(EditBox)
    End Sub

    ' LoadFile : ファイルを開く
    Public Sub LoadFile(ByVal path As String)
        Cursor.Current = Cursors.WaitCursor
        If IsNothing(path) Then path = ""
        If path.Length > 0 Then
            If IO.Path.GetExtension(path).Equals(".rtf") Then
                EditBox.LoadFile(path, RichTextBoxStreamType.RichText)
            Else
                EditBox.LoadFile(path, RichTextBoxStreamType.PlainText)
            End If
        End If
        EditBox.PathName = path
        EditBox.Modified = False
        Cursor.Current = Cursors.Default
    End Sub

    ' SaveFile : ファイルへ保存
    Public Sub SaveFile(ByVal path As String)
        Cursor.Current = Cursors.WaitCursor
        If (Not IsNothing(path)) AndAlso (path.Length > 0) Then
            If IO.Path.GetExtension(path).Equals(".rtf") Then
                EditBox.SaveFile(path, RichTextBoxStreamType.RichText)
            Else
                EditBox.SaveFile(path, RichTextBoxStreamType.PlainText)
            End If
            EditBox.PathName = path
            EditBox.Modified = False
        End If
        Cursor.Current = Cursors.Default
    End Sub

End Class	

"最近使ったファイル"コレクションクラス

 「綴り帖」では、最近使ったファイルを10個まで記録することにします。ファイルは、メニューのリストの0番に格納し、以下一つづつ下にずらしていきます。なお、ファイル名は、後半の回でつくる初期化ファイルに書き出します。今回はそのためのコレクションクラスをつくっておきます。文字列専用のコレクションです。これも既存のクラスで間に合います。ArrayListクラスあたりが良いかもしれません。ただし、既存のクラスを使うときは、CType,CStringなどを使って、いちいちStringクラスへキャスト(型変換)してやる必要があります。

Public Class StringCollection
    Inherits System.Collections.CollectionBase

    ' デフォルトプロパティ
    Default Public Property Item(ByVal index As Integer) As String
        Get
            Return Me.List(index).ToString
        End Get
        Set(ByVal Value As String)
            Me.List(index) = Value
        End Set
    End Property

    ' New コンストラクタ
    Public Sub New()
        MyBase.New()
    End Sub

    ' Insert : 挿入
    Public Sub Insert( _
            ByVal value As String, _
            Optional ByVal position As Integer = -1)
        If position = -1 Then
            Me.List.Add(value)
        Else
            Me.List.Insert(position, value)
        End If
    End Sub

    ' IndexOf : 検索
    Public Function IndexOf(ByVal value As String) As Integer
        Return Me.List.IndexOf(value)
    End Function

End Class	

 CollectionBaseクラスには、"Add"(追加)メソッドと"RemoveAt"(削除)メソッドがすでに装備済みです。これだけではリストの頭に追加するのに苦労するので、"Insert"メソッドを追加します。通常、"Insert"メソッドはリストの末尾に追加できないのですが、これは便利に使えるように"Add"メソッド兼用にしています。
 また、既存のリストの中に同じファイル名があるかどうかを探すのに、検索機能を持つ"IndexOf"メソッドを実装します。リストの各項目には、派生クラスからは"List"プロパティを使ってアクセスすることができます。さらに外部からもアクセスするために、デフォルトプロパティを定義しておく必要があります。

| ■HOME | ◆プログラムTop | ▲ページの先頭 | << 前の章 | 次の章 >> |