- PR -

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

投稿者投稿内容
シュリ
会議室デビュー日: 2007/01/29
投稿数: 15
投稿日時: 2007-07-05 11:01
位置の事だけ。

コード:
    Dim frm2 As New Form2
    Dim p As New System.Drawing.Point(0, 0)
    frm2.StartPosition = FormStartPosition.Manual
    frm2.Location = New System.Drawing.Point(TextBox1.PointToScreen(p).X, TextBox1.PointToScreen(p).Y + TextBox1.Height)
    frm2.Show()


#また妙な事を言ってたらごめんなさい。
イシバシ
常連さん
会議室デビュー日: 2007/02/06
投稿数: 20
お住まい・勤務地: 浦安の隣
投稿日時: 2007-07-05 11:40
位置のことを書こうとしたら先を越されたので、サイズの件
コード:
	private void Form1_Paint(object sender, PaintEventArgs e)
	{
		this.Width = this.monthCalendar1.Size.Width;
		this.Height = this.monthCalendar1.Size.Height;
	}


VBに翻訳して下さい。

ちなみに、AutoSizeプロパティはFalseです。
reiko
ベテラン
会議室デビュー日: 2004/11/19
投稿数: 84
投稿日時: 2007-07-05 13:29
シュリさん、ありあがとうございます。
教えていただいた方法で無事テキストの下に表示させる事が出来ました。
勉強になりました。ありがとうございました。

イシバシさん、ありがとうございます。
アドバイスを頂くまで、とりあえずデザイン時にAutoSizeプロパティをFalseにして、
カレンダーのサイズを調べてFormも同じ大きさの数値を設定していたのですが、
そうですよね。コードで一応サイズ変更しておいたほうが良さそうですね。勉強になりました。ありがとうございました。

あとは、カレンダーフォームから呼び出し側のMaskedTextBoxの値を変えられれば完成なのですが・・・(泣)どなたか良い方法がありましたらご指導お願い致します。
reiko
ベテラン
会議室デビュー日: 2004/11/19
投稿数: 84
投稿日時: 2007-07-05 13:32
じゃんぬねっとさん、すみません!
皆さんからたくさんのコメントをつけて頂いて、じゃんぬねっとさんからもコメントを頂けていた事に気づいていませんでした;
今から頂いたコメントをゆっくり読んで、試してみます。
いつもありがとうございます。後ほどまた報告いたします。
reiko
ベテラン
会議室デビュー日: 2004/11/19
投稿数: 84
投稿日時: 2007-07-05 15:04
皆様、この度は本当にお世話になっております。

カレンダーの余白の問題は、無事解決しました。

デザイン時にAnchor プロパティ や Dock プロパティを設定した後、表示実行部分で

frm.AutoSize = True
frm.AutoSizeMode = Windows.Forms.AutoSizeMode.GrowAndShrink

とし、カレンダーフォームのPaintイベントで
Me.Width = Me.MonthCalendar1.Size.Width
Me.Height = Me.MonthCalendar1.Size.Height

とすることで、無事解決しました。

あとはカレンダーフォームから呼び出し側のMaskedTextBoxに値をセットする方法ですが、
実は、前回質問した際のソースの「SValue」は、自作したプロパティだったのです。
でも、やはり値をセットする事は出来ませんでした。

以下にプロパティのソースを記述します。

Public Property SValue() As String
Get
Return GetValue()
End Get
Set(ByVal value As String)
MskDt.Text = value
End Set

End Property


Private Function GetValue() As String
Return MskDt.Text.Replace("/", "")

End Function

※ちなみに、質問した際のこのプロパティはLong型だったのですが、
他の問題で発生しているエラー回避のために試行錯誤しているうちに、String型に変わりました;

カレンダー側の処理も念のためもう一度記述します。

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 = Format(MonthCalendar1.SelectionStart, "yyyyMMdd")
Me.Close()

End Sub

一応、単なるテキストボックスを配置し、そのテキストボックスのプロパティを作成した後、カレンダーフォーム側で TextBox1.Text = "OK" と表示させるのを試してみましたが、これも設定する事が出来ませんでした。

デバッグで追ってみると、
Set(ByVal value As String)
MskDt.Text = value
End Set
の部分はちゃんと通っています。

