不可解な不具合
ごきげんよう、皆様。
技術担当の大林です。
先日、C#でUIを作成していた所、とても不可解な不具合が発生したので、ちょっと書き残しておこうと思います。
ごくごく普通にVS2017のデザイナでフォームを作成していて、デザイナの自動生成のコードを作成したのですが、どうもこのウインドウだけが他のウインドウと違って変なサイズで出るという不具合が発生しました。
下記の通りログを挟み、通常だと自動生成で書かれた通り、800×450のサイズでログが出力される事もきっちり意図したサイズで表示される事も、自分のPC上で確認しました。
しかし、実際に不具合の報告があった端末で同じプログラムを実行すると、何故か変なサイズで出てきます。
OSは両方Win10、モニターの解像度も両方フルHDで1920×1080で同じで、他のコントロール等も似たような作りでやっているのに、何故かちゃんと出るコントロールばかりの中、たまに何十箇所に1箇所程度の割合で、必ずサイズが変わって出るコントロールが出てきています。
1 2 3 4 5 6 7 8 | public partial class Form1 : Form { public Form1() { InitializeComponent(); Console.WriteLine(string.Format("W = {0},H = {1}",this.Size.Width,this.Size.Height)); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | private void InitializeComponent() { this.label1 = new System.Windows.Forms.Label(); this.pictureBox1 = new System.Windows.Forms.PictureBox(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); this.SuspendLayout(); // // label // this.label1.AutoSize = true; this.label1.Location = new System.Drawing.Point(175, 14); this.label1.Name = "lblFileName"; this.label1.Size = new System.Drawing.Size(54, 12); this.label1.TabIndex = 0; this.label1.Text = "label1"; // // pictureBox1 // this.pictureBox1.Location = new System.Drawing.Point(188, 59); this.pictureBox1.Name = "pictureBox1"; this.pictureBox1.Size = new System.Drawing.Size(483, 333); this.pictureBox1.TabIndex = 4; this.pictureBox1.TabStop = false; // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(800, 450); this.Controls.Add(this.pictureBox1); this.Controls.Add(this.label1); this.Name = "Form1"; this.Text = "Form1"; ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); } |
こちらの不具合が発生していたPC、以前から様々な問題が起きており、検証を進める中で何故かこのPCでだけInitializeComponent内のResumeLayout(false)のタイミングで色んなイベントが走るような動きをしていて、その後のInitializeComponent抜けた直後のログにも「W = 800,H = 450」ではなく、「W = 800,H = 480」のように勝手にサイズが変わってしまうような現象が発生していた事が判明しました。
ResumeLayoutの引数がtrueなら即座に再描画が走るという仕様なので分からないでもないですが、与えている引数は何度確認してもfalseです。
しかも、コンストラクタ中でまだどのコントロールのControlsにAddしたりしてなくてもLoadやPaint等、様々な動かない筈のイベントがどんどん走って、その後コンストラクタが実行されるような動き方をします。
正直、訳が分からないですが、変に描画関係のフラグか描画領域か何かを踏んでしまった扱いになってるのかもしれませんので、百歩譲って分からないでもない動きです。
ただ、今回輪をかけて不可解なのは、少なくとも自分で書いたコード上ではサイズを弄るような項目は何一つ変更していないという点です。
イベントがどんな順番で走ったとしても、Locationを親のフォームから一度だけ変更する機会があるだけで、サイズを弄るようなコードはInitializeComponentの自動生成で作成された箇所しか入っていません。
正直、サイズが勝手に変わるような要素は無い筈なのですが、何故か決まってサイズが縦に少しだけ伸びるという現象が発生します。
非常に不可解です。
とりあえずこの件に関しては、応急処置としてInitializeComponent内で行われたサイズ設定をコピーして、IntializeComponent後に再度行うようにしたら、案の定不具合の方は解消したので、一旦はそれで乗り切れたのですが、何というかどう動いたらこうなるのかまるで検討がつかないような現象だったので、凄くモヤッとする感じです。
どなたかご存知の方とかいらっしゃったら、教えてもらえると非常に助かります。
では!
見ていただき、ありがとうございました!