§1 テキストエディタの制作 VB6
 (5) 検索機能の追加 U 前へ 目次へ 次へ 

 2. メニューの追加

 テキストエディタのプログラムを呼び出し、メニューを追加する。検索メニューはメモ帳と同じように設定する。

図1-5-2

メニュー追加

キャプション     名前            ショートカット 
検索(S) mnuSearch  
検索(F) mnuFind Ctrl + F
次を検索(N) mnuNextFind F3
置換(E) mnuReplace Ctrl + H
 
図1-5-3


3. 検索フォームの追加

 検索文字列や置換文字列を入力するため、フォームを追加する。
 文字列を一つだけ入力するのであれば、InputBox関数(ヘルプ参照)が使えるが、ここではフォーム上にテキストボックスなどを配置して入力することにする。

 フォームの追加はメニューバーから次のように選択する。

 [プロジェクト(P)] → [フォームモジュールの追加(F)]

 ダイアログから「フォームモジュール」を選択し、開くボタンをクリックする。追加したフォームはForm2となる。

 追加したフォーム(MaxButton=False, MinButton=False)には、ラベル1個、テキストボックス1個、ボタン2個、オプションボタン2個を配置する。オプションボタンの一つ目(Option1)のValueプロパティをTrueに設定する。(図1-5-4)

図1-5-4


 4. フォームの呼び出し

 実行すると1つめのフォーム(Form1:テキストエディタ)が自動的に表示されるが、そのフォームから追加したフォーム(Form2)を呼び出すには、次のようにShowメソッドを使ってプログラムする。

Form2.Show 0

 Showメソッドの引数に0を指定すると、フォームはモードレスになり、引数に1を指定すると、フォームはモーダルになる。引数を省略するとモードレスになる。
 ウィンドウ (フォームおよびダイアログ ボックス) には、モーダルとモードレスの 2 種類がある。
 モーダルウィンドウは、[OK] ボタンまたは [キャンセル] ボタンによってそのウィンドウを閉じるまで、ユーザーはほかのウィンドウに切り替えることができない。
 モードレスは、そのウィンドウを閉じなくても、ほかのウィンドウに切り替えることができる。

 追加したフォーム(Form2)を呼び出すと、Form2のLoadプロシージャから実行が始まり、Form2に書かれたプログラムが処理される。Form2を閉じると呼び出し元のForm1に処理が戻る。

 フォームの呼出しは、検索メニューをクリックしたときに行えばよいので、mnuFind_ClickプロシージャにForm2.Show 0を書くだけで良い。

Private Sub mnuFind_Click()
    Form2.Show 0
End Sub

 実行後、メニューから検索(S) → 検索(F)を選択して、検索用のウィンドウ(Form2)が表示されるか確認する。検索用のウィンドウは閉じるのボタンで閉じる。


 5. 別のフォームのプロパティ参照

 Form1とForm2のオブジェクトは、互いに独立しているので、Text1オブジェクトが、Form1とForm2の両方にあっても別のものとして扱われるのでかまわない。
 では、例えば、Form1からForm2のText1のTextプロパティ、逆にForm2からForm1のText1のTextプロパティを参照するにはどうすればよいか。検索の処理では、検索文字列がForm2のText1にあり、被検索文字列はForm1のText1にある。
 答えは、フォーム名も付けて参照する。例えば、Form2からForm1のText1のTextプロパティを参照するには、次のように書く。

Form1.Text1.Text    (Form1のText1オブジェクトのTextプロパティ)


Form2(検索ウィンドウ)のプログラムリスト

 キャンセルボタン(Command2)がクリックされたとき、フォームをアンロードして閉じるので、UnLoad Meだけでよい。
 検索ボタン(Command1)がクリックされたとき、Text1の文字列をForm1のText1の中から検索する。このとき、検索前にオプションボタンを判定する必要がある。
 Form1のText1オブジェクトのHideSelectionプロパティをFalseに設定しておく。

Dim pt As Integer        '検索文字列を発見した位置

Private Sub Command1_Click()
    If Len(Text1.Text) = 0 Then    '検索文字列なし
        Exit Sub        '何もしない
    End If
    If Option1.Value = True Then    'カーソル位置から検索
            'カーソル位置に選択されている文字長を加算
            '+1は0からカウントしているため
        pt = Form1.Text1.SelStart + Form1.Text1.SelLength + 1
    Else
        pt = 1                      '先頭から
        Option1.Value = True    '2回目からはカーソル位置
    End If
    pt = InStr(pt, Form1.Text1.Text, Text1.Text)    '検索
    If pt = 0 Then            '見つからなかった
        MsgBox "検索文字列は見つかりませんでした。"
    Else                      '見つかった
        Form1.Text1.SelStart = pt - 1
        Form1.Text1.SelLength = Len(Text1.Text)
    End If
End Sub

Private Sub Command2_Click()
    Unload Me
End Sub


 (5) 検索機能の追加 U 前へ 目次へ 次へ 
Copyright © 2001,2002 Hiroshi Masuda 

 

 

inserted by FC2 system