ラベル Mono の投稿を表示しています。 すべての投稿を表示
ラベル Mono の投稿を表示しています。 すべての投稿を表示

2014-12-15

魅惑の Qyoto (7) - Fedora 21 での動作確認

Qyoto は Qt の .NET バインディングです。Fedora 20 の時に、新しい Qyoto を入手して「魅惑の Qyoto」と題して、Mono 環境でサンプルを紹介していましたが、一時期 CentOS 7 へ乗り換えてから中断していました。Fedora 21 では、Fedora 標準のレポジトリから Qyoto のパッケージが利用できますので、まずは動作確認をしてみます。

Fedora 21 における Mono の開発環境

Fedora 21 における Mono / Qyoto の開発環境の主要なパッケージは、下記の通りです。

  • mono-core-2.10.8-8.fc21.x86_64
  • qt-4.8.6-18.fc21.x86_64
  • qyoto-4.14.3-1.fc21.x86_64
  • qyoto-devel-4.14.3-1.fc21.x86_64

Fedora 21 で Mono のバージョンが 2.10 から 3.4 へ移行するものと思っていましたが、あらためて Changes/Mono 3.4 - FedoraProject を確認すると、ターゲットリリースは Fedora 22 になっていました。なお、Mono の最新バージョンは 3.8 です。

Mono の今後

Microsoft は 11 月 12 日、.NET Framework のサーバーサイド向け技術 .NET Core をオープンソース化することを発表して関係者を驚かせました 1.。"Microsoft" という言葉と "オープンソース" という言葉が、今や同一の文章の中で使われる時代になったのです。Mono Project はこの動きに呼応して、今後統合に向けて動いていくことを表明しています 2.。

  1. 「.NET Core」がオープンソース化、MacやLinuxもサポート | SourceForge.JP Magazine (2014年11月13日)
  2. .NET Source Code Integration | Mono(2014年11月18日)

そういうわけで、.NET にまつわる技術動向が注目されますが、まずは現状でできることを整理しておきましょう。

Hello World 再び

mono のバージョンは 2.10 ですが、ひとまず Hello World のプログラムの動作を確認してみます。「魅惑の Qyoto (1) - Hello Wold!」で紹介したサンプルで確認しますので、ソースを再掲します。

List: hello-qyoto.cs
using System;
using Qyoto;

/**
 * ZetCode Qyoto C# tutorial
 *
 * This program creates a quit
 * button. When we press the button,
 * the application terminates. 
 *
 * @author Jan Bodnar
 * website zetcode.com
 * last modified October 2012
 *
 * modified by Fuhito Suguri
 * last modified 13-May-2014
 */


public class QyotoApp : QWidget
{
    public QyotoApp ()
    {
        WindowTitle = "mono/qyoto";

        InitUI ();

        Resize (180, 60);
        Move (300, 300);
        Show ();
    }

    public void InitUI ()
    {    
        QPushButton but = new QPushButton ("こんにちは、世界!", this);

        Connect (but, SIGNAL ("clicked()"), qApp, SLOT ("quit()"));
        but.SetGeometry (10, 10, 160, 40);
    }

    [STAThread]
    public static int Main (String[] args)
    {
        new QApplication (args);
        new QyotoApp ();
        return QApplication.Exec ();
    }
}

コンパイルおよび実行例を以下に示します。

$ mcs hello-qyoto.cs -pkg:qyoto
$ mono hello-qyoto.exe

Mono の最近のバージョンについては、下記からパッケージをダウンロードして試してみる予定です。

  1. software.opensuse.org: パッケージのインストール: home:tpokorra:mono / mono-opt

2014-06-07

魅惑の Qyoto (6) - SpinBox, Slider & Dial

Qyoto (Qt) を用いて、今回は、設定した範囲の数字を調節するウィジェット 3 種類を紹介します。

まず、Fedora 20 における Mono / Qyoto の開発環境の主要なパッケージですが、前回と同じく以下の通りです。

  • mono-core-3.4.0-2.fc20.x86_64
  • qt-4.8.6-5.fc20.x86_64
  • qyoto-4.12.5-1.fc20.x86_64
  • qyoto-devel-4.12.5-1.fc20.x86_64

スピンボックス

スピンボックス QSpinBox は、ボックスに表示されている数値データを,ボックスの右端にあるアップダウンボタンで増減させて変更するウィジェットです。「↑」「↓」キーやマウスホイールでも調節できます。

List: spinbox.cs
using System;
using Qyoto;

/**
 * ZetCode Qyoto C# tutorial
 *
 * This program uses the QSpinBox widget.
 * The option selected from the combo box is
 * displayed in the label widget.
 *
 * @author Jan Bodnar
 * website zetcode.com
 * last modified October 2012
 * 
 * modified by Fujito Suguri
 * last modified 7-Jun-2014
 */

public class QyotoApp : QWidget
{
    public QyotoApp ()
    {
        WindowTitle = "スピンボックス";

        InitUI ();

        Move (100, 100);
        Show ();
    }

    void InitUI ()
    {
        QSpinBox sp = new QSpinBox ();
        sp.SetRange (0, 100);
        sp.SetValue(50);
        sp.Alignment = (uint) AlignmentFlag.AlignRight;
        sp.SetSizePolicy (QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Preferred);

        Connect (sp, SIGNAL ("valueChanged(int)"), this, SLOT ("OnValueChanged(int)"));

        QVBoxLayout vbox = new QVBoxLayout (this);
        vbox.AddWidget (sp);
    }

    [Q_SLOT]
    void OnValueChanged (int i)
    {
        Console.WriteLine ("値が " + i + " になりました。");
    }

    [STAThread]
    public static int Main (String[] args)
    {
        new QApplication (args);
        new QyotoApp ();
        return QApplication.Exec ();
    }
}

コンパイルおよび実行例を以下に示します。

$ mcs spinbox.cs -pkg:qyoto
$ mono spinbox.exe
値が 51 になりました。
値が 52 になりました。
値が 53 になりました。

スライダー

スライダー QSlider はツマミをマウスでドラッグすることで、値を変更できるウィジェットです。「↑」「↓」キーやマウスホイールでも調節できます。

List: slider.cs
using System;
using Qyoto;

/**
 * ZetCode Qyoto C# tutorial
 *
 * This program uses the QSlider widget.
 * The option selected from the combo box is
 * displayed in the label widget.
 *
 * @author Jan Bodnar
 * website zetcode.com
 * last modified October 2012
 * 
 * modified by Fujito Suguri
 * last modified 7-Jun-2014
 */

public class QyotoApp : QWidget
{
    public QyotoApp ()
    {
        WindowTitle = "スライダー";

        InitUI ();

        Move (100, 100);
        Show ();
    }

    void InitUI ()
    {
        QSlider sl = new QSlider ();
        sl.SetRange (0, 100);
        sl.SetValue (50);
        sl.SetOrientation (Orientation.Horizontal);
        sl.FocusPolicy = FocusPolicy.StrongFocus;
        sl.tickPosition = QSlider.TickPosition.TicksBelow;
        sl.TickInterval = 10;
        sl.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred);

        Connect (sl, SIGNAL ("valueChanged(int)"), this, SLOT ("OnValueChanged(int)"));

        QVBoxLayout vbox = new QVBoxLayout (this);
        vbox.AddWidget (sl);
    }

    [Q_SLOT]
    void OnValueChanged (int i)
    {
        Console.WriteLine ("値が " + i + " になりました。");
    }

    [STAThread]
    public static int Main (String[] args)
    {
        new QApplication (args);
        new QyotoApp ();
        return QApplication.Exec ();
    }
}

コンパイルおよび実行例を以下に示します。

$ mcs slider.cs -pkg:qyoto
$ mono slider.exe
値が 51 になりました。
値が 52 になりました。
値が 53 になりました。

ダイヤル †

† 「だいある」で一発変換できなかったのでダイヤルにしました。

ダイヤル QDial は、スライダーと同様にツマミをマウスでドラッグすることで、値を変更できるウィジェットですが直線的ではなく回転的に値を変化させるウィジェットです。「↑」「↓」キーやマウスホイールでも調節できます。

List: dial.cs
using System;
using Qyoto;

/**
 * ZetCode Qyoto C# tutorial
 *
 * This program uses the QDial widget.
 * The option selected from the combo box is
 * displayed in the label widget.
 *
 * @author Jan Bodnar
 * website zetcode.com
 * last modified October 2012
 * 
 * modified by Fujito Suguri
 * last modified 7-Jun-2014
 */

public class QyotoApp : QWidget
{
    public QyotoApp ()
    {
        WindowTitle = "ダイヤル";

        InitUI ();

        Move (100, 100);
        Show ();
    }

    void InitUI ()
    {
        QDial dl = new QDial ();
        dl.SetRange (0, 100);
        dl.SetValue (50);
        dl.SetNotchesVisible (true);
        dl.FocusPolicy = FocusPolicy.StrongFocus;

        dl.SetSizePolicy (QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Preferred);

        Connect (dl, SIGNAL ("valueChanged(int)"), this, SLOT ("OnValueChanged(int)"));

        QVBoxLayout vbox = new QVBoxLayout (this);
        vbox.AddWidget (dl);
    }

    [Q_SLOT]
    void OnValueChanged (int i)
    {
        Console.WriteLine ("値が " + i + " になりました。");
    }

    [STAThread]
    public static int Main (String[] args)
    {
        new QApplication (args);
        new QyotoApp ();
        return QApplication.Exec ();
    }
}

コンパイルおよび実行例を以下に示します。

$ mcs dial.cs -pkg:qyoto
$ mono dial.exe
値が 51 になりました。
値が 52 になりました。
値が 53 になりました。

参考サイト

  1. C# Qyoto tutorial
  2. Qyoto: Main Page - Qyoto Documentation

2014-05-31

魅惑の Qyoto (5) - ListWidget & ComboBox

Qyoto (Qt) を用いたリストウィジェットとコンボボックスを紹介します。

まず、Fedora 20 における Mono / Qyoto の開発環境の主要なパッケージですが、前回と同じく以下の通りです。

  • mono-core-3.4.0-2.fc20.x86_64
  • qt-4.8.6-5.fc20.x86_64
  • qyoto-4.12.5-1.fc20.x86_64
  • qyoto-devel-4.12.5-1.fc20.x86_64

リストウィジェット

リストウィジェット QListWidget はあらかじめ用意された選択肢の中から 1 つあるいは複数の項目を選択するためのウィジェットです。

List: listwidget.cs
using System;
using System.Collections.Generic;
using Qyoto;

/**
 * ZetCode Qyoto C# tutorial
 *
 * This program uses the QListWidget widget.
 * The option selected from the lw box is
 * displayed in the label widget.
 *
 * @author Jan Bodnar
 * website zetcode.com
 * last modified October 2012
 * 
 * modified by Fujito Suguri
 * last modified 27-May-2014
 */

public class QyotoApp : QWidget
{
    public QyotoApp ()
    {
        WindowTitle = "リストウィジェット";

        InitUI ();

        Move (100, 100);
        Show ();
    }

    public void InitUI ()
    {
        QLabel label = new QLabel ("都道府県リスト");
        QListWidget lw = new QListWidget ();

        label.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed);
        lw.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred);

        List prefList = new List (new string[] {
            "北海道", "青森県", "岩手県", "宮城県", "秋田県", "山形県", "福島県", "茨城県", "栃木県",
            "群馬県", "埼玉県", "千葉県", "東京都", "神奈川県", "山梨県", "長野県", "新潟県", "富山県",
            "石川県", "福井県", "岐阜県", "静岡県", "愛知県", "三重県", "滋賀県", "京都府", "大阪府",
            "兵庫県", "奈良県", "和歌山県", "鳥取県", "島根県", "岡山県", "広島県", "山口県", "徳島県",
            "香川県", "愛媛県", "高知県", "福岡県", "佐賀県", "長崎県", "熊本県", "大分県", "宮崎県",
            "鹿児島県", "沖縄県"
        });

        foreach (string pref in prefList) {
            lw.AddItem (pref);
        }

        Connect (lw, SIGNAL ("itemSelectionChanged()"), this, SLOT ("OnSelected()"));

        QVBoxLayout vbox = new QVBoxLayout (this);
        vbox.AddWidget (label);
        vbox.AddWidget (lw);
    }

    [Q_SLOT]
    public void OnSelected ()
    {
        QListWidget l = (QListWidget)Sender ();
        Console.WriteLine (l.CurrentItem ().Text () + "が選択されました。");
    }

    [STAThread]
    public static int Main (String[] args)
    {
        new QApplication (args);
        new QyotoApp ();
        return QApplication.Exec ();
    }
}

コンパイルおよび実行例を以下に示します。

$ mcs listwidget.cs -pkg:qyoto
$ mono listwidget.exe
岩手県が選択されました。
福島県が選択されました。

