- PR -

ShowDialogでハングする。

投稿者投稿内容
COPECHAN
会議室デビュー日: 2006/06/21
投稿数: 12
投稿日時: 2006-06-21 19:34
いろいろと不手際で申し訳ございません。
守秘義務の関係から正確なコードを公開することは出来ません。

---
obj.Label.Text = "XXXXX"; //描画初期値設定
---
上記は、あくまでも例です。

Form1クラスに宣言されているLabelプロパティですので、コンパイルは通ります。
「オブジェクトに宣言されている内部プロパティ」にアクセスするとご理解ください。

----さんぷる----
public class Form1 : Form
{
private Label label1;

public
Label
Label
{
get{

{
// ここでODBC経由のDBアクセスがある。
// ※ここは正常に通過していることは確認済み。
}
GC.Collect();

return label1;
}
set{
label1 = value;
}
}
----
現象で記述忘れがありました。
・Form1_LoadメソッドにBreakを設定してもここまでたどり着きません。


よろしくお願いいたします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-06-21 20:05
引用:

COPECHANさんの書き込み (2006-06-21 18:54) より:

サンプルコードの提示の仕方と言葉足らずで、すみません。
基本的にコンパイルには問題はありません。


では、あの Form は System.Windows.Forms.Form ではなく、
COPECHAN さんの '独自の型' なんでしょうか? (もしくは、ただの例?)
でなければ、絶対コンパイルは通りません。

引用:

・LabelはForm1に宣言してある内部オブジェクトを参照する独自のプロパティです。


Form ではなく、Form1 に存在するメンバなのですよね?

引用:

・ハングするというのは、画面が表示されないということです。


この時、どこで制御が止まっているのか調査して頂けませんか?

引用:

※再現性がないということは、やはり他の要因も関係しているって事なのでしょうか。


それを '切り分け' るためには、新しい Form でミニマム コードを作成するようにしてください。
現状の情報からですと、ハングする要因は一切ありません。

情報外の部分が原因であると考えられますので、それを調査するためにも是非お願いします。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2006-06-21 20:09
引用:
守秘義務の関係から正確なコードを公開することは出来ません。

「正確なコード」は要りません。現象の発生する最小のコードが必要です。

引用:
---
obj.Label.Text = "XXXXX"; //描画初期値設定
---
上記は、あくまでも例です。

この「例」は現象の発生に必要でしょうか。また、十分でしょうか。

引用:
Form1クラスに宣言されているLabelプロパティですので、

だからこそみなさんは「コンパイル通るの?」とおっしゃっています。
Form obj = new Form1();
↑これは
Form1 obj = new Form1();
↑これの間違いですか?

「さんぷる」で実行してみましたが、NullReferenceExceptionでした。
label1のインスタンスをどこで作っているのでしょう。。

引用:
・Form1_LoadメソッドにBreakを設定してもここまでたどり着きません。

「たどり着きません」もなにも、Form1_Loadのソースが提示されていないので、何ともいえません。
Kazuki
ぬし
会議室デビュー日: 2004/10/13
投稿数: 298
投稿日時: 2006-06-21 21:53
これを実行してハングアップするって言ってます?
コード:
class Form1 : Form
{
    private Button b = new Button();
    public Form1()
    {
        this.Controls.Add(b);
        b.Text = "click";
        b.Click += new EventHandler(b_Click);
    }

    void b_Click(object sender, EventArgs e)
    {
        Form2 f2 = new Form2();
        f2.Label.Text = "click";
        f2.ShowDialog(this);
    }

    [STAThread]
    static void Main()
    {
        Application.Run(new Form1());
    }
}
class Form2 : Form
{
    private Label l = new Label();
    public Form2()
    {
        this.Controls.Add(l);
    }
    public Label Label
    {
        get
        {
            return l;
        }
    }
}

COPECHAN
会議室デビュー日: 2006/06/21
投稿数: 12
投稿日時: 2006-06-22 06:44
おはようございます。
ご意見ありがとうございます。
支離滅裂な文章で申し訳なく思っています。

現象の要約:
----
ShowDialog()もしくは、Show()メソッドを呼び出すが、
ダイアログ側でLoadイベントが発生しない(=画面が表示されない)。
----

多少構造は違いますが、基本的にはKazuki様の提示されているソースと同等です。

じゃんぬねっと様の仰るとおり再現性のあるコードを提示したいのですが、
本番のソース以外で現象の再現ができていません。
影響のないと思われる部分を削除して再現性のある部分のコードを抜き出している段階です。
現状作業の納期が押し迫っている関係から再現コードの提示には多少の時間を頂きたく思います。

囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-06-22 07:50
コンストラクタで何かしてるんじゃないですか?
_________________
囚人のジレンマな日々
COPECHAN
会議室デビュー日: 2006/06/21
投稿数: 12
投稿日時: 2006-06-22 08:12
コンストラクタには下記のコードしかありません。
category1からwarehouseCodeは、private string です。

----ここから----
//
// Windows フォーム デザイナ サポートに必要です。
//
InitializeComponent();

category1 = "";
text1 = "";
text2 = "";
text3 = "";
text4 = "";
text5 = "";
----ここまで----

逆にお聞きしたいのですが、何らかのコードを仕込むことによって、
「Loadイベントが発生しない(発生させない)」事が可能なのでしょうか?
そのようなことが可能なのであれば、そこから逆に原因を探ることも可能かもしれません。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-06-22 08:19
引用:

COPECHANさんの書き込み (2006-06-22 08:12) より:

逆にお聞きしたいのですが、何らかのコードを仕込むことによって、
「Loadイベントが発生しない(発生させない)」事が可能なのでしょうか?
そのようなことが可能なのであれば、そこから逆に原因を探ることも可能かもしれません。


TopMost = true の場合は、Load イベントより前に Activated イベントなどが発生します。
そして、そこで無限ループに陥っているコードは、見かけたことはありますが...

とにもかくにも、1 番情報を知ることができる COPECHAN さんが色々検証するしかありません。
ですから、先のレスでも切り分けるためにミニマム コードを作成しましょうと書きました。
再現できるタイミングさえ見つかれば、それで良いのですから。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

スキルアップ/キャリアアップ(JOB@IT)