オプションボタンについて


テンテン  2003-07-28 08:41:25  No: 78805  IP: [192.*.*.*]

まず環境はvb6.0  windows2000pro sp4 
状況は formに  フレームをセットしてその中にオプションボタンを2つ
配置しました。
この状況で実行して矢印ボタンで移動しなくする方法はあるのでしょうか?

どうか御指南して頂けると恐縮です。

編集 削除
nanashi  2003-07-28 11:07:09  No: 78806  IP: [192.*.*.*]

片方のオプションボタンを別コンテナに入れる、くらいしか思い付きません。
ただし、こうすると2つのオプションボタンは別グループになるので
Clickイベントで各オプションボタンのValueを自力で制御しないといけません。

編集 削除
ぬけさく  2003-07-28 12:53:16  No: 78807  IP: [192.*.*.*]

KeyDownでPrg書いてみる手もありますよ。

VB6のページじゃないけど参考資料
http://homepage1.nifty.com/tsware/study/vol9/vbanote_03.htm

編集 削除
nanashi  2003-07-28 13:44:07  No: 78808  IP: [192.*.*.*]

KeyDownイベントは起こりません。

編集 削除
ぬけ  2003-07-28 15:06:42  No: 78809  IP: [192.*.*.*]

無責任なこと書いてすいませんでした。

編集 削除
イトウ  2003-07-30 11:33:06  No: 78810  IP: [192.*.*.*]

…OptionButtonのKeyDownイベントをMicrosoft Office XP ProfessionalのVBAで確認しました。

VB6でできないのであれば、オプションボタンをあきらめ他の(CheckBoxとか?)に切り替えるほうがいいかもしれません。
…いざとなれば独自のオブジェクトをつくるとか。

編集 削除
ぢゃわ  2003-07-30 16:19:07  No: 78811  IP: [192.*.*.*]

nanashiさんのいうとおり、KeyDownとかKeyPressとかは使えないので、
カーソル移動させない方法は別コンテナに入れるくらいしかないですね。

Frameの中にもうひとつCaptionなし枠なしのFrameを作って、片方の
オプションボタンはそのFrame内に入れればそれっぽく見えます。

ちなみに、別Frameに入っていても、双方のオプションボタンの
オブジェクト名を同じものにして、それぞれにIndexを振り、
下記のように手動でValue制御さえしてあげれば、あとは普通の
オプションボタンとそう変わらない使い勝手になると思います。

Private Sub Option1_Click(Index As Integer)
    For i = 0 To Option1.UBound
        If i = Index Then
            Option1(i).value = True
        Else
            Option1(i).value = False
        End If
    Next
End Sub

編集 削除
Say  2003-07-30 19:04:31  No: 78812  IP: [192.*.*.*]

KeyDownイベントは起こりませんが、メッセージは来てますので、
サブクラス化かローカルキーフックで拾うことはできます。
ただし、カーソルキー移動は内部処理ですので、
メッセージを握りつぶしても防げませんから、
「メッセージを拾ったら移動前の状態に戻してやる」
処理が必要です。

手っ取り早いのは、

●Optionボタンをコントロール配列にする。
●LostFocusイベントでIndexを保存。
●サブクラス化かローカルキーフックでメッセージをチェック。
●メッセージが「Optionボタンに対するカーソルキー」だったら
  フラグをたてる。
●Optionボタンのクリックイベントで、フラグがたっていたら
  フラグをおろし、
  Indexを保存していたOptionボタンにSetFocusし、
  そのOptionボタンのValueをTrueにする。

というところでしょう。(あまり手っ取り早くないような・・・)

個人的見解としては、(技術的には面白いのですが)
こういう手間をかけるより、
「カーソルキー移動を禁止する」という仕様のほうを
見直したいところです。

編集 削除