簡易テキストエディタを作ろうその1

せっかく.Netライブラリが使えるF#なのだから GUIプログラミングをやってみよう、ということで このページではテキストエディタの作成を行います。 細かい説明は抜きにして、ざっと進めてみましょう。 この講座では、オブジェクト指向の知識をある程度仮定しています。 最初に、プロジェクトの設定を変更します Visual Studio 2022のコミュニティエディションでは、 コンソールアプリでプロジェクトを作成していると思いますが これをウィンドウズアプリ用に書き換える必要があります。 ソリューションエクスプローラー(デフォルトでは画面右側にある)にある ソリューションの一つ下にあるプロジェクト名をダブルクリックして プロジェクト名.fsprojというファイルを開いてください。 おそらく次のようになっているはずです。
プロジェクト名.fsproj
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
	  <OutputType>Exe</OutputType>
	  <TargetFramework>net6.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <Compile Include="Program.fs" />
  </ItemGroup>

</Project>
これを次のように書き換えてください。
プロジェクト名.fsproj
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
	  <!--
	  <OutputType>Exe</OutputType>
	  <TargetFramework>net6.0</TargetFramework>
	  -->

	  <OutputType>WinExe</OutputType>
	  <TargetFramework>net6.0-windows</TargetFramework>
	  <UseWindowsForms>true</UseWindowsForms>
  </PropertyGroup>

  <ItemGroup>
    <Compile Include="Program.fs" />
  </ItemGroup>

</Project>

ExeをWinExeに変更して、net6.0をnet6.0-windowsに変更しています。 この状態で以下のプログラムをコンパイルし、ウィンドウが表示されたら 準備は完了です。
ウィンドウの表示
open System;;
open System.Windows.Forms;;

[<STAThread>]
do Application.Run(new Form());;
ウィンドウの表示(軽量構文)
open System
open System.Windows.Forms

[<STAThread>]
do Application.Run(new Form())
このプログラムをコンパイルし実行すると最小化最大化×ボタンのついた小さなウィンドウが表示されます。 うまくいかない場合はビルド(B) -> ソリューションのリビルドを試してみるとうまくいくかもしれません STAThreadというのはCOM関係の何からしいのですが詳しくは知りません。 ここで大事なことは RunメソッドにSystem.Windows.Formsの派生クラスのインスタンスを与えれば ウィンドウが表示される、という点です。 この例では、Formクラスを直接与えています。 それでは、Formクラスの派生クラスを作ってみましょう。
ウィンドウの表示2
open System;;
open System.Windows.Forms;;

type Editor() = class
    inherit Form()
end;;

[<STAThread>]
do Application.Run(new Editor());;
ウィンドウの表示2(軽量構文)
open System
open System.Windows.Forms

type Editor() =
    inherit Form()

[<STAThread>]
do Application.Run(new Editor())
このプログラムでは、Formクラスを継承したEditorクラスを作成し Runメソッドに与えています。 Editorクラスには、まだメンバもメソッドも何もありません。 実行結果は先ほどと同じになりますね。 それでは、このプログラムにリッチテキストボックスを配置します。
リッチテキストボックスの配置
open System;;
open System.Windows.Forms;;

//メインフォーム
type Editor() as this= class
    inherit Form()
    let edit = new RichTextBox()
    do
        edit.Dock <- DockStyle.Fill;
        this.Controls.Add(edit)
end;;

[<STAThread>]
do Application.Run(new Editor());;
リッチテキストボックスの配置(軽量構文)
open System
open System.Windows.Forms

//メインフォーム
type Editor() as this =
    inherit Form()
    let edit = new RichTextBox()
    do
        edit.Dock <- DockStyle.Fill;
        this.Controls.Add(edit)

[<STAThread>]
do Application.Run(new Editor())
このプログラムのEditorクラスは RichTextBoxクラスのプライベートフィールドeditを持っています。 Editorクラスは 1.editをRichTextBoxで初期化 2.RichTextBoxのDockスタイルの設定 3.RichTextBoxをフォームに関連づける という動作を行っています。 スタイルの設定で、DockStyle.Fillを指定すると、 コントロールは親フォームいっぱいに広がります。 この行をコメントアウトして動作を確かめてみてください。 たったこれだけのプログラムですが エディットボックスが表示され、文字が入力出来るようになりました。