- PR -

Formの継承とレイアウトのずれについて

1
投稿者投稿内容
masak
会議室デビュー日: 2002/12/26
投稿数: 6
投稿日時: 2002-12-27 11:17
現在、VS.Net C# にて Windowsアプリケーションを作成しております。

フォームのレイアウトの統一化、工数削減のために
レイアウトの元になる基本フォームを作成し、
個々のフォームはこの基本フォームを継承し作成しています。

とても基本的な使い方だと思うのですが、
ここでおかしな現象に遭遇しております。

基本フォームを継承したフォームを作りつつ、
・フォームのサイズを変更
・メニューバーから「デバッグ」→「開始」
を繰り返すと継承元に配置してあったコントロール
(ボタンなど)の配置位置がどんどんずれていく。

というものです。

このずれは、微妙にずれるといったものでなく
ひとめでわかるようなもので、
とても許容できる範囲のものではありません。


継承元フォームに配置してあるコントロールの
Dockプロパティや Anchorプロパティが関係しているような
気がしているのですが...


私の環境では、以下の方法で必ず再現します。
VS.Net で

1)継承元の基本フォーム(以降 BaseForm)に
System.Windows.Forms.Panel を配置 (以降 panel1)
panel1 の Dockプロパティを Top に設定
panel1 に重なるように System.Windows.Forms.Button を右上あたりに配置(以降 button1)
button1 の Anchor を (Top, Right) に設定
→ 保存&ビルド

2)BaseForm を継承して Form1 を作成


この状態で
A)Form1のサイズ(特に横幅)を変更
B)「デバッグ」→「開始」

A,Bを繰り返すとbutton1 がどんどんずれていきます。

考えられる情報源はチェックしたつもりなのですが、
この件に関する情報が入手できずに困っております。

使い方が間違っているのか、仕様なのか、バグなのか、
はたまた私の環境の問題なのか...

何かこの件についての情報をお持ちの方おられましたら
よろしくお願いいたします。

masak
会議室デビュー日: 2002/12/26
投稿数: 6
投稿日時: 2002-12-27 12:27
追記です。

再現方法を完全に把握したわけではないのですが...

再現しない場合は、
BaseForm に配置した button1の Modifiersプロパティを
Protected に設定すると再現しやすいようです。

masak
会議室デビュー日: 2002/12/26
投稿数: 6
投稿日時: 2003-01-07 10:17
Form の継承は割と基本的な機能だと思うのですが、なかなかコメントつきませんね

「私のところではおきません」とか
「Modififiers を Protected にした場合は当然です!」
などの情報でも助かります。

個人的には VS.Netのバグかなと思うのですが、
そうだとしたら、Formの継承が使えないオブジェクト(コンポーネント)指向っていったい...

バグではなく使い方の間違いでありますように。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2003-01-07 10:49
現象を確認しました。

条件は以下のようです。
●ボタンのModifiersプロパティをProtected(publicでも良い。子フォームから操作できる指定なら良いということかも)
●前回の実行後、子フォームのサイズを変更した。

ずれの大きさ=子フォームの横幅−親フォームの横幅
のようです。どれだけ大きさを変えたかではなく、フォームの大きさが親からどれだけずれているかがズレの大きさを決めているようです。

子フォームのボタンのLocationをプロパティウィンドウで見てみると、実行前と実行後で値が変わっています。
いくら実行時に値を変えても、デザイン時の値が変わるというのはおかしいので、バグだと思います。

以下は私の勝手な想像です。

ボタンの座標を変えているものは2つあります。
プロパティウィンドウでの設定(Locationプロパティ)と、フォームの大きさを変えた場合のAnchorによる変更です。
で、子フォームの大きさが親と異なっている場合、プロパティウィンドウの値を見れば分かると思いますがボタンのLocationの値も変わっています。そこで実行をすると、
「ウィンドウの大きさが変わっているのだから、Anchorによってボタンの座標も変えなければ」
と考えるはず。「変わっている」というのは、親フォームとして見れば実行時にサイズが違う(子フォームのサイズに変えられた)ように見えるということです。
そして、ボタンの座標を(Locationで正しい位置に設定されているのに)さらにずらしてしまうということではないでしょうか。


[ メッセージ編集済み 編集者: 一郎 編集日時 2003-01-07 13:40 ]
masak
会議室デビュー日: 2002/12/26
投稿数: 6
投稿日時: 2003-01-08 10:58
一郎さん、コメントありがとうございます。

