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