簡易テキストエディタを作ろうその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を指定すると、
コントロールは親フォームいっぱいに広がります。
この行をコメントアウトして動作を確かめてみてください。
たったこれだけのプログラムですが
エディットボックスが表示され、文字が入力出来るようになりました。