Out of Memory

ごめん、忘れてた。

目次

Blog 利用状況

ニュース

2008年7月1日
Microsoft MVP for Developer Tools - Visual C++ を再受賞しました。
2008年2月某日
MVPアワードがVisual C++に変更になりました。
2007年10月23日
blogタイトルを変更しました。
2007年7月1日
Microsoft MVP for Windows - SDKを受賞しました!
2007年6月20日
スキル「ニュース欄ハック」を覚えた!
2006年12月14日
記念すべき初エントリ
2006年12月3日
わんくま同盟に加盟しました。

カレンダー

中の人

aetos

顔写真

埼玉を馬鹿にする奴は俺が許さん。

基本的に知ったかぶり。興味を持った技術に手を出して、ちょっと齧りはするものの、それを応用して何か形にするまでは及ばずに飽きて放り出す人。

Microsoft MVP for Windows SDK July 2007 - February 2008, Microsoft MVP for Visual C++ February 2008 - June 2009
Microsoft MVP for Windows SDK
July 2007 - February 2008
Microsoft MVP for Visual C++
February 2008 - June 2009

アクセサリ

あわせて読みたい

e-Words

アフィリエイト

記事カテゴリ

書庫

日記カテゴリ

System.Drawing.Point

2次元座標を表す、おなじみのPoint構造体
こいつがSystem.Drawing名前空間にあることは、ちょっとした不満である。

理由は簡単で、2次元座標とは、何も描画するときだけに使うものではないからだ。
たとえばControl.Locationプロパティに使われるが、Locationプロパティを設定することは、何かを描画しているという意識なく行われるだろう。
だが、Windowsはウィンドウの移動を裏で描画しているわけだし、また、ピクセル単位での座標指定に使うものであると拡大解釈して、なんとか自分を納得させてきた。

だが、つい先ほど、ひょんなことから、DataGridView.CurrentCellAddressというプロパティを知ってしまった。
この型はPointであるが、単位はピクセルではない。DataGridViewのアクティブセルの行および列のインデックスである。
また、DataGridViewは、この座標を用いて何かを描画することもない。
ここへきて完全に、PointがDrawing名前空間にあることを正当化する理由は消えた。

だが、いくら文句を言ったところで、Point構造体がDrawing名前空間を脱することはないだろう。
だから、ここから先は妄想の域を出ない話だ。

そもそも、Point構造体を、座標の単位を意識せずに、単なる2つの座標のペアとして扱うことは正しいのだろうか。
それとも、表すものの単位ごとに異なるデータ型を用意すべきだったのだろうか。
あるいはまた、2次元座標であるという意味さえ捨てて、Pair<int, int>のようなもので統一してしまうことは是なのだろうか。
なかなか難しい問題ではないかと思うが、どうだろう。

投稿日時 : 2008年2月17日 0:53

Feedback

# re: System.Drawing.Point 2008/02/17 6:01 かzくん

グリッド座標系を定義するってのはだめです?
だめですか?
だめですか...orz

javaなんて、java.awtパッケージにいるからねぇ
Pointを使うときは、UIツールキットに依存するなんて、なんかやな感じって思ってる。
それに比べれば、.netの方がまだまし

# re: System.Drawing.Point 2008/02/17 11:04 よもやま

「とある場所」を指し示す為にPoint構造体が存在しているとしたら
いろんな使われ方が生まれますねえ。

# re: System.Drawing.Point 2008/02/17 22:59 よねけん

どちらかというと
DataGridView.CurrentCellAddressプロパティ
が間違ったPointの使い方をしたのだと思います。

Pointをこのように使いたい誘惑にかられたことのある人は
きっと多いと思いますけど。

# re: System.Drawing.Point 2008/02/17 23:20 シャノン

> グリッド座標系を定義するってのはだめです?

グリッド座標系って何です?
単純に、グリッドの行・列インデックスによる座標系ってことですか?
であれば、Pointは「何らかの座標系による2次元座標」を表わすものでなければならないところ、Drawing名前空間にあるので、描画を目的とする座標系以外に使っちゃいかんのではないかということなのです。

> 「とある場所」を指し示す為にPoint構造体が存在しているとしたら

それなら System.Point とでもしてくれればよかったんですが、Drawing 空間にある以上は、描画にしか使うべきではないのではないか? と。

> DataGridView.CurrentCellAddressプロパティ
> が間違ったPointの使い方をしたのだと思います。

.NET Frameworkの開発チームももちろん一枚岩ではなく、ADO.NETチームは独自の哲学を持ってるなんてよく言われますが、Drawing空間とForms空間は密接に関連しているほうだと思うので、そこで齟齬が起きるようではおしまいかなと。

# re: System.Drawing.Point 2008/02/17 23:49 れい

わたしも嫌です。
DataGridView.CurrentCellAddressはすごく嫌いです。

そもそもPointで2次元座標なのが嫌です。
System.Drawing.Drawing2D内にPointがあるなら2Dでも許せますが。

Pointぐらい簡単な構造だと適当に使われちゃうんでしょうね。

# re: System.Drawing.Point 2008/02/18 9:23 Zee

わー、疑問に思ってたことが記事になってる^^

「Point構造体」と思って、自分の勝手な潜入感で、
使ってえらいことになった経験がありました。


>理由は簡単で、2次元座標とは、何も描画するときだけに使うものではないからだ。
まったくそのとおり・・・


>それとも、表すものの単位ごとに異なるデータ型を用意すべきだったのだろうか。
どうしようもなく(私の知識不足で?)、自分で定義しなおしたデータ型を作りましたけども。

タイトル  
名前  
Url
コメント