GUI関連の文法事項

ここではGUIプログラミングをする上で 知っておくと役に立つかもしれない事項について述べます。

列挙体の扱い

ボタンなどのコントロールのAnchorの設定で出てくる AnchorStylesのような、列挙体の設定は以下のように行います
列挙体の扱い
//OR演算
button.Anchor <- AnchorStyles.Left ||| AnchorStyles.Right;;
//参考:古いやり方
//button.Anchor <- Enum.combine[AnchorStyles.Left;AnchorStyles.Right];;
//空を指定する場合
//let settextattr (t:RichTextBox) =
//	t.LanguageOption <- Enum.of_int(0);;
//	t.LanguageOption <- Enum.combine[];;
F#6.0時点ではEnum.of_intもEnum.combineも使えなくなっています。 基本的にはOR演算で利用すればいいと思います。

ダウンキャスト

親クラスから子クラスへキャストすることをダウンキャストと言います。 F#では:?という表記を用いてこれを実現出来ます。
例1
match object_value with
	| :? string -> printfn "string value"
	| :? int -> printfn "int value"
例2
try 
	File.Copy(src,dst);
with
	| :? PathTooLongException -> msg "パス名が長すぎます"
	| :? NotSupportedException -> msg "パスにコロンが含まれています"
	| :? DirectoryNotFoundException -> msg "コピー先がNothingまたは空文字列です"
	| :? UnauthorizedAccessException -> msg "ファイルへアクセスできません"
	| :? System.Security.SecurityException -> msg "必要なアクセス権がありません"

Flexible type

#型名とすることで、スーパークラスの型を型情報として与えることが出来ます。
Flexible type
let settext (c : #Control) = c.Text <- "text";;
//こう書いても同じ意味
let settext (c : 'a when 'a :> Control) = c.Text <- "text";;

BoxingとUnboxing

C#でいうObject型へと変換することをboxing その逆変換をUnboxingといいます。 F#で相当する型はobj型になります。
obj型の利用
//obj型に変換
box 1;;
box "abc";;
//obj型から元の型に戻す
unbox<string> (box "abc");;
(unbox (box "abc") : string);;
例えばこれを用いると System.Runtime.Serialization.Formatters.Binaryを用いて 任意の型のデータをシリアライズする関数を定義出来ます。

Attribute

[< ... >]で囲むことで利用できます。 例えば以下で定義した関数を利用しようすると コンパイラが警告を出してくれます
System.Obsolete属性
[<System.Obsolete("旧バージョンの関数")>]
let old () = printfn "old function";;

use

C#でいうusing文に相当します。 letの代わりにuseを用いることで 自動的にDisposeが呼ばれます。 トップレベルではuseは使えないので関数内などから利用することになるでしょう。
useの利用
let fileopen fullpath =
    use fs = new FileStream(fullpath,FileMode.Open,FileAccess.Read) in
    // fs.Read(...)