ステップ3 - 静的リストデータソースを定義して使用する¶
このチュートリアルのステップでは、まずデータソースプラグインで静的リストのデータソースを定義し、次にそれを Kanzi Studio プロジェクトで使用して、データソースから Grid List Box ノード内のアイテムのデータを取得します。
リストデータオブジェクトを生成する機能を追加する¶
データソースプラグインでリストデータオブジェクトを生成する機能を追加します。
リストデータオブジェクトを生成する機能を追加するには:
<KanziWorkspace>/Tutorials/Data sources/Assets/Static listディレクトリからファイルエクスプローラーでdata_object_static_list.cppとdata_object_static_list.hppファイルを<KanziWorkspace>/Tutorials/Data sources/Start/Application/src/plugin/srcディレクトリにコピーします。これらのファイルにより、静的リスト用のデータオブジェクトを作成する機能が備わります。
<KanziWorkspace>/Tutorials/Data sources/Start/Application/src/plugin/CMakeLists.txtで、setコマンドにdata_object_static_list.cppとdata_object_static_list.hppファイルを追加します。set(sources_plugin src/data_object_static_list.cpp src/data_object_static_list.hpp src/tinyxml2.cpp src/tinyxml2.h src/xmldatasource.cpp src/xmldatasource.hpp src/xmldatasource.rc src/xmldatasource_module.cpp src/xmldatasource_module.hpp)
Kanzi Studio で、File > Open Kanzi Command Prompt を選択します。
Kanzi Command Prompt は、Kanzi 環境変数が設定された Windows コマンドプロンプトを開き、Kanzi のバージョンに対して Kanzi Command Prompt を開きます。
Kanzi Command Prompt を使用して、絶対パスや環境変数を設定せずに、Gradle、SCons、CMake などの Kanzi ユーティリティおよびビルドツールにアクセスします。
ヒント
Kanzi Command Prompt は、Rightware ディレクトリの Windows スタートメニューで見つけることができます。
Kanzi のバージョンが複数インストールされている場合は、そのコマンドプロンプトで作業したい Kanzi のバージョンに対応する Kanzi Command Prompt を起動するようにしてください。
<KanziWorkspace>/Tutorials/Data sources/Start/Applicationディレクトリ内の Kanzi Command Prompt で実行します。generate_cmake_vs2019_solution.bat
アプリケーションにファイルを追加または削除した後、Visual Studio ソリューションを再生成する必要があります。
Visual Studio ですべてのプロジェクトをリロードします。
Visual Studio で
xmldatasource.cppにこれらの変更を加えてください。data_object_static_list.hppヘッダーファイルを含めます。// Provides the functionality for creating data objects for a static list. #include "data_object_static_list.hpp"
addDataObject関数の前に、メモリ内のXML構造の内容を静的リストデータオブジェクトのリストアイテムに変換する関数を作成します。// Use this function to add list items to a list data object. static void addListItems(Domain* domain, DataObjectStaticListSharedPtr list, const tinyxml2::XMLElement* itemsElement) { for (const tinyxml2::XMLElement* child = itemsElement->FirstChildElement(); child; child = child->NextSiblingElement()) { // Create the root data object for the list item hierarchy. DataObjectSharedPtr rootObject = DataObject::create(domain, "Item root"); // Create the list item tree recursively. addDataObjectsRecursively(domain, rootObject, child); // Add the first child from the root data object as a list item. Discard the root object. list->addItem(rootObject); } }
addDataObject関数に、リスト型属性からリスト型データオブジェクトを作成する条件を追加します。// Add a data object of the type specified by the type attribute in the XML element. Get the initial value // from the text parameter. DataObjectSharedPtr addDataObject(Domain *domain, const char* type, const char* name, const char* text) { ... // Create a list data object from the list type attributes. else if (type && strcmp(type, "list") == 0) { object = make_shared<DataObjectStaticList>(domain, name); } ... }
addDataObjectsRecursively関数を変更して、リストデータオブジェクト内にデータオブジェクトを作成する機能を追加します。これは、リストタイプ内のXML要素の名前が items と呼ばれる場合に適用されます。リプレイス (Replace)
static void addDataObjectsRecursively(Domain* domain, DataObjectSharedPtr parent, const tinyxml2::XMLElement* xml) { ... // Traverse the tree in the XML file to add data objects for each child element of the current XML element. for (const tinyxml2::XMLElement* child = xml->FirstChildElement(); child; child = child->NextSiblingElement()) { // Recurse. addDataObjectsRecursively(domain, object, child); } }
以下に置き換えます。
static void addDataObjectsRecursively(Domain* domain, DataObjectSharedPtr parent, const tinyxml2::XMLElement* xml) { ... // Check whether the type of the current data object is list. DataObjectStaticListSharedPtr list = dynamic_pointer_cast<DataObjectStaticList>(object); // Traverse the tree in the XML file to add data objects for each child element of the current XML element. for (const tinyxml2::XMLElement* child = xml->FirstChildElement(); child; child = child->NextSiblingElement()) { // If the name of the XML element within the list type is items, create data objects inside that list data object. if (list && strcmp(child->Name(), "items") == 0) { addListItems(domain, list, child); } else { // Recurse. addDataObjectsRecursively(domain, object, child); } } }
Kanzi Studio で F8 を押して Preview を終了します。
Visual Studio のソリューションエクスプローラーで XML_data_source_start プロジェクトを右クリックし、ビルドを選択してプラグインをビルドします。
Visual Studioがプラグインをビルドした後、Kanzi Studio で F5 を押して Preview を開始します。
データソースからリストデータを取得する¶
このセクションでは、プロジェクト内の Grid List Box 2D ノードを設定し、プラグインがデータソースから生成するリストデータオブジェクトからそのアイテムのデータを取得します。
データソースからリストデータを取得するには:
Cluster データソースの隣にある Data Sources ウィンドウで
をクリックし、XML Data Source File プロパティを ClusterWithList.xmlファイルに設定します。ファイルはApplication/binディレクトリにあります。Cluster.xmlファイルに含まれるデータに加えて、ClusterWithList.xmlファイルにはリストアイテムのデータが含まれています。
Cluster データソースの隣にある
をクリックして、ClusterWithList.xmlファイルの内容からデータオブジェクトを作成します。Node Tree で、Grid List Box ノード Contacts > ContactsList を選択し、Properties で Item Template プロパティを ContactItem プレハブに追加して設定します。
Item Template プロパティを使用して、Grid List Box ノードがリスト内のアイテムに使用するプレハブテンプレートを設定します。
Data Sources ウィンドウから Cluster > contacts リストデータオブジェクトを ContactsList ノードの Items Source プロパティにドラッグします。
Items Source プロパティを使用して、Grid List Box ノード内のリストアイテムにデータを提供するデータオブジェクトを設定します。
ContactItem プレハブの Prefabs で ContactFirstName ノードを選択し、Data Sources ウィンドウから Cluster > contacts > Item > contact > firstname データオブジェクトをドラッグして、Properties の Text プロパティにドロップします。
前のステップを ContactLastName と ContactNumber に対して繰り返します。
Data Sources の ContactLastName ノードに対して、Cluster > contacts > Item > contact > lastname データオブジェクトを Text プロパティにドラッグアンドドロップします。
Data Sources から ContactNumber ノードの Cluster > contacts > Item > contact > phone データオブジェクトを Text プロパティにドラッグアンドドロップします。
連絡先のリストは、現在
ClusterWithList.xmlデータソースからデータを受け取ります。テキストエディタを使用してClusterWithList.xmlファイルの値を変更し、ClusterWithList.xmlファイルを保存し、Kanzi Studio Preview と Data Sources ウィンドウに更新されたデータオブジェクトとその値を表示します。
次の作業¶
このチュートリアルでは、XML データソースを定義する方法と、そのデータソースからのデータを Kanzi Studio プロジェクトで使用して、Kanzi アプリケーションにデータを提供する方法を学びました。これで、次のことができます。
Kanzi Engine API の使用方法について詳しく学びます。チュートリアル: Hello world! と チュートリアル: Kanzi Engine API の高度な使用法 を参照してください。
Kanzi Engine プラグインについて詳しく学びましょう。Kanzi Engine プラグイン を参照してください。
リソースを非同期でロードする方法を学習する。チュートリアル: リソースを非同期でロードおよびデプロイする を参照してください。
関連項目¶
Kanzi のデータソースについて詳しく学ぶには、データソース (Data Sources) を参照してください。