- PR -

【VB6.0】処理内容が同じイベントを纏めて記述したい

投稿者投稿内容
ハルシオン
常連さん
会議室デビュー日: 2005/03/29
投稿数: 24
投稿日時: 2006-09-28 11:29
いつもお世話になっております。

現在、1つのフォーム上に40個近いテキストボックスが存在する
画面をVB6.0で作成しており、その中で頭を悩ませている事がありますので
後学の為にも皆様のご意見を伺わせてください。
(テキストボックスはコントロール配列になっているものも存在します。)

行いたい事は、以下の通りです。

@全てのテキストボックスの「GotFocus」イベントで、イベントが発生した
 テキストボックスのバックカラーを「フォーカス取得時の色(定数)」に変更し、
 入力値が存在する場合は、その文字列を選択状態とする。

A全てのテキストボックスの「LostFocus」イベントでバックカラーが
 「フォーカス取得時の色(定数)」の場合は、「フォーカスが外れている時の色(定数)」
 に変更する。

@・Aともに難しい処理ではないですので、フォーム上の全てのテキストボックスに対し
そのイベントに対する処理を記述すれば問題ないと思うのですが、これではあまりに無駄な労力が
掛かる上に、コピペミスなどからバグを招きかねません。

以前VB.NETをやっていた時に、AddHandlerステートメントを使用してイベントとプロシージャ
を結びつける事が可能だったことを思い出し、VB6.0でも同様の事が出来ないかと
試行錯誤をしてみましたがうまくいきません。
(うまくいかなくてそりゃ当然だ、などのツッコミはご勘弁下さい。)

ただ、もし、
『AddHandlerステートメントを使用してイベントとプロシージャを結びつける』
ような感じで(処理事態は違えど、上記と同等にイベントのコーディング量を減らせる方法)、
処理内容が同じイベントを纏める事が出来れば、今後もとても助かります。

現在、苦肉の策として以下のようにイベントから共通プロシージャを呼んで
イベントごとのコーディング量を減らしてみました。

コード:
'イベント
Private Sub txtPoi_GotFocus(Index As Integer)

	'共通のイベント処理
    Call CommonTextBox_GotFocus(txtPoi(Index))

End Sub

'イベント共通の関数
Private Sub CommonTextBox_GotFocus(txtBox As TextBox)

    With txtBox
        .BackColor = [フォーカス取得時色定数]
        .SelStart = 0
        .SelLength = Len(.Text)
    End With

End Sub



本当は、.NETで以下のように行っていたように
イベント自体を纏めてしまいたいというのが理想です。

コード:
'<略>
Dim Ctrl As System.Windows.Forms.Control
For Each Ctrl In Me.Controls
    If Ctrl.GetType Is GetType(TextBox) Then
        AddHandler Ctrl.Enter, AddressOf TextBox_Enter
    End If
Next
'<略>

'イベント
Private Sub TextBox_Enter(ByVal sender As Object, ByVal e As System.EventArgs)

    Dim txtBox As TextBox
    txtBox = CType(sender, TextBox)
    Dim FocusOnBackColor As System.Drawing.Color = Color.FromArgb(255, 255, 160)
    
    If txtBox.Enabled And Not txtBox.ReadOnly Then
        If Not TypeDescriptor.GetProperties(sender)("BackColor").ShouldSerializeValue(sender) Then
            txtBox.BackColor = FocusOnBackColor
        End If
        txtBox.SelectAll()
    End If
End Sub




このような事は可能でしょうか?
また、このような場合、皆様はどのようにコーディングされているのでしょう?
ヒントになりそうなことをご存知でしたら、ご教示下さい。

過去ログなどですでに話題になっていましたら、申し訳ありません。

長文に最後までお付き合い頂き、ありがとうございます。
宜しくお願い致します。
nakaP
大ベテラン
会議室デビュー日: 2005/09/27
投稿数: 138
お住まい・勤務地: 高知
投稿日時: 2006-09-28 12:15
ハルシオンさん、初めまして。
私は、以下のページを参考にして同様のことを行いました。
VB イベントの共有

