粗茶でございます日本語 プログラミング 言語 「なでしこ」 大好き 

このページの記事目次 (tag: C# の検索結果)

total 2 pages  次のページ →  

スポンサーサイト

   ↑  --/--/-- (--)  カテゴリー: スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

(記事編集) http://nadesocha.blog.fc2.com/?overture" target="_new

--/--/-- | Comment (-) | ホーム | ↑ ページ先頭へ ↑ |

Excelプラグイン途中経過

   ↑  2011/01/29 (土)  カテゴリー: なでしこ全般
 Excel関係のプラグインをちまちまと作っていますが、いまのところここまでしかできていません。ひとつの命令をつくるたびに、いろいろとテストしていますので、結構時間がかかったりしています。
using System;
using System.Collections.Generic;
using System.Text;

using NakoPlugin;
using NakoExcel = Microsoft.Office.Interop.Excel;
using VBIDE = Microsoft.Vbe.Interop;

using System.Windows.Forms; //動作チェック用のダイアログ表示に使用

namespace NakoPluginOfficeExcel
{
public class NakoPluginOfficeExcel : INakoPlugin
{
//--- プラグインの宣言 ---
string _description = "エクセル命令 by 粗茶";
double _version = 1.0; //2011.1.7より作業開始
//--- プラグイン共通の部分 ---
public double TargetNakoVersion { get { return 2.0; } }
public bool Used { get; set; }
public string Name { get { return this.GetType().FullName; } }
public double PluginVersion { get { return _version; } }
public string Description { get { return _description; } }
//--- プラグインの初期化処理 ---
public void PluginInit(INakoInterpreter runner) { }
//--- プラグインの終了処理 ---
public void PluginFin(INakoInterpreter runner) { NakoExcelEnd(); }
//--- 変数の定義 ---
NakoExcel._Application xlApp; //Excelアプリケーション
NakoExcel.Workbooks xlBooks;
NakoExcel._Workbook xlBook;
NakoExcel.Sheets xlSheets;
NakoExcel._Worksheet xlSheet;
NakoExcel.Range xlRange;
VBIDE.VBComponents xlModules;

//--- 関数の定義 ---
public void DefineFunction(INakoPluginBank bank)
{
//エクセル
#region アプリケーション関係
//+アプリケーション
bank.AddFunc("エクセル起動", "FLAGで|FLAGに|FLAGへ", NakoVarType.Void, _xlStart, "エクセルを起動する。FLAG=1:可視、FLAG=0:不可視で起動。", "えくせるきどう");
bank.AddFunc("エクセル終了", "", NakoVarType.Void, _xlEnd, "エクセルを終了する。", "えくせるしゅうりょう");
bank.AddFunc("エクセル起動状態", "", NakoVarType.Int, _xlStarted, "エクセルが起動しているか確認する。1:起動している。0:起動していない。", "えくせるきどうじょうたい");
bank.AddFunc("エクセルバージョン", "", NakoVarType.String, _xlVer, "エクセルのバージョンを取得して返す。", "えくせるばーじょん");
bank.AddFunc("エクセル可視変更", "FLAGで|FLAGに|FLAGへ", NakoVarType.Void, _xlVisibleSet, "エクセルの可視を変更する。FLAG=1:可視、FLAG=0:不可視", "えくせるかしへんこう");
bank.AddFunc("エクセル可視状態", "", NakoVarType.Int, _xlVisibleGet, "エクセルの可視を取得して返す。1:可視、0:不可視。", "えくせるかしじょうたい");
bank.AddFunc("エクセル警告変更", "FLAGで|FLAGに|FLAGへ", NakoVarType.Void, _xlAlertSet, "エクセルの警告を変更する。FLAG=1:警告有り、FLAG=0:警告無視。", "えくせるけいこくへんこう");
bank.AddFunc("エクセル警告状態", "", NakoVarType.Int, _xlAlertGet, "エクセルの警告を取得して返す。1:警告有り、0:警告無視。", "えくせるけいこくじょうたい");
bank.AddFunc("エクセル窓変更", "STATEで|STATEに|STATEへ", NakoVarType.Void, _xlWindowStateSet, "エクセルのウインドウを最大化・最小化する。STATE=「最大化|最小化|標準」", "えくせるまどへんこう");
bank.AddFunc("エクセル窓状態", "", NakoVarType.String, _xlWindowStateGet, "エクセルのウインドウ状態を取得して返す。「最大化|最小化|標準」", "えくせるまどじょうたい");
bank.AddFunc("エクセルタイトル変更", "TITLEで|TITLEに|TITLEへ", NakoVarType.Void, _xlTitleSet, "エクセルのウインドウタイトルをTITLEに変更する。", "えくせるたいとるへんこう");
bank.AddFunc("エクセルタイトル状態", "", NakoVarType.String, _xlTitleGet, "エクセルのウインドウタイトルを取得して返す。", "えくせるたいとるじょうたい");
bank.AddFunc("エクセルステータスバー変更", "MSGで|MSGに|MSGへ", NakoVarType.Void, _xlStatusbarTextSet, "エクセルのステータスバーの内容をMSGに変更する。", "えくせるすてーたすばーへんこう");
bank.AddFunc("エクセルステータスバー状態", "", NakoVarType.String, _xlStatusbarTextGet, "エクセルのステータスバーの内容を取得して返す。", "えくせるすてーたすばーじょうたい");
bank.AddFunc("エクセルステータスバー標準", "", NakoVarType.Void, _xlStatusbarTextNormal, "エクセルのステータスバーの内容を元に戻す。", "えくせるすてーたすばーひょうじゅん");
bank.AddFunc("エクセルステータスバー可視変更", "FLAGで|FLAGに|FLAGへ", NakoVarType.Void, _xlStatusbarVisibleSet, "エクセルのステータスバーの表示を変更する。FLAG=1:表示、FLAG=0:非表示。", "えくせるすてーたすばーかしへんこう");
bank.AddFunc("エクセルステータスバー可視状態", "", NakoVarType.Int, _xlStatusbarVisibleGet, "エクセルのステータスバーの表示状態を取得して返す。1:表示、0:非表示。", "えくせるすてーたすばーかしじょうたい");
bank.AddFunc("エクセル枠線表示変更", "FLAGで|FLAGに|FLAGへ", NakoVarType.Void, _xlGridlineVisibleSet, "エクセルのセル枠線の表示を変更する。FLAG=1:表示、FLAG=0:非表示。", "えくせるわくせんひょうじへんこう");
bank.AddFunc("エクセル枠線表示状態", "", NakoVarType.Int, _xlGridlineVisibleGet, "エクセルのセル枠線の表示を取得して返す。1:表示、0:非表示。", "えくせるわくせんひょうじじょうたい");

#endregion
#region ブック関係
//+ブック
bank.AddFunc("エクセルブック追加", "", NakoVarType.Void, _xlBookAdd, "エクセルに新規ブックを追加。", "えくせるぶっくついか");
bank.AddFunc("エクセルブック開く", "FILEを|FILEで|FILEから", NakoVarType.Void, _xlBookOpen, "エクセルにFILE(ブックのパス)を開く。", "えくせるぶっくひらく");
bank.AddFunc("エクセルブック保存", "FILEを|FILEで|FILEに|FILEへ", NakoVarType.Void, _xlBookSaveAs, "", "");

#endregion
}
//--- Define Method ---
#region アプリケーション関係
//エクセル起動
public Object _xlStart(INakoFuncCallInfo info)
{
if (xlApp == null)
{
long arg = info.StackPopAsInt();
xlApp = new NakoExcel.Application { Visible = (arg != 0) }; //arg:0以外はtrue
xlBooks = xlApp.Workbooks;
}
return null;
}
//エクセル終了
public Object _xlEnd(INakoFuncCallInfo info)
{
NakoExcelEnd();
return null;
}
void NakoExcelEnd()
{
if (xlApp != null)
{
xlApp.DisplayAlerts = false;
xlApp.Quit(); //Excel終了
xlApp = null;
//GC.Collect();
}
}
//エクセル起動状態
public Object _xlStarted(INakoFuncCallInfo info)
{
int i = (xlApp != null) ? 1 : 0;
return i;
}
//エクセルバージョン
public Object _xlVer(INakoFuncCallInfo info)
{
if (xlApp != null) return xlApp.Version;
return "-1"; //Excelが起動していない
}
//エクセル可視変更
public Object _xlVisibleSet(INakoFuncCallInfo info)
{
if (xlApp != null)
{
long arg = info.StackPopAsInt();
xlApp.Visible = (arg != 0); //arg:0以外はtrue
}
return null;
}
//エクセル可視状態
public Object _xlVisibleGet(INakoFuncCallInfo info)
{
int i = (xlApp != null && xlApp.Visible == true) ? 1 : 0;
return i;
}
//エクセル警告変更
public Object _xlAlertSet(INakoFuncCallInfo info)
{
if (xlApp != null)
{
long arg = info.StackPopAsInt();
xlApp.DisplayAlerts = (arg != 0); //arg:0以外はtrue
}
return null;
}
//エクセル警告状態
public Object _xlAlertGet(INakoFuncCallInfo info)
{
int i = (xlApp != null && xlApp.DisplayAlerts == true) ? 1 : 0;
return i;
}
//エクセル窓変更
public Object _xlWindowStateSet(INakoFuncCallInfo info)
{
if (xlApp != null)
{
string arg = info.StackPopAsString();
NakoExcel.XlWindowState state = NakoExcel.XlWindowState.xlNormal;
switch (arg)
{
case "最大化":
state = NakoExcel.XlWindowState.xlMaximized;
break;
case "最小化":
state = NakoExcel.XlWindowState.xlMinimized;
break;
case "標準":
state = NakoExcel.XlWindowState.xlNormal;
break;
default:
state = xlApp.WindowState; //現在の状態
//throw new NakoPluginRuntimeException("エクセル窓変更の引数に「最大化|最小化|標準」以外の文字列が指定されました。");
break;
}
xlApp.WindowState = state;
}
return null;
}
//エクセル窓状態
public Object _xlWindowStateGet(INakoFuncCallInfo info)
{
if (xlApp != null)
{
NakoExcel.XlWindowState state = xlApp.WindowState;
switch (state)
{
case NakoExcel.XlWindowState.xlMaximized:
return "最大化";
case NakoExcel.XlWindowState.xlMinimized:
return "最小化";
case NakoExcel.XlWindowState.xlNormal:
return "標準";
}
}
return "-1"; //Excelが起動していない
}
//タイトル変更
public Object _xlTitleSet(INakoFuncCallInfo info)
{
if (xlApp != null && xlBooks != null)
{
xlApp.ActiveWindow.Caption = info.StackPopAsString();
}
return null;
}
//タイトル状態
public Object _xlTitleGet(INakoFuncCallInfo info)
{
if (xlApp != null && xlBooks != null)
{
return xlApp.ActiveWindow.Caption;
}
return "-1"; //Excelが起動していない or Bookがひとつもない
}
//ステータスバー変更
public Object _xlStatusbarTextSet(INakoFuncCallInfo info)
{
if (xlApp != null)
{
string arg = info.StackPopAsString();
xlApp.StatusBar = arg;
}
return null;
}
//ステータスバー状態
public Object _xlStatusbarTextGet(INakoFuncCallInfo info)
{
if (xlApp != null) { return xlApp.StatusBar; }
return "";
}
//ステータスバー標準
public Object _xlStatusbarTextNormal(INakoFuncCallInfo info)
{
if (xlApp != null)
{
xlApp.StatusBar = false;
}
return null;
}
//ステータスバー可視変更
public Object _xlStatusbarVisibleSet(INakoFuncCallInfo info)
{
if (xlApp != null)
{
long arg = info.StackPopAsInt();
xlApp.DisplayStatusBar = (arg != 0); //arg:0以外はtrue
}
return null;
}
//ステータスバー可視状態
public Object _xlStatusbarVisibleGet(INakoFuncCallInfo info)
{
int i = (xlApp != null && xlApp.DisplayStatusBar == true) ? 1 : 0;
return i;
}
//枠線表示変更
public Object _xlGridlineVisibleSet(INakoFuncCallInfo info)
{
if (xlApp != null && xlBooks != null)
{
long arg = info.StackPopAsInt();
xlApp.ActiveWindow.DisplayGridlines = (arg != 0); //arg:0以外はtrue
}
return null;
}
//枠線表示状態
public Object _xlGridlineVisibleGet(INakoFuncCallInfo info)
{
int i = (xlApp != null && xlBooks != null && xlApp.ActiveWindow.DisplayGridlines == true) ? 1 : 0;
return i;
}
#endregion
#region ブック関係
//ブック追加
public Object _xlBookAdd(INakoFuncCallInfo info)
{
if (xlApp != null)
{
xlBooks.Add();
AfterBookOpen();
}
return null;
}
//ブック開く
public Object _xlBookOpen(INakoFuncCallInfo info)
{
if (xlApp != null)
{
string filename = info.StackPopAsString();
if (!System.IO.File.Exists(filename))
{ throw new NakoPluginRuntimeException("ファイル『" + filename + "』は存在しません。"); }
xlBooks.Open(filename);
AfterBookOpen();
}
return null;
}
void AfterBookOpen()
{
xlBook = xlBooks[xlBooks.Count];
xlBook.Activate();
xlSheets = xlBook.Worksheets;
xlSheet = xlSheets[1];
xlSheet.Activate();
}
//ブック保存
public Object _xlBookSaveAs(INakoFuncCallInfo info)
{
if (xlApp != null && xlBook != null)
{
bool flag = xlApp.DisplayAlerts;
string filename = info.StackPopAsString();
object format = NakoExcel.XlFileFormat.xlWorkbookNormal;
xlApp.DisplayAlerts = false;
if (filename == "")
{
xlBook.Save(); //ファイル名指定なければ上書き保存
xlApp.DisplayAlerts = flag;
return null;
}
string ext = System.IO.Path.GetExtension(filename);
ext = ext.ToLower();
switch (ext)
{
case ".xlsx":
if (double.Parse(xlApp.Version) < 12.0)
{ throw new NakoPluginRuntimeException("Excel2007以上でなければ拡張子.xlsx形式で保存できません。"); }
//マクロを含んだBookをxlsx形式で保存すれば、マクロを削除して保存する仕様です。
//次の2行のコメントを外すと、自動的にxlsm形式(マクロあり)で保存します。
//xlModules = xlBook.VBProject.VBComponents;
//if (xlModules != null) goto case ".xlsm"; //マクロを含んでいれば.xlsm
format = NakoExcel.XlFileFormat.xlOpenXMLWorkbook;
break;
case ".xls":
if (double.Parse(xlApp.Version) < 12.0) { format = NakoExcel.XlFileFormat.xlExcel9795; }
else { format = NakoExcel.XlFileFormat.xlExcel8; } //Excel2007以上の場合
break;
case ".xlsm":
if (double.Parse(xlApp.Version) < 12.0)
{ throw new NakoPluginRuntimeException("Excel2007以上でなければ拡張子.xlsm形式で保存できません。"); }
format = NakoExcel.XlFileFormat.xlOpenXMLWorkbookMacroEnabled;
ext = ".xlsm";
break;
case ".csv":
format = NakoExcel.XlFileFormat.xlCSV;
break;
case ".txt":
format = NakoExcel.XlFileFormat.xlUnicodeText;
break;
case ".pdf":
if (double.Parse(xlApp.Version) < 12.0)
{ throw new NakoPluginRuntimeException("Excel2007以上でなければ拡張子.pdf形式で保存できません。"); }
break;
default:
throw new NakoPluginRuntimeException("保存形式が無効です。");
}
filename = System.IO.Path.ChangeExtension(filename, ext);
if (ext == ".pdf") { xlSheet.ExportAsFixedFormat(NakoExcel.XlFixedFormatType.xlTypePDF, filename); }
else { xlBook.SaveAs(filename, format); }
xlApp.DisplayAlerts = flag;
}
return null;
}
#endregion

/*
* --- マクロを扱う命令は、ユーザー側がExcelで次の設定が必要 ---
* (Excel2002、2003の場合)
* ツール>マクロ>セキュリティ>信頼できる発行元>Visual Basicプロジェクトへのアクセスを信頼するをオン
* (Excel2007、2010の場合)
* リボンの「開発」タブ>マクロのセキュリティ>VBAプロジェクトオブジェクトモデルへのアクセスを信頼するをオン
* ※「プログラミングによるVisual Basicプロジェクトへのアクセスは信頼性に欠けます」というエラーメッセージが出ないようになる。
*/
}
}
スポンサーサイト

この記事に含まれるtag : なでしこ2.0 プラグイン C# Excel 

FC2スレッドテーマ : プログラミング (ジャンル : コンピュータ

(記事編集) http://nadesocha.blog.fc2.com/blog-entry-139.html

2011/01/29 | Comment (0) | Trackback (0) | ホーム | ↑ ページ先頭へ ↑ |

C#とエクセル

   ↑  2010/10/31 (日)  カテゴリー: C#

プラグインでエクセル起動


 プラグインからエクセルを操作してみました。

 通常、C#からエクセルを操作するには、COMオブジェクトを利用するわけですが、COMオブジェクトはアンマネージドであり、アプリケーションの終了時に参照カウントを解放(メモリ解放)しなければ、プロセスに残ってしまうという問題があります。

 C#とCOM連携についてインターネットで検索すると、皆さんこの参照カウントの解放に苦労されています。しかしながら、Visual Studio 2010になり、フレームワークが.NET Framework 4になったことにより、どうやら自動的にメモリ解放されるようで、開発時にCOMオブジェクトの参照カウントを意識しなくても良いらしいです。(本当のところはわかりませんので、詳しい方は教えて下さい)

COMオブジェクトの実例


 Visual C# 2010 Expressにおいて、対象のフレームワークを「.NET Framework 4」に設定し、次のプロジェクトをビルドして実行します。デバッグのままだと、参照カウントが残ってしまいますので注意です。

プロジェクト名:NakoPluginSocha3
参 照 設 定:Libnako、Microsoft.CSharp、Microsoft.Office.Interop.Excel、System、System.Windows.Forms
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using NakoPlugin;
using Excel = Microsoft.Office.Interop.Excel;
//using System.Runtime.InteropServices;

namespace NakoPluginSocha3
{
public class NakoPluginSocha3 : INakoPlugin
{
//--- プラグインの宣言 ---
string _description = "エクセル操作テスト by 粗茶";
double _version = 1.0;
//--- プラグイン共通の部分 ---
public double TargetNakoVersion { get { return 2.0; } }
public bool Used { get; set; }
public string Name { get { return this.GetType().FullName; } }
public double PluginVersion { get { return _version; } }
public string Description { get { return _description; } }
//--- 関数の定義 ---
public void DefineFunction(INakoPluginBank bank)
{
bank.AddFunc("エクセル処理", "", NakoVarType.Void, _xl, "エクセルを開いてセルの値を取得する", "えくせるしょり");
}
// プラグインの初期化処理
public void PluginInit(INakoInterpreter runner)
{
}
// プラグインの終了処理
public void PluginFin(INakoInterpreter runner)
{
}
// Define Method
public Object _xl(INakoFuncCallInfo info)
{
dynamic xlApp = new Excel.Application { Visible = true };
var xlBooks = xlApp.Workbooks;
var xlBook = xlBooks.Open(@"Sample.xlsx"); //ファイルをフルパスで指定
var xlSheets = xlBook.Worksheets;
var xlSheet = xlSheets[1];
var xlCells = xlSheet.Cells;
var xlRange = xlCells[1, 1];

var a1val = xlRange.Value2;

//--- COMオブジェクト解放 ---
//Marshal.ReleaseComObject(xlRange);
//Marshal.ReleaseComObject(xlCells);
//Marshal.ReleaseComObject(xlSheet);
//Marshal.ReleaseComObject(xlSheets);

xlBook.Close(false);

//--- COMオブジェクト解放 ---
//Marshal.ReleaseComObject(xlBook);
//Marshal.ReleaseComObject(xlBooks);

xlApp.Quit();

//--- COMオブジェクト解放 ---
//Marshal.ReleaseComObject(xlApp);

MessageBox.Show(a1val.ToString());

return null;
}
}
}

なでしこプログラム


エクセル処理。

 実行すると、エクセルを起動し、指定したブックを開いて、最初のシートにあるA1セルの値を取得します。

 実行後は、DemoCNako2のProgram.csにより、コンソールが開いたままとなります。この時点ではまだ、プロセスにEXCEL.EXEが残っています。

 Enterキーを押してコンソールを終了します。この時点で、プロセスにEXCEL.EXEが残っていないことが確認できました。

COM解放を検証してみる

この記事に含まれるtag : なでしこ2.0 プラグイン C# Excel 

FC2スレッドテーマ : プログラミング (ジャンル : コンピュータ

(記事編集) http://nadesocha.blog.fc2.com/blog-entry-138.html

2010/10/31 | Comment (0) | Trackback (0) | ホーム | ↑ ページ先頭へ ↑ |

なでしこ2.0のプラグイン作成2

   ↑  2010/10/16 (土)  カテゴリー: なでしこ全般
 プラグインの中に変数を作成し、値を保持してみました。

プラグインのプログラム


using System;
using System.Text;

using NakoPlugin;
using System.Windows.Forms;

namespace NakoPluginSocha2
{
public class NakoPluginSocha2 : INakoPlugin
{
//--- プラグインの宣言 ---
string _description = "粗茶テストプラグイン2";
double _version = 1.0;
//--- プラグイン共通の部分 ---
public double TargetNakoVersion { get { return 2.0; } }
public string Name { get { return this.GetType().FullName; } }
public double PluginVersion { get { return _version; } }
public string Description { get { return _description; } }
public bool Used { get; set; }
//--- 関数の定義 ---
public void DefineFunction(INakoPluginBank bank)
{
bank.AddFunc("加算", "Numを", NakoVarType.Int, _add, "Num加える", "かさん");
bank.AddFunc("減算", "Numを", NakoVarType.Int, _sub, "Num減らす", "げんさん");
}

// Define Method 実際の動作を定義する
long myInt = 0;
string myTitle = "";

public Object _add(INakoFuncCallInfo info)
{
long myValue = info.StackPopAsInt();
myInt += myValue;
myTitle = myTitle + "+" + myValue;
MessageBox.Show(myInt.ToString(),myTitle);
return myInt;
}

public Object _sub(INakoFuncCallInfo info)
{
long myValue = info.StackPopAsInt();
myInt -= myValue;
myTitle = myTitle + "-" + myValue;
MessageBox.Show(myInt.ToString(), myTitle);
return myInt;
}

// アプリ開始時に実行する処理
public void PluginInit(INakoInterpreter runner)
{
}

// アプリ終了時に実行する処理(メモリの解放など)
public void PluginFin(INakoInterpreter runner)
{
}
}
}

 myIntとmyTitleは、命令ごとの処理が終了してもそのままの値を保持しています。

なでしこプログラム部分


"1を加算。2を加算。"+
"3を加算。4を減算。"+
"それを言う。";

この記事に含まれるtag : なでしこ2.0 プラグイン C# 

FC2スレッドテーマ : プログラミング (ジャンル : コンピュータ

(記事編集) http://nadesocha.blog.fc2.com/blog-entry-137.html

2010/10/16 | Comment (0) | Trackback (0) | ホーム | ↑ ページ先頭へ ↑ |

なでしこ2.0のプラグイン作成

   ↑  2010/10/02 (土)  カテゴリー: なでしこ全般

プラグインの実装


 なでしこ2.0が開発中ですが、現在プラグインが実装されましたので、自由に命令を追加することができるようになりました。

プラグインを作ってみる


 そこで、ちょっとテスト的に簡単なプラグインを作ってみました。
 ビルドしてみたところ、きちんと動作しました。感動!!
using System;
using System.Collections.Generic;
using System.Text;

using NakoPlugin;
using System.Windows.Forms;

namespace NakoPluginSocha
{
public class NakoPluginSocha : INakoPlugin
{
//--- プラグインの宣言 ---
string _description = "粗茶テストプラグイン";
double _version = 1.0;
//--- プラグイン共通の部分 ---
public double TargetNakoVersion { get { return 2.0; } }
public string Name { get { return this.GetType().FullName; } }
public double PluginVersion { get { return _version; } }
public string Description { get { return _description; } }
public bool Used { get; set; }
//--- 関数の定義 ---
public void DefineFunction(INakoPluginBank bank)
{
//引数なし、戻り値なし
bank.AddFunc("粗茶する", "", NakoVarType.Void, _sochaMethod, "自己紹介す。", "そちゃする");
//引数あり、戻り値(文字列)
bank.AddFunc("飛行机する", "SとAを", NakoVarType.String, _kujiraMethod, "S(文字列)にA(数値)を連結して、結果を「それ」に返す。", "ひこうづくえする");
}

// Define Method 実際の動作を定義する
public Object _sochaMethod(INakoFuncCallInfo info)
{
string myName;
myName = "私の名前は粗茶です。";
MessageBox.Show(myName, "これはテストです。", MessageBoxButtons.OK);
return null;
}

public Object _kujiraMethod(INakoFuncCallInfo info)
{
string s = info.StackPopAsString();
string a = info.StackPopAsString();
return s + a;
}

// アプリ開始時に実行する処理
public void PluginInit(INakoInterpreter runner)
{
}


// アプリ終了時に実行する処理(メモリの解放など)
public void PluginFin(INakoInterpreter runner)
{
}
}
}


プラグインの作り方


Visual Studio 2010の場合


 プロジェクトを開くと、Visual Studio 変換ウィザードが開きます。
 これは、なでしこ2.0が.NET Frameworkの古いバージョン(3.5)で作成されているためです。ウィザードの画面では「完了」をクリックします。

プロジェクトを作成する


 プロジェクトを作成または追加します。dllを作成するので、クラスライブラリを選択します。
 プロジェクト名はプラグイン名にします。
NakoPluginSocha

ファイル名を変更する


 ファイル名がデフォルトのままならば、プラグイン名と同じに変更します。
NakoPluginSocha.cs

参照設定を変更する


 参照設定で不要なものを削除します。
 参照の追加などで、必要なものを追加します。(Libnakoは必須です)
 プログラムの先頭にあるusingを編集します。
using System;
using System.Collections.Generic;
using System.Text;

using NakoPlugin;
using System.Windows.Forms;

クラスにインターフェースを継承する


 クラスにINakoPlugin(インターフェース)を継承します。
    public class NakoPluginSocha : INakoPlugin

TargetNakoVersionプロパティ


 対応プラグインのバージョン番号。なでしこのどのバージョン用のプラグインかを表します。なでしこ2.0用のプラグインですので、return 2.0とします。(読み取り専用)
    	public double TargetNakoVersion { get { return 2.0; } }

Nameプロパティ


 クラスの名前を返すプロパティです。次の通りそのまま記入します。(読み取り専用)
        public string Name { get { return this.GetType().FullName; } }

PluginVersionプロパティ


 このプラグインのバージョンを返すプロパティです。任意の値をreturnの後に設定します。(読み取り専用)
    	double _version = 1.0;
public double PluginVersion { get { return _version; } }

Descriptionプロパティ


 このプラグインの説明を返すプロパティです。(読み取り専用)
    	string _description = "粗茶テストプラグイン";
public string Description { get { return _description; } }

Usedプロパティ


 プラグインが利用されたかどうかを判別するのに使用されます。次の通りそのまま記入します。
        public bool Used { get; set; }

命令の登録


 命令の名前や引数、プログラムなどをシステムに登録します。
 public void DefineFunction(INakoPluginBank bank)の中に、bank.AddFuncで「命令の名前、引数の定義、関数の戻り値、実際に処理を行うC#のデリゲート、関数の説明、命令のよみがな」の順に記述します。
        public void DefineFunction(INakoPluginBank bank)
{
//引数なし、戻り値なし
bank.AddFunc("粗茶する", "", NakoVarType.Void, _sochaMethod, "自己紹介する。", "そちゃする");
//引数あり、戻り値(文字列)
bank.AddFunc("飛行机する", "SとAを", NakoVarType.String, _kujiraMethod, "S(文字列)にA(数値)を連結して、結果を「それ」に返す。", "ひこうづくえする");
}

 引数が不要な場合は、""とします。
 戻り値が無い場合は、NakoVarType.Voidとします。
 NakoVarType.Stringは、戻り値が文字列であることを表します。戻り値は「それ」に入ります。

命令の定義


 実際に命令の挙動を定義します。
 public Object 命令(INakoFuncCallInfo info)の中に記述します。
        public Object _sochaMethod(INakoFuncCallInfo info)
{
string myName;
myName = "私の名前は粗茶です。";
MessageBox.Show(myName, "これはテストです。", MessageBoxButtons.OK);
return null;
}

 「粗茶する」命令は、挨拶のダイアログを表示します。
 戻り値が無い場合は、return nullとします。
        public Object _kujiraMethod(INakoFuncCallInfo info)
{
string s = info.StackPopAsString();
string a = info.StackPopAsString();
return s + a;
}

 「飛行机する」命令は、ふたつの引数を連結して返します。
 引数は、info.StackPopAsString()で、第1引数から順に取り出します。この場合は文字列として取り出します。

エラー処理


 プラグインの中でエラーが発生したことを伝えるには、次のようにエラーメッセージを投げることができます。
throw new NakoPluginRuntimeException("エラーメッセージ");

プラグインの初期化


 最初にプラグインが呼び出された時に実行する部分です。INakoInterpreterを引数にとることで、複数のなでしこエディタを起動している場合に、どのエディタから呼び出されたのか判断できます。
 今回は何もしませんので、空っぽのままです。
        // アプリ開始時に実行する処理
public void PluginInit(INakoInterpreter runner)
{
}

プラグインの終了


 プログラムが終了するときに実行する部分です。オブジェクトを手動で開放するなど、安全に終了できるようにします。
 今回は何もしませんので、空っぽのままです。
        // アプリ終了時に実行する処理(メモリの解放など)
public void PluginFin(INakoInterpreter runner)
{
}

メインプログラム


 メインプログラムで、なでしこプログラムを書きます。(現在は、DemoCNako2のprogram.csに書きます。)
            compiler.DirectSource =
"粗茶する。" +
"「日本語」と「プログラミング」を飛行机する。" +
"それを言う。";

 また、メインプログラムの参照設定にプロジェクトNakoPluginSochaを追加します。

ビルド


 ビルド(デバッグではない)してバイナリを作成します。
 メインプログラムのフォルダに、bin\Debug\フォルダがあり、その中にプログラム(exe)とプラグイン(dll)が作成されているはずです。

実行結果


20101013235939.gif
20101013235938.gif
20101013235936.gif



この記事に含まれるtag : なでしこ2.0 C# プラグイン 

FC2スレッドテーマ : プログラミング (ジャンル : コンピュータ

(記事編集) http://nadesocha.blog.fc2.com/blog-entry-136.html

2010/10/02 | Comment (0) | Trackback (0) | ホーム | ↑ ページ先頭へ ↑ |

インスタンスを作るのは何故?

   ↑  2010/07/13 (火)  カテゴリー: なでしこ全般

なでしこ2.0のコードを眺めながら、C#の勉強中・・・

ちょっと意味がわからないので、誰か教えて下さい。

たとえば、NakoDicクラスの中で、

        private static NakoDic instance = null;

        public static NakoDic GetInstance()
        {
            if (NakoDic.instance == null)
            {
                NakoDic.instance = new NakoDic();
            }
            return NakoDic.instance;
        }

という処理をしています。

なぜわざわざインスタンスを作るのですか?

コンストラクタだけではだめなんですか?(by蓮舫)

    /// 
    /// なでしこ単語管理クラス
    /// 
    public class NakoDic : Dictionary{
        public NakoDic(){
            this.Add("ナデシコ", TokenType.T_RESERVED);
            this.Add("もし", TokenType.T_IF);
            this.Add("ならば", TokenType.T_THEN);
            this.Add("ここまで", TokenType.T_KOKOMADE);
            this.Add("繰り返す", TokenType.T_FOR);
            this.Add("間", TokenType.T_WHILE);
            this.Add("条件分岐", TokenType.T_SWITCH);
            this.Add("●", TokenType.T_DEF_FUNCTION);
            this.Add("*", TokenType.T_DEF_FUNCTION);
            this.Add("■", TokenType.T_DEF_GROUP);
        }
    }

とするのは間違いですか?

教えて~~~!

この記事に含まれるtag : なでしこ2.0 C# 

FC2スレッドテーマ : プログラミング (ジャンル : コンピュータ

(記事編集) http://nadesocha.blog.fc2.com/blog-entry-116.html

2010/07/13 | Comment (3) | Trackback (0) | ホーム | ↑ ページ先頭へ ↑ |
申し訳ありません。 お探しの記事は現在、この ユーザーtag (Keyword) を設定していない可能性があります。 右の検索BOXで 再度用語を短めに入力していただくと記事が見つかる場合があります。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。