多くの場合、画面上の Web コンポーネントオブジェクトのあるアクションから、別の Web コンポーネントのアクションをトリガーするソリューションの実装が必要になります。
たとえば、ユーザーが画面上のあるコンポーネントのメニュー項目を選択したら、別の Web コンポーネントのアクションをトリガーする場合などです。
画面上の Web コンポーネント間のやり取りは、親と子のコンポーネント間のみに制限されているため、別々の Web コンポーネント間でやり取りをする際にグローバルイベントはとても便利です (1)。
Web でグローバルイベントを使用するメリット:
- グローバルイベントは、フォーム内の Web コンポーネント間のやり取りを可能にします。
- また、コンポーネントの特定のイベントを実行できるので、コンポーネントのフォームを再表示する必要がありません。
コンポーネント A のアクションが、コンポーネント B のアクションをトリガーします。
たとえば、同じ親を持つ 2 つのコンポーネントについて考えてみます。コンポーネント "AuthorsComponent" は著者のリストをロードし、もう一方のコンポーネント "BooksComponent" は最初のコンポーネントで選択された著者の文芸作品を表示します。
この 2 つのコンポーネントは相互にやり取りできないので、コンポーネント "BooksComponent" のグリッドの再表示をトリガーするには、グローバルイベントを使用する方法が最適です。
1.GlobalEvents 外部オブジェクトを開き、"SelectAuthor" というイベントを追加します。必要なパラメーターを追加します。
2."AuthorsComponent" で、ユーザーがグリッド内の行をアクティベートしたら "SelectAuthor" グローバルイベントを呼び出します。
"AuthorsComponent" のコード:
Event grid1.OnLineActivate
GlobalEvents.SelectAuthor(AuthorId)
Endevent
3."BooksComponent" で、"SelectAuthor" グローバルイベントを定義します。&authorId をパラメーターとして受け取り、グリッドの再表示を呼び出します。&authorId は、この例では画面上に表示される変数です。
"BooksComponent" のコード
Event GlobalEvents.SelectAuthor(&authorId)
grid1.Refresh()
Endevent
ここでは具体的な例を示しましたが、フォーム内のコンポーネントを自由に組み合わせることができます。また、すべてのコンポーネントの親オブジェクトは、グローバルイベントを定義したり、呼び出したりできます。
注:
このスキームでは、イベントを呼び出すことができる Web コンポーネントが N 個、イベントが定義されている Web コンポーネントが M 個あります。
その後、別の Web コンポーネントに "SelectAuthor" グローバルイベントを定義することもできます。たとえば、コンポーネントに著者の略歴を表示することもできます。
このサンプルを試すには、「File:Web Global Events sample for books」からダウンロードしてください。
Web コンポーネント間でやり取りする従来の方法 (グローバルイベントを使用しない方法) は、次のとおりです。
- Web コンポーネントの Refresh コマンドを実行します
一般に、Web セッションを使用してほかの Web コンポーネントに情報を渡します。Web セッションは Refresh イベントで読み取られます。
ただし、WebComponent.Refresh コマンドは、特定のコンポーネントの子コンポーネントで実行できますが、親コンポーネントや同じ親を持つコンポーネントでは実行できません。
また、Refresh コマンドでは画面が完全に再表示されますが、多くの場合、これは適切な処理ではありません。
- Web コンポーネントを呼び出し、必要なパラメーターを渡します (WebComponent.create コマンド)。
Web コンポーネントは子コンポーネントとして作成できますが、親コンポーネントや、同じ親を持つコンポーネントは作成できません。
まとめると、同じ親を持つコンポーネントは相互にやり取りできず、また Web コンポーネントはその親や、さらにその親のコンポーネントとやり取りすることもできません。
|