A#とVisualStudio2005による.NETプログラミング・Formを作ってみる編

インストールができたので、コーディングに移る。基本的にはAda05と.NET Frameworkの合わせ技だ。

.NET FrameworkのSystem名前空間は、ここではMSSystになる。それ以下は同じなので、必要に応じてwithする。とりあえず、プレゼンテーションツールなので、画面を最大化したウィンドウを作ってみよう。Ada@WCIMHも参照のこと。

Steady_Talk.adb (as Main)
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;
Main_Form.ads
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;
Main_Form.adb
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を使おう。