何か呼び出し方が間違っていますでしょうか?本当にお手数をおかけして申し訳ないのですが、ご教授よろしくお願い致します。
reiko
ベテラン
会議室デビュー日: 2004/11/19
投稿数: 84
投稿日時: 2007-07-05 16:19
度々失礼します・・・・。
もうひとつ問題が出てきました(泣)

カレンダーの日付をクリックされた際に、カレンダーフォームを閉じたいのですが、
MonthCalendar1_DateChanged でカレンダーフォームを閉じようとすると、
MonthCalendar1_DateChanged の End Sub のところでエラーとなってしまいます。

閉じる方法を

Me.Close()
Me.Hide()
Me.Visible = False(苦肉の策で。frmCalendar_DeactivateでMe.Close()しているし、ということで)

の3種類を試してみましたが、だめでした。
エラーの内容以下の通りです。

System.ObjectDisposedException はハンドルされませんでした。
Message="破棄されたオブジェクトにアクセスできません。\\r\\nオブジェクト名 'MonthCalendar' です。"
Source="System.Windows.Forms"
ObjectName="MonthCalendar"

別に閉じる関数を作ろうかとか色々考えましたけど、
そうやっても呼び出したところが MonthCalendar1_DateChanged イベントなら、
最終的に End Sub は通りますよね・・・。

この場合、どうしたらよろしいのでしょうか。
もし何かお心当たりのある方がいらっしゃいましたら、ご教授よろしくお願い致します。


=================================
<編集しました>
上記の問題について、苦肉の策でこのようなことをしました。
Private Sub MonthCalendar1_DateChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DateRangeEventArgs) Handles MonthCalendar1.DateChanged
ParentCtrl.SValue = Format(MonthCalendar1.SelectionStart, "yyyyMMdd")

Me.MonthCalendar1.Visible = False
Me.Width = 0
Me.Height = 0
End Sub

Private Sub frmCalendar_Deactivate(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Deactivate

Me.Close()

End Sub

そして、カレンダーフォームのPaintイベントに記述していた
Me.Width = Me.MonthCalendar1.Size.Width
Me.Height = Me.MonthCalendar1.Size.Height

を、Form_Load イベントに移動しました。

一応エラーにはならなくなりましたが・・・・。なんか「無理矢理」ですよね(泣)
もしもっと良い方法をご存知の方がいらっしゃいましたらご教授よろしくお願い致します。


[ メッセージ編集済み 編集者: reiko 編集日時 2007-07-05 16:32 ]
イシバシ
常連さん
会議室デビュー日: 2007/02/06
投稿数: 20
お住まい・勤務地: 浦安の隣
投稿日時: 2007-07-05 17:17
ども。
なんだか、難しくやってますねぇ。

私の試した方法
1.ユーザーコントロール側に、Internalアクセス修飾子で文字列を受け取るメンバを作成。仮に名前を「DateString」とします。

2.カレンダー内包フォームのインスタンスに、ユーザーコントロールの参照を渡す。
仮にこれをPrivateな変数MyUcにでも格納します。
 C#で書くとこんな感じ Form1 f = New Form1(this);

3.MonthCalendar1_DateChanged イベントで、MyUcのDateStringプロパティに
MonthCalendar1で選択された日付のToString(編集)をセットし

4.Me.Close()

5.ユーザーコントロールのDateStringセッターではValueをテキストボックスにセット。

この他はシュリさんのレスにある位置についてと、私のレスのサイズについてのみで
他は一切やってませんが、ほぼスレ主さんの欲している機能は満たしていますよ。

[ メッセージ編集済み 編集者: イシバシ 編集日時 2007-07-05 17:23 ]
イシバシ
常連さん
会議室デビュー日: 2007/02/06
投稿数: 20
お住まい・勤務地: 浦安の隣
投稿日時: 2007-07-05 17:30
連投すいません。
気になってるんですが
>Private ParentCtrl As New EdDate
これってナンでしょう?
カレンダーフォームを開くユーザーコントロール?
New したら別モノですよ。
新しくインスタンス作成したユーザーコントロールに値をいくら渡しても、フォームを開いたほうのユーザーコントロールには反映しませんね。

追加
PaintイベントでMe.Width = ・・・とかやるのであれば、AutoSizeは意味無いと思いますが(というか、害あり?)

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