ステップ3 - 静的リストデータソースを定義して使用する

このチュートリアルのステップでは、まずデータソースプラグインで静的リストのデータソースを定義し、次にそれを Kanzi Studio プロジェクトで使用して、データソースから Grid List Box ノード内のアイテムのデータを取得します。

リストデータオブジェクトを生成する機能を追加する

データソースプラグインでリストデータオブジェクトを生成する機能を追加します。

リストデータオブジェクトを生成する機能を追加するには:

  1. <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 ディレクトリにコピーします。

    これらのファイルにより、静的リスト用のデータオブジェクトを作成する機能が備わります。

  2. <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)
    
  3. Kanzi Studio で、File > Open Kanzi Command Prompt を選択します。

    Kanzi Command Prompt は、Kanzi 環境変数が設定された Windows コマンドプロンプトを開き、Kanzi のバージョンに対して Kanzi Command Prompt を開きます。

    Kanzi Command Prompt を使用して、絶対パスや環境変数を設定せずに、Gradle、SCons、CMake などの Kanzi ユーティリティおよびビルドツールにアクセスします。

    ../../_images/open-kanzi-command-prompt.png

    ヒント

    Kanzi Command Prompt は、Rightware ディレクトリの Windows スタートメニューで見つけることができます。

    Kanzi のバージョンが複数インストールされている場合は、そのコマンドプロンプトで作業したい Kanzi のバージョンに対応する Kanzi Command Prompt を起動するようにしてください。

  4. <KanziWorkspace>/Tutorials/Data sources/Start/Application ディレクトリ内の Kanzi Command Prompt で実行します。

    generate_cmake_vs2019_solution.bat
    

    アプリケーションにファイルを追加または削除した後、Visual Studio ソリューションを再生成する必要があります。

  5. Visual Studio ですべてのプロジェクトをリロードします。

    ../../_images/visual-studio-reload-all.png
  6. Visual Studio で xmldatasource.cpp にこれらの変更を加えてください。

    1. data_object_static_list.hpp ヘッダーファイルを含めます。

      // Provides the functionality for creating data objects for a static list.
      #include "data_object_static_list.hpp"
      
    2. 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);
          }
      }
      
    3. 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);
          }
      
      ...
      
      }
      
    4. 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);
              }
          }
      }
      
  7. Kanzi Studio で F8 を押して Preview を終了します。

  8. Visual Studio のソリューションエクスプローラーで XML_data_source_start プロジェクトを右クリックし、ビルドを選択してプラグインをビルドします。

    ../../_images/build-plugin-project.png
  9. Visual Studioがプラグインをビルドした後、Kanzi Studio で F5 を押して Preview を開始します。

データソースからリストデータを取得する

このセクションでは、プロジェクト内の Grid List Box 2D ノードを設定し、プラグインがデータソースから生成するリストデータオブジェクトからそのアイテムのデータを取得します。

データソースからリストデータを取得するには:

  1. Cluster データソースの隣にある Data Sources ウィンドウで image0 をクリックし、XML Data Source File プロパティを ClusterWithList.xml ファイルに設定します。ファイルは Application/bin ディレクトリにあります。

    Cluster.xml ファイルに含まれるデータに加えて、ClusterWithList.xml ファイルにはリストアイテムのデータが含まれています。

    ../../_images/xml-data-source-file-to-clusterwithlist.png
  2. Cluster データソースの隣にある image1 をクリックして、ClusterWithList.xml ファイルの内容からデータオブジェクトを作成します。

  3. Node Tree で、Grid List Box ノード Contacts > ContactsList を選択し、Properties で Item Template プロパティを ContactItem プレハブに追加して設定します。

    Item Template プロパティを使用して、Grid List Box ノードがリスト内のアイテムに使用するプレハブテンプレートを設定します。

    ../../_images/project-contactslist.png ../../_images/item-template-contactitem.png
  4. Data Sources ウィンドウから Cluster > contacts リストデータオブジェクトを ContactsList ノードの Items Source プロパティにドラッグします。

    Items Source プロパティを使用して、Grid List Box ノード内のリストアイテムにデータを提供するデータオブジェクトを設定します。

    ../../_images/data-sources-contacts-value.png ../../_images/item-source-contactslist.png
  5. ContactItem プレハブの Prefabs で ContactFirstName ノードを選択し、Data Sources ウィンドウから Cluster > contacts > Item > contact > firstname データオブジェクトをドラッグして、Properties の Text プロパティにドロップします。

    ../../_images/prefabs-contactfirstname.png ../../_images/data-sources-firstname-value.png ../../_images/drop-to-contactfirstname-text-property.png
  6. 前のステップを ContactLastName と ContactNumber に対して繰り返します。

    • Data Sources の ContactLastName ノードに対して、Cluster > contacts > Item > contact > lastname データオブジェクトを Text プロパティにドラッグアンドドロップします。

      ../../_images/data-sources-lastname-value.png ../../_images/drop-to-contactlastname-text-property.png
    • Data Sources から ContactNumber ノードの Cluster > contacts > Item > contact > phone データオブジェクトを Text プロパティにドラッグアンドドロップします。

      ../../_images/data-sources-phone-value.png ../../_images/drop-to-contactnumber-text-property.png
    ../../_images/end-of-step-3.png

    連絡先のリストは、現在 ClusterWithList.xml データソースからデータを受け取ります。テキストエディタを使用して ClusterWithList.xml ファイルの値を変更し、ClusterWithList.xml ファイルを保存し、Kanzi Studio Preview と Data Sources ウィンドウに更新されたデータオブジェクトとその値を表示します。

次の作業

このチュートリアルでは、XML データソースを定義する方法と、そのデータソースからのデータを Kanzi Studio プロジェクトで使用して、Kanzi アプリケーションにデータを提供する方法を学びました。これで、次のことができます。

関連項目

Kanzi のデータソースについて詳しく学ぶには、データソース (Data Sources) を参照してください。