ただ、配列になっているコントロールには難しいかもしれません。
(出来るかもしれませんが、私にはできませんでした・・・。)
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2006-09-28 12:21
引用:

ハルシオンさんの書き込み (2006-09-28 11:29) より:
@全てのテキストボックスの「GotFocus」イベントで、イベントが発生した
 テキストボックスのバックカラーを「フォーカス取得時の色(定数)」に変更し、
 入力値が存在する場合は、その文字列を選択状態とする。

A全てのテキストボックスの「LostFocus」イベントでバックカラーが
 「フォーカス取得時の色(定数)」の場合は、「フォーカスが外れている時の色(定数)」
 に変更する。


ユーザーコントロールにする。要点を置き換えると標準のコントロールの機能では不足なので、コントロールの機能を拡張して独自のコントロールを作りたいと言う話ですよね。ならばユーザーコントロールを使うのが妥当でしょう。
まったけ
会議室デビュー日: 2006/09/08
投稿数: 13
投稿日時: 2006-09-28 12:35
各 TextBox に SetWindowLong() してみてはどうでしょう?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-09-28 12:35
クラス モジュールに WithEvents を定義して、関連付けする方法をお勧めします。VB6 の後半部分が、今回の話題そのものだろうと思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ハルシオン
常連さん
会議室デビュー日: 2005/03/29
投稿数: 24
投稿日時: 2006-09-28 17:50
皆様、迅速なご回答ありがとうございます。

引用:


まったけ さんの書き込み

各 TextBox に SetWindowLong() してみてはどうでしょう?




APIでしょうか。
まことに恥ずかしいのですが、APIに全く明るくないので出来れば
APIが絡まないことで対応できないかと考えておりました。
今後、調べてみたいと思います。
ありがとうございます。


引用:


甕星 さんの書き込み

ユーザーコントロールにする。




残念ながらVB6.0で開発を行っております。
ユーザコントロール、作りたかったです。
ありがとうございます。

頂いた情報より、早速 J.J.さん、じゃんぬねっとさんに
ご提示頂いた『WithEvents』を使用したクラスを作成してみました。
(じゃんぬねっとさんのページは隅々までチェックしていたつもりだったのですが
 見落としていました。いつもありがとうございます。)

まさにこのような事がやりたかったので「痒いところに手が届いた」と
いった気持ちです。
ありがとうございました。

ただ、J.J.さんもご指摘されている通り、

引用:


ただ、配列になっているコントロールには難しいかもしれません。
(出来るかもしれませんが、私にはできませんでした・・・。)




今回の画面はコントロール配列を含んでいたので
それを配列でなくして、とりあえず乗り切りました。

他の画面にもコントロール配列が存在しており、せっかく便利なクラスの
作り方を教えて頂いたのにこれではやっぱり色々と手を入れなくては
いけなくなってしまうので、もし更にチューンアップできる事があれば
対応したいと考えております。

無いものねだりだったら大変申し訳ないのですが、コントロール配列にも
対応できるような方法は無いでしょうか?

また、このような場合はどのような対処をされていますか?

宜しくお願い致します。


R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-09-28 18:43
引用:

ハルシオンさんの書き込み (2006-09-28 17:50) より:

引用:


甕星 さんの書き込み

ユーザーコントロールにする。




残念ながらVB6.0で開発を行っております。
ユーザコントロール、作りたかったです。


僕もユーザーコントロールにしますね。VB6.0でw
(作れますよん)


_________________
R・田中一郎 @ わんくま同盟  -  R.Tanaka.Ichiro’s Blog ←写真を載せてみた



[ メッセージ編集済み 編集者: R・田中一郎 編集日時 2006-09-28 18:51 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-09-28 18:54
引用:

ハルシオンさんの書き込み (2006-09-28 17:50) より:

無いものねだりだったら大変申し訳ないのですが、コントロール配列にも対応できるような方法は無いでしょうか?


試していませんが、できないと思います。
コントロール配列は、素直に Index 付きのイベント プロシージャでやると良いでしょう。

サブクラス化する方法を採ればできると思いますが、お勧めはできないですね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

スキルアップ/キャリアアップ(JOB@IT)