PowerTools SPREAD for ASP.NET 8.0J > 開発者の手引き > 数式 > カスタム関数の作成 |
頻繁に使用する関数が組み込み関数として存在しない場合、またはいくつかの組み込み関数を組み合わせて1つの関数にしたい場合は、独自のカスタム関数を定義できます。 カスタム関数は、組み込み関数とまったく同様に呼び出すことができ、
組み込み関数と同じ名前を付けることもできます。 また、カスタム関数は組み込み関数よりも優先されます。 カスタム関数は評価時に動的にリンクされます。 このため、アプリケーションにおいて既存のカスタム関数を再定義できます。
次のサンプルコードは、カスタム関数を実装します。この例では、3乗計算関数、XOR 論理関数、および null 文字列関数の3つの関数を作成し、登録、計算を行います。
// CUBEカスタム関数は、数値を3乗します。 つまり、CUBE(x) は POWER(x,3) と同じ意味です。 [Serializable()] public class CubeFunctionInfo : FarPoint.CalcEngine.FunctionInfo { public override string Name { get { return "CUBE"; } } public override int MinArgs { get { return 1; } } public override int MaxArgs { get { return 1; } } public override object Evaluate(object[] args) { double num = FarPoint.CalcEngine.CalcConvert.ToDouble(args[0]); return num * num * num; } } // XORカスタム関数は、2つのブール値に対し、排他的論理和演算を実行します。 [Serializable()] public class XorFunctionInfo : FarPoint.CalcEngine.FunctionInfo { public override string Name { get { return "XOR"; } } public override int MinArgs { get { return 2; } } public override int MaxArgs { get { return 2; } } public override object Evaluate(object[] args) { bool arg0 = FarPoint.CalcEngine.CalcConvert.ToBool(args[0]); bool arg1 = FarPoint.CalcEngine.CalcConvert.ToBool(args[1]); return (arg0 || arg1) && (arg0 != arg1); } } // NULLカスタム関数は定数値 null を返します。 [Serializable()] public class NullFunctionInfo : FarPoint.CalcEngine.FunctionInfo { public override string Name { get { return "NULL"; } } public override int MinArgs { get { return 0; } } public override int MaxArgs { get { return 0; } } public override object Evaluate(object[] args) { return null; } } protected void Page_Load(object sender, System.EventArgs e) { if (IsPostBack) return; FpSpread1.ActiveSheetView.ColumnCount = 5; FpSpread1.ActiveSheetView.RowCount = 5; // 3つのカスタム関数を登録します。 FarPoint.Web.Spread.Model.DefaultSheetDataModel dataModel = new FarPoint.Web.Spread.Model.DefaultSheetDataModel(); dataModel.AddCustomFunction(new CubeFunctionInfo()); dataModel.AddCustomFunction(new XorFunctionInfo()); dataModel.AddCustomFunction(new NullFunctionInfo()); // シートにデータモデルを設定します。 FpSpread1.ActiveSheetView.DataModel = dataModel; // セルに数式を設定します。 FpSpread1.ActiveSheetView.SetFormula(0, 0, "CUBE(5)"); FpSpread1.ActiveSheetView.SetFormula(1, 0, "XOR(FALSE,FALSE)"); FpSpread1.ActiveSheetView.SetFormula(1, 1, "XOR(TRUE,FALSE)"); FpSpread1.ActiveSheetView.SetFormula(1, 2, "XOR(FALSE,TRUE)"); FpSpread1.ActiveSheetView.SetFormula(1, 3, "XOR(TRUE,TRUE)"); FpSpread1.ActiveSheetView.SetFormula(2, 0, "CHOOSE(1,100,NULL(),300)"); FpSpread1.ActiveSheetView.SetFormula(2, 1, "CHOOSE(2,100,NULL(),300)"); FpSpread1.ActiveSheetView.SetFormula(2, 2, "CHOOSE(3,100,NULL(),300)"); }
' CUBEカスタム関数は、数値を3乗します。 つまり、CUBE(x) は POWER(x,3) と同じ意味です。 <Serializable()> _ Public Class CubeFunctionInfo Inherits FarPoint.CalcEngine.FunctionInfo Public Overrides ReadOnly Property Name As String Get Return "CUBE" End Get End Property Public Overrides ReadOnly Property MinArgs As Integer Get Return 1 End Get End Property Public Overrides ReadOnly Property MaxArgs As Integer Get Return 1 End Get End Property Public Overrides Function Evaluate(args() As Object) As Object Dim num As Double = FarPoint.CalcEngine.CalcConvert.ToDouble(args(0)) Return num * num * num End Function End Class ' XORカスタム関数は、2つのブール値に対し、排他的論理和演算を実行します。 <Serializable()> _ Public Class XorFunctionInfo Inherits FarPoint.CalcEngine.FunctionInfo Public Overrides ReadOnly Property Name As String Get Return "XOR" End Get End Property Public Overrides ReadOnly Property MinArgs As Integer Get Return 2 End Get End Property Public Overrides ReadOnly Property MaxArgs As Integer Get Return 2 End Get End Property Public Overrides Function Evaluate(args() As Object) As Object Dim arg0 As Boolean = FarPoint.CalcEngine.CalcConvert.ToBool(args(0)) Dim arg1 As Boolean = FarPoint.CalcEngine.CalcConvert.ToBool(args(1)) Return (arg0 OrElse arg1) AndAlso (arg0 <> arg1) End Function End Class ' NULLカスタム関数は定数値 null を返します。 <Serializable()> _ Public Class NullFunctionInfo Inherits FarPoint.CalcEngine.FunctionInfo Public Overrides ReadOnly Property Name As String Get Return "NULL" End Get End Property Public Overrides ReadOnly Property MinArgs As Integer Get Return 0 End Get End Property Public Overrides ReadOnly Property MaxArgs As Integer Get Return 0 End Get End Property Public Overrides Function Evaluate(args() As Object) As Object Return Nothing End Function End Class Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load If IsPostBack Then Return End If FpSpread1.ActiveSheetView.ColumnCount = 5 FpSpread1.ActiveSheetView.RowCount = 5 ' 3つのカスタム関数を登録します。 Dim dataModel As New FarPoint.Web.Spread.Model.DefaultSheetDataModel() dataModel.AddCustomFunction(New CubeFunctionInfo()) dataModel.AddCustomFunction(New XorFunctionInfo()) dataModel.AddCustomFunction(New NullFunctionInfo()) ' シートにデータモデルを設定します。 FpSpread1.ActiveSheetView.DataModel = dataModel ' セルに数式を設定します。 FpSpread1.ActiveSheetView.SetFormula(0, 0, "CUBE(5)") FpSpread1.ActiveSheetView.SetFormula(1, 0, "XOR(FALSE,FALSE)") FpSpread1.ActiveSheetView.SetFormula(1, 1, "XOR(TRUE,FALSE)") FpSpread1.ActiveSheetView.SetFormula(1, 2, "XOR(FALSE,TRUE)") FpSpread1.ActiveSheetView.SetFormula(1, 3, "XOR(TRUE,TRUE)") FpSpread1.ActiveSheetView.SetFormula(2, 0, "CHOOSE(1,100,NULL(),300)") FpSpread1.ActiveSheetView.SetFormula(2, 1, "CHOOSE(2,100,NULL(),300)") FpSpread1.ActiveSheetView.SetFormula(2, 2, "CHOOSE(3,100,NULL(),300)") End Sub