コンボボックス

コンボボックス QComboBox は文字入力あるいは表示のための矩形領域と項目選択リストを組み合わせたウィジェットです。

List: combobox.cs
using System;
using System.Collections.Generic;
using Qyoto;

/**
 * ZetCode Qyoto C# tutorial
 *
 * This program uses the QComboBox widget.
 * The option selected from the combo box is
 * displayed in the label widget.
 *
 * @author Jan Bodnar
 * website zetcode.com
 * last modified October 2012
 * 
 * modified by Fujito Suguri
 * last modified 27-May-2014
 */

public class QyotoApp : QWidget
{
    public QyotoApp ()
    {
        WindowTitle = "コンボボックス";

        InitUI ();

        Move (100, 100);
        Show ();
    }

    public void InitUI ()
    {
        QLabel label = new QLabel ("都道府県リスト");
        QComboBox combo = new QComboBox (this);

        label.SetSizePolicy (QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Preferred);
        combo.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred);

        List prefList = new List (new string[] {
            "北海道", "青森県", "岩手県", "宮城県", "秋田県", "山形県", "福島県", "茨城県", "栃木県",
            "群馬県", "埼玉県", "千葉県", "東京都", "神奈川県", "山梨県", "長野県", "新潟県", "富山県",
            "石川県", "福井県", "岐阜県", "静岡県", "愛知県", "三重県", "滋賀県", "京都府", "大阪府",
            "兵庫県", "奈良県", "和歌山県", "鳥取県", "島根県", "岡山県", "広島県", "山口県", "徳島県",
            "香川県", "愛媛県", "高知県", "福岡県", "佐賀県", "長崎県", "熊本県", "大分県", "宮崎県",
            "鹿児島県", "沖縄県"
        });

        foreach (string pref in prefList) {
            combo.AddItem (pref);
        }

        Connect (combo, SIGNAL ("activated(QString)"), this, SLOT ("OnActivated(QString)"));

        QHBoxLayout hbox = new QHBoxLayout (this);
        hbox.AddWidget (label);
        hbox.AddWidget (combo);
    }

    [Q_SLOT]
    public void OnActivated (string text)
    {
        Console.WriteLine (text + "が選択されました。");
    }

    [STAThread]
    public static int Main (String[] args)
    {
        new QApplication (args);
        new QyotoApp ();
        return QApplication.Exec ();
    }
}

コンパイルおよび実行例を以下に示します。

$ mcs combobox.cs -pkg:qyoto
$ mono combo.exe
岩手県が選択されました。
福島県が選択されました。

参考サイト

  1. C# Qyoto tutorial
  2. Qyoto: Main Page - Qyoto Documentation

2014-05-25

魅惑の Qyoto (4) - Buttons

Qyoto (Qt) を用いたボタン類のウィジェットを紹介します。Signal/Slot の使い方についてですが、参考文献 1 で紹介しているやり方ではコンパイルできなかったため、違うやり方をしています。この部分は改善の余地がありそうだということをご了承下さい。

まず、Fedora 20 における Mono / Qyoto の開発環境の主要なパッケージですが、前回と同じく以下の通りです。

  • mono-core-3.4.0-2.fc20.x86_64
  • qt-4.8.6-5.fc20.x86_64
  • qyoto-4.12.5-1.fc20.x86_64
  • qyoto-devel-4.12.5-1.fc20.x86_64

プッシュボタン

プッシュボタン QPushButton は Hello World! でも使ったウィジェットですが、再度紹介します。ボタンをマウスでクリックすると、イベント clicked() などが発生して、そのイベントに対応した処理をおこなうウィジェットです。

List: pushbutton.cs
using System;
using Qyoto;

/**
 * ZetCode Qyoto C# tutorial
 *
 * This program creates a quit
 * button. When we press the button,
 * the application terminates. 
 *
 * @author Jan Bodnar
 * website zetcode.com
 * last modified October 2012
 * 
 * modified by Fuhito Suguri
 * last modified 25-May-2014
 */


public class QyotoApp : QWidget
{
    public QyotoApp ()
    {
        WindowTitle = "ボタン";

        InitUI ();
        Move (100, 100);
        Show ();
    }

    public void InitUI ()
    {    
        QPushButton but1 = new QPushButton ("ボタンA");
        QPushButton but2 = new QPushButton ("ボタンB");
        QPushButton but3 = new QPushButton ("ボタンC");

        but1.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        but2.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        but3.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);

        Connect (but1, SIGNAL ("clicked()"), this, SLOT ("OnClicked()"));
        Connect (but2, SIGNAL ("clicked()"), this, SLOT ("OnClicked()"));
        Connect (but3, SIGNAL ("clicked()"), this, SLOT ("OnClicked()"));

        QVBoxLayout vbox = new QVBoxLayout (this);
        vbox.AddWidget (but1);
        vbox.AddWidget (but2);
        vbox.AddWidget (but3);
    }

    [Q_SLOT]
    public void OnClicked ()
    {
        QPushButton b = (QPushButton)Sender ();
        Console.WriteLine (Sender () + ":" + b.Text + "がクリックされました。");
    }

    [STAThread]
    public static int Main (String[] args)
    {
        new QApplication (args);
        new QyotoApp ();
        return QApplication.Exec ();
    }
}

コンパイルおよび実行例を以下に示します。

$ mcs pushbutton.cs -pkg:qyoto
$ mono pushbutton.exe
Qyoto.QPushButton:ボタンAがクリックされました。
Qyoto.QPushButton:ボタンBがクリックされました。
Qyoto.QPushButton:ボタンCがクリックされました。

チェックボックス

チェックボックス QCheckBox は、特定の項目のオンとオフ(二値)を切り替えるために用いられるウィジェットで、オンとオフの状態が保持されます。

List: checkbox.cs
using System;
using Qyoto;

/**
 * ZetCode Qyoto C# tutorial
 *
 * This program creates a quit
 * button. When we press the button,
 * the application terminates. 
 *
 * @author Jan Bodnar
 * website zetcode.com
 * last modified October 2012
 * 
 * modified by Fuhito Suguri
 * last modified 25-May-2014
 */


public class QyotoApp : QWidget
{
    public QyotoApp ()
    {
        WindowTitle = "チェックボックス";

        InitUI ();
        Move (100, 100);
        Show ();
    }

    public void InitUI ()
    {    
        QCheckBox chk1 = new QCheckBox ("チェックボックスA");
        QCheckBox chk2 = new QCheckBox ("チェックボックスB");
        QCheckBox chk3 = new QCheckBox ("チェックボックスC");

        chk1.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        chk2.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        chk3.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);

        Connect (chk1, SIGNAL ("clicked()"), this, SLOT ("OnClicked()"));
        Connect (chk2, SIGNAL ("clicked()"), this, SLOT ("OnClicked()"));
        Connect (chk3, SIGNAL ("clicked()"), this, SLOT ("OnClicked()"));

        QVBoxLayout vbox = new QVBoxLayout (this);
        vbox.AddWidget (chk1);
        vbox.AddWidget (chk2);
        vbox.AddWidget (chk3);
    }

    [Q_SLOT]
    public void OnClicked ()
    {
        string statusMsg;
        QCheckBox c = (QCheckBox)Sender ();
        if (c.Checked) {
            statusMsg = "オン";
        } else {
            statusMsg = "オフ";
        }
        Console.WriteLine (Sender () + ":" + c.Text + "が" + statusMsg + "になりました。");
    }

    [STAThread]
    public static int Main (String[] args)
    {
        new QApplication (args);
        new QyotoApp ();
        return QApplication.Exec ();
    }
}

コンパイルおよび実行例を以下に示します。

$ mcs checkbox.cs -pkg:qyoto
$ mono checkbox.exe
Qyoto.QCheckBox:チェックボックスAがオンになりました。
Qyoto.QCheckBox:チェックボックスBがオンになりました。
Qyoto.QCheckBox:チェックボックスCがオンになりました。
Qyoto.QCheckBox:チェックボックスAがオフになりました。
Qyoto.QCheckBox:チェックボックスBがオフになりました。

ラジオボタン

ラジオボタン QRadioButton は、複数の項目の中から 1 つだけ選択させるために用いられるウィジェットです。Qt の場合、親ウィジェットが同じであれば複数のラジオボタンは同じグループとして扱われます。同じ親の下で、複数のラジオボタンを複数のグループで管理したい場合には、QButtonGroup でグループを区別します。以下の例ではラジオボタンA、B、Cと、ラジオボタンD、Eを別のグループとして扱っています。

List: radiobutton.cs
using System;
using Qyoto;

/**
 * ZetCode Qyoto C# tutorial
 *
 * This program creates a quit
 * button. When we press the button,
 * the application terminates. 
 *
 * @author Jan Bodnar
 * website zetcode.com
 * last modified October 2012
 * 
 * modified by Fuhito Suguri
 * last modified 25-May-2014
 */


public class QyotoApp : QWidget
{
    public QyotoApp ()
    {
        WindowTitle = "ラジオボタン";

        InitUI ();
        Move (100, 100);
        Show ();
    }

    public void InitUI ()
    {    
        QButtonGroup g1 = new QButtonGroup ();
        QButtonGroup g2 = new QButtonGroup ();

        QRadioButton rb1 = new QRadioButton ("ラジオボタンA");
        QRadioButton rb2 = new QRadioButton ("ラジオボタンB");
        QRadioButton rb3 = new QRadioButton ("ラジオボタンC");
        QRadioButton rb4 = new QRadioButton ("ラジオボタンD");
        QRadioButton rb5 = new QRadioButton ("ラジオボタンE");

        rb1.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        rb2.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        rb3.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);            

        Connect (rb1, SIGNAL ("clicked()"), this, SLOT ("OnClicked()"));
        Connect (rb2, SIGNAL ("clicked()"), this, SLOT ("OnClicked()"));
        Connect (rb3, SIGNAL ("clicked()"), this, SLOT ("OnClicked()"));
        Connect (rb4, SIGNAL ("clicked()"), this, SLOT ("OnClicked()"));
        Connect (rb5, SIGNAL ("clicked()"), this, SLOT ("OnClicked()"));

        g1.AddButton (rb1, 1);
        g1.AddButton (rb2, 2);
        g1.AddButton (rb3, 3);
        g2.AddButton (rb4, 4);
        g2.AddButton (rb5, 5);

        QVBoxLayout vbox = new QVBoxLayout (this);
        vbox.AddWidget (rb1);
        vbox.AddWidget (rb2);
        vbox.AddWidget (rb3);
        vbox.AddWidget (rb4);
        vbox.AddWidget (rb5);
    }

    [Q_SLOT]
    public void OnClicked ()
    {
        QRadioButton r = (QRadioButton)Sender ();
        Console.WriteLine (Sender () + ":" + r.Text + "がオンになりました。");
    }

    [STAThread]
    public static int Main (String[] args)
    {
        new QApplication (args);
        new QyotoApp ();
        return QApplication.Exec ();
    }
}

コンパイルおよび実行例を以下に示します。

$ mcs radiobutton.cs -pkg:qyoto
$ mono radiobutton.exe
Qyoto.QRadioButton:ラジオボタンAがオンになりました。
Qyoto.QRadioButton:ラジオボタンBがオンになりました。
Qyoto.QRadioButton:ラジオボタンCがオンになりました。
Qyoto.QRadioButton:ラジオボタンDがオンになりました。
Qyoto.QRadioButton:ラジオボタンEがオンになりました。

参考サイト

  1. C# Qyoto tutorial
  2. Qyoto: Main Page - Qyoto Documentation

2014-05-24

魅惑の Qyoto (3) - Label

Qyoto (Qt) を用いたウィジェットを紹介していきますが、まだ Qt の Signal/Slot の理解が十分ではないので、今回は文字を表示するだけのラベルを紹介します。

Fedora 20 における Mono / Qyoto の開発環境の主要なパッケージは、前回と同じく以下の通りです。

  • mono-core-3.4.0-2.fc20.x86_64
  • qt-4.8.6-5.fc20.x86_64
  • qyoto-4.12.5-1.fc20.x86_64
  • qyoto-devel-4.12.5-1.fc20.x86_64

ラベル

ラベル QLabel は、文字列(あるいは画像)を表示するウィジェットです。

List: label.cs
using System;
using Qyoto;

/**
 * ZetCode Qyoto C# tutorial
 *
 * This program uses QLabel to 
 * show lyrics of a song.
 *
 * @author Jan Bodnar
 * website zetcode.com
 * last modified October 2012
 * 
 * modified by Fuhito Suguri
 * laste modified 24-May-2014
 */

public class QyotoApp : QWidget
{
    public QyotoApp ()
    {
        WindowTitle = "雨ニモマケズ";

        InitUI ();

        Move (100, 100);
        Show ();
    }

    public void InitUI ()
    {
        string text = @"雨ニモマケズ
風ニモマケズ
雪ニモ夏ノ暑サニモマケヌ
丈夫ナカラダヲモチ
慾ハナク
決シテ瞋ラズ
イツモシヅカニワラッテヰル
一日ニ玄米四合ト
味噌ト少シノ野菜ヲタベ
アラユルコトヲ
ジブンヲカンジョウニ入レズニ
ヨクミキキシワカリ
ソシテワスレズ
野原ノ松ノ林ノ蔭ノ
小サナ萓ブキノ小屋ニヰテ
東ニ病気ノコドモアレバ
行ッテ看病シテヤリ
西ニツカレタ母アレバ
行ッテソノ稲ノ朿ヲ負ヒ
南ニ死ニサウナ人アレバ
行ッテコハガラナクテモイヽトイヒ
北ニケンクヮヤソショウガアレバ
ツマラナイカラヤメロトイヒ
ヒドリノトキハナミダヲナガシ
サムサノナツハオロオロアルキ
ミンナニデクノボートヨバレ
ホメラレモセズ
クニモサレズ
サウイフモノニ
ワタシハナリタイ";

        QLabel label = new QLabel (text);
        label.Font = new QFont (null, 8);
        label.SetSizePolicy (QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);

        QVBoxLayout vbox = new QVBoxLayout (this);
        vbox.AddWidget (label);
    }

    [STAThread]
    public static int Main (String[] args)
    {
        new QApplication (args);
        new QyotoApp ();
        return QApplication.Exec ();
    }
}

フォントの設定をしている QFont では、日本語フォントを制御する確認ができていないので、とりあえずフォントを null にしてサイズだけ指定しています。

コンパイルおよび実行例を以下に示します。

$ mcs label.cs -pkg:qyoto
$ mono label.exe


参考サイト

  1. C# Qyoto tutorial
  2. Qyoto: Main Page - Qyoto Documentation

2014-05-15

魅惑の Qyoto (2) - Layout

Qyoto (Qt) でウィジェットを配置するには、Hello Wold! で紹介したサンプルのように絶対座標を指定する方法の他に、レイアウトマネージャを使う方法があります。レイアウトには「ボックスレイアウト」「グリッドレイアウト」「フォームレイアウト」そして「スタックトレイアウト」の四種類がありますが、その内最初の 2 つを使ってウィジェットを配置するサンプルを紹介します。

ここでは二種類のサンプルを紹介しますが、どちらもベタなコーディングで申し訳ありません(もう少し繰り返しを無くしたすっきりしたコーディングにしたいのですが、できていません)。

Fedora 20 における Mono / Qyoto の開発環境の主要なパッケージは、前回と同じく以下の通りです。

  • mono-core-3.4.0-2.fc20.x86_64
  • qt-4.8.6-5.fc20.x86_64
  • qyoto-4.12.5-1.fc20.x86_64
  • qyoto-devel-4.12.5-1.fc20.x86_64

ボックスレイアウト

縦方向 (QVBoxLayout) あるいは横方向 (QHBoxLayout) にウィジェットを配置するレイアウトマネージャです。レイアウトマネージャを組み合わせて、縦横にウィジェットを配置することができます。

参考サイト 1. に掲載されているサンプルをベースにしたボックスレイアウトのサンプルを示します。

List: boxlayout.cs
using System;
using Qyoto;

/**
 * ZetCode Qyoto C# tutorial
 *
 * In this program, use box layouts
 * to position two buttons in the
 * bottom right corner of the window.
 *
 * @author Jan Bodnar
 * website zetcode.com
 * last modified October 2012
 *
 * modified by Fuhito Suguri
 * last modified 14-May-2014
 */

public class QyotoApp : QWidget 
{
    public QyotoApp() 
    {
        WindowTitle = "BoxLayout";

        InitUI();

        Move(300, 300);
        Show();
    }

    void InitUI() 
    {    
        QPushButton but_1 = new QPushButton("1", this);
        QPushButton but_2 = new QPushButton("2", this);
        QPushButton but_3 = new QPushButton("3", this);
        QPushButton but_4 = new QPushButton("4", this);
        QPushButton but_5 = new QPushButton("5", this);

        but_1.SetSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        but_2.SetSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        but_3.SetSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        but_4.SetSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        but_5.SetSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);

        QVBoxLayout vbox = new QVBoxLayout(this);
        QHBoxLayout hbox1 = new QHBoxLayout();
        QHBoxLayout hbox2 = new QHBoxLayout();

        hbox1.AddWidget(but_1);
        hbox1.AddWidget(but_2);
        hbox1.AddWidget(but_3);

        hbox2.AddWidget(but_4);
        hbox2.AddWidget(but_5);

        vbox.AddLayout(hbox1);
        vbox.AddLayout(hbox2);
    }

    [STAThread]
    public static int Main(String[] args) 
    {
        new QApplication(args);
        new QyotoApp();
        return QApplication.Exec();
    }
}

コンパイルおよび実行例を以下に示します。

$ mcs boxlayout.cs -pkg:qyoto
$ mono boxlayout.exe


グリッドレイアウト

QGridLayout は、格子状にウィジェットを配置するレイアウトマネージャです。

次に、同じく参考サイト 1. に掲載されているサンプルをベースにした QGridLayout のサンプルを示します。

List: gridlayout.cs
using System;
using Qyoto;

/**
 * ZetCode Qyoto C# tutorial
 *
 * In this program, use the QGridLayout manager
 * to create a New Folder example.
 *
 * @author Jan Bodnar
 * website zetcode.com
 * last modified October 2012
 *
 * modified by Fuhito Suguri
 * last modified 14-May-2014
 */

public class QyotoApp : QWidget 
{
    public QyotoApp() 
    {
        WindowTitle = "GridLayout";

        InitUI();

        Move(300, 300);
        Show();
    }

    void InitUI() 
    {
        QGridLayout grid = new QGridLayout(this);

        QPushButton but_1 = new QPushButton("1", this);
        QPushButton but_2 = new QPushButton("2", this);
        QPushButton but_3 = new QPushButton("3", this);
        QPushButton but_4 = new QPushButton("4", this);
        QPushButton but_5 = new QPushButton("5", this);

        but_1.SetSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        but_2.SetSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        but_3.SetSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        but_4.SetSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);
        but_5.SetSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding);

        grid.AddWidget(but_1, 0, 0);
        grid.AddWidget(but_2, 0, 1);
        grid.AddWidget(but_3, 0, 2);
        grid.AddWidget(but_4, 1, 0);
        grid.AddWidget(but_5, 1, 1, 1, 2);
    }

    [STAThread]
    public static int Main(String[] args) 
    {
        new QApplication(args);
        new QyotoApp();
        return QApplication.Exec();
    }
}

