触発されてプレゼンツールを作ろうと思ったのだが、Ruby CLRを使うと確実にシベリア行きという事なので、Adaで書くことにした。AdaでWindowsのGUIを構築する場合、AdaGTK+をつかうのが一般的である。がしかし、WindowsでGTK+を使うのは今一しっくりこない上、IDEが整備されていないという問題があるので、できれば他の方法で実装したいところである。というわけで、A#による.NET Frameworkアプリケーションを作ることにした。いつの間にやらVS2005上で開発できるようになっているので、IDEもばっちりだ。
さて、まずはインストールからだ。A#のコンパイルに必要な全てのものはSourceForge.netからダウンロードできる。まず最初にmgnat20060606.zipをダウンロードして、unzipする。展開先はどこでも良いのだが、C:\mgnatに入れておくのが一般的らしい(C:\mgnat\README.txtが存在するように配置する)。次に、asharp-setup20060606.exeをダウンロードして実行する。インストール先は「C:\」のままにしておこう、気を利かせて「C:\mgnat」にすると逆に変なことになる。このファイルにより、必要な環境変数の設定やソースコードのコンパイルが行われる。mgnatを展開するときに、なんとなく嫌な予感を感じた場合、それが現実になるのもこの段階だ。4000近いファイルがコンパイルされるので、Rubyで実装していればアプリケーションが完成してしまうぐらいの時間がかかる。辛抱強く待とう。
無事asharp-setup20060606.exeが終了したら、環境変数のPATHを確認しよう。\「C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\」が追加されていないはずなので、足しておく。これがないと、後でVS2005を起動したときにエラーが起きて、ググっても何も情報が出てこない現実に絶望することになる。
最後にVS2005にA#の環境を統合するために、vs_integration20060606.exeをダウンロードして実行しよう。特に難しいことは無いはずだ。ただし、プログレスバーが一杯になった状態でものすごく待たされるので、それは覚悟しておく必要がある。
ここまで来れば後はVS2005を立ち上げて、新しいプロジェクトを作るだけだ。Ada for .NET (A#)が選択できるようになっている。取り敢えずは、with Ada.Text_IO;を入力してみよう。強力な補完機能に感動できるはずだ。
インストールができたので、コーディングに移る。基本的にはAda05と.NET Frameworkの合わせ技だ。
.NET FrameworkのSystem名前空間は、ここではMSSystになる。それ以下は同じなので、必要に応じてwithする。とりあえず、プレゼンテーションツールなので、画面を最大化したウィンドウを作ってみよう。Ada@WCIMHも参照のこと。
with Main_Form;
with MSSyst.Windows.Forms.Application;
procedure Steady_Talk is
pragma Linker_Options("-subsystem=2");
begin
Mssyst.Windows.Forms.Application.Run(Main_Form.new_Main_Form);
end Steady_Talk;
with MSSyst.String;
with MSSyst.Windows.Forms.Form;
package Main_Form is
type Typ is new MSSyst.Windows.Forms.Form.Typ with null record;
type Ref is access all Typ'Class;
function new_Main_Form(This : Ref := null) return Ref;
pragma MSIL_Constructor(new_Main_Form);
end Main_Form;
with MSSyst.Windows.Forms.FormBorderStyle;
with MSSyst.Windows.Forms.FormWindowState;
with MSSyst.Windows.Forms.Control;
with MSSyst.Windows.Forms.Control.ControlCollection;
with MSSyst.Windows.Forms.Label;
with MSSyst.Drawing.Font;
with MSSyst.Drawing.Color;
package body Main_Form is
function new_Main_Form(This : Ref := null) return Ref is
use type MSSyst.String.Ref;
Super : MSSyst.Windows.Forms.Form.Ref := MSSyst.Windows.Forms.Form.new_Form(MSSyst.Windows.Forms.Form.Ref(This));
Label : MSSyst.Windows.Forms.Label.Ref;
Label_Font : MSSyst.Drawing.Font.Ref;
begin
-- 適当に最大化して背景色を変えてみたり
This.set_Text("Steady Talk");
This.set_BackColor(MSSyst.Drawing.Color.get_Orange);
This.set_Opacity(0.9);
This.set_FormBorderStyle(MSSyst.Windows.Forms.FormBorderStyle.None);
This.set_WindowState(MSSyst.Windows.Forms.FormWindowState.Maximized);
-- とりあえず文字を入れてみる。
Label := MSSyst.Windows.Forms.Label.new_Label;
Label.set_Text("Hello world!");
-- フォントを変えたいんだけどクラッシュする
-- Label_Font := MSSyst.Drawing.Font.new_Font(This => null, prototype => Label.get_Font, newStyle => Label.get_Font.get_Style);
-- Label.set_Font(Label_Font);
-- This.get_Controls.Add(L)だとエラーになる
MSSyst.Windows.Forms.Control.ControlCollection.Add(This.get_Controls, Label);
return This;
end;
end Main_Form;
これで何となく動いている。やってみた感じ、そこまでアクロバティックな事は要求されなかった。2003年より進化している様に見える。
しかし、MSSyst.Drawing.Fontのインスタンスを作ろうと思ったら、コンパイラがクラッシュした。メッセージ的には以下の通りだが、その部分を読んでみても詳しいことは分からなかった。
4.01p (20060112) (.NET VM) Assert_Failure jvm-info.adb:301 Error detected at main_form.adb:23:121
面倒なのでGDIを使おう。