2006年02月18日
川俣晶の縁側ソフトウェア技術雑記total 13193 count

WindowsフォームのAutoScrollPositionプロパティの値は代入値と取得値が違う

Written By: 川俣 晶連絡先

 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になっていることが確認できます。

危ない放課後 §

 入れた値が出てこないというのは、なかなか危ない機能です。

 女の子を口説き落として脱がしてみると、実は男だった……というぐらいインパクトのある仕様ですね。

 どうしてこのような仕様になったのか、理由に興味があるところです。

Facebook

このコンテンツを書いた川俣 晶へメッセージを送る

[メッセージ送信フォームを利用する]

メッセージ送信フォームを利用することで、川俣 晶に対してメッセージを送ることができます。

この機能は、100%確実に川俣 晶へメッセージを伝達するものではなく、また、確実に川俣 晶よりの返事を得られるものではないことにご注意ください。

このコンテンツへトラックバックするためのURL

https://mag.autumn.org/tb.aspx/20060218162946
サイトの表紙【技術雑記】の表紙【技術雑記】のコンテンツ全リスト 【技術雑記】の入手全リスト 【技術雑記】のRSS1.0形式の情報このサイトの全キーワードリスト 印刷用ページ

管理者: 川俣 晶連絡先

Powered by MagSite2 Version 0.36 (Alpha-Test) Copyright (c) 2004-2021 Pie Dey.Co.,Ltd.