MESCIUS SPREAD for ASP.NET 10.0J
カスタム関数の作成

頻繁に使用する関数が組み込み関数として存在しない場合、またはいくつかの組み込み関数を組み合わせて1つの関数にしたい場合は、独自のカスタム関数を定義できます。 カスタム関数は、組み込み関数とまったく同様に呼び出すことができ、

組み込み関数と同じ名前を付けることもできます。 また、カスタム関数は組み込み関数よりも優先されます。 カスタム関数は評価時に動的にリンクされます。 このため、アプリケーションにおいて既存のカスタム関数を再定義できます。

設定方法

  1. 独自計算を行うカスタム関数用のクラスを定義します。
  2. DefaultSheetDataModel クラスAddCustomFunction メソッドを使用してカスタム関数を登録します。
  3. DefaultSheetDataModel クラスのSetFormula メソッド、またはSheetView クラスSetFormula メソッドを使用してカスタム関数を数式として設定します。

サンプルコード

次のサンプルコードは、カスタム関数を実装します。この例では、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

関連トピック

 

 


© MESCIUS inc. All rights reserved.