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

わんくま同盟

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

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


■85323 / )  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;
  // 以下略
}

返信 編集キー/


管理者用

- Child Tree -