C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[11]: 最大化フォームから新規フォームの呼び出しについて


(過去ログ 71 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■41361 / inTopicNo.1)  最大化フォームから新規フォームの呼び出しについて
  
□投稿者/ プリ太 (62回)-(2009/09/18(Fri) 13:58:01)

分類:[C#] 

プリ太です。

まだ前の問題は解決していませんが、こちらも行き詰っていますので、アドバイスをお願いします。

MDIから子フォームAを表示しています。
フォームAは画面表示の際に
this.WindowState = FormWindowState.Maximized;
で最大表示しています。
この状態でフォームAからフォームBを表示しようとしているのですが、エラーになりフォームBが表示されません。
StackTraceは以下のようになっています。
場所 System.Windows.Forms.NativeWindow.CreateHandle(CreateParams cp)
場所 System.Windows.Forms.Control.CreateHandle()
場所 System.Windows.Forms.Form.CreateHandle()
場所 System.Windows.Forms.Control.get_Handle()
場所 System.Windows.Forms.Form.SetVisibleCore(Boolean value)
場所 System.Windows.Forms.Control.Show()
場所 Editor.FormEdit.btnTEMP_Click(Object sender, EventArgs e) 場所 D:\v101\Editor\Editor\FormEdit.cs:行 14982
場所 System.Windows.Forms.Control.OnClick(EventArgs e)
場所 System.Windows.Forms.Button.OnClick(EventArgs e)
場所 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
場所 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
場所 System.Windows.Forms.Control.WndProc(Message& m)
場所 System.Windows.Forms.ButtonBase.WndProc(Message& m)
場所 System.Windows.Forms.Button.WndProc(Message& m)
場所 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
場所 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
場所 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
場所 System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
場所 System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
場所 System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
場所 System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
場所 System.Windows.Forms.Application.Run(Form mainForm)
場所 Editor.Program.Main(String[] args) 場所 D:\v101\Editor\Editor\Program.cs:行 67
場所 System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
場所 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
場所 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
場所 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
場所 System.Threading.ThreadHelper.ThreadStart()

一度、フォームAのサイズを変更後にまた最大化してからフォームBを呼び出すとエラーにならず、フォームBも最大サイズで表示されます。
また、
this.WindowState = FormWindowState.Maximized;
を入れなかった場合は、エラーは発生しません。

表示の時点で最大化したフォームから新しいフォームを表示する際は何か設定が必要なのでしょうか?
フォームAもBも表示はShow()で行っています。

環境はVS2005です。
宜しくお願いします。
引用返信 編集キー/
■41368 / inTopicNo.2)  Re[1]: 最大化フォームから新規フォームの呼び出しについて
□投稿者/ たくボン (196回)-(2009/09/18(Fri) 14:53:51)
No41361 (プリ太 さん) に返信
> プリ太です。
>
> まだ前の問題は解決していませんが、こちらも行き詰っていますので、アドバイスをお願いします。

ざっくりとだけしか見てないから断言はできないが・・・。


> StackTraceは以下のようになっています。

> 場所 System.Windows.Forms.Form.SetVisibleCore(Boolean value)
> 場所 System.Windows.Forms.Control.Show()
> 場所 Editor.FormEdit.btnTEMP_Click(Object sender, EventArgs e) 場所 D:\v101\Editor\Editor\FormEdit.cs:行 14982
> 場所 System.Windows.Forms.Control.OnClick(EventArgs e)

↑この辺りと


> 場所 System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
> 場所 System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
> 場所 System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)

この辺りを確認してみるのがいいんじゃないかなぁ。
まずは原因の切り分けをしてみる。

恐らくFormEditを作ったのはプリ太さんじゃないと思うので、詳しい人に聞いて見るのが一番かも。ソースあるならデバッグしてみては?おそらくFormEdit.csの中でゴニョゴニョしてるはずだから、そこのCreateWindowもしくはWindowを作成してる辺りを確認してみては?

例外が発生した時は、スタックトレースの内容だけでは判断しにくいから、例外の種類も書いてくれたらもっと推測しやすいと思うっす。

引用返信 編集キー/
■41386 / inTopicNo.3)  Re[2]: 最大化フォームから新規フォームの呼び出しについて
□投稿者/ プリ太 (64回)-(2009/09/18(Fri) 18:12:14)
たくボン さん、ありがとうございます。

> 例外が発生した時は、スタックトレースの内容だけでは判断しにくいから、例外の種類も書いてくれたらもっと推測しやすいと思うっす。

フォームをShowするところでエラーが発生しているのですが、そこで表示されるエラーは
「System.OutOfMemoryException: ウィンドウのハンドルを作成中にエラーが発生しました。 」です。

今いろいろ試しているのですが、MDIからフォームAを表示した後、またフォームAを表示しても同じ現象が起きることが判明しました。
フォームの呼び出しに問題があるだろうか?と今見直し中です。
ちなみに、フォームはツールバー、メニューバーから呼ばれるイベント関数で作成&呼び出ししています。
フォームAは以下の様に呼び出しています。
private void Function_New()
{
//画面クラス作成
FormEdit nEditWin = new FormEdit(mCommon, mPosition, mRange, mEdit, mResource, mToolTip, "");

//親フォーム設定
nEditWin.MdiParent = this;
//タイトル設定
nEditWin.Text = "< 新規 " + mNewFormCnt.ToString() + " >";
//表示
nEditWin.Show(); //ここでエラーが発生します。

//新規フォームカウントUp
mNewFormCnt++;

//WindowsListToolStripMenuItemに子フォームのリストを表示する
menuStrip.MdiWindowListItem = ToolStripMenu_Window;
}
フォームBはフォームAから同じ様に呼び出しています。
フォーム最大化の指定はフォームAのLoadの中で最後に行っています。
最大化の指定をしない場合は、AからBを呼んでもエラーは発生しません。

引用返信 編集キー/
■41402 / inTopicNo.4)  Re[3]: 最大化フォームから新規フォームの呼び出しについて
□投稿者/ プリ太 (65回)-(2009/09/18(Fri) 21:52:06)
プリ太です。

根本的な解決にはなりませんが、
新しいフォームを表示する前に既存のフォームのサイズをNormalにし、そのあとMaximizedしてから新しいフォームをShowするとエラーが出なくなりました。

1つ気になるのは、MDIだけを立ち上げてから新規で新しいフォームAを開いて・・・とするとエラーは発生しません。
発生するのは、MDIが表示されるときに同時にフォームAを開いて表示したときのみです。
フォーム表示関数は1つで、その関数をツールバーやメニューバーから呼ぶのですが、
動作条件によってはMDI_Loadから呼ぶ場合もあり、その場合のみエラーが発生します。
MDI_Loadで子フォーム表示処理を行ってはいけないのでしょうか?

引用返信 編集キー/
■41551 / inTopicNo.5)  Re[4]: 最大化フォームから新規フォームの呼び出しについて
□投稿者/ プリ太 (66回)-(2009/09/24(Thu) 10:06:09)
プリ太 です。

問題について考えるためコードの見直しを行っています。
そこで、気になったことがあるので教えてください。

MDIから子フォームを表示する際の子フォームの宣言についてですが、
現在、呼び出した関数の中で宣言し、表示しています。
この宣言についてですが、関数の中で行うのはよくないのでしょうか?

関数中ではなく、クラスの変数として宣言しても得に動作は変わらないように見えるのですが、
#エラーは相変わらず発生します。
問題はありますでしょうか?

宜しくお願いします。
引用返信 編集キー/
■41552 / inTopicNo.6)  Re[5]: 最大化フォームから新規フォームの呼び出しについて
□投稿者/ 渋木宏明(ひどり) (1227回)-(2009/09/24(Thu) 10:24:52)
渋木宏明(ひどり) さんの Web サイト
> この宣言についてですが、関数の中で行うのはよくないのでしょうか?

↑それ自体は問題ないです。

# 「宣言」ではないと思うけど、何となく意味が通じたような気がしたので今回はスルー

引用返信 編集キー/
■41558 / inTopicNo.7)  Re[6]: 最大化フォームから新規フォームの呼び出しについて
□投稿者/ プリ太 (67回)-(2009/09/24(Thu) 11:49:39)
渋木宏明(ひどり) さん ありがとうございます。

>>この宣言についてですが、関数の中で行うのはよくないのでしょうか?
>
> ↑それ自体は問題ないです。
>
> # 「宣言」ではないと思うけど、何となく意味が通じたような気がしたので今回はスルー

問題ない、ということでありがとうございます。


次に気になっているのは、子フォームの呼び出しのタイミングについてです。
現在、子フォーム呼び出しの関数を、MDIのLoadで呼んでいます。
子フォームは自分のLoadの最後でフォームサイズを最大になるように
this.WindowState = FormWindowState.Maximized;
を書いています。
MDIが表示されるのと同時に子フォームを表示したいのですが、MDIのLoadで呼んではいけないのでしょうか?

現在、MDIを表示するときに一緒に子フォームの表示はできますが、そのまま新規子フォームを追加で表示しようとすると追加分の子フォームは表示されません。
はじめに表示した子フォームを閉じると表示されます。
どちらも同じ子フォーム呼び出し関数を使用しています。

宜しくお願いします。
引用返信 編集キー/
■41560 / inTopicNo.8)  Re[7]: 最大化フォームから新規フォームの呼び出しについて
□投稿者/ 渋木宏明(ひどり) (1229回)-(2009/09/24(Thu) 12:03:49)
渋木宏明(ひどり) さんの Web サイト
> 次に気になっているのは、子フォームの呼び出しのタイミングについてです。
> 現在、子フォーム呼び出しの関数を、MDIのLoadで呼んでいます。
> 子フォームは自分のLoadの最後でフォームサイズを最大になるように
> this.WindowState = FormWindowState.Maximized;
> を書いています。
> MDIが表示されるのと同時に子フォームを表示したいのですが、MDIのLoadで呼んではいけないのでしょうか?

「呼ぶ」やら「MDIのLoad」やら、曖昧な表現で読みづらいです ;-p
もう少し主語や操作の内容を明確に書いてもらえませんか?

「MDI 親フォームの Load イベントのハンドラで、MDI 子フォームのインスタンスを生成・表示を行っている」という流れだと読み取りましたけど、それでいいですか?
であるなら、基本的にそれで問題ありません。

つか、子フォーム?が FormEdit とやらではなく、新規作成しただけのフォームである場合、どーなります?
それでなんともなければ、FormEdit 固有の問題だと思います。

引用返信 編集キー/
■41563 / inTopicNo.9)  Re[8]: 最大化フォームから新規フォームの呼び出しについて
□投稿者/ プリ太 (68回)-(2009/09/24(Thu) 13:21:16)
渋木宏明(ひどり) さん ありがとうございます。

説明が分かりにくくて申し訳ありません。

> 「呼ぶ」やら「MDIのLoad」やら、曖昧な表現で読みづらいです ;-p
> もう少し主語や操作の内容を明確に書いてもらえませんか?
>
> 「MDI 親フォームの Load イベントのハンドラで、MDI 子フォームのインスタンスを生成・表示を行っている」という流れだと読み取りましたけど、それでいいですか?
> であるなら、基本的にそれで問題ありません。

はい、その通りです。


> つか、子フォーム?が FormEdit とやらではなく、新規作成しただけのフォームである場合、どーなります?
> それでなんともなければ、FormEdit 固有の問題だと思います。

表示する子フォームはFormEdit型のフォームです。
■41386で表記しているのは新規作成時に呼ばれる関数ですが、これをMDIのLoadイベントで呼び出しています。
MDIのLoadイベントで子フォームのインスタンス生成・表示を行わない(Function_Newを呼ばない)場合は、問題はおきません。

