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

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

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

Re[4]: 最大化したのちにsplitterが動かされる


(過去ログ 48 を表示中)

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

■25998 / inTopicNo.1)  最大化したのちにsplitterが動かされる
  
□投稿者/ ヤモリ (1回)-(2008/09/30(Tue) 05:01:29)

分類:[C#] 

こんにちは、何度かお邪魔してます。ヤモリです。

C#VS2008SP1です

コンストラクタで最大化したのちSplitContainerのSplitterDistanceを変更しました。以下にソースを示します。
デザイナは、プロジェクト新規作成でフォームアプリケーションを作成した直後にsplitContainerを突っ込んでイベントハンドラを追加しただけです。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication3
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

WindowState = FormWindowState.Maximized;//a
splitContainer1.SplitterDistance = 100;//b
}//c

private void splitContainer1_SplitterMoved(object sender, SplitterEventArgs e)
{
int a = 3;

a = a * 3;//d
}
}
}

ブレークポイントで追うとabdcdとなってしまいます。

aをコメントアウトした場合、bdc。
aもbもコメントアウトすると、cとなります。

思うに、aで最大化されたときに自動調整によりsplitterの位置が変更されるべきなのに、その処理がコンストラクタをでてからになっているようです。

僕としては、splitContainer1_SplitterMoved内でそのイベントが初期化(最初のab)によって生じたものかどうか区別するかそのイベントが生じないようにする必要があります。
対策としては、
@最大化されたときの自動調整を無くす(そもそも上の仮定が正しいかどうかも分かりませんが)
Aイベントが発生したときがユーザーの操作ではありえない(つまり最初の最大化)ときだと知る
B問答無用で2回目までのイベント発生時を初期化の時だとする

Bでない方法があればご教授ください。

引用返信 編集キー/
■25999 / inTopicNo.2)  Re[1]: 最大化したのちにsplitterが動かされる
□投稿者/ ヤモリ (2回)-(2008/09/30(Tue) 05:09:16)
ヤモリ さんの Web サイト
Aで解決できました。
2回目のdのあとにForm1_Loadされるのでそこまでのは初期化と判断しました。
解決済み
引用返信 編集キー/
■26000 / inTopicNo.3)  Re[2]: 最大化したのちにsplitterが動かされる
□投稿者/ れい (806回)-(2008/09/30(Tue) 07:08:19)
No25999 (ヤモリ さん) に返信
> Aで解決できました。
> 2回目のdのあとにForm1_Loadされるのでそこまでのは初期化と判断しました。

解決できたならいいですが。

コンストラクタ
Form.Load
Form.Shown

3者の違い、特に呼ばれる順番やサイズやレイアウトとの関連は
きっちり抑えておくと、初期化がずいぶん綺麗にできます。
無理に違うイベントで処理しようと思うといろいろ大変なことになります。
解決済み
引用返信 編集キー/
■26013 / inTopicNo.4)  Re[3]: 最大化したのちにsplitterが動かされる
□投稿者/ ヤモリ (6回)-(2008/09/30(Tue) 15:00:58)
ヤモリ さんの Web サイト

> コンストラクタ
> Form.Load
> Form.Shown
>
> 3者の違い、特に呼ばれる順番やサイズやレイアウトとの関連は
> きっちり抑えておくと、初期化がずいぶん綺麗にできます。
> 無理に違うイベントで処理しようと思うといろいろ大変なことになります。

コンストラクタはオブジェクト生成時だから最初だということは知ってます。
でも、InitializeComponentで何をしているかはよく分かりません。
Loadっていうのは読み込まれた瞬間って書いてありますが、詳しいことはよく分かりません。
Shownは表示された直後に呼ばれるのだと思います。
現時点では初期化は全てコンストラクタのInitializeComponent後に行っています(他のアプリケーションでも)。
今回Loadで行ったのはフラグを切り替える作業のみなので、コンストラクタの処理が全てですね。
引用返信 編集キー/
■26015 / inTopicNo.5)  Re[4]: 最大化したのちにsplitterが動かされる
□投稿者/ ヤモリ (7回)-(2008/09/30(Tue) 15:02:22)
ヤモリ さんの Web サイト
解決済みチェック忘れていました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -