Visual Studio 2005でC#のWindowsフォームのプログラミングをしてますが、びっくりすることが多くて、なかなか作業が進みません。良い驚きの方が多かったりしますが、良い驚きでも作業は遅延するのです (笑。
さて、WindowsフォームのAutoScrollPositionプロパティの値は代入値と取得値が違います。これは、マニュアルに書いてあることですが、にわかに信じがたい挙動なので、自分のためにメモっておきます。
挙動 §
ScrollableControl.AutoScrollPositionプロパティは、自動スクロールのスクロール位置の情報を扱うプロパティです。データ型はPointで、XとYの値をまとめて扱います。
このプロパティは、値の取得(get)と設定(set)の双方ができます。
しかし、取得の場合は負の値を使い、設定の場合は正の値を使う必要があります。
つまり、取得した値をそのまま代入すると、同じスクロール位置として認識されません。
検証プログラム §
Visual Studio 2005でC#のWindowsアプリケーションとしてプロジェクトを作成します。
フォーム上にPanelを貼り付け、そのPanel上にLabelを貼り付けます。
PanelのAutoScrollプロパティをTrueに変更しておきます。
その後、Buttonを2個、Labelを1個、TextBoxを1個貼り付けます。
ButtonはダブルクリックしてClickのハンドラを作成します。フォームもダブルクリックしてLoadハンドラを作成しておきます。
そして、以下のコードを入力します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication24
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
const string text = "abcdefghijklmnopqrstuvwxyz";
this.label1.Text = text + text + text + text;
}
private void button1_Click(object sender, EventArgs e)
{
this.label2.Text = "panel1.AutoScrollPosition="
+ this.panel1.AutoScrollPosition.ToString();
}
private void button2_Click(object sender, EventArgs e)
{
this.panel1.AutoScrollPosition =
new Point(int.Parse(this.textBox1.Text), 0);
}
}
}
検証手順 §
実行すると、Panelに横スクロールバーが出ます。出ない場合はPanelのサイズをより小さく調整してください。
スクロールバーを中間ぐらいに移動させてからbutton1をクリックすると、Label2にAutoScrollPositionプロパティの値が表示されます。Xの値がマイナス値であることを確認できます。スクロールバーのどの位置で取得しても、0以下の値であることを確認できます。
次に、TextBoxに上記で確認した値のマイナス符号を取った正の値を入力し、button2をクリックします。スクロールバーが同じ位置に移動することを確認できます。button1をクリックすると、Xの値は、設定した値と異なり、マイナス値であることが確認できます。
マイナス符号を取らないで試すと、スクロールバーは左端に移動します。button1をクリックすると、Xの値が0になっていることが確認できます。
危ない放課後 §
入れた値が出てこないというのは、なかなか危ない機能です。
女の子を口説き落として脱がしてみると、実は男だった……というぐらいインパクトのある仕様ですね。
どうしてこのような仕様になったのか、理由に興味があるところです。