コンパイルおよび実行例を以下に示します。

$ mcs gridlayout.cs -pkg:qyoto
$ mono gridlayout.exe


参考サイト

  1. C# Qyoto tutorial
  2. Qyoto: Main Page - Qyoto Documentation

2014-05-14

魅惑の Qyoto (1) - Hello World!

Java のように、Linux 上で開発したプログラムを Windows でも動作させることができる開発環境を常に探索していますが、.Net/Mono もそのように利用できそうだと注目しています。

ただ GUI ライブラリに何を使うかが悩みの種です。C# については、Windows 上では .Net、Linux 上では Mono の開発環境を使えば良いと考えています。そういう考えに立って Windows と Linux の両方で利用できる GUI ライブラリを考えた場合、Linux 上での Mono / GTk# の組み合わせは問題ないのですが、Windows 上で Mono 抜きに .Net / GTk# の開発環境を構築する壁にぶつかります。

そこで wxWidgets の wx.Net や Qt の Qyoto などの .Net / Mono バインディングを調べてみたところ、Qyoto が Fedora で利用できることが判りましたので、とりあえず試してみました。

Fedora 20 における Mono / Qyoto の開発環境の主要なパッケージは以下の通りです。なお、Fedora 20 における Mono-3.4 系のパッケージの入手については、本記事の最後にある、参考サイト 1. を参照してください。

  • mono-core-3.4.0-2.fc20.x86_64
  • qt-4.8.6-5.fc20.x86_64
  • qyoto-4.12.5-1.fc20.x86_64
  • qyoto-devel-4.12.5-1.fc20.x86_64

参考サイト 2. に掲載されているサンプルをベースにして、簡単な Hello World! プログラムで動作確認をしました。

List: hello-qyoto.cs
using System;
using Qyoto;

/**
 * ZetCode Qyoto C# tutorial
 *
 * This program creates a quit
 * button. When we press the button,
 * the application terminates. 
 *
 * @author Jan Bodnar
 * website zetcode.com
 * last modified October 2012
 *
 * modified by Fuhito Suguri
 * last modified 13-May-2014
 */


public class QyotoApp : QWidget 
{
    public QyotoApp() 
    {
        WindowTitle = "mono/qyoto";

        InitUI();

        Resize(180, 60);
        Move(300, 300);
        Show();
    }

    public void InitUI() 
    {    
        QPushButton but = new QPushButton("こんにちは、世界!", this);

        Connect(but, SIGNAL("clicked()"), qApp, SLOT("quit()"));
        but.SetGeometry(10, 10, 160, 40);
    }

    [STAThread]
    public static int Main(String[] args) 
    {
        new QApplication(args);
        new QyotoApp();
        return QApplication.Exec();
    }
}

Mono によるコンパイルおよび実行例を以下に示します。

$ mcs hello-qyoto.cs -pkg:qyoto
$ mono hello-qyoto.exe

参考サイト 2. に掲載されているサンプルをざっとみたところ、これなら自分でもできそうだと思いましたので、そこに掲載されているサンプルをベースに、今後何回かに分けて Qyoto を使った Mono のプログラミング例を紹介していく予定です 4.。

ちなみに、Windows 上での実行ですが、まだ成功していません。これについても調査結果を紹介していきたいと考えています。

参考サイト

  1. bitWalk's: Mono で GUI プログラミング - Mono 3.4 を試す
  2. C# Qyoto tutorial
  3. Development/Languages/Qyoto - KDE TechBase
  4. bitWalk's: 魅惑の Qyoto

2014-05-11

Mono で GUI プログラミング - Mono 3.4 を試す

Fedora 20 で Mono 3.4 を試してみましたので、備忘録的にまとめておきます。

レポジトリの追加

Fedora 20 を導入した時、クリーンインストールをしました。その際、monodevelop を yum でインストールしてあります。当然その際、必要な関連パッケージもインストールされています。

この状態で、参考サイト [1] のレポジトリ情報 fedora-monodevelop.repo を、ルート権限で /etc/yum.repos.d/ にこのレポジトリ情報を追加(保存)して、yum update で MonoDevelop 4.22 および Mono 3.4.0 に更新しました。

最初、サンプルプログラムを正常にコンパイル・実行できなかったので、試行錯誤の結果、下記のパッケージを追加インストールしています。

  • libgdiplus-devel
  • mono-data-oracle
  • gtk-sharp2-devel

再び Hello World プログラム

いまさら Hello World プログラムというのもなんですが、簡単なプログラムで動作確認をします。

List: hello-winforms.cs
using System;
using System.Windows.Forms;
 
class HelloWorldApp {
    public static void Main() {
        MessageBox.Show("こんにちは、世界!", "mono");
    }
}

以前は mscorlib のバージョンによって gmcs, smcs, dmcs と複数のコンパイルコマンドが存在していましたが、参考サイト [2] によると、コンパイルコマンドは、Mono 2.11 以降 mcs に統合されたということですのでこれをコンパイルに使います。

$ mcs hello-winforms.cs -pkg:dotnet -target:winexe
$ mono hello-winforms.exe
$

コンパイルの際、-target:winexe を省略すると、Windows 上で実行した時に、コマンドプロンプトのウィンドウも表示されます。

以下は hello-winforms.exe を Windows 7 (32bit) へコピーして実行した例です。

Mono の標準の GUI Toolkit である GTk# を利用した場合の Hello World プログラムを下記に示しました。

List: hello-gtksharp.cs
using Gtk;
using System;
 
class Hello {
 
    static void Main()
    {
        Application.Init ();

        // Set up a button object.
        Button btn = new Button ("こんにちは、世界!");
        // when this button is clicked, it'll run hello()
        btn.Clicked += new EventHandler (hello);

        Window window = new Window ("mono");
        // when this window is deleted, it'll run delete_event()
        window.DeleteEvent += delete_event;

        // Add the button to the window and display everything
        window.Add (btn);
        window.ShowAll ();

        Application.Run ();
    }

    // runs when the user deletes the window using the "close
    // window" widget in the window frame.
    static void delete_event (object obj, DeleteEventArgs args)
    {
        Application.Quit ();
    }

    // runs when the button is clicked.
    static void hello (object obj, EventArgs args)
    {
        Console.WriteLine("こんにちは、世界!");
        Application.Quit ();
    }
}
$ mcs hello-gtksharp.cs -pkg:gtk-sharp-2.0
$ mono hello-gtksharp.exe
こんにちは、世界!
$ 

Windows と Linux 両方で動作することに興味があるのですが、今さら Windows Forms (winforms) に力を入れるのはやや時代遅れな気がしないでもありません。むしろ GTk# の環境を Windows でも使えるようにして GTk# の GUI を Linux と Windows 両方で利用できる方が価値が高いような気がしています。うまくいくようであれば、本ブログで報告します。

【注記】その後、Qt の C# バインディング Qyoto に注目して調べています。魅惑の Qyoto を参照してください。


参考サイト

  1. http://repos.fedorapeople.org/repos/elsupergomez/monodevelop/fedora-monodevelop.repo
  2. CSharp Compiler - Mono

2014-05-09

Mono で GUI プログラミング - Fedora 21 と Mono 3.4

Mono は、Ecma 標準に準じた .NET Framework 互換の環境を実現するためのオープンソースのプロジェクトです。

Fedora でも Mono を利用できますが、永らく Mono のバージョンは 2.10 のままでした。しかし、下記プロジェクトサイトによると、2014 年 10 月頃に予定されている次回のリリース Fedora 21(コードネームなし)では、一気に Mono のバージョンが 3.4 になるようです。

このサイトによると、Fedora 19, 20 を使っている開発者向けにも Mono 3.4 および Monodevelop 4.x.x 系を試せるように Mono 専用のレポジトリが用意されています(下記)。

早速 /etc/yum.repos.d/ にこのレポジトリ情報を追加(保存)して、yum update で Mono を 3.4.0 に更新しました。後日、情報をまとめて本ブログに掲載します。

2010-08-14

CLR のバージョンの取得

Mono で開発したアプリケーションを Windows でも実行することを想定しているので、ビルド時と実行時の CLR のバージョンを把握できる方法があればなにかと便利です。情報がないか探したところ、下記の参考サイト [1] にぴったりな情報があったので、早速試してみました。

using System;
using System.Reflection;
using System.Runtime.InteropServices;

namespace bitWalk
{
class VerTest
{
public static void Main (string[] args)
{
string clrVersionBuildtime = Assembly.GetExecutingAssembly ().ImageRuntimeVersion;
Console.WriteLine ("built CLR version: " + clrVersionBuildtime);
string clrVersionRuntime = RuntimeEnvironment.GetSystemVersion();
Console.WriteLine ("runtime CLR version: " + clrVersionRuntime);
}
}
}

プログラム名は VerTest.exe です。Linux の端末エミュレータ上で実行してみると、CLR のバージョンはどちらも v2.0.50727 でした。

Wine 上だと、実行バージョンが変わるかもしれないと期待して試してみましたが、両方とも v2.0.50727 でした。

それでは Windows 上であれば、と期待して実行してみましたが、結果はやはり同じ v2.0.50727 です。

なんとなく納得できないので、今度は、Windows XP 上の Visual Studio 2010 Express で同じソースを VerTest_VS.exe としてコンパイルして実行してみました。Windows 上では v4.0.30319 と表示されています。

Linux / Mono 上で実行すると、今度は確かに実行 CLR のバージョンが変わりました (v1.1.4322)。

Mono でコンパイルしたプログラムで直接確認できませんでしたが、機能的には確認できたので、とりあえず納得です。

参考サイト


[1] @IT:.NET TIPS ビルド時および実行時のCLRバージョンを取得するには? - C# VB.NET
[2] @IT:.NET TIPS サイド・バイ・サイドによりCLRバージョンを指定するには?
 

2010-08-13

Math.NET Numerics

C# で手軽に使える、オープンソースの数値計算ライブラリがないか探してみました。演算速度のパフォーマンスを求める場合は、C# 以外の環境を検討する必要がありますが、それにしても「ある程度」の数値計算ぐらいは C# で開発していれば C# で処理したいですし、その「ある程度」がどの程度なのかも評価しなければなりません。

Mono プロジェクトの、ライブラリを紹介しているページの Math の項目に、dnAnalytics というライブラリが紹介されていますが、調べてみると、当の dnAnalytics と、Math.NET Iridium という他の数値計算ライブラリを開発するプロジェクトが一緒になり、現在 Math.NET Numerics というプロジェクトになっていることが判りました。ライセンスは MIT/X11 になっています。(ちなみに、以前の Math.NET Iridium は LGPL でした。)

早速、ダウンロードのサイトから MathNet.Numerics.2010.1.28.762.zip をダウンロードして、MonoDevelop で簡単なサンプルを動かしてみました。最初、Math.NET Numerics Code Samples - Math.NET Numerics Documentation にあるサンプルをそのままビルドしようとしましたが、以前の Math.NET Iridium 用のサンプルのままで、現時点で存在しないメソッドを使っていたので、少し直しました。動作確認だけだったので面白いサンプルではありません。

ドキュメントもある程度揃っているので、簡単なサンプルを作るなどして、使い勝手を評価していこうと考えています。

参考サイト


[1] Math.NET Numerics
[2] Math.NET on Mono (and Linux) - Math.NET Numerics Documentation
注)以前の Math.NET Iridium の時のままですが同じことですので読み替えてください。
 

2010-08-12

Mono で GUI プログラミング (4)

今週は、お盆休みで時間に余裕があるので、インターネット上で入手できる .NET の GUI アプリケーションの C# ソースがあれば、ダウンロードして mono でビルドできるかどうか試してばかりいます。

今回は、Yukun's Blog で紹介されていたサンプルをビルドしてみました。サンプルは、以下の URL で紹介されている「キッチンタイマー」です。

・C#でキッチンタイマーを作ろう - Yukun's Blog

このサイトで紹介されているコードは、FormTimer.cs と FormTimer.Designer.cs の二種類です。これに、次のメインメソッドを記述した FormTimer.Main.cs を加えてビルドしました。

using System;
using System.Windows.Forms;

namespace Sample
{
class Program
{
static void Main ()
{
Application.Run (new FormTimer ());
}
}
}

複数のソースファイルから、単一の実行ファイルをビルドするには、-out オプションで出力ファイル名を指定して、ビルドするソースファイルを列挙します。

$ gmcs -pkg:dotnet -target:winexe -out:FormTimer.exe FormTimer.Designer.cs FormT
imer.Main.cs FormTimer.cs

$ mono FormTimer.exe &

Linux での実行例

MonoDevelop の利用


まともなアプリケーションを作ろうとすると、ソースコードは長大なファイルになるか、あるいは、いくつもの分割されたファイルになります。上記の例のように 3 つぐらいのソースコードであれば我慢ができますが、それ以上になると管理しきれなくなります。そんなとき IDE を使うと便利です。Mono 用の IDE に MonoDevelop があります。Fedora だと yum コマンドでインストールできます。以下は、MonoDevelop (2.2.2) で、上記のサンプルを編集している例です。

 

2010-08-08

Mono で GUI プログラミング (3)

Excel のようなスプレッドシートを使いたければ、それこそ Excel とか OpenOffice.org Calc を使えば良いのですが、GUI アプリケーションでちょっとしたスプレッドシートを使いたい時があります。

DataGridView コントロールを利用した例を [1] で見つけたので、それを少し加工したサンプル DataGridViewTest.cs を紹介します。

///////////////////////////////////////////////////////////////////////////////
// DataGridViewTest.cs - DataGridView コントロールを使ったサンプル
//
// 参考/引用:
// Koders Code Search: Test.cs - C#
// modified by Fuhito Suguri, 7-Aug-2010
///////////////////////////////////////////////////////////////////////////////

using System;
using System.Windows.Forms;
using System.Drawing;
//
namespace bitWalk
{
public class Program
{
public static void Main (string[] args) {
DataGridViewTest p = new DataGridViewTest();
p.SampleDataShow();
Application.Run(p);
}
}
//
public class DataGridViewTest : Form {
DataGridView myDataGridView;
/////////////////////////////////////////////////////////////////////////////
// DataGridViewTest constructor

public DataGridViewTest () {
this.Width = 400;
this.Height = 200;
this.Text = "DataGridViewTest";
//
this.Closed += OnClosed;
//
myDataGridView = new DataGridView();
myDataGridView.ColumnCount = 5;
//
DataGridViewCellStyle style1 = myDataGridView.ColumnHeadersDefaultCellStyle;
style1.BackColor = Color.Navy;
style1.ForeColor = Color.White;
style1.Font = new Font(myDataGridView.Font, FontStyle.Bold);
//
DataGridViewCellStyle style2 = new DataGridViewCellStyle();
style2.BackColor = Color.Beige;
style2.ForeColor = Color.Brown;
style2.Font = new Font("Arial", 8);
myDataGridView.AlternatingRowsDefaultCellStyle = style2;
//
myDataGridView.EditMode = DataGridViewEditMode.EditOnEnter;
myDataGridView.Name = "myDataGridView";
myDataGridView.AutoSizeRowsMode =
DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders;
myDataGridView.ColumnHeadersBorderStyle =
DataGridViewHeaderBorderStyle.Raised;
myDataGridView.CellBorderStyle = DataGridViewCellBorderStyle.Single;
myDataGridView.GridColor = SystemColors.ActiveBorder;
myDataGridView.Columns[0].Name = "リリース日";
myDataGridView.Columns[1].Name = "トラック";
myDataGridView.Columns[1].DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleCenter;
myDataGridView.Columns[2].Name = "タイトル";
myDataGridView.Columns[3].Name = "アーティスト";
myDataGridView.Columns[4].Name = "アルバム";
myDataGridView.Columns[4].DefaultCellStyle.Font =
new Font(DataGridView.DefaultFont, FontStyle.Italic);
myDataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
myDataGridView.MultiSelect = false;
myDataGridView.BackgroundColor = Color.Honeydew;
myDataGridView.Dock = DockStyle.Fill;
myDataGridView.CellFormatting +=
new DataGridViewCellFormattingEventHandler(MyDataGridViewCellFormatting);
myDataGridView.CellParsing +=
new DataGridViewCellParsingEventHandler(MyDataGridViewCellParsing);
myDataGridView.CellValidating +=
new DataGridViewCellValidatingEventHandler(MyDataGridViewCellValidating);
this.Controls.Add(myDataGridView);
//
DataGridViewColumnCollection columns = this.myDataGridView.Columns;
columns[0].DisplayIndex = 3;
columns[1].DisplayIndex = 4;
columns[2].DisplayIndex = 0;
columns[3].DisplayIndex = 1;
columns[4].DisplayIndex = 2;
}
// Populating the DataGrid
public void SampleDataShow () {
DataGridViewRowCollection rows = this.myDataGridView.Rows;
rows.Add(new string[] {"11/22/1968", "29", "Revolution 9", "Beatles", "The Beatles [White Album]"});
rows.Add(new string[] {"4/4/1960", "6", "Fools Rush In", "Frank Sinatra", "Nice 'N' Easy"});
rows.Add(new string[] {"11/11/1971", "1", "One of These Days", "Pink Floyd", "Meddle"});
rows.Add(new string[] {"4/4/1988", "7", "Where Is MY Mind?", "Pixies", "Surfer Rosa"});
rows.Add(new string[] {"5/1981", "9", "Can't Find My Mind", "Cramps", "Psychedelic Jungle"});
rows.Add(new string[] {"6/10/2003", "13", "Scatterbrain. (As Dead As Leaves.)", "Radiohead", "Hail to the Thief"});
rows.Add(new string[] {"6/30/1992", "3", "Dress", "P J Harvey", "Dry"});
}
//
void MyDataGridViewCellValidating (object sender, EventArgs args) {
}
//
void MyDataGridViewCellParsing (object sender, EventArgs args) {
}
//
void MyDataGridViewCellFormatting (object sender, EventArgs args) {
}
//
void OnClosed (object o, EventArgs e) {
Console.WriteLine("Closed!");
Application.Exit();
}
}
}
// END PROGRAM

Fedora 上でのビルド、および実行は次のようにします。

$ gmcs -pkg:dotnet -target:winexe DataGridViewTest.cs
$ mono DataGridViewTest.exe &


Windows XP へ DataGridViewTest.exe をコピーして、(ダブルクリックして)実行した結果を以下に示しました。

アプリケーションで使用するスプレッドシートでも、Excel の機能すべてが必要ではありませんが、それでも、ほとんどの場合で必要になる共通な基本機能があります。これらを用意してある程度汎用性があるクラスを用意しておけば、利用価値が高くなります。

参考サイト


[1] Koders Code Search: Test.cs - C#