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

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

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

Re[2]: GetPositionFromCharIndexについて


(過去ログ 52 を表示中)

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

■28854 / inTopicNo.1)  GetPositionFromCharIndexについて
  
□投稿者/ DS (1回)-(2008/12/02(Tue) 10:28:40)

分類:[C#] 

.NET Framework2.0を使用しています。
GetPositionFromCharIndexをつかってTextBox内の位置を取得しようとして、

Point p = TextBox.GetPositionFromCharIndex(TextBox.Text.Length);

としてもpには(0,0)しか入りません。しかし、RichTextBoxで作るとうまくいきます。
なぜTextBoxではできないのでしょうか?
宜しくお願いいたします。
引用返信 編集キー/
■28856 / inTopicNo.2)  Re[1]: GetPositionFromCharIndexについて
□投稿者/ よねKEN (211回)-(2008/12/02(Tue) 10:45:45)
No28854 (DS さん) に返信
> .NET Framework2.0を使用しています。
> GetPositionFromCharIndexをつかってTextBox内の位置を取得しようとして、
>
> Point p = TextBox.GetPositionFromCharIndex(TextBox.Text.Length);

Point p = TextBox.GetPositionFromCharIndex(TextBox.Text.Length - 1);
ならうまく行きますよ。

TextBox.Text.Lengthはテキストの範囲外のため、うまくいかないのではないかと予想されます。
(正確なところはEM_POSFROMCHARメッセージに対する各コントロールがどう応答するのかの
仕様を確認しないとわかりませんが)

> としてもpには(0,0)しか入りません。しかし、RichTextBoxで作るとうまくいきます。
> なぜTextBoxではできないのでしょうか?

たぶん単純に仕様が違うからだと思いますが、明確な根拠は今のところわかりません。
#理由は上記に書いた括弧書きかなと思ってますが。

引用返信 編集キー/
■28858 / inTopicNo.3)  Re[2]: GetPositionFromCharIndexについて
□投稿者/ DS (2回)-(2008/12/02(Tue) 10:58:19)
No28856 (よねKEN さん) に返信

よねKENさん返信ありがとうございます。

> Point p = TextBox.GetPositionFromCharIndex(TextBox.Text.Length - 1);
> ならうまく行きますよ。
>

いわれたとおりPoint p = TextBox.GetPositionFromCharIndex(TextBox.Text.Length - 1);とするとうまくいきました!
おっしゃった通りTextBox.Text.Lengthはテキストの範囲外のためのようでした。本当にありがとうございます。


> たぶん単純に仕様が違うからだと思いますが、明確な根拠は今のところわかりません。
> #理由は上記に書いた括弧書きかなと思ってますが。

RichTextBoxでできてしまったのでTextBoxでもできるかと思って、そのままのコードを使ってしまったことが原因ですね。
使用が違っていたんですね。ありがとうございます。

引用返信 編集キー/
■28859 / inTopicNo.4)  Re[2]: GetPositionFromCharIndexについて
□投稿者/ よねKEN (212回)-(2008/12/02(Tue) 11:06:30)
2008/12/02(Tue) 11:07:36 編集(投稿者)

その動作になる理由をTextBoxBase、TextBox、RichTextBoxのソースコードを読んで調べてきました。

> (正確なところはEM_POSFROMCHARメッセージに対する各コントロールがどう応答するのかの
> 仕様を確認しないとわかりませんが)

EM_POSFROMCHARメッセージといったWindowsAPIレベルの部分以前の話で、
それぞれのコントロールでのindexの範囲チェックによる動作でした。

TextBoxBase → index < 0 || index >= Text.Length だったら Point.Emptyを返す
TextBox   → TextBoxBaseと同じ
RichTextBox → RichEditのメジャーバージョンが2だったら、TextBoxBaseと同じ
        それ以外なら、index < 0 || index > Text.Length だったら Point.Emptyを返す

RichTextBoxでRichEditのメジャーバージョンが2以外のときだけ、テキストの末尾+1までOKなようです。

ちなみに以下のサイトのRichEditのバージョンについての情報を参照する限りでは、
.NET Framework2.0のサポート環境だとWin98の場合だけ注意が必要そうですね。
http://www.river.sannet.ne.jp/yuui/richedit.html

.NET Framework2.0のサポート環境は以下のシステム要件から
http://www.microsoft.com/downloads/details.aspx?familyid=0856EACB-4362-4B0D-8EDD-AAB15C5E04F5&displaylang=ja
引用返信 編集キー/
■28860 / inTopicNo.5)  Re[3]: GetPositionFromCharIndexについて
□投稿者/ DS (3回)-(2008/12/02(Tue) 11:18:17)
2008/12/02(Tue) 11:52:04 編集(投稿者)
2008/12/02(Tue) 11:52:01 編集(投稿者)

No28859 (よねKEN さん) に返信


よねKEN さん とても詳しくわかりやすい説明ありがとうございます。
> TextBoxBase → index < 0 || index >= Text.Length だったら Point.Emptyを返す
完全にこれが原因のようですね。RichTextで成功した理由まで教えて頂きありがとうございました。


解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -