投稿者 魔界の仮面弁士  (社会人) 投稿日時 2008/12/17 01:04:15
> CenterToScreen()は是非使いたいところなのですが、

CenterToScreenは、私のコードともるきおさんのコードとも異なる動作になります。

るきおさんのコードは、常に第一画面に配置され、
私のコードは、現在のフォーム(の大部分)が配置されている画面に配置され、
CenterToScreen は、マウスカーソルのある画面に配置されます。

また、複数画面にまたがるような、巨大なフォームに対する動作も異なります。


> これは対象となるフォームのクラス外(モジュールの関数内等)でも使えますか?

Proteced メソッドなので、継承先のクラスでのみ使用可能です。

外部から呼びたいのであれば、継承先クラスに Public メソッドを用意するか、
あるいはリフレクションで呼び出すかの二拓になると思います。

たとえば上記のようにすると、外部から「フォーム.MoveToCenter()」で呼び出せるようになります。
「スマートなコード」とは程遠い気がしますけれどね。
(無理に外部から呼び出す程の物でもありませんし)

Imports System
Imports System.Reflection
Imports System.Windows.Forms
Imports System.Runtime.CompilerServices
Module Sample
    <Extension()> Public Sub MoveToCenter(ByVal f As Form)
        GetType(Form).InvokeMember("CenterToScreen", _
        BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.InvokeMethod, _
        Nothing, f, New Object() {})
    End Sub
End Module


> size構造体って演算できるんですね。新発見です。

Size 構造体に対する加減算は、.NET 1.0/VB.NET 2002の頃からサポートされていました。
しかし以前のバージョンでは、『演算子のオーバーロード』がサポートされていないため、減算処理には
Dim s As Size = Size.op_Subtraction(r.Size, Me.Size)
という表現が必要でした。
今のような
Dim s As Size = r.Size - Me.Size
という記述を行えるようになったのは、.NET 2.0/VB2005(およびそれ以降のバージョン)からです。

> 他にもこのような構造体ってあるのでしょうか?

加減算であれば、
 日付型(Date) ± 日付型(Date) = 期間(TimeSpan)
 日付型(Date) ± 期間(TimeSpan) = 日付型(Date)
とかですかね。
この他、代入演算子のオーバーロードもサポートされたため、
System.Data.SqlTypes.SqlDecimal や System.IntPtr 型などに、数値を
直接代入するような構文も許可されるようになっています。