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

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

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

Re[2]: スタートアップ時にフォームが指定された位置に表示されない


(過去ログ 125 を表示中)

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

■74251 / inTopicNo.1)  スタートアップ時にフォームが指定された位置に表示されない
  
□投稿者/ pod (25回)-(2014/12/11(Thu) 10:29:44)

分類:[C#] 

2014/12/11(Thu) 10:31:38 編集(投稿者)
2014/12/11(Thu) 10:31:34 編集(投稿者)

C# 2013 でアプリケーション終了時にフォームの位置や状態などをXMLに保存し、
次回起動時に復元するようにしました。

フォームには FormStartPosition.Manual を設定し、XMLに書かれた座標に従って
Left と Top を指定する一般的な方法をとり基本的には正しく動作しているのですが、
スタートアップに登録してWindows起動時に実行するようにすると何回かに一回だけ
指定した位置ではなく初期位置に表示されてしまうことがあります。

XMLの項目は正しく読み込まれており、位置以外は正しく動作していてエラーが出ている様子もありません。
問題発生時のXMLを使ってもう一度実行し直すと正しい位置に表示されます。

フォームは複数あり、メインとなる非表示フォームのコンストラクタでXMLを読み込み、
子フォームをインスタンス化した後でLeftとTopを設定しています。

再現性が低く、1割以下の確率でしか発生しないので調査が難しく困っています。
同様の症状の解決策や、問題の原因を特定する方法等ありましたら教えて下さい。
よろしくお願いします。

使用しているOSは Windows 7(64bit) です。
引用返信 編集キー/
■74252 / inTopicNo.2)  Re[1]: スタートアップ時にフォームが指定された位置に表示されない
□投稿者/ shu (643回)-(2014/12/11(Thu) 10:48:16)
No74251 (pod さん) に返信
> フォームは複数あり、メインとなる非表示フォームのコンストラクタでXMLを読み込み、
> 子フォームをインスタンス化した後でLeftとTopを設定しています。
>
Load以降で設定するとうまくいくかもしれません。
引用返信 編集キー/
■74253 / inTopicNo.3)  Re[1]: スタートアップ時にフォームが指定された位置に表示されない
□投稿者/ 魔界の仮面弁士 (194回)-(2014/12/11(Thu) 11:00:52)
No74251 (pod さん) に返信
> 再現性が低く、1割以下の確率でしか発生しないので調査が難しく困っています。

そもそも設定が行われていないのか、設定が無視されているのか、
あるいは、設定した後で別の値で上書きされてしまっているのか、
呼び出し元を特定する必要がありそうですね。


たとえばこんなコードを仕込んでおくなどして、現象発生時の
呼び出し元を追跡してみては如何でしょうか。
(再現性が低いのであれば、画面に表示するのではなくログとして残すようにするとか)


private void Form1_Resize(object sender, EventArgs e)
{
    var sb = new StringBuilder(DateTime.Now.ToLongTimeString());
    sb.AppendLine(this.Bounds.ToString());
    sb.AppendLine("Resize on " + this.GetType().Name);
    sb.AppendLine(new StackTrace(true).ToString());

    var li = listBox1.Items.Count - 1;
    listBox1.Items.AddRange(
        sb.ToString().Split(new string[] { "\r\n" }, StringSplitOptions.None));
    listBox1.TopIndex = li;
}

private void Form1_LocationChanged(object sender, EventArgs e)
{
    var sb = new StringBuilder(DateTime.Now.ToLongTimeString());
    sb.AppendLine(this.Bounds.ToString());
    sb.AppendLine("LocationChanged on " + this.GetType().Name);
    sb.AppendLine(new StackTrace(true).ToString());

    var li = listBox1.Items.Count - 1;
    listBox1.Items.AddRange(
        sb.ToString().Split(new string[] { "\r\n" }, StringSplitOptions.None));
    listBox1.TopIndex = li;
}

引用返信 編集キー/
■74260 / inTopicNo.4)  Re[2]: スタートアップ時にフォームが指定された位置に表示されない
□投稿者/ pod (26回)-(2014/12/11(Thu) 16:15:07)
お二方とも回答有難うございます。

No74252 (shu さん) に返信
> Load以降で設定するとうまくいくかもしれません。

メインフォームを非表示にするためにエントリポイントが次のようになっていて
ロードイベントが発生しない状態となっています。

new Form1();
Application.EnableVisualStyles();
Application.Run();

もしかしたらこの方法も問題の遠因なのかもしれません。


No74253 (魔界の仮面弁士 さん) に返信

> そもそも設定が行われていないのか、設定が無視されているのか、
> あるいは、設定した後で別の値で上書きされてしまっているのか、
> 呼び出し元を特定する必要がありそうですね。

正常な起動時には上書き動作をしているログはなさそうでしたが
異常発生時にどうなっているかはまだ確認できていません。

異常発生時であっても小フォームのラベルなどはXMLの記述通りに
書き換わっていたので位置指定だけが何らかの原因で無視されているような印象です。

ひとまずアドバイスにあった LocationChanged でログを取る方法を試して
以上が発生するまで様子を見てみようと思います。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -