- PR -

カレンダーを使用した日付入力コントロールを自作したい

投稿者投稿内容
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-07-04 15:59
引用:

そこでカレンダーを表示する為のボタンのクリックイベントで
PrtForm = Me.Parent
AddHandler PrtForm.Click, AddressOf PrtForm_Click
を記述する事により、親フォームのクリックイベントを拾う事が出来るようになりました。



Parent がフォームそのものを表す場合はこれでよいかも知れませんが、
フォーム上にパネルを配置して、その上にこのコントロールを配置すると、
Parent はそのパネルを表すことになりますから、
フォームを参照するには Parent.Parent と書かなくてはなりません。
したがってこの実装ですと、こういうケースの場合に
「パネル内をクリックすれば動作するけど、パネル外をクリックすれば動作しない」
ということになると思います。
じゃんぬさんのコメント中にある「Parent を追って」というのは、そういう意味だと思います。

少し話は違いますが、そもそもユーザーコントロールで
Parent のイベントをハンドルするという設計が少々疑問です。
ユーザーコントロールはそれが置かれているコンテナに依存すべきではないと思います。

というわけで、私ならイシバシさんのように実装すると思います。
シュリ
会議室デビュー日: 2007/01/29
投稿数: 15
投稿日時: 2007-07-04 16:13
KIさんこんにちは。

考えてみれば確かにそうですね、、、浅はかでした。
勉強になりました。
ありがとうございました。
reiko
ベテラン
会議室デビュー日: 2004/11/19
投稿数: 84
投稿日時: 2007-07-04 16:35
KIさん、ご回答ありがとうございます。大変勉強になりました。
アドバイスどおり、イシバシさんの方法で作成してみようと思います。


シュリさん、ご回答ありがとうございます。大変勉強になりました。
そもそもフォームのデザインでコントロールを配置しなくても
コード内で宣言してあげる事で表示する事も可能だという事も知らなかった私です。
そういう方法がある事を知ったのもすごく勉強になりました。

お2人ともありがとうございました。
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-07-04 18:35
引用:

イシバシさんの書き込み (2007-07-04 15:28) より:
・さらにMonthCalendarと同じサイズにし、リサイズ不可にする。



MonthCalendarのサイズが変わらないとは限りません。
フォントサイズやデスクトップのデザイン、
.Netのバグフィックスなどでも変わる可能性があります。
ですので、

Form.AutoSize = true
From.AutoSizeMode = GrowAndShrink

として自動で計算させるのがよいと思います。
reiko
ベテラン
会議室デビュー日: 2004/11/19
投稿数: 84
投稿日時: 2007-07-05 08:38
引用:

れいさんの書き込み (2007-07-04 18:35) より:
MonthCalendarのサイズが変わらないとは限りません。
フォントサイズやデスクトップのデザイン、
.Netのバグフィックスなどでも変わる可能性があります。
ですので、

Form.AutoSize = true
From.AutoSizeMode = GrowAndShrink

として自動で計算させるのがよいと思います。




れいさん、アドバイスありがとうございます。
「GrowAndShrink」を早速調べてみました。とても勉強になりました。
アドバイスどおりに作ろうと思います。
ありがとうございました。
reiko
ベテラン
会議室デビュー日: 2004/11/19
投稿数: 84
投稿日時: 2007-07-05 09:12
引用:

Form.AutoSize = true
From.AutoSizeMode = GrowAndShrink



早速このようにして実行してみたのですが、
カレンダーの右と下の部分に1ミリ程度のグレーの部分が出来てしまいます。
何か設定がおかしいのでしょうか・・・。

fCalendar = New frmCalendar
fCalendar.AutoSize = True
fCalendar.AutoSizeMode =Windows.Forms.AutoSizeMode.GrowAndShrink
fCalendar.Location = New System.Drawing.Point(Me.Location.X, Me.Location.Y)
fCalendar.Show()

あと、このタイミングで相談してしまうのですが

fCalendar.Location = New System.Drawing.Point(Me.Location.X, Me.Location.Y)
で、ユーザコントロールの下にカレンダーを出そうとしているのですが、
希望通りの場所に出てくれません。

ベストはユーザコントロール内のMaskedTextBoxの下にくっつけるように出したいのですが、MaskedTextBoxのLocationで指定すると、デスクトップの左上に出てしまいます。
これはMaskedTextBoxのLocationで取得している数値が、ユーザコントロールのデザインのフォームにあたるところの一番上にあるからだと推測しているのですが・・・。

そこで、ユーザコントロールのLocationを指定したのですが、そうするとユーザコントロールを覆い隠す形で、(カレンダーの真ん中あたりの後ろにユーザコントロールがある状態です)表示されてしまいます。
何か良い方法がありましたらご教授お願い致します。
reiko
ベテラン
会議室デビュー日: 2004/11/19
投稿数: 84
投稿日時: 2007-07-05 10:04
もうひとつ質問になってしまうのですが、しかもオブジェクト指向の基本的なお話になってしまうのですが、フォームにしたカレンダーから、ユーザコントロールのMaskedTextBoxのTextを変更するにはどうしたら良いのでしょうか・・・。

カレンダーの日付がクリックされた時に、MaskedTextBoxの値を変更したいのです。

最初このように書いていました。
=============================================================
Private ParentCtrl As New EdDate(ユーザコントロール)

Private Sub MonthCalendar1_DateChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DateRangeEventArgs) Handles MonthCalendar1.DateChanged
ParentCtrl.SValue = CLng(Format(MonthCalendar1.SelectionStart, "yyyyMMdd"))
Me.Hide()
End Sub
=============================================================
・・・当然値は変わってくれません。

そこで
http://dobon.net/vb/dotnet/form/accessanotherformdata.html
を参考にしました。

fCalendar.Show(Me)と、ユーザコントロールを渡して表示するようにしました。

「所有されているフォームの取得」
で書かれている[Me.Owner]をイミディエイトウインドウで見てみると、テスト用のフォームがOwnerになっています・・・。これだと、フォームに配置する際のユーザコントロールのNameが同じでないと指定できないし、複数配置できない事になってしまいます(泣)

こうなってくると、やはり呼び出し元を「追って」イベントを発生させた方が良いのでしょうか・・・。

なんとか自分でも調べてみますが、前回の質問とあわせてこちらの情報も頂けるととても嬉しいです。

皆様何卒よろしくお願い致します。





[ メッセージ編集済み 編集者: reiko 編集日時 2007-07-05 10:06 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-07-05 10:33
知らない間にいろいろと先を越されておりました。orz
昨日もあれからせっせと実装していたのですが...

引用:

reikoさんの書き込み (2007-07-05 09:12) より:

早速このようにして実行してみたのですが、
カレンダーの右と下の部分に1ミリ程度のグレーの部分が出来てしまいます。
何か設定がおかしいのでしょうか・・・。


最初に設定されたコントロールの位置がおかしいのではないでしょうか。あるいは Anchor プロパティ や Dock プロパティで端を揃えないとダメかもしれません。それでもダメなら Resize のタイミングで動的に配置するロジックを書かなければならないかもしれません。

引用:

reikoさんの書き込み (2007-07-05 10:04) より:

もうひとつ質問になってしまうのですが、しかもオブジェクト指向の基本的なお話になってしまうのですが、フォームにしたカレンダーから、ユーザコントロールのMaskedTextBoxのTextを変更するにはどうしたら良いのでしょうか・・・。


ユーザーコントロール側に MaskedTextBox の Text プロパティを公開したプロパティ メンバを実装するだけで良いと思います。MaskedTextBox 自体は隠蔽化しておきましょう。

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

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