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

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

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

Re[7]: LinkLabel.Links.Addメソッドについて


(過去ログ 20 を表示中)

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

■8711 / inTopicNo.1)  LinkLabel.Links.Addメソッドについて
  
□投稿者/ Y (1回)-(2007/10/08(Mon) 21:42:47)

分類:[C#] 

2007/10/08(Mon) 21:43:33 編集(投稿者)

はじめまして。
開発環境 OS WinXP, C# .net2.0 Visual Studio2005

Windowsアプリでリンクラベルとボタンをフォームに設置し、
ボタンが押されたときにリンクラベルにリンクを追加する処理を書いています。

linkLabel1.Links.Add(start, lenght, value);
この処理で開始地点とそこからの長さと関連付けのデータを渡してリンクを追加しています。
これを31回追加するのはセーフで32回以降はオーバーフローになります。
LinkLabel.Linksプロパティで取得するリンクコレクションの仕様でしょうか。

仕様だとしたらのAddできる最大数を変更する方法はないのでしょうか。


引用返信 編集キー/
■8725 / inTopicNo.2)  Re[1]: LinkLabel.Links.Addメソッドについて
□投稿者/ 囚人 (195回)-(2007/10/09(Tue) 10:17:59)
コードを見せて欲しいですね。

自分の書いた「何か」がオーバーフローしていませんか?デバッグしてみましたか?
引用返信 編集キー/
■8735 / inTopicNo.3)  Re[2]: LinkLabel.Links.Addメソッドについて
□投稿者/ 魔界の仮面弁士 (453回)-(2007/10/09(Tue) 12:20:07)
No8725 (囚人 さん) に返信
> コードを見せて欲しいですね。
32 回、Links.Add するだけですよね。

linkLabel1.Text = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
for (int i = 1; i <= 32; i += 2)
{
    linkLabel1.Links.Add(i + 0, 1, new Uri("http://www.google.co.jp/"));
    linkLabel1.Links.Add(i + 1, 1, new Uri("http://jp.msn.com/"));
}

> 自分の書いた「何か」がオーバーフローしていませんか?デバッグしてみましたか?
デバッグしましたが、実際に実行すると、LinkLabel の表示すら壊れてしまうようですね。
(赤×で表示されてしまう)


■No8711 (Y さん) に返信
> LinkLabel.Linksプロパティで取得するリンクコレクションの仕様でしょうか。
わかりません。

ただ、不思議なのは、「Controls.Add していない LinkLabel」であれば、32 回以上でも
エラーにならないということです。
しかし、その LinkLabel を Controls.Add した瞬間、オーバーフローしてしまうようで…。

# フィードバック行きかな。

引用返信 編集キー/
■8736 / inTopicNo.4)  Re[3]: LinkLabel.Links.Addメソッドについて
□投稿者/ 魔界の仮面弁士 (454回)-(2007/10/09(Tue) 12:45:01)
No8735 (魔界の仮面弁士 さん) に追記
> ■No8711 (Y さん) に返信
>>LinkLabel.Linksプロパティで取得するリンクコレクションの仕様でしょうか。
> わかりません。

とりあえず、犯人はわかりました。直接の原因は、LinkLabel ではないようですが、
今のところは、フレームワーク側の制限という事になりそうです。


例外の StackTrace を見ると、問題の発生箇所は WmPaint メソッド処理の最中に使われる、
 System.Drawing.StringFormat.SetMeasurableCharacterRanges(CharacterRange[] ranges)
であることが分かります。

そしてこのメソッドは、32 を超える範囲が渡されたときに、OverflowException を発生させる、と。
http://msdn2.microsoft.com/ja-jp/library/system.drawing.stringformat.setmeasurablecharacterranges%28VS.80%29.aspx


// これは OK
sf = new System.Drawing.StringFormat();
cr = new System.Drawing.CharacterRange[32];
sf.SetMeasurableCharacterRanges( cr );

// これは NG
sf = new System.Drawing.StringFormat();
cr = new System.Drawing.CharacterRange[33];
sf.SetMeasurableCharacterRanges(cr);
引用返信 編集キー/
■8737 / inTopicNo.5)  Re[4]: LinkLabel.Links.Addメソッドについて
□投稿者/ 囚人 (197回)-(2007/10/09(Tue) 12:48:50)
あぁ、失礼しました。

32文字制限といえば、StringFormat.SetMeasurableCharacterRanges メソッドの 32 文字限界の事かな。
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=272679&SiteID=7

内部でコイツを呼び出して計算しているっぽいですね。GDI+ の制限なので難しいのかな。

ちなみに、StringFormat.SetMeasurableCharacterRanges に関しては過去にフィードバックがあったみたいです。
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=96250

引用返信 編集キー/
■8738 / inTopicNo.6)  Re[5]: LinkLabel.Links.Addメソッドについて
□投稿者/ 囚人 (198回)-(2007/10/09(Tue) 12:49:24)
おっと。被りまくった。
引用返信 編集キー/
■8740 / inTopicNo.7)  Re[6]: LinkLabel.Links.Addメソッドについて
□投稿者/ IIJIMAS (41回)-(2007/10/09(Tue) 12:56:57)
私も被るところでした…
#リロードしてよかったです…
OnPaintの中で使ってるんですね…
StringFormat.SetMeasurableCharacterRanges メソッド…
引用返信 編集キー/
■8771 / inTopicNo.8)  Re[7]: LinkLabel.Links.Addメソッドについて
□投稿者/ Y (2回)-(2007/10/09(Tue) 22:04:32)
ありがとうごさいます。

そこまで深いところで落ちてるとは気がつきませんでした。

まだ経験が浅いので自分のプログラムを疑ったりと見当違いな場所を見ていたようです。

C#で開発してるいるとこのような現象は結構あるものでしょうか?
それとも今回がレアケースだったのでしょうか。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -