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

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

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

Re[5]: Application.Runのインデックスエラーについて


(過去ログ 71 を表示中)

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

■41293 / inTopicNo.1)  Application.Runのインデックスエラーについて
  
□投稿者/ プリ太 (59回)-(2009/09/17(Thu) 10:11:22)

分類:[C#] 

プリ太です。

Program.csのApplication.Runについて教えてください。

現在、MDIフォームから子フォームAを呼び出し、Aの一部の情報を元にフォームBを表示しています。
フォームBもMDIの子フォームです。
フォームAには読み込んだファイルのデータを表示しています。
また、Aは編集も可能なので、新規(データは空)で表示もしています。
MDIを起動する際にApplication.Runは通りますが、その後フォームAを開く時はApplication.Runは通りません。
また、ファイルの内容をAに表示した後にフォームBを表示する際も通りません。
ただし、新規でフォームAを表示し、そのAの情報を元にBを呼び出すと、Application.Runを再度通りエラーになります。

フォームBでは、フォームAのデータを元にNplotを使用してグラフを表示しています。
グラフは折れ線グラフで目盛りを自分で設定しているのですが、そのメモリ部分の表示をコメントにすると
新規フォームAの情報を元にフォームBを表示してもApplication.Runを通らずに画面が表示されます。
エラーにもなりません。

エラーになる手順は、アプリ起動後、新規でフォームAを呼び出し、その後フォームBを呼び出した後にApplication.Run(new FormMDI())で「インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。」となります。
#フォームBの目盛り表示の部分のコメントは外しています。
FormMDIの値はnullなのですが、起動しているのになぜnullなのでしょうか?
エラーの原因はNplotのメモリ表示と判明しているのですが、それによってApplication.Runを再度通るのはなぜなのでしょうか?
フォームBはMDIからShow()で表示しています。

説明が分かりにくいと思いますが、何かヒントでも頂けたら、と思います。
環境はVS2005です。
宜しくお願いします。
引用返信 編集キー/
■41300 / inTopicNo.2)  Re[1]: Application.Runのインデックスエラーについて
□投稿者/ 渋木宏明(ひどり) (1202回)-(2009/09/17(Thu) 11:52:55)
渋木宏明(ひどり) さんの Web サイト
> 説明が分かりにくいと思いますが、何かヒントでも頂けたら、と思います。

分かりにくかったです。

少なくとも、アプリケーション実行中に Application.Run() が再度(何回も?)呼び出されるのはおかしいです。

>エラーになる手順は、アプリ起動後、新規でフォームAを呼び出し、その後フォームBを呼び出した後にApplication.Run(new FormMDI())で「インデックスが範囲を超えています

という手順でエラーになるなら、その過程に何か問題があるのかもしれません。

引用返信 編集キー/
■41302 / inTopicNo.3)  Re[1]: Application.Runのインデックスエラーについて
□投稿者/ Azulean (455回)-(2009/09/17(Thu) 12:25:09)
No41293 (プリ太 さん) に返信
> ただし、新規でフォームAを表示し、そのAの情報を元にBを呼び出すと、Application.Runを再度通りエラーになります。
恐らくですが、「Application.Runを通り」ではなく、例外発生時の実行している行が自分で書いたコードではなかったために一番外側のApplication.Runが薄い緑色で表示されていただけではないでしょうか。
勘違いしやすいところですが、現象を的確に捉えて表現しないと迷走することが多いですので気をつけましょう。

なお、どこが悪いかは現時点ではわかりません。発生した例外のStackTraceプロパティの情報が参考になるかどうかだと思います。
引用返信 編集キー/
■41305 / inTopicNo.4)  Re[2]: Application.Runのインデックスエラーについて
□投稿者/ プリ太 (60回)-(2009/09/17(Thu) 14:08:04)
渋木宏明(ひどり) さん、Azulean さん、ありがとうございます。

> 少なくとも、アプリケーション実行中に Application.Run() が再度(何回も?)呼び出されるのはおかしいです。

やはりそうなのですね。


>>ただし、新規でフォームAを表示し、そのAの情報を元にBを呼び出すと、Application.Runを再度通りエラーになります。
> 恐らくですが、「Application.Runを通り」ではなく、例外発生時の実行している行が自分で書いたコードではなかったために一番外側のApplication.Runが薄い緑色で表示されていただけではないでしょうか。
> 勘違いしやすいところですが、現象を的確に捉えて表現しないと迷走することが多いですので気をつけましょう。
>
> なお、どこが悪いかは現時点ではわかりません。発生した例外のStackTraceプロパティの情報が参考になるかどうかだと思います。

StackTraceの値は以下でした。

System.ArgumentOutOfRangeException はハンドルされませんでした。
Message="インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。\r\nパラメータ名: index"
Source="mscorlib"
ParamName="index"
StackTrace:
場所 System.Collections.ArrayList.get_Item(Int32 index)
場所 NPlot.LabelAxis.DrawTicks(Graphics g, Point physicalMin, Point physicalMax, Object& labelOffset, Object& boundingBox)
場所 NPlot.Axis.Draw(Graphics g, Point physicalMin, Point physicalMax, Rectangle& boundingBox)
場所 NPlot.PhysicalAxis.Draw(Graphics g, Rectangle& boundingBox)
場所 NPlot.PhysicalAxis.GetBoundingBox()
場所 NPlot.PlotSurface2D.DeterminePhysicalAxesToDraw(Rectangle bounds, Axis xAxis1, Axis xAxis2, Axis yAxis1, Axis yAxis2, PhysicalAxis& pXAxis1, PhysicalAxis& pXAxis2, PhysicalAxis& pYAxis1, PhysicalAxis& pYAxis2)
場所 NPlot.PlotSurface2D.Draw(Graphics g, Rectangle bounds)
場所 NPlot.Windows.PlotSurface2D.Draw(Graphics g, Rectangle bounds)
場所 NPlot.Windows.PlotSurface2D.DoPaint(PaintEventArgs pe, Int32 width, Int32 height)
場所 NPlot.Windows.PlotSurface2D.OnPaint(PaintEventArgs pe)
場所 System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
場所 System.Windows.Forms.Control.WmPaint(Message& m)
場所 System.Windows.Forms.Control.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.DispatchMessageA(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()

Nplotで目盛りを表示する処理が終了した後にエラーになっているようです。
この辺を調べてみます。
引用返信 編集キー/
■41342 / inTopicNo.5)  Re[3]: Application.Runのインデックスエラーについて
□投稿者/ Jitta on the way (438回)-(2009/09/18(Fri) 07:49:49)
No41305 (プリ太 さん) に返信
> StackTraceの値は以下でした。
>
> System.ArgumentOutOfRangeException はハンドルされませんでした。
> Message="インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。\r\nパラメータ名: index"
> Source="mscorlib"
> ParamName="index"
> StackTrace:
> 場所 System.Collections.ArrayList.get_Item(Int32 index)
> 場所 NPlot.LabelAxis.DrawTicks(Graphics g, Point physicalMin, Point physicalMax, Object& labelOffset, Object& boundingBox)
> 場所 NPlot.Axis.Draw(Graphics g, Point physicalMin, Point physicalMax, Rectangle& boundingBox)
> 場所 NPlot.PhysicalAxis.Draw(Graphics g, Rectangle& boundingBox)


目盛りを描くところで発生しています。目盛りは、数と、それぞれの値を別個に指定するのかな?
引用返信 編集キー/
■41359 / inTopicNo.6)  Re[4]: Application.Runのインデックスエラーについて
□投稿者/ プリ太 (61回)-(2009/09/18(Fri) 13:36:37)
Jitta on the way さん、ありがとうございます。

>>StackTraceの値は以下でした。
>>
>>System.ArgumentOutOfRangeException はハンドルされませんでした。
>> Message="インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。\r\nパラメータ名: index"
>> Source="mscorlib"
>> ParamName="index"
>> StackTrace:
>> 場所 System.Collections.ArrayList.get_Item(Int32 index)
>> 場所 NPlot.LabelAxis.DrawTicks(Graphics g, Point physicalMin, Point physicalMax, Object& labelOffset, Object& boundingBox)
>> 場所 NPlot.Axis.Draw(Graphics g, Point physicalMin, Point physicalMax, Rectangle& boundingBox)
>> 場所 NPlot.PhysicalAxis.Draw(Graphics g, Rectangle& boundingBox)
>
>
> 目盛りを描くところで発生しています。目盛りは、数と、それぞれの値を別個に指定するのかな?

目盛りは
lbAxis.AddLabel("0", 0.0f);
で指定しています。
何個か表示するので、位置と表示したい値を配列にいれて、forで回しています。

現段階まででは、目盛りを書かない場合と、メモリを0地点にのみ各場合が落ちることがわかりました。
#なぜか、0地点以外にもメモリを表示すると落ちませんが、0地点には目盛りが表示されません・・・
もっと調べてみます。
ありがとうございます。
引用返信 編集キー/
■41373 / inTopicNo.7)  Re[5]: Application.Runのインデックスエラーについて
□投稿者/ プリ太 (63回)-(2009/09/18(Fri) 16:16:58)
プリ太です。

> 現段階まででは、目盛りを書かない場合と、目盛りを0地点にのみ各場合が落ちることがわかりました。

目盛りを0地点に記述しても表示されないことが解りました。
そのため、表示されなかったので、落ちてたようです。
0地点に目盛りを表示できないのは仕様だったようです。

そこで位置を少しずらしてやることで一応回避ができました。
そのためいったん解決とさせていただきます。

後々時間ができたらもっとじっくり調べてみます。
アドバイスありがとうございました。

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


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

このトピックに書きこむ

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

管理者用

- Child Tree -