MonthCalendarのダブルクリックについて

解決


よしお  2008-01-01 07:34:56  No: 144221

MonthCalendarでダブルクリック判定を行いたいと考えています。
以下のコードが使えると考えています。
http://dotnet.mvps.org/dotnet/faqs/?id=monthcalendardoubleclick&lang=en
しかし、使いかたがわかりません。

まずはフォームで宣言しなくてはならないと考え、以下のように宣言しました。
Public Class top
    Inherits System.Windows.Forms.Form
    WithEvents ExtendedMonthCalendar1 As New ExtendedMonthCalendar
自信がないのですが合ってますでしょうか?

また、ダブルクリック時の処理はどこに書けばよいのでしょうか?

ご指導いただけましたら幸いです。


アクア  2008-01-03 00:38:03  No: 144222

アクアと申します。
微力ながらお手伝いさせていただきます。

私の環境は
OS  :Windows Vista Ultimate
言語:Visual Studio 2008 Team Bata 2 (Visual Basic 2008) 

ここでは、ご提示のあった
http://dotnet.mvps.org/dotnet/faqs/?id=monthcalendardoubleclick&lang=en
のサンプルの使用方法を2点説明いたします。

1つ目:
ご提示のサンプルがtopというFormが用意されているものとします。
1) メニューバーから[プロジェクト(P)]→[クラスの追加]と順番に選択します。
2) ファイル名を『ExtendedMonthCalendar.vb』として、[追加(A)]を押します。
3) 2で追加したクラスに提示のあったURLのコード
をコピー&ペーストします。
4) 以下のコードを打ち込みます。

Public Class top
    Friend WithEvents exMonthCalendar As New ExtendedMonthCalendar

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles MyBase.Load
        exMonthCalendar.Location = New Point(20, 20)
        Me.Controls.Add(exMonthCalendar)
    End Sub

    Private Sub exMonthCalender_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles exMonthCalendar.DoubleClick
        MessageBox.Show("ダブルクリックされました。")
    End Sub

End Class

2つ目:
上記の手順の1〜4を行います。
5) メニューバーから[ビルド]→[ソリューションのビルド]と順番に選択します。
6) ツールボックスの中にExtendedMonthCalendarが確認できると思います。
   ドラッグしてフォームに貼り付けて見ましょう。
7) フォームのコードデザイナ画面に映って次のコードを打ち込んでEnterキーを押します。
    Private Sub exMonthCalender_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles exMonthCalendar.DoubleClick
        MessageBox.Show("ダブルクリックされました。")
    End Sub

ご提示のあったコードの2行目
Inherits System.Windows.Forms.Form
ではフォームを継承していることになり、ここでは不要です。


アクア  2008-01-03 00:41:49  No: 144223

ちょっと訂正

誤:4) 以下のコードを打ち込みます。
正:4) topのコードデザイナを表示して以下のコードを打ち込みます。


アクア  2008-01-03 01:03:15  No: 144224

さらに訂正。(混乱させてしまって申し訳ありません。)

7も非常に問題があります。…orz

正:7) コード表示画面に移って以下のコードを打ち込みます。

    Private Sub ExtendedMonthCalender1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles ExtendedMonthCalendar1.DoubleClick
        MessageBox.Show("ダブルクリックされました。")
    End Sub


よしお  2008-01-03 10:01:47  No: 144225

アクア様
丁寧なご指導感謝いたします。

さらに質問で申し訳ないのですが、
コードの2行目にある
Inherits System.Windows.Forms.Form
を消したところ、
 Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
     Handles MyBase.Load
        exMonthCalendar.Location = New Point(20, 20)
        Me.Controls.Add(exMonthCalendar)
    End Sub
のHandles MyBase.LoadのLoadとMe.Controls.Add(exMonthCalendar)のMe.Controlsにエラーが表示され、ビルドできないという結果になってしまいました。

コードの2行目にある
Inherits System.Windows.Forms.Formを消さずに
ソリューションのビルドを行って見たところ、正常に終了しましたが
ツールボックスの中にExtendedMonthCalendarは現れませんでした。

申し訳ありませんがまたお力をお貸しいただけましたら幸いです。

私の環境です(前回記入を忘れてましたすみませんでした)
OS  :Windows XP pro
言語:Visual Studio 2003


アクア  URL  2008-01-04 09:22:07  No: 144226

Visual Basic 2003だったのですね。失礼しました。

改めてお手伝いさせて頂きます。

今までの説明はとりあえず無かったものとしてください。
また、私はVisual Basic 2003は所有していませんでしたのでVisual Basic 2002での検証となります。
(多分、正常に2003でも再現できると思います。)

環境
OS   : Windows XP Pro sp2
言語 : Visual Basic 2002

