オプション

オプションは、オブジェクトの属性を格納するために使用します。オプションは、ダイアログ、フィールド、ボタン、シェイプなどの可視オブジェクト用に設計されています。属性にはオブジェクトの幅、高さ、色などの情報を格納できます。
Curl® 言語の可視オブジェクトには、オプションのサポートが組み込まれています。具体的には、オプションのサポートは Visual を直接または間接に継承するクラスに組み込まれることになります。つまり、可視クラスを作成する場合には、組み込まれているグラフィック オプションの豊富なセットから選択して新しいクラスで使用するか、または下記に示すように新規のオプションを追加することができます。
可視クラスを継承しない新規のクラスを作成する場合には使用可能な組み込みのオプションはありませんが、必要ならばオプション メカニズムを拡張して非可視クラスで使用することができます。ただし、非可視クラスにオプションのサポートを追加するというのは高度なトピックであるため、このガイドでは触れていません。
オプションは、設定時にキーワードと値を指定する必要があるという点でキーワード引数に似ています。たとえば、width と呼ばれるオプションを設定するには、キーワード width および幅の実際値を指定する必要があります。クラスのインスタンスの作成時にオプションを設定するには、そのインスタンスの引数としてオプション設定を指定します。また、オブジェクトのインスタンスを作成した後で set ステートメントでオプションを設定することもできます。
オプション バインディングの設定解除も可能です。オプションを設定すると、オプションに値がバインドされます。unset 式を使用して、オプション バインディングを後で削除することができます。さらに、set? 演算子を使用してオプションが設定されているかどうかを確認できます。
クラス メンバとして宣言されたオプションには通常は変更ハンドラが含まれています。 この変更ハンドラには、新しい値がオプションに代入される度に (オブジェクトのインスタンス化中、set ステートメント、または unset の呼び出し)評価されるコード ブロックです。
オプションはローカル オプション非ローカル オプションのいずれかになります。 現可視オブジェクトのみに適用する属性に、ローカル オプションを使用してください。グラフィカルな子には適用できません。 非ローカル オプションは、オブジェクトとそのグラフィカルなすべての子に適用される属性に使用します。
このセクションでは、クラス作成のコンテキストにおけるオプションの使用について説明します。 可視クラスのオプション使用に関する詳細は、「グラフィック オプション 」のセクションを参照してください。

ローカル オプションの宣言

ローカル オプションを宣言するには次の構文を使用します。
構文:{local-option public option-name:option-type [= option-value]
option-code
}
説明:
option-nameオプション名です。Curl 言語の命名規則により、小文字のみ使用します。オプション名に複数の単語を含める場合、単語間の空白をハイフンに置き換えます。オプション名が一意であり、同じクラスの他のメンバが使用していないことを確認します。
option-typeオプションのデータ型です。既定のデータ型は any です。データ型の詳細については、「データ型」を参照してください。
option-valueオプションの既定値です (省略可能)。Curl® 実行環境 (RTE) は、指定した値をコンパイル時に計算しなければなりません。オプションを 設定しない(unset) と、その値は option-value になります。option-value を指定せずにオプションを unset すると、そのオプションのデータ型 (option-type) の既定値に設定されます。
option-codeオプションの変更ハンドラを実装する任意のコード ブロックです。
注:
  • オプションは、オプションをサポートするクラス内のみで宣言できます。すべての可視クラスはオプションをサポートしています。
  • スーパークラスから継承されたオプションは、 option-value を記述してはいけません
次の例では Visual クラスを作成し、my-highlight? という名前でローカルの bool オプションを作成しています。 既定では、 my-highlight?false に設定されています。 オプション値が true に設定されると、このオプション定義に関連するコードが実行され、オブジェクトの backgroundborder-color を設定します。

例: ローカルオプションの宣言
|| A class that creates a box.  The class inherits from
|| HVBox (a visual class).
{define-class MyBox {inherits HVBox}

  || A local option that, when set, changes the colors
  || of the box.
  {local-option public my-highlight?:bool = false
    {if self.my-highlight? == true then
        set self.background="wheat"
        set self.border-color="brown"
    }
  }

  || The constructor method creates a box with beige
  || background, 2-point wheat borders, and a 3-point
  || margin.
  {constructor {default ...}
    {construct-super
        background="beige",
        border-color="wheat",
        border-width=2pt,
        margin=3pt,
        ...
    }
  }
}
{value
    || box1 and box3 are instances of MyBox that do not
    || have the option set.  box2 is an instance that
    || does have the option set.
    let box1:MyBox = {MyBox "Box 1"}
    let box2:MyBox = {MyBox my-highlight?=true, "Box 2"}
    let box3:MyBox = {MyBox "Box 3"}

    || Display box1, box2, and box3 within a spaced-hbox.
    {spaced-hbox box1, box2, box3}
}

非ローカル オプションの定義と宣言

非ローカル オプションを設置するには、次の2つのプロセスに従います。

最初にオプションを定義します。 次にクラス定義内で宣言します。 非ローカル オプションを定義するには、次の構文を使用します。
構文:{define-nonlocal-option public option-name:option-type [= option-value]}
説明:
option-nameオプション名です。 Curl 言語の命名規則により小文字のみを使用します。 オプション名が複数の単語で構成される場合、単語間の空白をハイフンに置き換えます。
option-typeローカルオプションの説明を参照
option-valueローカルオプションの説明を参照
非ローカル オプションを宣言するには、次の構文を使用します。
構文:{nonlocal-option public option-name:option-type
option-code
}
説明:
option-name既に定義されているオプション。
option-typeオプション定義で指定されているオプションの型
option-codeオプションの変更ハンドラを実装する任意のコード ブロック
以下の例では define-nonlocal-option を使ってオプション my-highlight? を定義し、 MyBox クラスでオプションを使うため nonlocal-option を使用します。 オブジェクト box5 は、コンテナ box2 で設定された my-highlight? の値をピックアップし、 box6 は親で設定されたオプション値をオーバーライドします。 CommandButton をクリックして box2my-highlight? を解除してください。

例: 非ローカル オプションの定義と宣言
{define-nonlocal-option public my-highlight?:bool = false}

{define-class MyBox {inherits HVBox}
  {nonlocal-option public my-highlight?:bool
    {if self.my-highlight? == true then
        set self.border-color="brown"
     else
        set self.border-color = "wheat"
    }
  }
  {constructor {default ...}
    {construct-super
        border-color="wheat",
        border-width=2pt,
        margin=3pt,
        ...
    }
  }
}
{value
    let box4:MyBox = {MyBox "Box 4"}
    let box5:MyBox = {MyBox "Box 5"}
    let box6:MyBox = {MyBox my-highlight?=true, "Box 6"}

    let box1:MyBox = {MyBox "Box 1", box4}
    let box2:MyBox = {MyBox my-highlight?=true, "Box 2", box5}
    let box3:MyBox = {MyBox "Box 3", box6}

    {spaced-hbox box1, box2, box3,
        {CommandButton
            {on Action do
                {unset box2.my-highlight?}
            }
        }
    }
}

オプションのアクセス

コードのオプションのアクセスするには、クラスメンバに使用するのと同じドット表記を使います。
    object name.option name
オプション定義内で現在のクラスのインスタンスを参照するには、オブジェクト名 self を使用します。 フィールド、アクセッサおよびオプションのアクセス構文は、クラスの内外で同じです。次の構文を常に使用します
    instance-name.member-name
オプション値の取得も参照してください。

オプションの設定

オプションバインドを設定( set )することができます。 詳細は、 オプション値の設定を参照してください。

オプションの設定を解除

オプションバインドを解除( unset )することができます。 詳細は、オプションの設定を解除を参照してください。

オプションが設定されているかどうかの確認

オプションが設定されたかどうかを確認するには、set? 演算子を使用します。
詳細は、「オプションが設定されているかどうかの確認」のセクションを参照してください。

オプションの継承

他のプロパティと同様に、オプションはサブクラス化によって継承されます。ただし、すべてのオプションがそれを継承するクラスで意味を持つとは限りません。このような場合、オプションを設定または設定解除しても違いはありません。たとえば、RadioButtonGraphicOptions のサブクラスなので、background および cell-margin オプションを継承します。background オプションは RadioButton クラスでも効果がありますが、cell-margin を使用しても意味がありません。RadioButtoncell-margin オプションを設定しても、次の例で明らかなように効果はありません。

例: オプションの継承
{value
    || Declare and initialize a radio button.
    let rb:RadioButton = {RadioButton label="Hello World!"}
    
    || Set an inherited option that is relevant to
    || the class.
    set rb.background = "beige"
    
    || Set an inherited option that is not relevant
    || to the class.
    set rb.cell-margin = 1cm
    
    || Display the radio button.
    {VBox rb}
}