やはり、起こりますか...
おっしゃるとおり Location の値が変わってしまいますね。

実は、この件についての情報をネット上で検索しても
まったく見つからないのでちょっと不思議に思っていたんです。
(日本語のサイトのみですが)

私の頭のなかでは、

1)フォームの継承は、とても基本的な機能なので多く使われているだろう
2)フォームの継承を使えば、ほとんどのケースでこのトラブルに巻き込まれるだろう
3)なので、この件についての情報は比較的簡単に入手できそうだ
4)が、全然見つからないし、MSのサイトにもない (T_T)
5)なので、私の環境だけかもしれない。

と、なっていましたので一郎さんのコメントは大変ありがたいです。

MSDNのインシデントが残っていますのでMSに問い合わせてみます。


*それにしても私が思っているより、フォーム継承って使われていないのかな。
二天
ベテラン
会議室デビュー日: 2001/09/26
投稿数: 60
投稿日時: 2003-01-08 11:44
> *それにしても私が思っているより、フォーム継承って使われていないのかな。

独自に継承はしていませんが、FormにPanelクラスを貼り付けて使用したところ、一部ユーザーから「Panelの横幅が異常に大きくなり、右横にあるボタンを隠してしまった」という不具合報告を受けて呆れたことがあります。
結局、この不具合の原因がわからずにいますが、気になるのは一部ユーザーだけで発生しており、Windowsのスタートアップから起動すると再発するということです。しかも、他のユーザーが同じようにしても発生しないのでさらに気になります。

それと、レイアウトとは少し違いますが、UserControlを継承した抽象クラスを作成し、そのクラスを継承させて使用しようとしたらデザイン時に「抽象クラスは使えない」とかエラーになった覚えがあるのですが、抽象クラス化というのも頻繁に使うので何とかして欲しい部分ではありますね。
masak
会議室デビュー日: 2002/12/26
投稿数: 6
投稿日時: 2003-01-09 15:30
>一部ユーザーから「Panelの横幅が異常に大きくなり、右横にあるボタンを隠してしまった」
>という不具合報告を受けて呆れたことがあります。


>それと、レイアウトとは少し違いますが、UserControlを継承した抽象クラスを作成し、
>そのクラスを継承させて使用しようとしたらデザイン時に「抽象クラスは使えない」
>とかエラーになった覚えがあるのですが、抽象クラス化というのも頻繁に使うので
>何とかして欲しい部分ではありますね。
も、どちらも開発ツールとしてはとても基本的な部分だと思います。
この辺の完成度が低いようだと、他にどんな不具合が隠されているかわかりませんね。

もっと十分なテストを経てリリースして欲しいものです。

次の開発案件は、VS.Net C# で開発するつもりでしたが、
今回は見合わせようかどうか検討中です。

C# 自体は大変いい言語だけにとても残念です。

二天
ベテラン
会議室デビュー日: 2001/09/26
投稿数: 60
投稿日時: 2003-01-09 15:57
> どちらも開発ツールとしてはとても基本的な部分だと思います。
> この辺の完成度が低いようだと、他にどんな不具合が隠されているかわかりませんね。
>
> もっと十分なテストを経てリリースして欲しいものです。

横幅が異常に大きくなったというのは、開発環境と言うよりも、実行環境の不具合でしょうね。どちらにしても、困りものですが。
抽象クラスの方は、Javaの方では問題なくできていたので、ある意味呆れました。

なお、デザイナでフォームの読み込みエラーになった時(赤丸のバツ印が表示される)に保存をしてしまうと、そのフォームの設定がすべて無効になるという潜在的な問題がありますので、注意して下さい。


> 次の開発案件は、VS.Net C# で開発するつもりでしたが、
> 今回は見合わせようかどうか検討中です。
>
> C# 自体は大変いい言語だけにとても残念です。

C#というよりも、.NETの実行環境の問題はいくつか見つけましたが、今後のためにも.NETで開発をした方が良いかも知れませんよ。

IT Proサイトに「.NETに乗り遅れるな」という記事(要会員登録)がありましたので、読んでみるとおもしろいかも知れません。
http://itpro.nikkeibp.co.jp/members/NC/ITARTICLE/20021226/4/
ただし、この記事の著者は.NET Frameworkを「マイクロソフトが策定したWebアプリケーションの開発・実行環境のことだ。」と言い切っているので、Webアプリケーションのことしか書いてありませんが。
# なぜ、.NETをWebアプリだけしか開発できないと環境と勘違いをしたのかを聞いてみたいものですね。
1

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