1) テスト用のプロジェクトを新規に作成してください。
   プロジェクト名(N): は、TestExMonthCalendar とでもしておいてください。
2) Form1.vb[デザイナ]のタブが選択されており、フォームデザイナ画面が表示されていると思います。
   メニューの[表示(V)]→[コード(C)]の順番で選択し、コードを表示します。表示されているのは以下のような感じだと思います。
   ここでは確認だけです。

--------------------------------------------------
Public Class Form1
    Inherits System.Windows.Forms.Form

  " Windows フォーム デザイナで生成されたコード "

End Class
--------------------------------------------------
   ※  先の説明では  Inherits System.Windows.Forms.Form を削除するような説明を致しましたが削除しないでください。

3) メニューの[プロジェクト(P)]→[クラスの追加(C)...]を順に選択します。
   ダイアログが開いていると思いますので、ファイル名(N): の欄に ExtendedMonthCalendar.vb と入力し[開く(O)]ボタンを押します。
   
---------------------------------------------------
Public Class ExtendedMonthCalendar
    
End Class
---------------------------------------------------

   と書かれた画面が表示されていると思いますので、この中にご提示のあったURLにあるコードをコピー&ペーストします。

4) Form1.vbのコード画面を開き、2のコードに以下を記述します。
--------------------------------------------------
Public Class Form1
    Inherits System.Windows.Forms.Form

  [ Windows フォーム デザイナで生成されたコード ]

    Friend WithEvents exMonthCalendar As New ExtendedMonthCalendar()

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

       Me.exMonthCalendar.Location = New Point(20,20)
       Me.Controls.Add(exMonthCalendar)

    End Sub

    Private Shadows Sub exMonthCalendar_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles exMonthCalendar.DoubleClick
        MessageBox.Show("ダブルクリックされました。")
    End Sub

End Class


アクア  URL  2008-01-04 09:26:49  No: 144227

途中で送信してしまい失礼しました。
続きです。(コードの記述については先の投稿で終了です。)

5) メニューの[デバッグ(D)] → [開始(S)] の順番で選択します。
   ExtendedMonthCalendarが追加された状態であることが確認できると思いますので、ExtendedMonthCalendarの任意の場所をダブルクリックして正常にメッセージボックスが表示されている事を確認してください。

テストは以上です。

今回もプロパティの設定については配置位置の設定のみにしました。
他のプロパティの設定についてもLocationと同じ様に記述する事で設定できると思います。
ただし、注意しなければならない事は、FormのLoadイベント時に配置処理やプロパティ設定を行うことは上策とは言えない様です。
(この件については今後知識を深めていく中でお分かりになろうかと思いますので、ここでは深く言及しませんが・・・)

・・・長々とすみませんでした。


アクア  URL  2008-01-04 10:30:22  No: 144228

# うぅ・・・肝心なところ外してました。
重ね重ね申し訳ありません。

ご質問の趣旨にきちんと答えていませんでした。

最初によしおさんが示されたコードは間違っていませんでした。
ただし、必要な処理が欠けていたと言うことです。
WithEvents ExtendedMonthCalendar1 As New ExtendedMonthCalendar
はExtendedMonthCalendarを使いますよ〜・・・と宣言したに過ぎません。

なので今回(多少、問題はあるものの)私が行った処理はMyBase.Load時にコントロールの追加を行っています。
それが
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
から
End Sub
までのコードです。
この中の、
Me.exMonthCalendar.Location = New Point(20,20)
は表示位置のプロパティの設定です。
次の
Me.Controls.Add(exMonthCalendar)
は、このフォームにexMonthCalendarを追加して表示する処理です。
この1行が表示させるために必要な処理です。

ExtendedMonthCalendarのDoubleClickイベントは
Friend WithEvents exMonthCalendar As New ExtendedMonthCalendar
の1行で適切にイベントを処理してくれる様になっていますので、その処理を記述するだけです。
それが
    Private Shadows Sub exMonthCalendar_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles exMonthCalendar.DoubleClick
        MessageBox.Show("ダブルクリックされました。")
    End Sub
です。
HandlesキーワードがExtendedMonthCalendarオブジェクトのDoubleClickイベントを拾ってくれますが、それが使用可能なのはよしおさんも書かれている
WithEventsの1文があるからこそです。

DoubleClickイベントがどのような物であるかについては、追加したExtendedMonthCalendarクラスに記述されてあるのはよしおさんもお解りの事と思います。

以上です。説明が足りていれば幸いですが・・・


よしお  2008-01-05 05:35:49  No: 144229

アクア様

無事にダブルクリック判定をすることができました!!
アクア様のお力添えのおかげです。
本当にありがとうございました。m(_ _)m


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加