これで聞かれていることへの答えになっていますでしょうか?
引用返信 編集キー/
■41566 / inTopicNo.10)  Re[9]: 最大化フォームから新規フォームの呼び出しについて
□投稿者/ 渋木宏明(ひどり) (1230回)-(2009/09/24(Thu) 15:56:14)
渋木宏明(ひどり) さんの Web サイト
> これで聞かれていることへの答えになっていますでしょうか?

なってません。

FormEdit 型の子フォームでなく、新規に作成した単なるフォーム(Form1 とか)を、MDI 親フォームの Load イベントで生成・表示した場合どうなりますか?とお尋ねしています。

FormEdit が原因なのか、それとも MDI 子フォームの生成・表示に至る手順そのものに問題があるのか切り分けた方がよいと思うからです。


引用返信 編集キー/
■41571 / inTopicNo.11)  Re[10]: 最大化フォームから新規フォームの呼び出しについて
□投稿者/ プリ太 (69回)-(2009/09/24(Thu) 17:09:42)
渋木宏明(ひどり) さん ありがとうございます。

>>これで聞かれていることへの答えになっていますでしょうか?
>
> なってません。
>
> FormEdit 型の子フォームでなく、新規に作成した単なるフォーム(Form1 とか)を、MDI 親フォームの Load イベントで生成・表示した場合どうなりますか?とお尋ねしています。
>
> FormEdit が原因なのか、それとも MDI 子フォームの生成・表示に至る手順そのものに問題があるのか切り分けた方がよいと思うからです。

すみません、やっと理解できました。
確かにそうですね。
切り分けのため、いろいろ試したところ原因のようなところが見えかけてきました。
以下が行った内容です。

プロジェクトに新規WindowsフォームFormSampleを追加しました。
これをMDI親フォームのLoadイベントから呼び出すFunction_Newで表示するようにしました。
インスタンス生成・表示は以下です。
FormSample nSampleWin = new FormSample();
nSampleWin.MdiParent = this;
nSampleWin.Show();
FormEditのインスタンス作成・表示の部分をFormSampleに入れ替えただけなのですが、これだけだと何も問題はありませんでした。

その後、FormSampleのLoadイベントに
this.WindowState = FormWindowState.Maximized;
を記述し、実行したところ同じエラーが発生しました。

この際、と思いFormSampleのインスタンス生成・表示をMDI親フォームのLoadイベントに直接記述したところ、
エラーは発生しませんでした。
#FormSampleのLoadイベントにサイズの最大指定は記述したままです。
そこで、お試しでMDIのLoadイベントでFormEditのインスタンス生成・表示を直接記述したところ、エラーは発生しませんでした。
どうも、インスタンスの生成・表示をFunction_Newで行うとエラーになるらしいことが判明したので、
Function_Newをいろいろ試したところ、以下の行をコメントにするとエラーが発生しなくなりました。
menuStrip.MdiWindowListItem = ToolStripMenu_Window;
この行では、作成した子フォームのリストをメニューバーに追加しています。
なぜここをコメントにすると上手くいくのか、今から調べたいと思います。
引用返信 編集キー/
■41576 / inTopicNo.12)  Re[11]: 最大化フォームから新規フォームの呼び出しについて
□投稿者/ プリ太 (70回)-(2009/09/24(Thu) 19:46:36)
プリ太 です。

さきほど検討を付けた
> menuStrip.MdiWindowListItem = ToolStripMenu_Window;
についてですが、
調べ直したところ、この記述は1度で良いことが解りました。
また、MDIフォームのプロパティで設定できることが解りましたので、そちらで設定し、
コード上の記述を全部コメントにしたところ、エラーは発生しなくなりました。
#プロパティで設定できることを、今回調べるまで知りませんでした。
MDIのLoadイベントで設定する際に上手く設定できない状態で、再度設定しようとして落ちていたようです。

いろいろ確認でき、勉強になりました。
アドバイスを頂いた方々、ありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -