ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Visual Basic User's ClubコミュのコマンドボタンのEnabled設定

  • mixiチェック
  • このエントリーをはてなブックマークに追加
始めまして。
最近社会復帰し、現在既存システムをサンプルに、
新規でフォームプログラムを起こしています。
言語はVB6.0です。

フォーム上に検索用テキストボックス(txt)が4個。
コマンドボタン(cmd)が10個。
スプレッド(spd)が1枚あります。

このとき、
txtA、Bと
spdの列A,Bのどれかが選択されているとき、
cmdAのEnabledを有効にし、クリックできるようにする仕様があります。(別フォームを表示し、結果をテキストorスプレッドに返す)

最初に考えたのは、
txtA、txtB、SpdのGotFocus時にcmdAのEnabledを有効、
LostFocus時にEnabledを無効にするという処理でしたが、
この処理だとCmdAにフォーカスが移った瞬間にEnabledが無効になってしまい、
Clickイベントが呼べないことに気づきました。

最終的に
txtA、txtB、SpdのGotFocus時にcmdAのEnabledを有効、
txtA、txtB、Spd以外のGotFocus時にcmdAのEnabledを無効
という処理で逃げましたが、
他にコントロールが増えたときの事を考えると、
あまり良い処理とは思えないのです。

良い処理をお持ちでしたらご教授願いたく、トピックを立てました。
仕様は満たしているので、急ぎではありません。
よろしくお願いします。

コメント(17)

こんにちは。
スプレッドに関してはよく判らないのですが
TextBoxコントロールに関してはLostFocusイベントではなく
Validateイベントで対応してみてはいかがでしょうか。
えりささん>
コメントありがとうございます。
Validateも考えました。
しかし、今回の処理ではTXTの値に関わらず、
コマンドのEnabledを有効/無効にする仕様なので、NGです。
値があるときは無効、値がないときは有効という仕様ならこれで解決できました。


りきゅあさん>
コメントありがとうございます。
言語仕様の壁ですかね〜・・・。
コーディング量を減らすなら、その処理は有用ですね。

どちらにせよ、コントロールが追加されるということは、
なんらかの改変が行われるので、今の処理のまま逃げようと思います。
アクティブなコントロールを見るという観点は、
後任者が気がつきにくい処理になると思われるので・・・
txtAとcmdAが隣接しているような画面デザインであれば、この手が使えるかもしれません。

txtAとcmdAをActiveXコントロールにしてしまいます。(仮にUserControl1とします)
UserControl1には下記のメソッドを実装します。

Public Sub SetEnable(bIsEnable As Boolean)
    If bIsEnable Then
        txtA.Enabled = True
        cmdA.Enabled = True
    Else
        txtA.Enabled = False
        cmdA.Enabled = False
    End If
End Sub

Private Sub UserControl_GotFocus()
    txtA.SetFocus
End Sub

本体画面側(EXEですかね?)ではFormにUserControl1を貼り付けます。
Form側でUserControl1のGetFocusとLostFocusイベントで、Usercontrol1.SetEnableメソッドを呼び出して制御します。

Private Sub UserControl11_GotFocus()
    Call UserControl11.SetEnable(True)
End Sub

Private Sub UserControl11_LostFocus()
    Call UserControl11.SetEnable(False)
End Sub

#SHIFT+TABで戻ってきた時のフォーカスとか、いろいろ考えないといけない事はありそうです。
#すっごく久しぶりにVBをさわったので、間違いがあるかもです。
まみむめマさん>
僕がトピックを立てたことにより、シンプルな作りのシステムが
世の中に出ると思うと、立てた甲斐があったなーなどと思ってしまいます。
Varidateは・・・確か、VB5の頃から出現していたと思います。
あると便利ですね。このイベントは。
ぽてぽてさん>
確かに隣り合っているものなら、かなり楽になりますね。
ユーザー管理ツールなどには使えるかもしれません。

私の担当しているシステムは、ボタンが10個画面下部に並んでいるもの
(ファンクションキーと連動)
なので、少し趣向は異なりますけど・・・
僕にないアイデアだったので、今後に活かしていこうかと思います。
>>4の件で気になったので試してみました。
以下のようにテストしてみたところ、TextBoxの値に関わらず
CommandButtonを有効/無効にすることができましたのでその内容を記述しておきます。
私の解釈はこのような感じ↓なのですがヒゲミンさんの実現したいことと一致していますか?

≪テストの仕様≫
・TextBox2にフォーカスがある場合CommandButton1が有効
・それ以外にフォーカスがある場合CommandButton1が無効

≪コントロール配置≫
・TextBox1(ダミー用)
・TextBox2
・CommandButton1

≪コード記述内容≫
Private Sub Form_Load()
  Command1.Enabled = False
End Sub

Private Sub Text2_GotFocus()
  Command1.Enabled = True
End Sub

Private Sub Text2_Validate(Cancel As Boolean)
  Command1.Enabled = False
End Sub

Private Sub Command1_Click()
  Call MsgBox("あ。")
  Text1.SetFocus '初期位置
End Sub
Private Sub Command2_Click()
    Text1.SetFocus
End Sub

Private Sub Form_Load()
    Command2.Enabled = False
End Sub

Private Sub Text1_GotFocus()
    Command2.Enabled = True
End Sub

Private Sub Text1_LostFocus()
    If "Command2" <> Form1.ActiveControl.Name Then
        Command2.Enabled = False
    End If
End Sub

Private Sub Command2_LostFocus()
    If "Text1" <> Form1.ActiveControl.Name Then
        Command2.Enabled = False
    End If
End Sub
申し訳ないです。
書きかけで送信してしまいました。>12

内容としてはForm1に下記のコントロールを貼り付けます。
Text1
Text2
Command1
Command2
Command3

Text1がフォーカスを持っている時のみCommand2がEnableになります。
Command2はクリックされたらフォーカスをText1に戻します。

う〜ん、どうでしょ?
皆様ご協力ありがとうございます。
ぽてぽてさんがコーディングしていただいたものは、
リキュアさんが考案されたアイデアをコーディングしたものです。
2人ActiveControlに行き着いたあたり、
おそらく、ここらへんがVBの限界でしょうね。

そして、総勢5人のエンジニアが集って2日かかって出したアイデアですから、
これ以上のものはないでしょうね〜。

それから、Validateですが、
LostFocusイベントが呼ばれる前に呼ばれるイベントです。
この辺はしっかり理解しておかないと、はまります。
CancelをTrueにするのを忘れて、
2日原因追求についやした経験があります。

皆様、本当にありがとうございました。
ぽてぽてさんのアクティブになっているコントロール名で処理分岐する方法は
ターゲットを指定しているので間違いがなくとても良さそうですね。
とてもお勉強になります。

余談ですが、私は4年ぶりぐらい??でVB6をいじってみたのですが
オンラインヘルプがなくなっていてびっくりしました。(笑)
.netが世に出てそろそろ7年くらい経ちますからね〜。
.netも安定してきたと思うので、そろそろ本格的に
.net化されるでしょう。

WEBの世界では、IISだったらASP.netですし。

ログインすると、残り5件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

Visual Basic User's Club 更新情報

Visual Basic User's Clubのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング