> ## Documentation Index
> Fetch the complete documentation index at: https://docs.abbyy.com/llms.txt
> Use this file to discover all available pages before exploring further.

# ユーザー定義プロパティ

> FlexiLayout language におけるユーザー定義プロパティ: External fields セクションで型付き変数を宣言し、要素間で仮説の値を共有します。

**ユーザー定義プロパティ**は、要素に属する型付き変数です。これらのプロパティは、**Advanced** タブの **External fields** セクションで定義します。

次の形式を使用します:

```text theme={null}
Type1 Name1;
...
TypeN NameN;
```

ここで、`Name` は変数名、`Type` はその型です。

field の作成時には、自動的に初期化されます。たとえば、数値 field は 0、矩形と Region は空の値で初期化されます。

<div id="field-scope-and-access">
  ## field のスコープとアクセス
</div>

field は、それが属する要素内と、検索ツリー内でそれより下位にある任意の要素で使用できます。field の値を変更できるのは、それが属する要素内だけです。ほかの要素では、読み取り専用で参照できます。

要素の field にアクセスするには、`ElementName.FieldName` の形式で field の完全名を使用します (例: `SearchElements.StaticText1.x`) 。要素内では、その field には `x` という名前でアクセスできます。複合要素の場合は、そのサブ要素も (ネストのレベルに関係なく) 短縮名でその field にアクセスできます。

要素の仮説を表す複雑な式の値は、計算してプロパティに書き込むことができます。その後、この値には検索ツリー内でそれより下位にある任意の要素から、必要になるたびに再計算することなくアクセスできます。これにより、FlexiLayout のマッチングに必要な時間が短縮され、大きな式を各要素にコピーする必要がなくなり、コードの可読性も向上します。

<div id="field-naming-restrictions">
  ## field の命名に関する制限
</div>

* 1 つの要素内では、field 名は一意である必要があります。
* 複合要素内の要素名は、そのサブ要素 (ネストされたすべてのレベルを含む) 内のいずれの field 名とも一致してはなりません。
* 複合要素の field 名は、その配下のいずれのサブ要素名とも一致してはなりません。

<div id="example-speed-up-matching-with-a-user-defined-property">
  ## 例: ユーザー定義プロパティでマッチングを高速化する
</div>

この例では、2 つの住所コンポーネント、つまり都市 (character string **City**) と地下鉄駅 (character string **Station**) を検索します。地下鉄駅を指定するのは、都市が Moscow の場合のみです。FlexiLayout のマッチングを高速化するため、この例では **City** 要素に `fromMoscow` プロパティを定義しています。このプロパティは、**City** 要素が検出され、その値が "Moscow" の場合は `true`、それ以外の場合は `false` になります。

**External fields** セクションの **City** 要素のコード:

```text theme={null}
logic fromMoscow;
```

**Advanced post-search relations** セクション:

```text theme={null}
if( not IsNull and Value.Find( "Moscow" ) >= 0 ) then fromMoscow = true;
else fromMoscow = false;
```

その後、**Station** 要素はこのプロパティを使って、Moscow が **City** 要素として**検出**された場合にのみステーションを検索します。

**Station** 要素のコードは、**Advanced pre-search relations** セクションにあります。

```text theme={null}
if not City.fromMoscow then dontfind;
```

<Warning>
  field があるため、同じ型の要素でも同一のものとしては扱われません。

  したがって、次のような記述は禁止されています。

  ```text theme={null}
  Let e = SearchElements.StaticText1;
  e = SearchElements.StaticText2; // 同じ型の要素
  ```
</Warning>
