Mono」タグアーカイブ

out

using System;

namespace test_cs1
{
    class MainClass
    {
        private static void Seifuku(out string a, out string b)
        {
            a = "水色の";
            b = "セーラー服";
        }
        public static void Main(string[] args)
        {
            string s = "紺色の";
            string t = "ブレザー";
            Seifuku(out s, out t);
            Console.WriteLine(s + t);
            Console.Read(); //閉じないように
        }
    }
}

なんだ、ref で string を参照渡しがどーのとか以前書いたがこうすればイイんだ。
引数指定の両方に out を付けるだけね、ふんふん。

この方法ならば C/C++ っぽく書ける、無理に C/C++ っぽくする必要は無いと思うけど。
どうしても戻り値に string を使いたくない場合があるのよ。
とにかくコレで IniFile8 C# 版も同様の処理が可能になるな。

常識だったりして…
個人的には yield return 並に衝撃だったんだけど…
C# はまだ始めて三ヶ月なのでまあこんな感じです。

#include <stdio.h>

void Seifuku(char *a, char *b)
{
	sprintf_s(a, 256, "%s", "水色の");
	sprintf_s(b, 256, "%s", "セーラー服");
}
int main(int argc, char* argv[])
{
	char s[256];
	char t[256];
	sprintf_s(s, 256, "%s", "紺色の");
	sprintf_s(t, 256, "%s", "ブレザー");
	Seifuku(s, t);
	printf("%s%s\n", s, t);
	getchar(); //閉じないように
}

こんなコードに比べたら遙かに解りやすい構文だし。

試しに mono でもやってみたけど普通にコンパイル完了。
なるほど、C# 言語仕様は見事にトレースしているんだ。

つーか

Mono って StreamReader も foreach 文も Windows と全く同様に扱える。
それどころか Generic も同じように問題無く使える。
ココまで再現していると思わなかった、違うのは GUI 部分だけだ。
こりゃどっちでも使えるライブラリを作らなきゃ損って気分。

何をやろうとしているかは何となく解るでしょう。

大嘘を書いた

Mono での GUI 開発の続き。

オイラはアホウだった…

Gtk# 2.0 プロジェクトでとりあえずプロジェクトを作ると
MainWindow.cs ってファイルが作成されとるじゃないの!
このファイルをWクリックすれば普通に GUI 開発が…

DeleteEventHandler もリソース内で…自分で追加する必要は無かった。
気を取り直して、、、、、

コンテナから Fixed を選んでデザイナにD&D。
すると従来の Windows RAD 開発のような配置でウイジェットが置ける。
ウイジェットツリーで編集したいパーツを選んでプロパティからラベルとかを編集。
異様に CPU 負荷が高いんだが…仮想マシンなせいかもしれないけど。

イベントハンドラは「シグナル」のタブを選ぶ。

のイベントのトコに希望するハンドラ名を記述するわけだ。
Visual Studio のようにWクリックしても自動で名前は付けてくれない。
Ctrl+A で全選択して自分で書き込んでくだされですね。
でも書き込みさえ行えばソースやリソースへのへの追加は自動でやってくれる。

using System;
using Gtk;

public partial class MainWindow: Gtk.Window
{    
    public MainWindow (): base (Gtk.WindowType.Toplevel)
    {
        Build ();
    }
    
    protected void OnDeleteEvent (object sender, DeleteEventArgs a)
    {
        Application.Quit ();
        a.RetVal = true;
    }
    //↑までは最初から作成されている
    //上記操作でハンドラが作成されるので内容を自前で書く
    protected virtual void button1_Click (object sender, System.EventArgs e)
    {
        MessageDialog dlg = new MessageDialog(
            (Window)this,
            Gtk.DialogFlags.Modal,
            Gtk.MessageType.Info,
            Gtk.ButtonsType.Ok,
            "スカートも水色!\n復活希望!");
        dlg.Run();
        dlg.Destroy();
    }
}

これだけで良かったのね、ウソを書いてごめんなチャイ!

ちなみにハンドラ名を変更したい場合はシグナルの所で変更すれば自動反映される。
自動でハンドラ名を付けてくれない以外は Windows の開発と変わらないねコレ。

Gtk#

Gtk# とやらで Linux の GUI 作りを試してみる。
実体は思いっきりというか単なる Gtk+ のラッパーらしいんだが…

とりあえず Gtk# 2.0 プロジェクトを新規で作成する。
static void Main だけの雛形コードが作成された。
そのままビルドすればとりあえずウインドは表示されるようである。

とりあえずボタンを押すとメッセージを表示する初心者アプリでも。
色々探したが情報少なすぎ、見つけたコードを色々試してみる。

Gtk.MessageDialog 関数を使えばいいようだとまでは解ったのだが…
一番迷ったのは引数の一番最初に指定する Gtk.Window をどう指定するか。
それ以外はコード補完機能のおかげでなんとなく解ったがココでどうしても詰まる。

後で解ったんだけどメインの class では static メソッドは Main 一つにすべし!

GtkSharp – Mono

ココのスクリーンショットを見ると RAD での GUI デザインできそうなんだが…
方法が解らない、情報が全く見つからない、まあコードでなんとかしよう。

CodeProject: A google search application using Gtk#. Free source code and programming help

Glade なんてのがあるんだ。
「追加と削除」から Glade3 をインストール。
でもよく解らない…今回は下の方にあるコードを見てなんか作ってみよう。

using System;
using Gtk;
//using Glade; //後で

namespace gtkApp2
{
    class Test
    {
        private Window win;

        public static void Main (string[] args)
        {
            new Test(args);
        }
        public Test(string[] args)
        {
            Application.Init();
            win = new MainWindow();
            win.DeleteEvent += new DeleteEventHandler(win_DeleteEvent);
            Button btn = new Button();
            btn.Label = "水色の";
            btn.Clicked += new EventHandler(btn_Clicked);
            win.Add(btn);
            win.Show ();
            btn.Show();
            Application.Run ();
        }
        private void win_DeleteEvent(object o, DeleteEventArgs args)
        {
            Application.Quit();
            args.RetVal = true;
        }
        private void btn_Clicked(object sender, EventArgs e)
        {
            MessageDialog dlg = new MessageDialog(
                          this.win,
                          Gtk.DialogFlags.Modal,
                          Gtk.MessageType.Info,
                          Gtk.ButtonsType.Ok,
                          "セーラー服");
            dlg.Run();
            dlg.Destroy();
        }
    }
}

で、ウインドサイズに広がったボタンを押すとメッセージダイアログが出る。
というしょーもないアプリを作るのに三日も使った情けないプログラマーであった。

Gtk ってレイアウトという概念があるんだね。
ボタンがウインドサイズになった時に思わず「おまえは WPF か!」と思ったけど
よく考えたら Java にもレイアウタがあったっけか。

そうか、インターフェイスデザインはそういう方向に向かっているんだなぁと。
Windows も WPF でやっと時代に追いついたってことだね。

まあなんとか Gtk# はどういうもんか解ってきたぞと。

Ubuntu で C# と C++

まてよ、mono の実行エンジンはインストールされているのかな?
とりあえず Vista でコンソールアプリを作り Ubuntu に持って行って実行してみる。
java じゃないんだからコンソールでないと動くはずがない。

まあ結果は動く、軽く調べるとどうやら実行エンジンは標準搭載らしい。
標準状態では C 言語さえコンパイルできないんだから C# は当然ムリか。

Mono 1.9.1のインストール – Programming/Mono – 総武ソフトウェア推進所

なんかイッパイ入れなきゃいけないみたいですけど…
そういえば Visual Studio 2008 のインストールは二時間掛かったっけか。
たった二分でインストールできた mono Develop で同等なわけがない。

特に Linux の場合 GUI アプリは gtk+ か Qt とか様々なわけで。
Windows 版のようにまとめて一気にインストールはそりゃ無謀かと納得。

2008-02-03 – ままならない日記

とりあえず mono-gmcs だけをインストール。
結果はコンパイルできた、よしよし、後は気が向いたら(ぉい!)

ちなみに、コード補完は C# でしかやってくれない。
思わず Ctrl+Space を押して SCIM を…略。

それより知らなかったのだがソースコードは UTF-8 で保存されるんだね。
ローケルのとうりになるのか、こりゃ日本語の扱いが更に面倒そう。
だけどコードページ 932 (つまり Shift-JIS)の呪縛が無いのは嬉しいね。

ということは…

やはり search.ini なんかも普通に char 配列で読み書きできるわな。
Firefox も Opera も設定が全部 UTF-8 なわけだよ、よく解った。
Windows も…バイナリ配布が普通の Windows では無理だと解っているけど。

C# テストが目的だったけど C++ コンパイラとして使うのも悪くないなコレ。
続く…かもしれない。

Ubuntu で C#

ふと気がついた。
C# を勉強しているんだから Ubuntu に Main Page – MonoDevelop を入れてみよう。
Linux ではどう動くか見てみたい。

Vista じゃないから遅いと思うけど…JAVA も死ぬほど遅いし。

一応書くと .NET Framuwork 技術基盤 CLI の Linux 実装の一つである。
追加と削除(Synaptic)に普通にあるのが怖い。

普通に日本語化されとりました、恐るべし。

あれ?C++ もコンパイルできるのだろうか。
試してみよう、VS と同じようにソリューションを作って雛形をとりあえず。

んでもってコンパイル…エラー。
何一つ詳細が出ない、VC++ のワケワカなのもイヤだが全く出ないのもどうかと。

Ubuntu日本語フォーラム / gccやbinutils, make のインストール

つまり Ubuntu デスクトップにははコンパイラもヘッダも入っていないってわけ…
make install の儀式をやらなくなったので気がつかなかった…
まあ気を取り直して…追加と削除に無いんですけど…

$ sudo apt-get install build-essential

と勘(ぅぉい!)でやってみたら普通にインストール完了。
見事 C/C++ はコンパイルできるようになりました。

普通に C/C++ 用の IDE としても使えるみたい、これは嬉しい。
何故もっと有名にならないの?

Linux のコンパイルは端末というイメージがあったので今まで無視していた。
だけどこんな使える IDE があるのなら少しやってみようかなと感じた。
Eclipse でできるのは知っているけど…遅いもん。

いよいよ肝心な C#。

今度は gmcs とやらが無いんかい…次回へ続く。