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

わんくま同盟

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

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

ツリー一括表示

ほんの稀に例外エラーがでる /みー (17/10/07(Sat) 19:15) #85322
Re[1]: ほんの稀に例外エラーがでる /Azulean (17/10/07(Sat) 19:32) #85323
  └ Re[2]: ほんの稀に例外エラーがでる /??[ (17/10/07(Sat) 19:50) #85324 解決済み
    └ Re[3]: ほんの稀に例外エラーがでる /??[ (17/10/07(Sat) 22:34) #85326
      └ Re[4]: ほんの稀に例外エラーがでる /??[ (17/10/09(Mon) 11:36) #85332 解決済み


親記事 / ▼[ 85323 ]
■85322 / 親階層)  ほんの稀に例外エラーがでる
□投稿者/ みー (1回)-(2017/10/07(Sat) 19:15:33)

分類:[C#] 

2017/10/07(Sat) 19:28:12 編集(投稿者)

お世話になります。

開発環境
EPSON エンデバー AY320S
Celeron G530
メモリ 4GB
グラボはなしで、1920x1080、1440x900のディスプレイを接続(ディスプレイにどれだけメモリを消費しているか不明、何bitカラーとかいうのがでてこない)
大概youtubeを聞きながら作業しているので、メモリ使用量は60〜80%くらい、CPU使用率も50%〜90%くらい

Windows 10 Pro 64bit
ver 1703
OSビルド 15063.608

Visual Studio Community 2017を1ヶ月くらい前にインストールした初心者です。
現在C#でカレンダーを作成しています。
徐々に機能を増やしているのですが、稀に例外でストップして起動しないのです。
今回もエラーの状況をスクショしようと20回くらい起動しましたが、出ませんでした。

カレンダーの外観、例外が発生するところは
http://ty21ky.web.fc2.com/C_Sharp/error.html
全画面で壁紙のように使用しています。
カレンダーの文字はすべてLabelを使用しています。

例外が発生するところは,全画面の時のFormの幅を取得している601行で、ActiveForm.getがnull・・・あとは忘れたのですが。取得に失敗している??
全画面の幅を取得して7で割って日付のLabelの幅に代入しています。

いくら考えてもエラーがでる所じゃないような気がして。

よろしくお願いいたします。
[ □ Tree ] 返信 編集キー/

▲[ 85322 ] / ▼[ 85324 ]
■85323 / 1階層)  Re[1]: ほんの稀に例外エラーがでる
□投稿者/ Azulean (874回)-(2017/10/07(Sat) 19:32:18)
2017/10/07(Sat) 19:52:59 編集(投稿者)
No85322 (みー さん) に返信
> 例外が発生するところは,全画面の時のFormの幅を取得している601行で、
> ActiveForm.getがnull・・・あとは忘れたのですが。取得に失敗している??
> 全画面の幅を取得して7で割って日付のLabelの幅に代入しています。

ActiveForm はそのアプリケーションのアクティブになっているフォームが帰ってくるプロパティですが、
ほかのアプリケーションがアクティブになっているなど、状況によっては null を返します。
ActiveForm が null を返してもうまく動くようにコードを書く必要があります。

基本的には ActiveForm に依存する(ActiveForm を使う)ことは避けるべきです。
今後のアプリケーションの拡張(たとえば、設定画面を追加するなど)を妨げることになるため。
(設定画面を表示中など、LabelSizeChanged が予期せぬタイミングで呼び出される可能性がある)


このコードが Form2 自身にある場合は、this を書くか、省略してそのまま
自分自身の Width, Height プロパティを参照すればいい話です。

int width7 = Width / 7;

計算している箇所が Form2 自身ではなく、ユーザコントロールならば、
ParentForm を参照したら良いでしょう。

int width7 = ParentForm.Width / 7;

計算している箇所が Form2 自身ではなく、自前のクラスなら、
Form2 をあらかじめコンストラクタか何かで渡すようにしておいたら良い話です。

private readonly Form _form;
public DesktopCalendar(Form parentForm)
{
  _form = parentForm;
}

private void LabelSizeChanged()
{
  int width7 = _form.Width / 7;
  // 以下略
}

[ 親 85322 / □ Tree ] 返信 編集キー/

▲[ 85323 ] / ▼[ 85326 ]
■85324 / 2階層)  Re[2]: ほんの稀に例外エラーがでる
□投稿者/ ??[ (1回)-(2017/10/07(Sat) 19:50:22)
No85323 (Azulean さん) に返信
> 2017/10/07(Sat) 19:44:38 編集(投稿者)

ありがとうございます。
教えて頂いたように頑張ってみます。

>
> ■No85322 (みー さん) に返信
>>例外が発生するところは,全画面の時のFormの幅を取得している601行で、
>>ActiveForm.getがnull・・・あとは忘れたのですが。取得に失敗している??
>>全画面の幅を取得して7で割って日付のLabelの幅に代入しています。
>
> ActiveForm はそのアプリケーションのアクティブになっているフォームが帰ってくるプロパティですが、
> ほかのアプリケーションがアクティブになっているなど、状況によっては null を返します。
> ActiveForm が null を返してもうまく動くようにコードを書く必要があります。
>
> 基本的には ActiveForm に依存する(ActiveForm を使う)ことは避けるべきです。
> 今後のアプリケーションの拡張(たとえば、設定画面を追加するなど)を妨げることになるため。
> このコードが Form2 自身にある場合は、this を書くか、省略してそのまま
> 自分自身の Width, Height プロパティを参照すればいい話です。
>
> int width7 = Width / 7;
>
> 計算している箇所が Form2 自身ではなく、ユーザコントロールならば、
> ParentForm を参照したら良いでしょう。
>
> int width7 = ParentForm.Width / 7;
>
> 計算している箇所が Form2 自身ではなく、自前のクラスなら、
> Form2 をあらかじめコンストラクタか何かで渡すようにしておいたら良い話です。
>
> private readonly Form _form;
> public DesktopCalendar(Form parentForm)
> {
> _form = parentForm;
> }
>
> private void LabelSizeChanged()
> {
> int width7 = _form.Width / 7;
> // 以下略
> }
解決済み
[ 親 85322 / □ Tree ] 返信 編集キー/

▲[ 85324 ] / ▼[ 85332 ]
■85326 / 3階層)  Re[3]: ほんの稀に例外エラーがでる
□投稿者/ ??[ (2回)-(2017/10/07(Sat) 22:34:20)
No85324 (??[ さん) に返信
> ■No85323 (Azulean さん) に返信
>>2017/10/07(Sat) 19:44:38 編集(投稿者)
>
> ありがとうございます。
> 教えて頂いたように頑張ってみます。

Widthだけで良かったんですね。
最初は自分なりに考えて、うまくいかず解説本・ネットで探して最終的にActiveFormで動いたんで喜んでいたんですが。
先が長いですね。
本当にありがとうございました。

> int width7 = Width / 7;
[ 親 85322 / □ Tree ] 返信 編集キー/

▲[ 85326 ] / 返信無し
■85332 / 4階層)  Re[4]: ほんの稀に例外エラーがでる
□投稿者/ ??[ (3回)-(2017/10/09(Mon) 11:36:59)
No85326 (??[ さん) に返信
> ■No85324 (??[ さん) に返信
>>■No85323 (Azulean さん) に返信
> >>2017/10/07(Sat) 19:44:38 編集(投稿者)
>>
>>ありがとうございます。
>>教えて頂いたように頑張ってみます。
>
> Widthだけで良かったんですね。
> 最初は自分なりに考えて、うまくいかず解説本・ネットで探して最終的にActiveFormで動いたんで喜んでいたんですが。
> 先が長いですね。
> 本当にありがとうございました。
>
>>int width7 = Width / 7;
解決済み
[ 親 85322 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -