.NET ModelKit Suite User(s) Guide

.NET ModelKit Suiteについて

.NET ModelKit Suiteは.NETフレームワーク用に設計された、高度なデータ分析や処理を行うコンポーネントやビジュアルコンポーネントで構成されています。

パッケージには

・Chart ModelKit （チャートやグラフを作成するためのコンポーネント）

・Instrumentation ModelKit （メータやゲージ等を作成するためのコンポーネント）

・OLAP ModelKit （データ処理を行うためのコンポーネント）

・Report Sharp-Shooter （レポートを行うためのコンポーネント）

が含まれています。

また、これらのコンポーネントはほとんどコーディングする必要がなく、デザイン時にカスタマイズすることができます。

Copyright(c) by Perpetuum Software
Japanese localization by NEWTONE Corporation


.NET ModelKit Suite Documentation

お問い合わせについて

弊社にお問い合わせされる場合は、以下の項目をお知らせいただきますようお願いいたします。

ユーザ情報
1)ユーザID(ユーザ登録後に弊社より返送されるはがきに記載されている番号 UID-XXXXXX)
2)お名前(法人登録の場合は、会社名も併せてお知らせください。)
3)ユーザ登録している電話番号、FAX 番号もしくはメールアドレス
4)有償サポート契約を結ばれている方は契約番号

製品に関する情報
1)製品名
2)バージョン
3)製品のシリアルNo.
4)DLL ファイルのタイムスタンプ

開発環境及び使用計器に関する情報
1)OS
2)開発コンテナ

ご質問の内容
どのようにしたらその症状が発生するのか、あるいはどのような事柄が聞きたいのか、できるだけ簡潔にご説明ください。文章で説明するのが難しい場合は、再現性のあるプログラムをメールにて添付していただいた方がよりスムーズに解決する場合もございますので、その場合はプログラムをLZH もしくはZIP 形式で圧縮していただき、お送りください。
また、製品とは関係のないプログラミング技法やWindowsAPI などに関するご質問にはお答えいたしかねますので、予めご了承ください。

問い合わせ先
「お使いになる前に」(パッケージ版は同梱の折込案内、ダウンロード版は別のPDF ファイル)のサポートについてをご覧ください。

注意
1 インストールライセンスはユーザ登録された方がサポート対象となります。


システムの必要条件

.Net ModelKit Suiteがサポートする開発環境は、Microsoft Visual Studio 2005です。

.NET ModelKit Suiteを使用するアプリケーションの実行には、Microsoft .NET Framework 2.0が必要です。


インストール

インストールパッケージファイル名はNETModelKitSuite.msiです。ウィザードの指示通りにインストールを行ってください。

インストール時に「Visual Studio Toolboxにコンポーネントを追加」を選択すると、Microsoft Visual Studio .Netのツールボックスにコンポーネントが自動的に追加されます。手動でツールボックスに追加する場合は、製品別にタブを作成することをお勧めします。その場合は、Visual Studioを起動し、ツールボックス上で右クリックして、コンテキストメニューから[タブの追加]を選択し、タブ名をReport Sharp Shooterなどと入力して「Enter」を押します。次に作成したタブにコンポーネントを追加します。タブを左クリックして開き、右クリックしてコンテキストメニューを開き、「アイテムの追加と削除」を選択します。下図のようなダイアログボックスが表示されます。

名前空間（PerpetuumSoftで始まるコンポーネントすべての名前空間）でリストをソートするには、名前空間のヘッダーをクリックして、ReportManager、DesignerDataSourceTree、DesignerDocumentTree、DesignerErrorList、DesignerPropertyGrid、DesignerStatusBar、DesignerToolBar、DesignerToolBox、ReportDesigner、CSVExportFilter、ExcelExportFilter、ExcelXMLExportFilter、BitmapExportFilter、EmfExportFilter、GifExportFilter、JpgExportFilter、TiffExportFilter、HtmlExportFilter、PdfExportFilter、RTFExportFilter、ReportViewer、SharpShooterWebViewerコンポーネントを選択し、「OK」をクリックします。

ツールボックスに次図のように表示されます。

[Windowsフォーム時] | [Webフォーム時]

ここで、もし「ExcelExportFilter」を追加しない場合ツールボックスで選択できないため、プレビュー時のエクスポート時にExcelファイル形式（.Xls）はファイルの種類の選択肢に表示されなくなります。

Visual Studio 2005でInstrumentation ModelKitを使用するには、ツールボックスにIndicatorWidget、Widget、WidgetHolder、WidgetProducer、OPCChannel、OPCConnectionコンポーネントを追加してください。OLAP ModelKitを使用するには、DataCube、DataCubePrintDocument、DataCubeGrid、DataCubeViewコンポーネントを追加し、Chart ModelKitを使用するには、ChartViewerコンポーネントをVisual Studioのツールボックスに追加してください。


製品のライセンス認証

ライセンスファイルのインストール

本製品はライセンス認証を行わないと、「体験版」の警告が表示されます。

ユーザー登録後に弊社から送付されたライセンスファイル(xxx.elic)をライセンスの管理(LicenseManager.exe)でインストールしてください。また、複数のライセンスを購入された場合には、全てのライセンスファイルをインストールしてください。

本製品を使用してプロジェクトを作成すると、license.licxファイルが作成され、プロジェクトに追加されます。このlicense.licxファイルにはライセンス認証を受けたコンポーネントの一覧があります。

license.licxのライセンス情報はプロジェクトがビルドされると、アプリケーションのリソースに組み込まれます。このリソースに組み込まれたライセンス情報により、ライセンスがインストールされていないエンドユーザーのPCでもアプリケーションが正しく実行されます。

しかし、ライセンス認証を行っていないPCで作成されたアプリケーションにはライセンス情報がないので、このアプリケーションをエンドユーザーのPCで実行すると体験版のメッセージが表示されますので注意してください。

また、最終的にアプリケーションを配布する場合には、ライセンス情報がプロジェクトに含まれているか確認してください。作成されたlicense.licxファイルには使用されているコンポーネントの一覧があります。そして最後にライセンスがインストールされていないPCでアプリケーションを実行してみてください。

プロジェクトをビルドしてもソースファイルがコンパイルされないで、license.licxファイルも更新されない場合があります。このときはコンポーネントが配置されているフォームを少し変更してプロジェクトをリビルドをしてください。license.licxファイルが更新されます。

コンポーネントをフォームに配置しないでコードで動的に作成する場合には、一時的なプロジェクトを新規に作成することによりlicense.licxファイルが生成されますので、このファイルをプロジェクトに追加してください。

コマンドラインからビルドして使用する場合には、.NET FrameworkのSDKにあるlcユーティリティを使用します。例えば、アプリケーションをMyApplication.exeとすると、下記のようになります。

lc.exe /target:MyApplication.exe /complist:licenses.licx /i:PerpetuumSoft.Framework.dll /i:PerpetuumSoft.Reporting.dll

これによりライセンス付きのリソースファイルが作成されます（MyApplication.exe.licensesファイル）。

その後下記のように、このファイルをアプリケーションのリソースに追加してください。

csc /res:MyApplication.exe.licenses /reference:….


製品の言語設定について

本製品は簡単に他言語に変更できます。言語の文字列は言語別のXMLファイルに設定されます。

言語の設定方法は下記の方法があります。

1）パッケージに含まれているSelectLanguageアプリケーションを使用して言語を設定します。このアプリケーションは製品の言語に関する登録を設定します。
設定には
1.インストールされている言語（Select from list）から1つを選択する
2.カスタムローカライズファイル（ファイルから読込）を使用してカスタム言語を設定
3.デフォルト言語（Default－デフォルト言語は英語）を選択する
の何れかを行います。

2）言語をアプリケーションプログラムで設定します。
PerpetuumSoft.Framework.Localization名前空間の型を使用します。
PerpetuumSoft.Framework.Localization.Language.CurrentLanguage はカレントの言語を表します。
設定言語を変更するには以下の方法があります。
1. 専用の形式ファイルからローカライズ文字列を読み込む
PerpetuumSoft.Framework.Localization.LocalizationFile localizationFile = new PerpetuumSoft.Framework.Localization.LocalizationFile();
localizationFile.Read(<filePath>);
PerpetuumSoft.Framework.Localization.Language language = PerpetuumSoft.Framework.Localization.Language();
language.AddLocalizationFile(localizationFile);
PerpetuumSoft.Framework.Localization.Language.CurrentLanguage = language;
2. デフォルト言語を設定する
PerpetuumSoft.Framework.Localization.Language.CurrentLanguage = PerpetuumSoft.Framework.Localization.Language.DefaultLanguage;
3. レジストリにローカライズ言語をカレントの言語として指定する
PerpetuumSoft.Framework.Localization.Language.CurrentLanguage = PerpetuumSoft.Framework.Localization.Language.CreateLanguageFromRegistrySettings();


Report Sharp Shooterについて

Report Sharp Shooter?はさまざまな分野で利用できる最もフレキシブルな.NET対応のレポートエンジンです。バウンド・アンバウンドの両対応はもちろん、多数のリレーションに対応した「マスター・詳細」形式のレポートを作成できる100%マネージド.NETコンポーネントです。グループ、列、クロス、ダブルパスモード、C#/VBスクリプトなどを使用して、非常に複雑なレポートを作成することができます。ADO.NETの階層表示型のデータモデル、WinForms、ASP.NET WebForms、C#/VB.NETのスクリプトをサポートしています。最終ドキュメントやレポートのテンプレートに必要なデザイナが含まれています。ビルドイン・ピボットテーブルコンポーネントを使用して動的なデータ分析が行えます。内蔵されたチャート作成コンポーネントを使用してレポートにチャートを含めることができます。詳細は弊社ホームページをご覧ください。

製品機能：

.NET 2.0完全対応：

  • マネージドレポートエンジン
  • マネージドレポートデザイナはデザイン時および実行時に使用可能
  • Visual Studio .NET、Borland C# Builder、Delphi.NET、その他の.NET IDEに対応。IDEなしでの使用も可能。
  • ADO.NETに対応 。リレーショナル階層データモデルをサポート
  • WinFormsおよびASP.NET WebFormsのサポート
  • ADO.NETデータセット、 データビュー、コレクション、配列、IEnumerable、IListまたはIListSourceを実装する任意のクラスを含むすべての .NET データソースをサポート。
  • 複数のデータソースが単一レポートで使用可能。
  • GDI+の優位性を利点。 グラデーションの塗りつぶし、アルファチャンネルの重ね合わせ、 カスタムな形状など
  • C#、VB.NETのスクリプトをサポート。新たにスクリプト言語を学ぶ必要はありません。

優れた柔軟性:

  • 同一レポート内で無制限レベルの「マスター/詳細」形式バンド
  • クロスバンドを使用した自然なクロスレポートの作成
  • すべての.NET Framework機能(任意のプロジェクトの名前空間のインポート、ローカル変数、手続き、関数など)へのアクセスを持つC#/VBスクリプトを使用して生成を100%カスタマイズ可能
  • 分かりやすく、すぐに使用できる、レポートテンプレートに適したマネージドドキュメントオブジェクトモデル
  • 同一レポートでさまざまなページサイズやページ方向の設定が可能
  • ページヘッダー/フッターおよびページオーバーレイ (ページの背景に透かし模様などのオブジェクトを作成することができます。)
  • オープン プラグイン アーキテクチャ
  • テキスト、シェープ、イメージ、バーコード、郵便番号を含む、豊富でビジュアルなコントロールセットを提供。さらに、全ての WinFormsコントロールもReport Sharp Shooterのレポートオブジェクトとして使用することができます。
  • スタイルがサポートされています。プレビュー、印刷、エクスポートなどに最適なスタイルシートを使用することができます。
  • バウンド、アンバウンドの両方のモードがサポートされています。
  • 手動ビルドモードがサポートされています。レポート生成過程（非常に複雑なレポートを作成する場合に限る）を制御するには手動ビルドモードを使用します。手動と自動のレンダリングを組み合わせて、連続してバンドを作成することができます。
  • 計測単位はメートルとインチに対応しています。
  • Win/Web Formsのデータバインドと同様の強力なバインドモデルは、データフィールド、システム変数やローカル変数、C#または VB.NETで作成された式にコントロールのプロパティをバインドできます。
  • 生成されたレポートはメタファイル形式ではなくReportDOMを使用したグラフオブジェクト形式で保存されるので、最終ドキュメントも簡単に変更できます。
  • PDF、HTML、RTF、EMF、BMP、JPG、GIF、PNG、TIFF、Excel、Excel(XML)、CSVおよびText形式でのエクスポートフィルタを装備しています。 カスタムなエクスポートフィルタも使用可能。
  • バンドを使用しなくても正確な位置にレポートを作成できます。
  • 自動コンバータによりCrystal ReportsをReport Sharp Shooterにすばやく変換できます。

ロイヤリティフリーのランタイム

  • ロイヤリティフリーのレポートエンジン
  • ロイヤリティフリーのレポートビューア
  • 最終ドキュメント用の実行時デザイナ全機能がロイヤリティフリー
  • レポートテンプレートの実行時デザイナ全機能がロイヤリティフリー

簡単な配布とインターネット共有

  • 必要なDLLは2つで、実行環境への配布が簡単
  • Report Sharp Shooterのレポートファイル形式はXMLに基づいており、インターネットでのデータ共有が容易
  • ウィザードを使用してレポートを迅速かつ簡単に作成できます
  • レポートのジェネレータ（プロパティグリッドを含む）のローカライズが可能。製品を再起動せずにインターフェースの言語変更が可能。


基本的な使い方（Report Sharp Shooter編）

この章では、順を追ってシンプルなレポートの作成を行います。

Visual Studio .NETを起動し、新規のC# Windowsアプリケーションプロジェクトを作成します。（VB.NETでも同様な手順です。）

まず、レポートのデータソースを作成します。これを行うには、フォームにツールボックスの「データ」タブからDataSetオブジェクトを追加します。

「データセットの追加」ダイアログから「型指定のないデータセット」を選択します。

DataSetはビジュアルコンポーネントではないので、フォームデザイナウィンドウの下部に表示されます。

次にサンプルテーブルを作成します。

追加されたDataSetコンポーネント（デフォルト名：DataSet1）を選択して、プロパティウィンドウのTablesプロパティを選択し、 [image] ボタンをクリックして「テーブル コレクション エディタ」を開きます。「追加」ボタンを使って、「Customers」という名前のテーブルを作成します。

次に、「テーブル コレクション エディタ」のプロパティリストで「Columns」（コレクション）をクリックして、表示される「列コレクション エディタ」を使って、テーブル内に「Name」と「Phone」という文字列型のフィールドを二つ作成してください。

次に、プログラム実行時に何件かのデータを表示するためにフォームのLoadイベントに次のコードを追加します。

DataRow row = dataTable1.NewRow();
row["Name"] =
                    "Johnson Leslie";
row["Phone"] =
                    "613-442-7654";
dataTable1.Rows.Add(row);
row = dataTable1.NewRow();
row["Name"] =
                    "Fisher Pete";
row["Phone"] =
                    "401-609-7623";
dataTable1.Rows.Add(row);
row = dataTable1.NewRow();
row["Name"] =
                    "Brown Kelly";
row["Phone"] =
                    "803-438-2771";
dataTable1.Rows.Add(row);

次に、フォームにReport Sharp Shooterの「ReportManager」コンポーネントを置きます（このコンポーネントがツールボックスにない場合は、「インストレーション」 のセクションを参照）。ReportManagerはビジュアルコンポーネントではないので、フォームデザイナウィンドウの下部に表示されます。

次は、レポート用のデータソースを指定します。追加されたコンポーネント（デフォルト名はreportManager1です）を選択し、ダブルクリックすると、レポートマネージャエディタが開きます。このウィンドウでデータソースを設定したりレポートのコレクションを編集できます。

レポートマネージャエディタのウィンドウから「データソース」タブを選択すると、データバインドリストが画面に表示されます。

「追加」ボタンをクリックすると新しいダイアログボックスが表示されるので、「名称」フィールドに「CustomersDataSet」
                、「値」プロパティに「dataSet1」を入力してOKボタンをクリックします。

OKボタンを押してデータバインドエディタを閉じます。

では、レポートを追加してください。レポートマネージャエディタウィンドウからレポートタブを選択してください。

「追加」ボタンをクリックしてInlineReportSlotオブジェクトを追加します。レポートデザイナを開くには、プロパティグリッドのDocumentプロパティの  [image]
                ボタンをクリックするか、「デザイナの起動」ボタンをクリックしてください。

レポートデザイナを開くと、次のようになっています。

ファイルメニューの「新規」を選択すると、次のダイアログが表示されます。

「新規」タブから「標準のレポート」を選択し、OKボタンをクリックします。「標準のウィザード」のウィンドウが画面に表示されます。

「レポートのテンプレートのプロパティ」のレポートのタイトルを「Customers」と指定します。そして  [image] ボタンをクリックします。このボタンの下のリストに新しい「データセクション」タブが表示されます。

ここでリスト項目から一つ選択できます。利用可能な設定がパネルの右に表示されます。データセクション（  [image] ボタン）のデータソース（「データソース」フィールド）をCustomersDataSet.Customersと指定します。
                「全フィールド]」リストの「Name」フィールドを選択し、  [image] ボタンを使用するか、またはマウスでドラッグして「可視フィールド」タブに「Name」を追加します。「Phone」フィールドも同様に行います。この後の「標準のウィザード」のフォームは下記のようになるはずです。

  ボタンを押し、「レポートデザイナ」を閉じます。

フォームにボタンを一つ追加し、そのボタンの「Text」
                プロパティに「プレビュー」と指定します。このボタンのClickイベントに次のコードを記述します。

if (inlineReportSlot1 != null)

                try

                {

                inlineReportSlot1.Prepare();

                } catch(Exception exc)

                {

                MessageBox.Show(exc.Message, "Report Sharp-Shooter", MessageBoxButtons.OK,
                MessageBoxIcon.Error);

                }

そして、プロパティエディタのinlineReportSlot1オブジェクトを選択します。

RenderCompletedイベントを追加し、そこに次のコードを記述します。

using (PerpetuumSoft.Reporting.View.PreviewForm previewForm = new
                PerpetuumSoft.Reporting.View.PreviewForm(inlineReportSlot1))
{
previewForm.WindowState = FormWindowState.Maximized;
previewForm.ShowDialog(this);
}

このコードはレポートのテンプレートを使用して最終ドキュメントを作成し、「レポートビューア」コンポーネントを開きます。

アプリケーションを実行して「プレビュー」ボタンをクリックすると、作成されたレポートが表示されます。不明な点は、「GettingStartedExample」サンプルを参照してください。

            【デザイン例】

【実行例】


レポートデザイナの操作

レポートデザイナはレポートのテンプレートを作成するため（レポートをデザインするため）に使用します。

下記にレポートデザイナが表示されています。レポートのテンプレートはレポートの外観を自由自在に設定できるように、さまざまなコンポーネントが置かれているページのテンプレートです。各コンポーネントにはプロパティタブのツールウィンドウに表示されているプロパティがあります。ほとんどのプロパティに.NET対応プログラム言語で記述された式をリンクすることができます。このバインド可能なプロパティをプロパティタブに表示するには、 [image] ボタンをクリックしてください。

レポートのテンプレートにコンポーネントを配置するには、メニューまたはコンポーネントツールボックスを使用して選択してください。次に、「Work area（ワークエリア）」上で左クリックしてコンポーネントを配置するか、コンポーネントのサイズを変更する場合はドラッグしてコンポーネントを配置します。

[ファイル]メニューについて説明します。

[ファイル]メニューの[新規]、Ctrl+N、または [image] ボタン - 新規のレポートのテンプレートを作成できます。
次のような「ウィザードギャラリ」を開きます。

リストから「白紙のレポート」を選択し、Оkをクリックすると、白紙のテンプレートが作成されます。[標準のレポート]を選択すると、標準のウィザードを開きます。[ファイルから読込]ボタンをクリックすると以前に保存したウィザードファイルを選択でき、標準の[ファイルからウィザードを読み込む]のダイアログボックスが表示されます。作成したウィザードファイルを選択するには、[保存]タブを使います。「参照」ボタンをクリックすることによりパスを選択できます。「標準のレポート」ウィザードの使用方法に関する詳細は、ユーザガイドの「ウィザードでテンプレートを作成」を参照してください。

[ファイル]メニューの[開く Ctrl+O]、 (ツールバーの [image] ボタン)はファイルから[テンプレートを開く]のダイアログボックスを開きます。[ファイル]メニューの[保存 Ctrl+S](ツールバーの [image] ボタン)はレポートのテンプレートを保存します。新しいファイル名でテンプレートを保存するには、[ファイル]メニューの[名前を付けて保存]を使用します。[ファイル]メニューの[言語の選択]は Report Sharp Shooterのインターフェース言語を選択できます。レポートデザイナを終了するには、[ファイル]メニューの[デザイナの終了]を選択してください。

レポートのテンプレートの変更を元に戻すには、[編集]メニューの[元に戻す Ctrl+Z] またはツールバーの [image] ボタンを使用します。元に戻した変更をやり直すには、[編集]メニューの[やり直し Ctrl+Shift+Z] またはツールバーの [image] ボタンを使用できます。

レポートビューアと同様に、レポートデザイナはマウスを使用して[ビュー]メニューまたは対応するツールバーボタンのさまざまなモードを選択できます。

オブジェクトの選択モードを指定するには、[ビュー]メニューの[選択]（F2）またはツールバーの [image] ボタンをクリックしてください。このモードを使用してテンプレートにある各コンポーネントをマウスで選択できます。複数のオブジェクトを選択するには、Shift キーを押しながら希望のオブジェクトを左クリックするか、左クリックしたままドラッグしてオブジェクト領域を選択してください。また、プロパティタブのオブジェクトのドロップダウンリストからオブジェクトを選択することもできます。さらに、「ページ」オブジェクトや「ドキュメント」オブジェクトを選択するには、特別な方法があります。「ページ」オブジェクトは[レポート]メニューの[ページのプロパティ]またはツールバーの [image] ボタンを使用して選択できます。「ドキュメント」オブジェクトは[レポート]メニューの[ドキュメントのプロパティ]またはツールバーの [image] ボタンを使用して選択できます。

パンモードは[ビュー]メニューの[パン]（F3）またはツールバーの [image] ボタンを使用して指定します。このモードはドキュメント上で左クリックしたまま希望する方向にドキュメントをドラッグすることにより希望するレポート部分を表示することができます。

[ダイナミックズーム]モードは[ビュー]メニューの[ダイナミックズーム]（F6）またはツールバーの [image] ボタンで選択することにより使用できます。左クリックしたままマウスを上か下にドラッグすると、ドキュメントがズームインまたはズームアウトされます。

[ズームイン]モードは[ビュー]メニューの[ズームイン]（F4 ）またはツールバーの [image] ボタンで選択することにより使用できます。ドキュメントを左クリックすると、ズームインされます。

[ズームアウト]モードは[ビュー]メニューの[ズームアウト]（F5 ）またはツールバーの [image] ボタンで選択することにより使用できます。ドキュメントを左クリックすると、ズームアウトされます。

ドキュメントの特定領域のズームインは[ビュー]メニューの[矩形に合わせてズーム（F5）]（ツールバーの [image] ボタン）で使用することができます。このモードは選択した矩形領域をズームインできます。ドキュメント領域上で左クリックしたままマウスポインタを希望する方向にドラッグして、矩形領域を選択することができます。

[ビュー]メニューの次の項目を使用して自動ズームを調節できます。

  • [ページ全体] またはツールバーの [image] ボタン - ページ全体がレポートビューアウィンドウに収まるようにドキュメントがズームされます。
  • [ページの幅] またはツールバーの [image] ボタン - ページの幅に合わせてウィンドウに収められます。
  • [実サイズ] またはツールバーの [image] ボタン - 100%にズームされます。

また、[ビュー]メニューには次の項目があります。

  • [グリッドの表示] (ツールバーの [image] ボタン) - グリッドを表示または非表示にします。
  • [グリッドに合わせる] (ツールバーの [image] ボタン) - グリッドに合わせることを有効/無効にします。 オブジェクトをグリッド線に合わせて移動またはサイズ変更することができます。
  • [オブジェクトバンドの表示] (ツールバーの [image] ボタン) - オブジェクトの枠を表示/非表示にします。
  • [バンドのレイアウト] (ツールバーの [image] ボタン) - セクションの自動整列を有効/無効にします。有効の場合、セクションはレポートに表示される順番通りに自動的に並べられます。
  • [ルーラの表示] (ツールバーの [image] ボタン) - ルーラの垂直・水平表示を有効/無効にします。

レポートのテンプレートを何ページでも作成できます。ページを追加するには、[レポート]メニューの[ページの追加]またはツールバーの [image] ボタンを使用してください。ページの削除は[レポート]メニューの[ページの削除]またはツールバーの [image] ボタンを使用して削除できますが、テンプレートは少なくとも1ページは残しておかなければなりません。ページの切り替えにはフォームの左下にあるlページタブ（下図参照）を使用します。

[編集]メニューには選択したオブジェクトに関するさまざまな操作方法があります。[編集]メニューの[オブジェクトの切り取り（Ctrl+X）]（またはツールバーの [image] ボタン）は選択したオブジェクトをクリップボードにコピーしたり切り取ることができます。[編集]メニューの[オブジェクトのコピー（Ctrl+C）]（またはツールバーの [image] ボタン）は選択したオブジェクトをクリップボードにコピーします。[編集]メニューの[オブジェクトの挿入（Ctrl+V）]（またはツールバーの [image] ボタン）はクリップボードからオブジェクトを挿入します。[編集]メニューの[オブジェクトの削除（Ctrl+D）]（またはツールバーの [image] ボタン）は選択したオブジェクトを削除します。レポートデザイナはオブジェクトにZバッファ法を使用します。手前のオブジェクトはテンプレートに挿入され、隠面オブジェクトはZバッファに挿入されます。オブジェクトの順番も[編集]メニューで変更します。[編集]メニューの[整列]の[選択したオブジェクトを先頭に移動]（ツールバーの [image] ボタン）は選択したオブジェクトをページの一番上に配置します。[編集]メニューの[整列]の[選択したオブジェクトを最後に移動]（ツールバーの [image] ボタン）は選択したオブジェクトを他のオブジェクトの一番下に配置します。[編集]メニューの[整列]の[選択したオブジェクトを前方に移動]（ツールバーの [image] ボタン）および[編集]メニューの[整列]の[選択したオブジェクトを後方に移動]（ツールバーの [image] ボタン）は選択したオブジェクトを一つ前または後ろに配置します。

あらかじめ作成しておいたテンプレートを使用してレポートをプレビューするには、[レポート]メニューの[プレビュー]またはツールバーの [image] ボタンを使用できます。スクリプトでエラーが検出された場合、レポートデザイナの下部にエラーリストが表示されます。[ウィンドウ]メニューの[エラーリスト（Ctrl+E）]を使用してエラーリストを有効/無効にできます。また、レポートを生成しなくてもスクリプトのチェックが行えます。これを行うには、[レポート]メニューの[スクリプトのチェック]またはツールバーの [image] ボタンを使用できます。

デザイナのツールバーには頻繁に使用するプロパティを操作するために次のようなオブジェクトがあります。

レポートオブジェクトのスタイル( [image] )、フォント、テキストの整列（縦、横）、枠のスタイル( [image] )、マージン( [image] )、背景の塗りつぶし( [image] )とテキストの塗りつぶし( [image] )、テキスト形式( [image] )

「名称」フィールドにはレポートのオブジェクト名を指定することができます。

またツールバーに、オブジェクトのプロパティにバインドする式を設定することもできます。「Binding」リストはオブジェクトのプロパティを設定し、「F(X)」フィールドには式を定義できます。expressionエディタは [image] ボタンで開くことができます。

同様に、[ウィンドウ]メニューの[ツールウィンドウ（Ctrl+P）]を使用して、ツールウィンドウの表示を有効/無効にできます。

ツールウィンドウにはプロパティタブの他に「データソース」と「ドキュメントツリー」という2つのタブがあります。データソースタブを使用して利用可能なデータソースを参照できます。また、これらのコンポーネントをマウスでドラッグして配置することにより、レポートに追加することができます。

ドキュメントツリータブはカレントのテンプレートの構造を表示します。


概念

Report Sharp Shooterを使用する際に必要な概念について紹介します。

レポートを生成するには、テンプレートを作成します。テンプレートとはページ（通常１ページ使用されます）のことです。各ページには様々な可視コンポーネントがあります。これらのコンポーネントのプロパティを使って、レポート表示をカスタマイズすることができます。レポートのテンプレートを作成するには三つの方法があります。

  • 「レポートデザイナ」コンポーネントでテンプレートをデザインする
  • ウィザードを使用して動的にテンプレートを作成する
  • すべてプログラミングによって動的にテンプレートを作成する

テンプレートは、*.xmlまたは*.rstの拡張子がついたXML形式に保存することができます。作成されたテンプレートはPerpetuumSoft.Reporting.Components.ReportSlotクラスのメソッドの力を借りて保存されます。ReportManagerコンポーネントはさまざまなレポートのソース（Reportプロパティ）やデータソース（DataSourceプロパティ）のために設計されています。レポートが作成されると（そのテンプレートにデータが入力されると）、その結果が最終ドキュメントになります。PerpetuumSoft.Reporting.DOM.Documentクラスは最終ドキュメントやレポートのテンプレートの作成に使用します。

最終ドキュメントは「レポートビューア」コンポーネントに表示されます。このコンポーネント内でレポートを印刷したり、コンポーネントを一般的な形式にエクスポートするのと同じように、拡張子に*.xmlまたは*.rsdがついたXML形式に保存できます。

現在、Report Sharp Shooterは、GIF、PNG、JPG、BMP、EMF、PDF、HTML、CSV、TXT、Excel、XML、RTFなどの形式へのエクスポートをサポートしています。

最終ドキュメントを作成した後、プログラムによって、または「レポートデザイナ」コンポーネントを使用して修正することができます。「レポートデザイナ」コンポーネントは、「レポートビューア」コンポーネントから直接開くことができます。

レポートがどのように作成されるかは、下記の図を参照してください。


Report Sharp Shooterでのデータソースの使用

下記のクラスは Report Sharp Shooter のデータソースとして使用可能です。

  • ADO.NET オブジェクト - System.Data.DataSet、System.Data.DataView、System.Data.DataTable
  • System.ComponentModel.IListSource インターフェースまたは System.Collections.Ienumerable インターフェース（Ienumerable インターフェースは、System.Array、System.Collections.ArrayList、System.Collections.CollectionBase やその他の多数のクラスで実装されます）を実装するユーザオブジェクト（ビジネスオブジェクト）
  • 上述されたリストに含まれない任意のクラスのユーザオブジェクト（ビジネスオブジェクト）のプロパティすべてがデータソースとして利用可能です。

それでは、実際に既存のデータベース（MDB）の1テーブルのデータをレポートに一覧表示してみましょう。 この例では、最後にボタンのクリックイベントで実行時のデータ読み込みとビューアとデザイナの呼び出しのために6行だけコードを書きますが、それ以外は1行もコードを記述しません。

まず、Visual Studio（Visual Baisc） の新しいプロジェクト（Windows アプリケーション）を作成します。
次に、Visual Studio の「データ」メニューの「新しいデータソースの追加」を選択します。

「データソース構成ウィザード」が起動します。

「データソースの種類を選択」画面で「データベース」を選択して、「次へ」ボタンを押します。

「データ接続の選択」画面で「新しい接続」ボタンを押します。

次に開く「接続の追加」ダイアログの「参照」ボタンで、（製品のインストール先がデフォルトの場合）「C:\Program Files\Perpetuum Software\Net ModelKit Suite\Resources\Data\NWIND.MDB」を選択し、「OK」ボタンを押します。

「データ接続の選択」画面に戻りますので、そのまま「次へ」ボタンを押します。

下図のような、データベースをプロジェクトコピーして使うか、既存のデータベースを直接使うかの選択ダイアログが表示された場合は、「いいえ」を選択してください。

「接続文字列をアプリケーション構成ファイルに保存する」画面では、下図の通り設定し、「次へ」ボタンを押します。

「データベースオブジェクトの選択」画面では、データベースオブジェクト ツリーの「テーブル」の「Employees」（従業員）を選択し「データセット名」を下図のように設定し、「完了」ボタンを押します。

以上の手順が済むと、下図のようにソリューションエクスプローラに設定したデータセットのスキーマ（*.xsd：画面右）が作成され、そのスキーマをダブルクリックするとデータセットデザイナが（画面左）起動し、生成されたTableAdapter クラスを確認できます。

次に、DataSetを作成します。「ツールボックス」の「データ」タブから「DataSet」をフォームにドロップします。

「データセットの追加」ダイアログが表示されますので、下図のような設定で「OK」ボタンを押します。

すると、下図のようにコンポーネントトレイ上に DataSet が表示されます。

ここまでは、まだ Report Sharp Shooter のコンポーネントには何も使用していません。Visual Studio の機能で、レポートに使うデータを設定しただけです。ここから先でReport Sharp Shooter のコンポーネントを利用します。

最初に、Visual Studio の「ツールボックス」から「Report Sharp-Shooter」の「ReportManager」を選択し、フォームにドロップします。

すると、下図のようにコンポーネントトレイ上に ReportManager が表示されます。

次に、ReportManager にデータソースを関連付けます。コンポーネントトレイ上の ReportManager をダブルクリックして「レポートマネージャエディタ」を起動し、「データソース」タブの「追加」ボタンを押します。

「オブジェクトの編集」ダイアログで、下図のように「データソースのみ」にチェックをした後、「値」項目に一覧より NwindDataSet1.Employees を選択して「OK」ボタンを押します。

＜参考＞
「名称」フィールドは、レポートで使用するデータソース名を入力するために使用します。「値」フィールドは、アプリケーションで使用するオブジェクト名を選択するために使用され、データソース自体を表します。

その結果、下図のようになります。ここでは、「OK」ボタンを押します。

＜参考＞結果として、下記のようなコードがInitializeComponent()メソッドに追加されます。
(C#)
this.reportManager.DataSources =
new PerpetuumSoft.Reporting.Components.ObjectPointerCollection(
new string[] {"AccountsDataSet", "CustomersByCity"},
new object[] {this.accountsDataSet, this.customersByCity});

(VB)
Me.reportManager.DataSources =
New PerpetuumSoft.Reporting.Components.ObjectPointerCollection(
New String() {"AccountsDataSet", "CustomersByCity"},
New Object() {Me.accountsDataSet, Me.customersByCity })
データソースを「値」リストに表示するには、System.ComponentModel.Component クラスから継承してください。コードからデータソースを追加するには、ObjectPointerCollectionクラスのAddメソッドまたはItemプロパティを使用することができます。

(C#)
reportManager.DataSources.Add("DataSourceName", dataSource);

(VB)
reportManager.DataSources.Add("DataSourceName", dataSource)

または、

(C#)
reportManager.DataSources["DataSourceName"] = dataSource;

(VB)
reportManager.DataSources("DataSourceName ") = dataSource
「Add」メソッドには2つのパラメータ（レポートで使用可能なデータソース名とデータソース自体）があります。Itemプロパティを使用する際も同様に名前とデータソースを指定します。レポートのデータソースは、レポートのスクリプトを使用してテンプレートにも直接読み込めます（GetDataExampleサンプルを参照してください）。

次に、いよいよレポートを作成します。
再度、コンポーネントトレイ上の ReportManagerをダブルクリックして「レポートマネージャエディタ」を起動し、「レポート」タブで「追加」ボタンを押し、選択肢より「InlineReportSlot」を選択します。

すると、下図のような画面になりますので、ここで「デザイナの起動」ボタンを押し（または、InlineReportSlot1 をダブルクリックし）ます。

レポートデザイナが起動します。まだ、レポートはありません。ここで、「ファイル」メニューの「新規」を選択します。

ウィザードギャラリが開きますので、新規タブの「標準のレポート」を選択して、「OK」を押します。

スタンダードウィザードが起動します。
「ページ」フレームの中の「＋」ボタンを押します。

すると新しいデータセクションのための設定画面が表示されます。

「データセクション」の「データソース」で「...」ボタンを押して New_Name を選択し、ダブルクリックします。

すると、下図のような画面になります。

次に、出力する項目を選択して行きます。
「全フィールド」の New_Name のツリーから順に、EmployeeID（従業員ID）、Title（役職）、FirstName、LastName の各フィールドを選び「→」ボタンで「目に見えるフィールド」に追加していきます。その際、「キャプション」をそれぞれ、従業員ID 、役職、FirstName、LastNameというように入力します。
設定が終わったら、「OK」ボタンを押します。

すると、次図のようなデザインが表示されます。
このまま、レポートデザイナを閉じます。保存の確認には「保存する」ように指定します。

ここで、Visual Studioのデザイン画面でフォーム（Form1）に、2つのボタン（左からButton1、Button2）を貼って、Textプロパティにそれぞれ、"プレビュー"、"デザイン"と入力してください。

その2つのボタンのクリックイベントに次のコードを記述してください。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

 Dim ta As New NWINDDataSetTableAdapters.EmployeesTableAdapter
ta.Fill(Me.NwindDataSet1.Employees)

 'プレビュー
 InlineReportSlot1.Prepare()
 Dim previewForm As PerpetuumSoft.Reporting.View.PreviewForm = New PerpetuumSoft.Reporting.View.PreviewForm(InlineReportSlot1)
previewForm.ShowDialog()
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
'デザイン
 InlineReportSlot1.DesignTemplate()
End Sub

これで、全ての設定は終了です。
それでは、このプロジェクトを実行してください。

以下のような実行画面になります。

「プレビュー」すると次のような画面が表示されます。

「デザイン」ボタンを押した場合は、次のようなレポートデザイナが表示されます。

以上で、この例は終わりですが、実際のアプリケーションでは必要に応じて、色をつけ、罫線を引き、他のデータとのリレーションを設定したりと、より細かいデザインを行うことになるでしょう。
ここで重要なのは、アプリケーション開発者がほとんどコードを書かずに、ビジュアルで簡単にデータと連動したレポートを作成できるということです。 この例では、書いたコードは6行だけでした。


ADO.NETオブジェクトの使用

ADO.NETをデータソースとして使用した例について説明します。

「ADODataSource」フォルダにサンプルがあります。

「Authors」テーブルには作者名、「Books」テーブルには作者の本のタイトルが格納されているデータベースがあります。「Authors」テーブルには、主要キー、作者名の2つのフィールドがあり、「Books」テーブルには主要キー、作者キー、タイトル、価格のフィールドがあります。

【デザイン例】

【実行例】


ビジネスオブジェクトの使用

「Report Sharp Shooterでのデータソースの使用」で説明したように、ビジネスオブジェクトをデータソースにするには、System.Collections.IEnumerableインターフェースまたはSystem.ComponentModel.IlistSourceを実装してください。
（IEnumerableインターフェースは、System.Array、 System.Collections.ArrayList、 System.Collections、CollectionBaseやその他の多数の標準クラスで実装されています）

「UserDataSource」フォルダにサンプルがあります。

IlistSourceインターフェースで定義されたメンバが2つあります。1つはReport Sharp Shooterに影響のないContainsListCollection{get;}Booleanプロパティで、もう一つは順次にIenumerableインターフェースを実装するSystem.Collections.Ilistインターフェースへのリンクを返すGetList()メソッドです。

つまり、ビジネスデータソースの処理はIEnumerableインターフェースによって行われ、その中でGetEnumerator()と呼ばれる単一メソッドが定義されます。このインターフェースを使用してすべてのコレクション項目にアクセスすることができます。IEnumeratorインターフェースにはその中で定義される、Current {get;}というプロパティオブジェクトがあります。このプロパティオブジェクトは、コレクション内のカレントオブジェクトと2つのメソッド（MoveNext()メソッドとReset()メソッド）を表します。 そのMoveNext()メソッドは、コレクション内の次の項目への移動を提供し、成功するとtrueを返し、カレントの項目がコレクション内の最後の項目になる場合はfalseを返します。Reset()メソッドは列挙体をリセットします。つまりコレクション内の最初の項目の前の位置がカレント位置になります。

ビジネスデータセットに格納されるオブジェクトのプロパティはすべてデータフィールドとして利用できます。IListSourceインターフェースまたはIEnumerableインターフェースを実装するタイプのプロパティの場合、順次にリストと見なすこともできます。ビジネスデータソースを使用して、階層型表示のリンクが付いている複雑なレポートを作成することができます。

データソースがIListSourceインターフェースまたはIEnumerableインターフェースのどちらかを実装する場合、そのすべてのプロパティをデータとして使用することができます。したがって、テーブルに一つのレコードを作成できます。

さて、「ADO.NETオブジェクトの使用」で使用した作者と本のデータベースのデータソースを作成します。

一冊の本に関する情報を格納するために、次のクラスを作成してください。

public class Book
{
public Book()
{
}
private string name = string.Empty;
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
private decimal price;
public decimal Price
{
get
{
return price;
}
set
{
price = value;
}
}
}

このクラスにはレポートの作成中に利用可能なプロパティが2つあります。

では、「Book」クラスのインスタンスを格納するIEnumerableインターフェースを実装する「BookCollection」と呼ばれるコレクションクラスを追加します。ArrayListクラスのインスタンスにデータを格納します。さらに、コレクションに項目を追加するAdd()メソッドとIEnumerableインターフェースを実装するGetEnumeratorメソッドを実装します。このクラスのコードは次の通りです。

public class BookCollection : IEnumerable
{
  private ArrayList list = new ArrayList();
  public BookCollection()
  {
  }
  public void Add(Book b)
  {
    list.Add(b);
  }
  public IEnumerator GetEnumerator()
  {
    return list.GetEnumerator();
  }
}

では、ある作者に関する情報を格納するクラスを作成します。作者の著書を多数格納できるように、本が格納されるプロパティはコレクションでなければなりません。したがって、ビジネスデータソース内に階層型表示のリンクを実装します。

public class Author
{
  public Author()
  {
  }
  private string name = string.Empty;
  public string Name
  {
    get
    {
      return name;
    }
    set
    {
      name = value;
    }
  }
  private BookCollection books = new BookCollection();
  public BookCollection Books
  {
    get
    {
      return books;
    }
  }
}

最後に作者を格納するコレクションを作成します。例えば、このクラスは厳密に型指定されたコレクションの基本クラスでIEnumerableインターフェースを実装する、System.Collections.CollectionBaseから継承することができます。

public class AuthorCollection : CollectionBase
{
  public Author Add(Author value)
  {
    base.List.Add(value as object);
    return value;
  }
  public void Remove(Author value)
  {
    base.List.Remove(value as object);
  }
  public void Insert(int index, Author value)
  {
    base.List.Insert(index, value as object);
  }
  public Author this[int index]
  {
    get
    {
      return (base.List[index] as Author );
    }
    set
    {
      base.List[index] = value;
    }
  }
}

このサンプルではBookCollectionクラスがこのような可能性を実証するためだけにIEnumerableインターフェースを実装しています。もちろん、コレクションも配列あるいは例えば、ArrayListクラスのインスタンスに格納できますが、厳密に型指定されたコレクション（CollectionBaseから継承されたコレクション）を使用することをお勧めします。

データソースはデータで表示され、Init()メソッドのReportManagerクラスのDataSourcesコレクションに追加されます。


標準メカニズムを変更してビジネスオブジェクトを使用する

オブジェクトプロパティの代わりに動的に計算されたプロパティを使用できるようにビジネスデータソース処理の標準メカニズムを変更する必要がある場合、データソース内の1つのレコードを表すオブジェクトのICustomTypeDescriptorインターフェースと、オブジェクトが格納されるコレクションのITypedListインターフェースを実装してください。

サンプル「CustomTypeDescriptorExample」を使用してこの特徴について説明します。世界中にさまざまな商品を提供する企業向けのプログラムを開発しているとします。レポートで主要通貨からさまざまな通貨に換算しなければなりません。

利用可能な通貨に関する情報を格納するためにCurrencyクラスを使用します。

(C#[Currency.cs])
public class Currency

{
public Currency(string name, double rate)
{
this.name = name;
this.rate = rate;
}
private string name = string.Empty;
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
private double rate = 1;
public double Rate
{
get
{
return rate;
}
set
{
rate = value;
}
}
static public Currency[] SystemCurrencies = new Currency[]
{
new Currency("Dollar", 1),
new Currency("Euro", 1.2),
new Currency("Ruble", 1 / 30.0)
};

}

(VB[Currency.vb])
Public Class Currency

Public Sub New(ByVal name As String, ByVal rate As Double)
Me.name1 = name
Me.rate1 = rate
End Sub

Private name1 As String = String.Empty
Public Property Name() As String
Get
Return name1
End Get
Set(ByVal Value As String)
name1 = Value
End Set
End Property

Private rate1 As Double = 1
Public Property Rate() As Double
Get
Return rate1
End Get
Set(ByVal Value As Double)
rate1 = Value
End Set
End Property

Public Shared ReadOnly Property SystemCurrencies() As Currency()
Get
Return New Currency() {New Currency("Dollar", 1), New Currency("Euro", 1.2), New Currency("Ruble", 1 / 30.0)}
End Get
End Property

End Class

このクラスには2つのプロパティがあり、主要通貨から換算するための名前とレートを定義しています。静的配列のSystemCurrenciesもこのクラスで宣言されます。これはシステム内で使用された通貨すべてを格納するために使用されます。この例では、配列の値を直接設定しますが、実際のアプリケーションではデータベースからこの配列に読み込みます。

商品を表す1つのレコードを格納するには、IcustomTypeDescriptorインターフェースを実装するPathクラスを使用します。下記にこのクラスの動的プロパティのコレクションを生成する静的メソッドのコードを示します。

(C#[Part.cs内])
public static PropertyDescriptorCollection GetPartProperties()
{
PropertyDescriptorCollection props = new PropertyDescriptorCollection(null);
foreach(Currency c in Currency.SystemCurrencies)
{
props.Add(new CurrencyPropertyDescriptor(c));
}
props.Add(TypeDescriptor.CreateProperty(typeof(Part), "Name", typeof(string)));
return props;
}

(VB[Part.vb内])
Public Shared Function GetPartProperties() As PropertyDescriptorCollection
Dim props As PropertyDescriptorCollection = New PropertyDescriptorCollection(Nothing)
For Each c As Currency In Currency.SystemCurrencies
props.Add(New CurrencyPropertyDescriptor(c))
Next
 props.Add(TypeDescriptor.CreateProperty(GetType(Part), "Name", GetType(String)))
Return props
End Function

動的プロパティのコレクションを取得するために次のメソッド

ICustomTypeDescriptor.GetProperties(Attribute[] attributes)

ICustomTypeDescriptor.GetProperties()

で呼び出されるのはこのメソッドです。コードからわかるように、始めにCurrencyPropertyDescriptorクラスのインスタンスは、各通貨に対してCurrency.SystemCurrencies配列から循環的に作成され、商品名が追加されます。

CurrencyPropertyDescriptorはPropertyDescriptorクラスから継承されます。プロパティの値をそれぞれ取得および設定するGetValueメソッドやSetValueメソッドと同様に、このプロパティを実装するプロパティ型とクラス型を返すPropertyTypeプロパティとComponentTypeプロパティを実装する方法に注目してください。

最後に、商品のコレクションを格納するPartCollectionクラスを取得します。このクラスはITypedListインターフェースを実装します。このインターフェースには2つのメソッドがあります。GetListNameはリスト名を返し、GetItemPropertiesはリスト内のオブジェクトの動的プロパティを記述するPropertyDescriptorsの配列を返します。このメソッドは静的メソッドPart.GetPartProperties()から結果を返します。

したがって、金額を換算価格で表示したい国に対して、個別のレポートのテンプレートを実装するだけで十分です。

【デザイン例】

【実行例】


XMLファイルをデータソースとして使用する

XMLファイルのデータを使用したサンプルが「XmlDataSourceExample」フォルダにあります。

ＸＭＬドキュメントをデータソースとして使用するには、次の手順を行ってください。

1. PerpetuumSoft.Reporting.Data.XmlDataSourceオブジェクトを作成する

2. DataFileプロパティに、XMLドキュメントのパスを指定する

3. XPathプロパティに、XMLデータに使用するイニシャルパス（XPathの式言語）を指定する

4. 作成したオブジェクトをＲｅｐｏｒｔＭａｎａｇｅｒのデータソースとして指定する

これはReportManager.DataSources.Add (“DataSourceName”, “DataSource”)メソッドを使用して行えます。

他のデータソースと同じように、このデータソースをレポートのテンプレートに使用できます。

データソースにはイニシャルパス（XPathプロパティ）で指定した最初のXMLドキュメント内の要素にあったレコード数が含まれます。

レポートのテンプレートにデータを取得するにはGetData (“SourcePath”)メソッドを使用してください。

SourcePathはデータソース名を指定する文字列で、XMLドキュメントの構造に従って要素へのパスを指定してください。SourcePathにXMLタグ属性へのパスを指定した場合、GetDataメソッドがこの属性の文字列の値を返します。

XMLタグ内のテキストを取得するには、SourcePathにこのタグへのパスを指定し、ドットの後に“GetText()”を記述してください。

例：

データソースとして、本に関する情報を持ったXMLドキュメントを使用します。

すべての本に関する情報を含んだレポートを生成するには、次のことを行ってください。

  1. XmlDataSourceデータソースを作成し、DataFileプロパティにはこのXMLファイルを、XPathプロパティには「book」へのパスを指定します。(XPath=’bookstore/book’)
  2. ReportManager.DataSources.Addメソッドを使用して、データソースのコレクション（“XmlSource”の下）に作成したソースを追加してください。
  3. DataBandで構成されたドキュメントのテンプレートを作成し、データソース名をXmlSourceにします（“DataBand.DataSource = “XmlSource”）。
  4. すべての本(“book”)の情報を表示するために、DataBand内にDetailを配置してください。
  5. 本に関する色々な情報を表示するために、Detail内にTextBoxコンポーネントを配置して次のように設定してください。

    例 | 式
    本のタイトル（“title”要素）を表示する場合 | TextBox.Value (property binding) = ‘GetData(“XmlSource.title.GetText()”)
    著者に関する情報を取得する場合 | 'GetData(“XmSource.author.first-name.GetText()”)’
    出版日（'publicationdate'）に関するデータをXML属性から取得する場合 | 'GetData(“XmSource. publicationdate ”)’

【レポートのテンプレート】

【実行例】

場合によっては、XMLドキュメントをデータソースとしてレポートのテンプレートデザイナに直接指定しなければなりません。このコンポーネントはその機能をサポートしています（詳細は「データソースへ直接アクセスする」の章をご覧ください）。


データベースへ直接アクセスする

Report Sharp Shooterのレポートジェネレータは「アプリケーションがレポートを生成するためのデータを提供する」というコンセプトを実現します。これは、ユーザが任意のデータソースを使え、データ表現（レポートのテンプレート）の規則を特定のソースから独立して作れるようにします。

しかし、レポートのテンプレートを特定のデータソースにバインドする必要がない場合や、エンドユーザがレポートのテンプレートを作成/編集したり独自のデータソースを追加できるようにしなければならない場合があります。

ドキュメントのテンプレートに組み込まれたデータソースのコレクション、つまり直接テンプレートに指定されたソース（Document.DataSourcesプロパティ）があるのはそのためです。

【データソースエディタ】

このエディタはDocument.DataSourcesプロパティを指定する場合やツールバーの [image] 「データソース」ボタンを押した時に表示されます。

エディタで、以下のデータソース型を指定/編集できます。

  1. OdbсDataSource （Open Database Connectivity（ODBC）インターフェースを使用して、さまざまなDBMSからデータを取得できます）
  2. SqlDataSource （DBMS MS SQLからデータを取得できます）
  3. XmlDataSource （ドキュメントのデータを取得できます）

ドキュメントのテンプレートで作成されたデータソースを使用するのとアプリケーションからデータソースを使うのと違いはありません。テンプレートデザイナのデータソースツリーに、組み込まれたデータソースとその構造が表示されます（テンプレートのデザイン時にデータソースからデータを取得できる場合）。

データベースからデータを直接ドキュメントのテンプレートに取得するにはOdbсDataSourceかSqlDataSourceを使用できます。どちらも同じ機能やプロパティがありますが、DBMSへの接続方法が違います。DBMS MS SQLを使用する場合はSqlDataSourceの使用をお勧めします。

OdbсDataSourceまたはSQL SqlDataSourceを指定するには、次のプロパティを指定してください。

プロパティ名 | 説明
Name | ドキュメントのテンプレートからデータソースに使用するデータソース名を指定します
ConnectionString | データベースの接続文字列を指定します
SelectQuery | データを取得するためのSQLクエリを指定します

データをXMLドキュメントから直接ドキュメントのテンプレートに取得するには、ドキュメントのテンプレートにXmlDataSourceを追加し、次のプロパティを指定してください。

プロパティ名 | 説明
Name | ドキュメントのテンプレートからデータソースに使用するデータソース名を指定します
DataFile | XMLドキュメントのパスを指定します
XPath | XMLデータに使用するイニシャルパス（XPath言語内の式）を指定します

XmlDataSourceの使用に関する詳細は、「XMLファイルを データソースとして 使用する」の章をご覧ください。


データソースなしのレポート

データソースを指定せずにレポートを作成することもできます。DataBandオブジェクトには、レポート内でオブジェクトの内容を何回表示するかを定義するInstanceCountプロパティがあります。

データソースなしのレポートのサンプルは、「WithoutDataExample」フォルダにあります。

このサンプルは乗算テーブルを表示します。レポートのテンプレートには2つのDataBandがあり、dataBand2はdataBand1に組み込まれています。両方ともInstanceCountプロパティが10に設定されています。textBox1オブジェクトのValueプロパティに次の値が指定されています。

dataBand1.LineNumber.ToString() + " * " + dataBand2.LineNumber.ToString() + " = " + (dataBand1.LineNumber * dataBand2.LineNumber).ToString()

DataBandのLineNumberプロパティはカレントの行数を示します。したがって、1の乗算テーブル、次に2の乗算テーブル・・・というように10まで連続的に表示します。

【デザイン例】

【実行例】


レポートパラメータ

カスタムなデータソースをレポートパラメータとして使用することができます。レポートパラメータのシンプルな例について説明します。データベースで価格が表示されているすべての本に関するレポートを作成するとします（ユーザガイドの「ビジネスオブジェクトの使用」を参照してください）。自国通貨だけでなく、各国のクライアントに個別の通貨換算価格を表示するレポートを提供するとします。これを行うには、為替係数が必要です。同時に自国のクライアントにはこれは必要ありません。レポート内で別の換算価格を表示するかどうかを定義するブール式パラメータが必要なのはこのためです。

このサンプルは「ParamsExample」フォルダにあります。

フォームにレポートのパラメータを入力するTextBoxとCheckBoxがあります。「デザイン」ボタンは「レポートデザイナ」コンポーネントが開き、「プレビュー」ボタンは「レポートビューア」コンポーネントを開きます。「閉じる」ボタンはプログラムを閉じます。レポートのパラメータを格納するには、Params型のpar変数が使用されます。 以下にParamsクラスのコードを示します。

public class Params
{
public Params()
{
}
private bool show = false;
public bool Show
{
get
{
return show;
}
set
{
show = value;
}
}
private decimal factor;
public decimal Factor
{
get
{
return factor;
}
set
{
factor = value;
}
}
}

レポートにデータソースとしてパラメータを追加すると、次の行がフォームエディタに挿入されます。

reportManager1.DataSources["Parameters"] = par;

では、レポートでこれらのパラメータがどのように使用されているか見てみます。プログラムを起動し、「デザイン」ボタンをクリックします。Showパラメータがtrueに設定されている時だけ右のtextBox4列がレポートに表示されます。この場合、指定した為替レートに応じて価格が変換されます。

レポートの生成時に計算されるようValueプロパティとVisibleプロパティに値が指定されています。これらのプロパティを見るには、textBox4オブジェクトを選択し、 [image] ボタンをクリックします。VisibleプロパティにはGetData("Parameters.Show")が設定されているので、GetDataメソッドと"Parameters.Show"パラメータによってレポートの生成時に値が返されます。GetDataメソッドは設定されたデータソースの値を返します。つまり、"Parameters.Show"の値がtrueの場合のみTextBoxが表示されます。同じようにtextBox4のValueプロパティには小数点以下の値GetData("Parameters.Factor")*(decimal)dataBand2["Price"]、つまり為替レートを乗算した本の価格が返されます。

【デザイン例】

【実行例】

Report Sharp-Shooterは直接ドキュメントにパラメータを設定できるようになりました。次のサンプルで実証してみます。

このサンプルは「DocumentParametersUsing」フォルダにあります。

新規プロジェクトを作成し、フォームにreportManager1コンポーネントを追加し、reportManager1コンポーネントのReportsプロパティにデータソースinlineReportSlot1を追加します。そしてinlineReportSlot1のDocumentのプロパティの [image] ボタンをクリックしてデザイナを開きます。始めに、 [image] ツールバーボタンをクリックして新規ドキュメントを作成します。ここでDocument（Doc1）のParametersプロパティの [image] ボタンをクリックしてコレクションエディタを開き、「Date」と「Number」というパラメータを追加し、「Date」のParameterTypeプロパティにはSystem.DateTimeを、「Number」のParameterTypeプロパティにはSystem.Int32を指定します。エディタは次のようになるはずです。

次に、テキストボックスを２つ追加します。1つのテキストボックスのValueプロパティには“GetParameter(“Date”)” を、もう一方のValueプロパティには“GetParameter(“Number”)”を指定します。これでレポート生成時に2つのパラメータの値が計算され、テキストボックスのValueプロパティに返されます。これでドキュメントの設定は終了です。ドキュメントを保存し、エディタを閉じてください。

次に、アプリケーションのメインフォームにテキストボックスを2つ追加してください。この2つのテキストボックスを使用してドキュメントに渡すパラメータの値を入力します。フォームのLoadイベントハンドラに次のコードを記述してください。

    private void Form1_Load(object sender, System.EventArgs e)

    {

      textBox1.Text = DateTime.Now.ToString();

      textBox2.Text = Environment.TickCount.ToString();

    }

RenderCompletedイベントハンドラに、inlineReportSlot1コンポーネント用の下記コードを記述します。

    private void inlineReportSlot1_RenderCompleted(object sender, System.EventArgs e)

    {

      using (PerpetuumSoft.Reporting.View.PreviewForm form = new PerpetuumSoft.Reporting.View.PreviewForm(inlineReportSlot1))

      {

        form.WindowState = FormWindowState.Maximized;

        form.ShowDialog();

      }

    }

GetReportParameterイベントハンドラに、次のコードを記述します。

    private void inlineReportSlot1_GetReportParameter(object sender, PerpetuumSoft.Reporting.Components.GetReportParameterEventArgs e)

    {

      e.Parameters["Date"].Value = textBox1.Text;

      e.Parameters["Number"].Value = textBox2.Text;

    }

では、フォームにボタンを1つ追加し、Clickイベントハンドラに下記のコードを記述します。

    private void button1_Click(object sender, System.EventArgs e)

    {

      inlineReportSlot1.Prepare();

    }

レポートの生成時について説明します。レポートを生成する前にドキュメントのコピーが作成され、それと同時にアプリケーションからパラメータの値を設定するGetReportParameterイベントが呼び出されます。レポートにサブレポートがある場合、サブレポートの生成前にサブレポートのGetReportParameterイベントが呼び出されます。レポートにマスターレポートがある場合、カレントのレポートのイベントより先にマスターレポートのGetReportParameterイベントが呼び出されます。


レポートのエクスポート

Report Sharp Shooter は、GIF、PNG、JPG、BMP、EMF、PDF、HTML、CSV、TXT、Excel、XML for Excel、XPSの形式へのエクスポートをサポートしています。

各形式のエクスポートフィルタは次のアセンブリに含まれています。

  • RTFエクスポートフィルタ - PerpetuumSoft.Reportingアセンブリ
  • PDFエ クスポートフィルタ - PerpetuumSoft.Reporting.Export.Pdfアセンブリ
    PerpetuumSoft.Writers.Pdf アセンブリ
  • HTMLエクスポートフィルタ - PerpetuumSoft.Reporting.Export.Htmlアセンブリ
  • CSVとTXT のエクスポートフィルタ - PerpetuumSoft.Reporting.Export.Textアセンブリ
  • Excelエクスポートフィルタ - PerpetuumSoft.Reporting.Export.Excelアセンブリ
    PerpetuumSoft.Writers.Excelアセンブリ
  • Excel XMLエクスポートフィルタ - PerpetuumSoft. Reporting.Export.ExcelXMLアセンブリ
  • XPS(XML Paper Specification) エクスポートフィルタ - PerpetuumSoft.Reporting.Export.Xpsアセンブリ

エクスポートフィルタにはオーバーロードされたエクスポート関数があり、この関数を使用して対応する形式にドキュメントをエクスポートします。

public void Export(Document document, string fileName )
public virtual void Export(Document document,string fileName,bool showDialog ),

つまり、documentは最終ドキュメントで、fileNameはエクスポートされたドキュメントが保存されるファイル名で、showDialogはフィルタ設定ダイアログボックスを表示するかどうかを定義します。

最初のメソッドの使用時に、フィルタ設定のダイアログボックスが表示されます。

PerpetuumSoft.Reportingアセンブリからのフィルタを使用する形式へのエクスポートは、常に「レポートビューア」で行えます。それ以外のフィルタを使用するには、該当するアセンブリを有効にし、このフィルタクラスのインスタンスを少なくとも1つは作成しなければなりません。一番簡単な方法は、フォームに必要なフィルタを配置することです。

他には、利用可能なエクスポートフィルタを操作する手段として、PerpetuumSoft.Reporting.Export.RegisterExportFilter(ExportFilterFactoryのファクトリ)の静的メソッドとPerpetuumSoft.Reporting.Export.ExportFiltersの静的コレクションにアクセスできます。


ウィザードでテンプレートを作成

ウィザードはレポートのテンプレートをすばやく作成できます。ウィザードを使用してテンプレートの構成を設定したら外観をカスタマイズするだけです。

ウィザードを開くには、「レポートデザイナ」から「ファイル」メニューの「新規」を選択し、[Ctrl+N]を押すかツールバーの [image] ボタンを押します。下記のようなフォームが画面に表示されます。

リストから「標準のレポート」を選択し、OKをクリックします。画面に下記のフォームが表示されます。

左側の「ページ」パネルには項目が表示されます。最初は「共通」項目だけが表示されます。この「共通」項目を使用してレポートテンプレートのパラメータ（タイトル、計測単位、スタイル、スクリプト言語、ページパラメータ、列パラメータ）を構成することができます。

データセクションを追加するには、 [image] ボタンを使用してください。データセクションはリストでカレントに選択したセクションに入れ子表示されます。「共通」項目を選択すると、セクションが一番上に追加されます。セクションを削除するには、リスト内でセクションを選択し、 [image] ボタンをクリックしてください。

「ページ」パネルのリストで選択したセクションのパラメータを構成することができます（新しいセクションの作成後に自動的に選択されます）。

データソース名を指定するには、「データソース」フィールドを使用し、フィールドのレイアウト型を指定するには「フィールドのレイアウト」のドロップダウンリストを使用します。値が「リスト」の場合、フィールドはテーブルとして表示され、値が「カード」の場合、各フィールドが新しい行に表示されます。

データソースで利用可能なフィールドは「全フィールド」のリストに表示されます。レポートにあるフィールドを「可視フィールド」タブに移動してください。「可視フィールド」リストからフィールドを追加および移動するには [image] ボタンや [image] ボタンを使用できます。ブランクのフィールドを追加するには、 [image] ボタンをクリックしてください。フィールドの位置を変更するには、 [image] ボタンや [image] ボタンを使用してください。フィールドのキャプションや幅を「キャプション」および「幅」の入力フィールドで指定できます。「集計」にはこのフィールドに使用する集計関数を指定できます。この場合、集計グループの条件として、現在のセクションを含むすべてのデータセクションのLineNumberプロパティが定義されます。

グループ条件を指定するには、「グループ」タブの一覧にフィールドを追加してください。


ウィザードを使用してピボットテーブルのレポートをデザインする

ピボットテーブルのレポートを作成する場合、専用ウィザードを使用して簡単にレポートを作成、カスタマイズすることができます。レポートデザイナを開き、デザイナの[ファイル]メニューから[新規]（ツールバーの新規( [image] )ボタンまたは[Ctrl+N]からも作成可能）を選んで、新規ドキュメントのテンプレートを作成してください。下図のようなウィザードギャラリが表示されるので、「ピボットテーブルのレポート」を選択し、OK をクリックします。

そうすると、ピボットテーブルウィザードが表示されます。

ピボットテーブルのレポートの基本設定は「共通設定」タブで指定します。スタイルシートのフィールドに注目してください。ここで最終的なピボットテーブルを描画するためのスタイルを１つ選択します。その他のフォームフィールドを使用してドキュメントの各プロパティを設定できます。

ピボットテーブルの設定は[ピボットテーブル設定]タブで行います。「データソース」フィールドにピボットテーブルをビルドするためのデータソースを設定する必要があります。

ピボットテーブルの生成時に使用する入れ子のデータソースは「入れ子フィールド」で指定します。

データソースの指定時に、ピボットテーブルのレイアウトを設定できます。「レイアウトの構成」ボタンをクリックすると、レイアウトエディタが表示されます。レイアウトエディタに関する詳細は、ユーザガイドを参照してください。

[ピボットテーブル設定]タブの「表示」グループを使用してピボットテーブルの表示に関する設定を行います。

さらに、ピボットテーブルの「ウィザード」を開くとボタンパネルがあります。

「プレビュー」ボタン( [image] )をクリックすると、設定に応じたレポートを作成し、プレビュー表示されます。

「テンプレートの編集」ボタン( [image] )をクリックして、テンプレートを編集することができます。

ピボットテーブルの構成が済んだら、OKボタンをクリックしてください。次のような最終的なレポートが表示されます。


サンプルデータの構造

この章で紹介するサンプルのほとんどは、下図のようなデータベースの構造になっています。

データベースはさまざまな商品の販売を行う、ある会社を想定しています。顧客がこの会社へ商品を発注/購入し、従業員が受注を請負います。したがって、データベースは5つのテーブル（顧客、担当社員、注文、商品ライン、品名）で構成することができます。


レポートデザイナのコンポーネントツール、共通プロパティおよびデータバインドの設定

レポート生成時に利用可能なコンポーネントツールについて説明します。

これらはレポートデザイナの[挿入]メニューまたは「コンポーネントツールボックス」の各ボタンを使用することにより利用可能です。

すべてのコンポーネントには値をデザイン時に静的に指定できるプロパティがあり、同時にプロパティに式をバインドすることができます。式をバインドできるプロパティの一覧を表示するには、「プロパティ」タブの [image] ボタンをクリックしてください。

コンポーネント名 | 説明
「データバンド」 | おそらく、レポート生成時に最も重要なコントロール要素です。データソースの各レコードに対してデータバンドに複数のコンポーネントを挿入することができます。「データバンド」のデータソースはDataSourceプロパティで指定します。
「詳細」 | 「データバンド」に [image] 「詳細」セクションを追加して、データにアクセスします
「ページヘッダー」/ [image] 「ページフッター」 | ページのヘッダーやフッターを作成します
「ヘッダー」/ [image] 「フッター」 | 「データバンド」セクションのヘッダーやフッターを作成します
「グループヘッダー」/ [image] 「グループフッター」 | グループヘッダーとグループフッターを作成します
「ページオーバーレイ」 | ページのオーバーレイです
「クロスバンド」 | データセクションを上から下ではなく、右から左に表示します

Report Sharp Shooterにはレポートの生成プロセスを管理するためのコンポーネントがあります。これらのコンポーネントに関しては、ユーザガイドの各章で説明してあります。
コンポーネント名 | 説明
「バンドコンテナ」 | その内容を一回表示します。これは「データバンド」のInstanceCountプロパティが１の場合と同じです。
「並列」 | 並列レポートを作成します
「サブレポート」 | サブレポートを作成します
「コンテンツ」 | マスターレポートのテンプレート内で使用します
「ピボットテーブル」 | ピボットテーブルを作成します

レポートの作成時に使用する各コンポーネントの共通プロパティについて説明します。

プロパティ名 | 説明
Bookmark | Hyperlinkプロパティを使用して後で参照することができるブックマークを作成します
Hyperlink | オブジェクトをクリックした時に、ジャンプするリンクを作成します。この場合、次の方法で検索が行われます。レポートに既に存在するオブジェクトのブックマーク内でリンクが検出された場合、レポート内の該当する場所を開きます。それ以外のリンクは、どのアプリケーションをリンクに使用するかを定義するオペレーティングシステムに渡されます。
Border | 枠の表示/非表示や線のスタイルを指定します
CanGrow | レポートの生成時に、挿入した内容がテンプレートで指定したオブジェクトサイズに収まらない場合、オブジェクトを拡大します
CanShrink | レポートの生成時に、挿入した内容がテンプレートで指定したオブジェクトサイズより小さい場合、オブジェクトを縮小します
GrowToBottom | テンプレートのサイズに関係なく、セクションの下まで達するように最終ドキュメントでオブジェクトを拡大します
Fill | オブジェクトが使用する領域の色や塗りつぶしのスタイルを定義します
Location | オブジェクトの左上角の位置を定義します
Size | オブジェクトのサイズを定義します
Margins | オブジェクトのマージンサイズを定義します
Name | オブジェクト名を指定します
StyleName | コントロール要素に使用するスタイルを定義します
Tag | オブジェクトに関する追加情報を格納します
Visible | オブジェクトを表示するかどうかを定義します

次に、実際にレポートに表示されるビジュアルコンポーネントについて説明します。

テキストボックス

このコンポーネントはテキスト情報を表示できます。Textプロパティはテキストの一部のスタティック値を定義します。Valueプロパティに式を指定することでこの値を動的に計算できます。例えば、データソースからフィールド値を取得できます。Valueプロパティを指定した場合、Textプロパティは無視されます。またこのコンポーネントにはフォントを定義するFontプロパティ、テキストの整列を定義するTextAlignプロパティ、塗りつぶしの色やスタイルを定義するTextFillプロパティ、そしてテキスト形式を定義するTextFormatプロパティがあります。

テキスト形式の指定に関する詳細は、.NET Framework Developer's Guide Formatting typesにあります。

アドバンステキスト

このコンポーネントは書式設定されたテキスト情報を表示します。段落やテキストスタイルを指定でき、特定のテキスト項目内に直接式を使用することもできます。このTextプロパティはHTMLのような形式で情報を定義し、RtfTextプロパティはRTFのような形式で情報を定義します。詳細は、ユーザガイドの「アドバンステキストコンポーネントを使用する」を参照してください。

イメージ

このコンポーネントはレポートにイメージを組み込むことができます。このコンポーネントにはイメージを指定できるImageプロパティがあります。またイメージの整列を指定できるImageAlignプロパティと、どのイメージを引き伸ばすかを指定できるSizeModeプロパティがあります。

シェープ

このコンポーネントはさまざまな形状を表示できます。形状はShapeStyleプロパティで指定し、Lineプロパティは線の種類を指定でき、ShadowプロパティとShadowFillプロパティは影と影の塗りつぶしを定義します。

ZipCode

このコンポーネントはzipコードを表示できます。値はCodeプロパティで指定されます。

バーコード

このコンポーネントはバーコードを表示できます。値はCodeプロパティで指定され、CodeTypeプロパティはコード型を指定できます。

RT形式

このコンポーネントはRTF 形式でテキストを表示できます。テキストはRTFTextプロパティで指定されます。

Windows Formsコントロール

このコンポーネントはレポートにWindows Formsのコントロール要素を含むことができます。ControlTypeNameプロパティはコントロール要素の型を指定できます。


概要

レポートのテンプレートの式やスクリプトはすべて、 レポートデザイナの「ドキュメントのプロパティ」のScriptLanguageプロパティに設定したプログラム言語で書かれます。C#、 Visual Basic .NET、または.NET環境をサポートするその他のプログラミング言語を使用できます。

注意：すべてのスクリプトはソースコードとしてテンプレートに保存されるので、対応するコンパイラをレポートを生成するクライアントコンピュータにインストールしておく必要があります。C#、Visual Basic .NET、Jscript .NET言語のコンパイラはMicrosoft .NET Frameworkのパッケージに含まれています。

アプリケーションに読み込んだアセンブリの関数やオブジェクトをすべて式やスクリプトに使用できます。

プロパティ一覧を表示して式をバインドするには、「プロパティ」タブの [image] ボタンをクリックしてください。

TextBoxプロパティに式をバインドした例を以下に示します。

プロパティのエディタを開くには、 [image] ボタンをクリックしてください。スクリプトエディタが表示されます。

式を手動で入力するか、「データソース」パネルのデータソースからフィールドをドラッグできます。

式の他に、各レポートオブジェクトにはGenerateScriptプロパティがあります。このプロパティにはオブジェクトのインスタンスを作成する前に実行させるコードを記述します。

式といっても実際には短いスクリプトです。

プロパティ | バインド
Value | dataBand1[“Column1”]
Fill | new SolidFill(Color.Blue)

これはGenerateScriptプロパティに次のコードを追加するのと同じです。

textBox1.Value = dataBand1[“Column1”];

textBox1.Fill = new SolidFill(Color.Blue);

もちろんスクリプトを使用しても、フレキシブルにレポートを作成できます。

容易にスクリプトを編集するために、スクリプトエディタで構文をハイライトし、コードを選択できる機能があります。コードの入力途中に[Ctrl+Space]を押すと、該当するコードの候補のリストが表示されます。

また、スクリプトエディタにはC#やVB.NETのコードの一部を挿入する機能があります。コードの一部のリストは[Ctrl+k+X]を押すか、「コードスニペット」ボタンを押すと表示されます。

GenerateScriptプロパティに加えて、DocumentオブジェクトにはCommonScriptプロパティがあります。このプロパティは必要なオブジェクトを指定したり、後でスクリプトやコードに使用可能な一部のフィールド、メソッド、またはプロパティを宣言できます。

PageオブジェクトにはManualBuildScriptプロパティがあります。レポートの生成時にオブジェクトの表示を制御するためのコードをこのプロパティに設定することができます。


オブジェクトの参照

スクリプトや式に、Report Sharp Shooterのテンプレートにあるオブジェクト、特別なプロパティや他のアプリケーションのアセンブリのオブジェクトも使用することができます。

テンプレートのオブジェクトは、次のようにNameフィールドに格納された名称でグローバル変数として表されます。

textBox1.Text = “New Text”;

また、レポートの生成時には次のような特別なプロパティが使用可能です。

プロパティ | 値
PageNumber | カレントのページ番号
PageCount | レポートのページ総数
ColumnNumber | 列番号
Now | 現在日時
Document.Title | ドキュメントのタイトル
Document.Description | ドキュメントの説明
DataObjects | データソースのコレクション

注意：FirstPass時は、ページ総数がまだわからないのでPageCountプロパティは常にPageNumberプロパティと同じです。このプロパティを使用する場合、レポートをダブルパスにしてください。それには、DocumentオブジェクトのDoublePassプロパティをTrueに設定してください。

DataObjectsプロパティに注目してください。このプロパティはレポートのデータソースすべてにアクセスできます。したがって、複数の値を計算するには、データソースオブジェクトのメソッドを使用することができます。例えば、System.Data.DataTableオブジェクトのComputeメソッドを使用して、集計関数を計算できます。

(DataObjects["AccountsDataSet"] as DataSet).Tables["LineItems"].Compute("Sum(Price)", "OrderNo = " + dataBand1["OrderNo"])

つまり、Report Sharp Shooterのスクリプトや式に、次の項目を参照できます。

  • PerpetuumSoft.Reporting.Rendering.ReportScriptBaseクラスで利用可能なすべてのプロパティや関数
  • テンプレートあるすべてのオブジェクト
  • アプリケーションに読み込んだアセンブリのオブジェクトや関数
  • Document.CommonScriptプロパティで記述された全オブジェクトやメソッド


色の設定

100個のランダム値を読み込んで、負の値を赤色で表示するレポートを作成します。

このサンプルは、「TextFillExample」フォルダにあります。

レポートデザイナのdataBand1のDataSourceプロパティにランダム値を持つ配列「Data」を設定してあります。TextBox1のTextFillプロパティには、次の式がバインドされています。

(C#)
(int)dataBand1.DataItem >= 0 ? null : new SolidFill(Color.Red)

(VB.NET)
IIf(dataBand1.DataItem >= 0, Nothing, New SolidFill(Color.Red))

DocumentオブジェクトのImportsプロパティにはSystem.Drawingという文字列が設定されています。スクリプトで使用するすべての名前空間はこのプロパティで指定します。この処理はスタイルでも実装できます。

【デザイン例】

【実行例】


表示/非表示の設定

カレントの行番号を表示し、奇数行だけが表示されるサンプルを作成します。

このサンプルは「VisibleBindingExample」フォルダにあります。

このサンプルでは、DataBandセクションはInstanceCountプロパティが100に設定されています。このプロパティはデータバンドの内容をレポートに何回表示するかを定義します。テンプレートのTextBoxオブジェクト （サンプルでは「textBox1」）はカレントの行番号を表示するために使用します。一方、レポートデザイナの「プロパティ」タブのDetailオブジェクト（サンプルでは「detail1」）のVisibleプロパティのバインドには次のスクリプトが設定されています。

(C#)
dataBand1.LineNumber % 2 ! = 0 ? false : true

(VB)
IIf(dataBand1.LineNumber Mod 2 = 0,false,true)

つまり、「詳細セクション」Detailはカレント行が奇数行の場合のみ表示されます。

表示/非表示の設定をDetailオブジェクトではなくTextBoxオブジェクトに行った場合は、奇数行間に空行が表示されます。これが非表示のTextBoxオブジェクトを持つDetailオブジェクトです。

つまり、この場合は「詳細セクション」Detailは奇数・偶数に関係なく表示されますが、「詳細セクション」Detail上のTextBoxオブジェクトは、奇数行の場合のみ表示されるということです。

【デザイン例】

【実行例】


位置の設定

次は、オブジェクトの位置の設定方法について説明します。

このサンプルは、「LocationBindingExample」フォルダにあります。

ユーザガイドの「表示/非表示の設定」で使用したサンプルと同じように、DataBandオブジェクトのInstanceCountプロパティは100に設定されています。このサンプルでは、5つのTextBoxオブジェクトをそれぞれ右に3.5センチづつ移動して表示します。これを行うには、Locationダイナミックプロパティに次の値を設定します。

(C#)

new PerpetuumSoft.Framework.Drawing.Vector(1.5f+3.5f*((dataBand1.LineNumber - 1) % 5),0f).ConvertUnits(Unit.Centimeter,Unit.InternalUnit)

(VB)

New PerpetuumSoft.Framework.Drawing.Vector(1.5f+3.5f*((dataBand1.LineNumber - 1) Mod 5),0f).ConvertUnits(Unit.Centimeter,Unit.InternalUnit)

ConvertUnitsメソッドは計測単位を変換します。

【デザイン例】

【実行例】


アプリケーション関数へのアクセス

ユーザガイドの「オブジェクトの参照」で説明したように、アプリケーションのアセンブリからのオブジェクトはすべて、スクリプト内で使用できます。アプリケーションの関数を使用した簡単なサンプルがあります。

このサンプルは「HostingApplicationExample」フォルダにあります。

メインフォーム（サンプルではForm1）のクラスで宣言されたGetString()スタティック関数は「HostingApplicationExample.exeからこんにちは」という文字列を返します。フォームのクラスにアクセスするには、DocumentオブジェクトのImportsプロパティに、格納されるフォームの名前空間を設定するだけです。GetString()関数はtextBox1オブジェクトのValueプロパティから呼び出します。

【デザイン例】

【実行例】


実行時の集計計算

コードの実行時にスクリプトを使用して集計計算を行う例があります。

このサンプルは「CustomScripting」フォルダにあります。

このサンプルには、2つのレポートがあります。
1つは、100個のランダムな配列値を表示し、カレントの要素とそれ以前のすべての要素の累計が各値の右側に表示されます。この累計を計算するには、DocumentオブジェクトのCommonScriptプロパティ内で次のように宣言します。

(C#)

int variable sum = 0

(VB.NET)

Dim sum as Integer

そして、DataBandオブジェクト（サンプルではdataBand1）のGenerateScriptプロパティ内で次のように記述します。

(C#)

if (dataBand1.DataItem != null)
{
sum += (int) dataBand1.DataItem;
}

(VB.NET)

sum += dataBand1.DataItem

つまり、新しいレコードに移動する度に次の配列要素の値が累計に追加されていきます。このコードを、累計を表示するTextBoxオブジェクト（サンプルではtextBox2）のGenerateScriptプロパティ内に設定してしまうと、カレントのページに生成された行が収まらない場合にすべてのコンポーネントをもう一度生成し、累計に同じ数が2度追加されてしまうので設定できません。

もう1つのレポートは、先ほどのレポートと同じ配列値を逆から表示し、カレントのオブジェクトとそれ以降のすべてのオブジェクトの累計が各値の右側に表示されます。この場合、レポートをダブルパスで作成しなければなりません。これを行うには、DocumentオブジェクトのDoublePassプロパティをtrueに設定してください。DocumentオブジェクトのCommonScriptプロパティ内に2つのint変数（sum1 = 0とsum2 = 0）が宣言されています。最初のパス（最初のレポート）の計算は変数sum1内で行われ、2番目のパス（2つ目のレポート）の計算はsum2内で行われます。これを行うには、次のコードをDataBandオブジェクトのGenerateScriptに設定します。

if(!Engine.IsDoublePass)

  sum1 += (int) dataBand1.DataItem;

else

  sum2 += (int) dataBand1.DataItem;

最初のパスではIsDoublePassプロパティはfalseになっており、2番目のパスではtrueに設定されています。次の値をTextBoxのValueダイナミックプロパティに設定します。

sum1-sum2+(int)dataBand1.DataItem


スクリプトの背景

ここでは、レポートマネージャ内で使用するスクリプトの内部メカニズムについて説明します。

実際、すべてのスクリプトや式は次の構造でクラスを構成します。

public class Script : PerpetuumSoft.Reporting.Rendering.ReportScriptBase
{
  private PerpetuumSoft.Reporting.DOM.Page page1;
  private PerpetuumSoft.Reporting.DOM.TextBox textBox1;
  …
  <Document.CommonScript>

  public Script(PerpetuumSoft.Reporting.DOM.Document document,  PerpetuumSoft.Reporting.Components.ObjectPointerCollection dataObjects,
  PerpetuumSoft.Reporting.Rendering.RenderEngine engine) : base(document,  dataObjects, engine)
  {
    this.page1 = ((PerpetuumSoft.Reporting.DOM.Page)(document.ControlByName("page1")));
    this.textBox1 = ((PerpetuumSoft.Reporting.DOM.TextBox) (document.ControlByName("textBox1")));
    …
    this.page1.ManualBuild += new System.EventHandler(this.page1_ManualBuild);
    this.textBox1.Generate += new System.EventHandler(this.textBox1_Generate);
    …
  }

  private void page1_ManualBuild(object sender, System.EventArgs e)
  {
    …
  }

  private void textBox1_Generate(object sender, System.EventArgs e)
  {
    this.textBox1.Value = <binding expression for Value property of the textBox1>;
    …
    <textBox1.GenerateScript>
  }
  …
}

下記は、「実行時の集計計算」の2番目のレポートで生成されるクラスの内部メカニズムです。

namespace PerpetuumSoft.Reporting.ReportScript
{
#line 1 "Document$ImportsString"
 using System;

#line default
#line hidden

#line 1 "Document$ImportsString"
 using PerpetuumSoft.Reporting.DOM;

#line default
#line hidden

#line 1 "Document$ImportsString"
 using PerpetuumSoft.Basics.Drawing;

#line default
#line hidden

 public class Script : PerpetuumSoft.Reporting.Rendering.ReportScriptBase
{
private PerpetuumSoft.Reporting.DOM.TextBox textBox2;
private PerpetuumSoft.Reporting.DOM.TextBox textBox3;
private PerpetuumSoft.Reporting.DOM.TextBox textBox1;
private PerpetuumSoft.Reporting.DOM.Header header1;
private PerpetuumSoft.Reporting.DOM.Detail detail1;
private PerpetuumSoft.Reporting.DOM.TextBox textBox4;
private PerpetuumSoft.Reporting.DOM.DataBand dataBand1;
private PerpetuumSoft.Reporting.DOM.Page page1;

#line 1 "Document$Common"
 int sum1 = 0;
int sum2 = 0;
#line default
#line hidden

 public Script(PerpetuumSoft.Reporting.DOM.Document document, PerpetuumSoft.Reporting.Components.ObjectPointerCollection dataObjects, PerpetuumSoft.Reporting.Rendering.RenderEngine engine) : base(document, dataObjects, engine)
{
this.textBox2 = ((PerpetuumSoft.Reporting.DOM.TextBox)(document.ControlByName("textBox2")));
this.textBox3 = ((PerpetuumSoft.Reporting.DOM.TextBox)(document.ControlByName("textBox3")));
this.textBox1 = ((PerpetuumSoft.Reporting.DOM.TextBox)(document.ControlByName("textBox1")));
this.header1 = ((PerpetuumSoft.Reporting.DOM.Header)(document.ControlByName("header1")));
this.detail1 = ((PerpetuumSoft.Reporting.DOM.Detail)(document.ControlByName("detail1")));
this.textBox4 = ((PerpetuumSoft.Reporting.DOM.TextBox)(document.ControlByName("textBox4")));
this.dataBand1 = ((PerpetuumSoft.Reporting.DOM.DataBand)(document.ControlByName("dataBand1")));
this.page1 = ((PerpetuumSoft.Reporting.DOM.Page)(document.ControlByName("page1")));
this.textBox2.Generate += new System.EventHandler(this.textBox2_Generate);
this.textBox1.Generate += new System.EventHandler(this.textBox1_Generate);
this.dataBand1.Generate += new System.EventHandler(this.dataBand1_Generate);
}

private void textBox2_Generate(object sender, System.EventArgs e)
{
#line 1 "textBox2$Value"
 this.textBox2.Value = sum1-sum2+(int)dataBand1.DataItem;

#line default
#line hidden

#line 1 "textBox2$Generate"

#line default
#line hidden
 }

private void textBox1_Generate(object sender, System.EventArgs e)
{

#line 1 "textBox1$Value"
 this.textBox1.Value = dataBand1.DataItem;

#line default
#line hidden

#line 1 "textBox1$Generate"

 #line default
#line hidden
 }

private void dataBand1_Generate(object sender, System.EventArgs e)
{
#line 1 "dataBand1$Generate"
 if(!Engine.IsDoublePass)
sum1 += (int) dataBand1.DataItem;
else
 sum2 += (int) dataBand1.DataItem;

#line default
#line hidden
 }
}
}


シンプルリストの作成

シンプルリストを作成する例について説明します。商品一覧が表示されるレポートを作成します。

このサンプルは「SimpleList」フォルダにあります。

このレポートを独自に作成するには、このサンプルプログラムを実行し、「デザイン」ボタンをクリックしてレポートデザイナを開きます。「白紙のレポート」のテンプレートを作成してください。これを行うには、ツールバーの [image] ボタンをクリックし、ダイアログボックスの「白紙のレポート」を選択し、OKをクリックします。

ページヘッダーを作成するには、テンプレートにコンポーネントツールのPageHeaderを配置し、そこにTextBoxを配置して枠なしでテンプレートの全幅に引き伸ばします。TextBoxのValueプロパティを＜PageNumber.ToString()+"ページ"＞に設定します。デザイン時にTextBoxにValueプロパティの値を表示するには、Textプロパティに空の値を指定してください（そうしないとTextプロパティの値が表示されます）。Valueプロパティにバインドされている式の値がレポートに表示されます。（プロパティエディタを使用して）下線を表示するには、TextBoxのBorderプロパティを、テキストを右揃えにするにはTextAlignプロパティを変更します。

では、レポートのタイトルを作成します。これを行うには、フォームにDetailセクションを配置し、そこにTextBoxオブジェクトを挿入します。Textプロパティを 「商品一覧」に設定してください。Fontプロパティ（使用されるフォントを定義します）、Fillプロパティ（TextBoxオブジェクトに使用される領域の塗りつぶしを定義します）、TextFillプロパティ（テキストの塗りつぶしを定義します）も変更してみてください。

そして、フォームにDataBandを配置し、DataSourceプロパティを使用してデータソースにPartsと呼ばれるテーブルを指定します。次にヘッダーを表示するために、DataBandにHeaderを配置します。HeaderのRepeatEveryPageプロパティをtrueに設定して各ページにヘッダーが表示されるようにします。商品名と価格の2つのヘッダーが必要なので、Headerに2つのTextBoxを配置し、右側のTextプロパティには「商品名」、もう一方には「価格」を設定します。これらのオブジェクトのフォントや塗りつぶしのカスタマイズもでき、TextAlignプロパティを使用してテキストを揃えることもできます。このサンプルでは、「商品名」は左寄せで、「価格」は右寄せになっています。

データソースのすべての行を表示するために、DataBandにDetailを配置します。
DetailのCanGrowプロパティとCanShrinkプロパティをtrueに設定して、Detail内のオブジェクトの高さによってこのセクションの高さを自動的に調節します。ここで、商品名と価格を表示するためにDetailに2つのTextBoxオブジェクトを挿入し、この2つのTextBoxオブジェクトのTextプロパティをリセットし、テキストのサイズに応じてオブジェクトの高さが自動的に調節されるようにCanGrowプロパティとCanShrinkプロパティをtrueに設定します。

また、GrowToBottomプロパティをtrueに設定して一番大きいオブジェクトの高さに合わせて一行に収めるようにします。左側のTextBoxオブジェクトのValueプロパティを 「dataBand1("Description")」に、右側を「dataBand1("ListPrice")」に設定します。

TextBoxオブジェクトのテキストを揃えるにはTextAlignプロパティを使用します。また、右側のTextBoxオブジェクトにはTextFormatプロパティを指定します。これを行うには、 [image] ボタンをクリックするか、TextFormatプロパティで [image] ボタンを押して表示される「フォーマット」ダイアログを使用してください。

標準の「通貨」形式を使用するか、カスタムな形式を使用するかを指定できます 。これを行うには、「フォーマット」ダイアログの「ユーザー定義」を選択し、使用するフォーマットを「マスクの形式」フィールドに入力してください。

次に、ページフッターが表示されるようにフォームにPageFooterを配置します。そこにTextBoxオブジェクトを挿入し、当日の日付が表示されるようにします。TextBoxオブジェクトのValueプロパティをNowに設定します。日付形式をカスタマイズするには、TextFormatプロパティで「フォーマット」ダイアログを使用してください。

最終的なレポートのテンプレートは次のように表示されます。


スタイルの使用

ユーザガイドの「シンプルリストの作成」で説明したサンプルは、どの商品に対する価格が表示されているのかわかりづらいので、最終レポートは少し読みづらいかもしれません。スタイルを使用して、レポートを読みやすくしていきます。
スタイルを使用してフォント、テキストの塗りつぶし、オブジェクトの塗りつぶし、枠を設定できます。そして、2つの異なるスタイルを作成して、1つはレポートの偶数行に、もう1つは奇数行に使用します。

このサンプルは「StyleSheet」フォルダにあります。

スタイルのコレクションはDocumentオブジェクトのStyleSheetプロパティで指定できます。（Documentオブジェクトを選択するには、ツールバーの [image] ボタンをクリックするか、「プロパティ」タブのドロップダウンリストから選択してください。）
StyleSheetプロパティの [image] ボタンを押して、「スタイルシート エディタ」を開き、「EvenColumn（偶数行）」と「OddColumn（奇数行）」という2つの異なるスタイルを作成します。

作成したスタイルは、テンプレートのすべてのオブジェクトで使用できます。

他のオブジェクトが配置されているコンテナにスタイルを指定すると、そのオブジェクトにも指定したスタイルが使用されます。つまり、そのオブジェクトのプロパティがデフォルト値の場合（プロパティを変更していない場合）に限り、スタイルで指定した値が使われます。デフォルト値以外のプロパティ値を設定した場合は、プロパティ値が太字で表示されます。あるプロパティの値をデフォルトに戻すには、そのプロパティを右クリックし、コンテキストメニューから「リセット」を選択します。

偶数行と奇数行に別々のスタイルを適用するには、detail2のStyleNameプロパティのバインドを次のように設定してください。

(C#)
dataBand1.LineNumber % 2 == 0 ? "EvenColumn" : "OddColumn"

(VB.NET)
IIf((dataBand1.LineNumber Mod 2) = 0, "EvenColumn", "OddColumn")

このコードでは、DataBandのLineNumberプロパティを使用しています。これはレポート生成時のカレントの行番号を定義します。

各オブジェクトのフォント、塗りつぶし、枠を指定する代わりに、スタイルを使用してレポートの表示方法をカスタマイズすることができます。更にスタイルのコレクションを変更するだけでレポートの外観を簡単に変更できます。例えば、色つきのスタイルを使用して画面上のレポートに色を付けたり、モノクロのプリンタで印刷する際にグレーのグラデーションスタイルを使用してレポートにグラデーションを付けることができます。サンプルの「ReportSharpShooterSamplesCenter」を使用してスタイルを変更してみてください。


レポートに段組みを設定する

ユーザガイドの「シンプルリストの作成」で作成したレポートには縦列が2つだけで、列と列の間に余白がたくさんあります。ページをより有効に使用するために、このレポートに段組みを設定していきます。

このサンプルは「MultiColumn」フォルダにあります。

レポートを2段にするには、段数とその間隔を設定します。DataBandのColumnsCountプロパティで段数を2（段）に、ColumnsGapプロパティで間隔を0.5(cm)に指定してください。

次に、（各段がピンクの垂直線で表示されているので）HeaderとDetail内のTextBoxオブジェクトの大きさを変更して1段に収めます。また、HeaderのRepeatEveryColumnプロパティをtrueに設定して、ヘッダーが各段に繰り返し表示されるようにします。

もちろんこれらの設定は、1段分をデザインするだけで、2段目のデザインを作成したりコピーする必要はありません。

最終的なテンプレートは次のようになります。

【実行例】


ラベルの作成

ラベル作成のサンプルが「LabelExample」フォルダにあります。ラベルの作成は通常のレポートの作成とほぼ同じです。主な違いはページサイズを調整しなければならないことです。これを行うには、Pageオブジェクトの一部のプロパティを変更する必要があります。

まず、PaperKindプロパティをCustomに設定します。次にCustomSizeプロパティにサイズを指定します。

このサンプルのdetail1オブジェクトには、バーコードを表示するためのBarCodeオブジェクトの他に、品名と単価を表示するためのTextBoxが2つ追加されています。また、オブジェクトは横ではなく縦に配置されており、オブジェクトのサイズが固定されています。つまり、CanGrowプロパティとCanShrinkプロパティはfalseに設定されています。


データリレーションを使用した階層型レポートの作成

階層型のリンクが付いた、より高度なレポートを作成していきます。全顧客の受注一覧で、どの顧客がいつ、どの商品を誰に注文したかを表すレポートを作成します。

このサンプルは「MasterDetail」フォルダにあります。

新たにレポートを作成するには、プログラムを起動し、「デザイン」ボタンをクリックします。「レポートデザイナ」コンポーネントが開いたら、「白紙のレポート」という新しいテンプレートを作成します。これを行うには、ツールバーの [image] ボタンをクリックし、ダイアログボックスの「白紙のレポート」を選択し、OKをクリックします。

まず、テンプレートにDataBandを配置し、DataSourceプロパティにデータソースとしてAccountsDataSetの「Customers」テーブルを設定します。次に、DataBandにDetailを配置し、CanGrowプロパティとCanShrinkプロパティをtrueに設定します。ここで、DetailにTextBoxを配置し、そのCanGrowプロパティとCanShrinkプロパティをtrueにします。
Valueプロパティに次の式を設定します。

（C#)
"顧客名: "+dataBand1["Company"]+"\n"+"電話番号: "+dataBand1["Phone"]

（VB）
"顧客名: "+dataBand1("Company")+chr(10)+"電話番号: "+dataBand1("Phone")

このようにTextBoxには2行（最初の行に顧客名、2行目に電話番号）が表示されます。

次に、最初のDataBand内に別のDataBandを配置して、DataSourceプロパティにAccountDataSet.Customers.CustomersOrdersを指定します。このCustomersOrdersはDataRelationオブジェクトの名称で、AccountDataSetの「Customers」テーブルと「Orders」テーブルとをリンクします。これによって、レポートの生成時にカレントの顧客の注文が、組み込まれたDataBand内に表示されます。

そして、dataBand2にDetailを配置し、CanGrowプロパティとCanShrinkプロパティをtrueに設定します。DetailにTextBoxを3つ配置し、CanGrowプロパティ、CanShrinkプロパティ、GrowToBottomプロパティをtrueに設定します。最初のTextBoxのValueプロパティを "担当者: " + dataBand2["EmpNo.LastName"]+" "+dataBand2["EmpNo.FirstName"]に、２番目を"受注日: " + dataBand2["SaleDate"]に、3番目を"支払方法: " + dataBand2["PaymentMethod"]に設定します。dataBand2["EmpNo.LastName"]のコードに注目してください。

EmpNoフィールドを使用して、AccountDataSet内の「Employee（従業員）」テーブルと「Orders（注文）」テーブルとをリンクします。つまり、「Orders」テーブルのEmpNoフィールドは「Employee」テーブルの外部キーです。

最後に、注文行を表示するために、dataBand2に別のDataBandを配置し、DataSourceプロパティをAccountDataSet.Customers.CustomersOrders.OrdersLineItemsに設定します。前回と同様に、OrdersLineItemsは「Orders」テーブルと「LineItems」テーブルとをリンクするためのDataRelationオブジェクトです。注文行に品名、数量、単価、値引、金額をテーブルとして表示するよう配列します。テーブルの枠を指定する最適な方法は、TextBoxオブジェクトのBorderプロパティを使用することです。テーブルのヘッダーを表示するために、dataBand3にHeaderを配置し、そこにTextBoxオブジェクトを5つ配置します。

テーブル行を表示するにはDetailを追加し、CanGrowプロパティとCanShrinkプロパティをtrueに設定します。ここで、このDetailに5つのTextBoxを配置し、最初のValueプロパティをdataBand3["PartNo.Description"]に、2番目をdataBand3["Qty"]に、3番目をdataBand3["Price"]に、4番目をdataBand3["Discount"]に、5番目をdataBand3["Total"]に設定します。また、このすべてのTextBoxオブジェクトのCanGrowプロパティ、CanShrinkプロパティ、GrowToBottomプロパティをtrueに設定します。さらにdataBand3["PartNo.Description"]のコードでも、外部キーを使用してPartsというテーブルを参照します。

最後に、レポートにタイトル、ページヘッダー、ページフッターを追加してください。

このサンプルでは、2つの入れ子を使用したレポートを作成しました。Report Sharp Shooterは、入れ子の数を好きなだけ使用してレポートを作成できます。

最終的にはレポートのテンプレートは次のように表示されます。

【実行例】


バンドなしのレポート

厳密なテンプレートによるドキュメントの作成が必要な場合があります。

たとえば、顧客情報のカードを作成する必要があるとします。カードには会社名、国、州、都市、アドレス、電話番号、ファックス番号、客先担当者の情報を表示します。

このサンプルは、「WithoutBands」フォルダにあります。

このサンプルでページとテンプレートのサイズを変更します。PageオブジェクトのPaperKindプロパティ、CustomSizeプロパティ、TemplateSizeプロパティを使用します。

メインフォームにはCustomersテーブルをデータソースとしたDataGridと3つのボタンがあります。実行時に、「デザイン」ボタンをクリックすると、レポートデザイナが開きます。「プレビュー」ボタンは、DataGridに表示されている顧客一覧の（選択した）カレントの顧客カードを作成 （表示）するために使います。Customerクラスのインスタンスは、レポートのデータソースとして使用されます。このクラスのコードは次の通りです。

public class Customer
{
public Customer()
{
}
private string company = String.Empty;
public string Company
{
get
{
return company;
}
set
{
company = value;
}
}

private string country = String.Empty;
public string Country
{
get
{
return country;
}
set
{
country = value;
}
}

private string state = String.Empty;
public string State
{
get
{
return state;
}
set
{
state = value;
}
}

private string city = String.Empty;
public string City
{
get
{
return city;
}
set
{
city = value;
}
}

private string addr = String.Empty;
public string Addr
{
get
{
return addr;
}
set
{
addr = value;
}
}

private string phone = String.Empty;
public string Phone
{
get
{
return phone;
}
set
{
phone = value;
}
}

private string fax = String.Empty;
public string Fax
{
get
{
return fax;
}
set
{
fax = value;
}
}

private string contact = String.Empty;
public string Contact
{
get
{
return contact;
}
set
{
contact = value;
}
}
}

レポートのテンプレートには、情報を表示するためにTextBoxオブジェクトを8つ配置しています。データにアクセスするために、パブリックオブジェクトのGetData(string dataMember)メソッドを使用しています。このメソッドはReportScriptBaseクラス（レポートの作成過程に生成されたスクリプトのクラスの親クラス）内で定義されます。例えば、会社名を表示するtextBox1オブジェクトのValueプロパティは、"会社名: " + GetData("Customer.Company")に設定されます。

このテンプレートは下記のようになります。

【実行例】


1つのレポートに複数のテンプレートを使用する

Report Sharp Shooterを使用して、1つのレポートにデザインの違う複数のレポートのテンプレートを作成できます。そしてその最終ドキュメントは、このテンプレートのページをすべて使用して作成されます。

このサンプルは「MultiPage」フォルダにあります。

最終ドキュメントは、テンプレートを挿入した順に、テンプレートのページごとに生成されます。もちろんこのようなレポートを2つのレポートに分割して、個別に作成することもできます。しかし個別に作成した場合、それらのレポートは共通のページ数、ブックマーク、リンクを持ちません。またレポートにタイトルページを作成しなければならない場合にも複数ページのレポートが便利です。

複数ページのレポートのテンプレートを使用するサンプルを作成して、顧客に関する情報を表示していきます。Page1のページには会社名、国名、電話番号といった情報を一覧表示します。Page2のページには詳細な顧客情報を表示します。また、レポート間を容易に移動するために、顧客の一覧情報から詳細情報へ、またはその逆にジャンプできるようにします。

レポートに新しいページを追加するには、「レポート」メニューの「ページの追加」を使用するか、ツールバーの [image] ボタンを使用してください。

以下に、2種類のレポートページのデザインを示します。

【Page1のデザイン】

【Page2のデザイン】

【ドキュメントツリーの状態】

一覧情報と詳細情報の表示を切り替えられるようにするには、ブックマークとリンク（BookmarkプロパティとHyperlinkプロパティ）を使用します。

ブックマーク（Bookmarkプロパティ）は、他の任意のオブジェクトがHyperlinkプロパティを使用して参照することができる値を定義します。
Page1のページのTextBoxオブジェクトは会社名を表示し、Page2のページのTextBoxオブジェクトは詳細な顧客情報を表示します。Page1とPage2のテキストボックスのBookmarkプロパティとHyperlinkプロパティは次のように設定されています。

Page1のTextBox

プロパティ名 | 値
Bookmarkプロパティ | "#" + dataBand1["Company"]
Hyperlinkプロパティ | "#" + dataBand1["Company"] + "\\" + "(detailed)"

Page2のTextBox
プロパティ名 | 値
Bookmarkプロパティ | "#" + dataBand2["Company"]
Hyperlinkプロパティ | "#" + dataBand2["Company"] + "\\" + "(detailed)"

したがって、これらのオブジェクトは互いに参照し合います。コードが # の文字で始まっていることに注目してください。この # 文字は、コンテンツ内のこのリンクをクリックすると、指定されたブックマークのオブジェクトにジャンプすることを表しています。同じように \ 文字は入れ子のリンクを作成することができます。この場合、それぞれの顧客の目次欄に入れ子のリンクがあることを表しています。

【実行例】

Page1

Page2


グループの使用

Report Sharp Shooterはデータをグループごとに表示することができます。それにはGroupBand [image] セクションを使用します。このセクションには式を定義するGroupExpressionプロパティがあり、この式の計算結果によりデータのグループ化を行います。GroupBandコンポーネントをDataBandに直接含めるか、DataBand内の別のGroupBandに含めなければなりません。GroupBandコンポーネントはGroupExpressionプロパティの式に応じて親セクションのデータをグループ化します。

Detailセクションはデータをグループごとに表示するために使用し、HeaderセクションとFooterセクションはグループのヘッダーやフッターを表示するために使用します。データはグループ化されるので、もうGroupHeaderやGroupFooterセクションを使用する必要はなく、GroupBand内のHeaderとFooterセクションが確実にグループのヘッダーやフッターと関連します。

式にGroup変数を使用して、グループ条件に一致するデータを表示できます。この変数はカレントのグループに一致する値を含みます。

GroupBandはグループごとにデータを階層表示できます。つまり、出力データはグループに分けられ、次に各グループはサブグループなどに分けられます。グループデータをサブグループに分けるには、GroupBandセクションにGroupBandセクションをもう1つ配置して、組み込んだGroupBandのGoupExpressionプロパティにサブグループにグループ化するための式を割り当ててください。

グループ化のロジックはデータのグループ化もサブグループ化も同じで、いくつでもグループを割り当てることができます。必要な数だけGroupBandセクションを組み込んで使用してください。

グループ化を行うソースデータは、（前のReport Sharp Shooterのバージョンのように）グループ条件でソートする必要はありません。グループ化の際に、各グループのデータが順次表示されます。SortExpressionプロパティにはソート条件を割り当て、Orderプロパティにはソート順を割り当てることができます。

次の例はGroupBandを使用したレポートの作成方法を示しています。

【ソースデータ】

国と都市でグループ化したレポートは次のようになります。

更に、GroupBandを使用する場合、例えばグループ、サブグループごとで集計データを計算するレポートを作成する方が簡単です（ユーザガイドの「集計関数の操作」の章を参照）。テンプレートウィザードを使用してグループ条件を指定したレポートを作成できます（ユーザガイドの「ウィザードでテンプレートを作成」を参照）。


データをグループ化したレポートの作成

例えば、顧客情報を表示するレポートを作成し、顧客が住んでいる国ごとにデータをグループ化しなければならない場合があります。データソースとして顧客のデータを含んでいるCustomersテーブルがあります。このテーブルにはCountryフィールド、Stateフィールド、Cityフィールド、Companyフィールドなどがあります。顧客会社の一覧を国（Countryフィールド）ごとにグループ化したレポートを作成していきます。

レポートにDataBandセクションを配置し、データソースとして顧客データ(dataBand1.DataSource = “Customers”)を設定します。

次に、DataBandセクション内にGroupBandセクションを配置し、国ごと(groupBand1.GroupExpression = ‘GetData("Customers.Country")’)にグループ化します。

例えば国、都市、会社名といったグループごとに顧客情報を表示するために、DetailセクションにTextBoxコンポーネントを配置し、このDetailセクションをGroupBand1内に配置します。

グループのヘッダーやフッターを表示するには、GroupBand1内にHeaderセクションとFooterセクションを配置します。

HeaderセクションとFooterセクション内にTextBoxを配置し、そのValueプロパティにtextBox.Value = “Group”をバインドします。これはTextBoxにカレントのグループ値を表示するためです。

レポートのテンプレートは次のようになります。

【ドキュメントツリーの状態】

【実行例】


サブグループ付きのレポートを作成する

では、テンプレートに手を加えて、国別にグループ化した中にさらに都市ごとにグループ化したデータを表示できるようにしていきます。

GroupBandセクションにgroupBand2というGroupBandをもう1つ配置します。GroupBand2のグループ条件を次のように設定し、都市ごとにグループ化します。

GroupBand2.GroupExpression = ‘GetData("Customers.City")’

次に、groupBand2の中にdetail1を移動します。サブグループのヘッダーとフッターを表示するためにGroupBand2にHeaderセクションとFooterセクションを追加します。新しいHeaderとFooterの中にそれぞれテキストボックスを追加し、TextBox.Value = ‘Group' を割り当てて、新しいヘッダーとフッターにサブグループのカレントの値を表示できるようにします。

レポートのテンプレートは次のようになります。

【ドキュメントツリーの状態】

【実行例】

レポートに別のサブグループを作成したい場合は、上述したようにGroupBandを追加し、グループ条件（GroupBand.GroupExpression）を割り当ててください。サブグループの入れ子も行えます。データをグループ化する際のアドバイスとして、ソースデータをソートする必要はありません。このサンプルで、ソースデータをランダムに配置できますが、各グループのデータは連続して出力されます。出力の順番を変更するには、GroupBandプロパティのSortExpressionプロパティ（ソートを行うことにより値を計算するための式）やOrderプロパティ（データの出力順を定義する）を使用してください。


集計関数の概要

他の帳票コンポーネントを使ったことがある方は、データを集計するにはFooterにSUM()を記述すればよいと思われるかもしれません。Report Sharp Shooterの集計値を取得するロジックもそれほど複雑ではありません。集計値を取得するには、集計関数の他に集計を作成して集計値の計算式を指定するだけです。

更に上級な開発で集計値を取得するには、GetTotal()関数を参照し、集計に独自の名前を指定するだけです。集計のカレントの累計を取得するには、GetRunningTotal()関数を参照してください。

GetTotal 関数を参照すると、レポートのヘッダーやフッターなど、どこで参照しても正確な値を取得します。グループヘッダーやグループフッターでGetTotal関数を参照すると、データはそのグループに応じて集計されます。グループ内でGetRunningTotal関数を参照すると、カレントのグループごとに累計データを取得します。

これには次の利点があります。

  • 簡単に集計値を取得できます。
  • ダブルパスにしなくても、データを出力する前にヘッダーなどに集計値を取得することができます。
  • 集計関数を使用する際に融通が利き、さまざまな条件部にクエリーを追加して計算することができます。
  • 常に何が行われているかを把握できます。
  • 利用可能な関数を使用して、どんな式の集計でも計算できます。
  • レポートの生成プロセスを最適化します（ほとんどの場合、レポートは1つのパスで作成されます）。

更に、ほとんどの場合ウィザードが全作業を行います。

現在、report generatorは12の内蔵された集計関数をサポートしています。

  • Sum – 合計
  • Avg – 平均値
  • Min – 最小値
  • Max – 最大値
  • Count – 個数

  • StandardDeviation – 標準偏差

  • EstimateOfStandardDeviation – 標本標準偏差

  • Variance – 分散

  • EstimateOfVariance – 標本分散

  • Median – 中央値

  • Skewness - 歪度

  • Kurtosis – 尖度

DataBandに表示するデータの集計リストはDataBand.Totalsに設定します。

それぞれの集計に、以下を設定してください。

  • その集計を参照するための独自の名前

  • 計算結果を集計する式（データソースのフィールド値と複雑な計算値の両方を取得するための簡単な式）

  • 適用する集計関数

【DataBand.Totalsプロパティの集計を割り当てるエディタ】

ここで、名前付きの集計を参照して集計値を取得することができます。集計が設定されたDataBandに入れ子になった任意のオブジェクトに、任意のスクリプトで集計を参照できます。集計値を取得するには、GetTotal()関数を、カレントの累計値を取得するにはGetRunningTotal()関数を呼び出す必要があります。集計値を表示する（例えば、ヘッダーに集計値を表示する）前に、集計データを取得することができます。GetTotal関数は集計を参照するオブジェクトの位置（データの表示前または表示後）には依存しませんが、オブジェクトがGroupBand内にあるかDataBand内にあるかに依存します。グループ内でGetTotal関数を参照すると、グループの合計が取得されます。グループ内でGetRunningTotal関数を参照すると、そのグループの累計が取得されます。

detailにGetRunningTotalの値を表示するのは良い考えです。Headerには累計がないので参照しても意味がありません。この関数をFooterから参照すると、結果はGetTotalと同じになります。

どういったメカニズムなのかがわかるように、レポートの色々なオブジェクトからGetTotal関数やGetRunningTotal関数を参照するレポートを作成していきます。データソースとして次のテーブルを設定します。

レポートのテンプレートは次のようになります。

【ドキュメントツリーの状態】

テンプレートのdataBand1のデータソースに「table」を使用します。dataBand1に、「Aggr」集計を設定します。この「Aggr」集計はValueフィールドでカウントされる値を計算します。dataBand1内のグループ条件は、Groupフィールドに設定します（groupBand1.GroupExpression = “GetData("table.Group")”)。

集計は次のように設定します。

最終ドキュメントには次のテーブルが表示されます。参照するセクションに応じて、どんな結果をGetTotal関数とGEｔRunningTotal関数で取得したかがわかります。

レポートのページごとに集計値を取得するには、DataBand.GetPageTotal( )関数を使用してください。これはダブルパス(Document.DoublePass = true) を使用した場合のみ、ページごとの集計値を取得します。

例えば、dataBand1 には次の値が設定されています。

dataBand1.Total[0].Name = "Aggregate"

dataBand1.Total[0].Expression = ...

dataBand1.Total[0].AggregateFunction = ...

ページごとに集計値を表示するには、Document.DoublePassプロパティをTrue（Document.DoublePass = true）に設定し、TextBoxをPageHeaderかPageFooterに配置し、その TextBox.Valueプロパティに'GetPageTotal("Aggregate")'をバインドしてください。


集計の使用例

この例は各企業とその所在地のデータを基にしています。

ソースデータは「table」というテーブルです。

各企業を国別にグループ化して表示するレポートを作成していきます。レポートには各国の企業数と企業総数を表示します。テンプレートにDataBandを配置し、データソースとして「table」というテーブルを割り当てます（dataBand1.DataSource = ‘table’）。dataBand1.Totalsプロパティに企業数を計算するための集計を割り当てます。

dataBand1.Totals[0].AggregateFunction = 個数

dataBand1.Totals[0].Expression = ‘1’

dataBand1.Totals[0]. Name = ‘CountCompany’

dataBand1にGroupBandを配置し、次のようにデータを国別にグループ化する条件を設定します。

groupBand1.GroupExpression = “GetData(“table.Country”)”

テーブルフィールドの値を表示するために、groupBand1の中にDetailを配置し、その中にTextBoxコンポーネントを3つ配置します。グループごとの合計を取得するために、groupBand1内にFooterを配置し、その中にTextBoxを配置して次の式を割り当てます。

TextBox.Value (property binding) = ‘GetTotal(“CountCompany”)’

dataBand1に全データの合計を表示するために、Footerセクションとその中にTextBoxを配置し、TextBox.Valueプロパティに次の式を割り当てます。

TextBox.Value (property binding) = ‘GetTotal(“CountCompany”)’

グループ内でGetTotal関数を参照するということは、グループごとの合計を取得するということなので注意してください。グループ以外でGetTotal関数を参照すると、参照は‘GetTotal(“CountCompany”)’と同じように行われますが、グループ全体の合計を取得します。

【レポートのテンプレート】

【ドキュメントツリーの状態】

【実行例】


データのソートとフィルタ処理

レポートを作成する際に、データのソートやフィルタ処理（出力順を設定したり、一定基準に応じてデータを表示する）して出力することができます。

データのソートを設定するには、DataBandセクションのSortプロパティを定義する必要があります。

【DataBandのSortプロパティのエディタ】

ソートの際に、DataBand.Sortプロパティのコレクションの条件は1つづつ順番に適用されます。最初の条件の式の計算結果が一致すると、順番を定義するために二番目の条件、そしてその次、と使用されます。

データのソートの設定について説明します。「Group」フィールドと「Value」フィールドがある「table」というテーブルがあります。このテーブルには次のデータが含まれています。

ソート設定を行わずにDataBandにデータを表示すると、データソースに表示されている順番でデータが表示されます。

データソースで、Groupフィールドの最初のソート条件が昇順に指定した場合、

DataBand.Sort[0].Expression = “GetData(“table.Group”);

DataBand.Sort[0].Order = Ascending,

次の結果が出力されます。

Groupフィールドの値と一致したデータをソートするには、DataBand.Sortプロパティにグループ条件を追加します。

DataBand.Sort[1].Expression = “GetData(“table.Value”);

DataBand.Sort[1].Order = Descending

次の結果が出力されます。

GroupBandでデータをグループ化した場合、グループ内のすべてのレコードを順次表示するためにデータの順番は変更されます。「Group」フィールドでグループ化を設定すると、グループ内のデータを順次表示するために順番は変更されますが、レコードの最初の順番は保存されます。このグループの最初のレコードの表示と同じ順番でグループが表示されます。

「table」というテーブルで、データは「Group」フィールドごとにグループ化されます（GroupBand.GroupExpression = “GetData(“table.Group”)”）。

グループの出力順を変更するためにKeepOriginalプロパティとは別の値をGroupBand.Orderプロパティに設定できます。例えば、GroupBand.Order = Ascendingに設定します。

ここで、データはGroupBand.GroupExpressionプロパティで計算された値に応じてソートされ、昇順で表示されます。

SortExpressionプロパティの設定

DataBand.FilterExpressionプロパティは値をフィルタ処理するために使用します。

このプロパティにBoolean型の式を設定します。この式の計算結果によって、データソースからのレコードを出力または計算するかどうかが決まります。Trueの場合はレコードが表示され、Falseの場合はレコードは除外されます。

例えば、データが「table」というテーブルから出力される際に次のフィルタ処理の条件が設定されます。

DataBand.FilterExpression = “ (int)GetData("table.Group") % 2 != 0 ”

次に、Groupフィールドの偶数の値のレコードは除外されます。

フィルタ処理の結果は次の通りです。


.NET ModelKit Suite Suite User(s) Guide

並列レポートの作成

並列レポートを作成するには、「並列」コンポーネント( [image] )を使用します。データなしの簡単なサンプルを作成していきます。レポートデザイナを立ち上げ、新しい「白紙のレポート」を作成し、「並列」コンポーネントをdocumentページに配置します。次に、そこにDataBandを2つ配置して、そのInstanceCountプロパティを30と10に設定します。各DataBandの中にそれぞれDetailコンポーネントを配置してください。そしてDetail1にtextBox1を左詰めに配置し、Valueプロパティには “dataBand1.LineNumber”を記述します。TextBoxの高さは1ｃｍに設定してください。Detail2にはTextBoxを右詰めに表示されるよう配置し、高さを1.5ｃｍに設定してください。出来上がったテンプレートは次のようになるはずです。

最終ドキュメントでは、dataBand1とdataBand2のテキストボックスが並列表示されます。


PivotTableコンポーネントの目的と主な機能

PivotTableコンポーネント( [image] )は、ピボットテーブルを作成するだけでなく、大量の統計データを基にクロスレポートを作成するためにあります。Report Sharp Shooterのドキュメントに書かれたピボットテーブルを含むレポートブロックがその使用例です。

特別なピボットテーブルのレイアウトエディタを使用して、計算に必要なデータを視覚的に指定できます。指定したデータソースの既存フィールドをエディタの必要な領域にドラッグするだけで必要なレポートを取得でき、ボタンをいくつかクリックするだけでピボットテーブルのスタイルを設定することができます。

ディメンションの交差セルだけでなく、ピボットテーブルのディメンションに計算命令を割り当てるために、Report Sharp Shooterでサポートされているプログラミング言語で書かれたスクリプトを使用できます。これはデータソースの内容に応じてピボットテーブルを調節することができます。スクリプトを使用することで、データソースのフィールド値の単純計算からレポートのディメンション内のグループ設定（例：年ごと、月ごと、四半期ごと、または曜日ごとに日付を分類する）に至るまで、ピボットテーブルのさまざまな設定オプションが行えます。

ピボットテーブルのディメンションの交差セルの値を計算するために、集計関数（例：平均値、最小値、最大値の取得）を使用することができます。

ピボットテーブルの設定をすべてファイルに保存できるので、いつでもピボットテーブルを編集前の状態に瞬時に戻すことができます。


ピボットテーブルのレポートの作成例

PivotTableコンポーネントは外部のデータソースのデータをピボットテーブルとして構成するために使用します。テーブルを設定するには、ディメンション（行や列）ごとにフィールドを指定してください。ファクトフィールド（行と列の交差セルの値を計算するために使用するデータ）も指定してください。

データソースのデータを取得するための命令はスクリプトによってフィールドに指定されます。

また、交差セルの値を計算するための集計関数もファクトフィールドに指定してください。

ではPivotTableコンポーネントを使用して、簡単なクロスレポートを順を追って作成していきます。

このサンプルは「PivotTableGettingStarted」フォルダにあります。

指定した2社のある製品の総売上高をピボットテーブルで作成します。

最終的なテーブル内のデータは次のようにグループ化されます。

縦列にはメーカ名が表示され、横行には食品部門名と品名が表示されます。交差セルには商品の値段、数量、値引を考慮して計算された合計額が返されます。

データソースにAccess NWind.mdb.demonstrationalデータベースを使用します。

まず始めに、レポートのデータソースを作成します。それには、メインフォームにSystem.Data.DataSetオブジェクトを追加します。その中に Sales テーブルを作成し、基のデータテーブルの構造と一致するようにSalesテーブルのフィールドを設定します。

では、ドキュメントのテンプレートを作成します。まず、フォームにReportManagerオブジェクトを追加します。そしてReportManagerのデータソースコレクションに「Sales」テーブルを追加します。

ReportManagerのReportsプロパティのコレクションにInlineReportSloｔオブジェクトを追加し、pivotTableReportSlotという名前にします。レポートデザイナを立ち上げ、このオブジェクトを編集します。

まず、ドキュメントのスタイル（StyleSheetプロパティ）を設定します。新しいスタイルを追加し、スタイル名を「Simple style」にして、そのBorderプロパティとTextAlignプロパティを設定します。

次に、テンプレートにPivotTableコンポーネントを配置して、このDataSourceプロパティに「Sales」テーブルを指定します。

では、ピボットテーブルの外観を設定します。それには、PivotTableオブジェクトのLayoutプロパティを変更します。Layoutプロパティのエディタはこのようになっています。

「ソースフィールド」から「CompanyName」をドラッグし、「Xディメンションフィールド」にドロップします（「CompanyName」のキャプションを「会社名」に変更してください）。「CategoryName」と「ProductName」は「Yディメンションフィールド」に配置します（「CategoryName」のキャプションを「食品部門」に、「ProductName」は「品名」に変更してください）。

次に、「ファクトフィールド」の「追加」 [image] ボタンをクリックして、新規フィールドのプロパティを次のように指定します。

プロパティ名 | 設定
Captionプロパティ | 売上小計
Formatプロパティ | 0.00
Expressionプロパティ | GetData ("Sales.UnitPrice") * GetData ("Sales.Quantity" ) * (1 - GetData ("Sales.Discount"))
Widthプロパティ | 150
TotalLabelプロパティ | Total price

StylesプロパティにPivotTableオブジェクトのスタイル（Simple style）を指定して、ピボットテーブルが最終レポートで設定した通りに表示されるようにします。これは Stylesプロパティを変更することにより行えます。

これでピボットテーブルの設定は完了です。では、メインフォームに ReportViewerオブジェクトを追加して、レポートビューアのSourceプロパティにpivotTableReportSlotを指定します。

Form uploadイベントに、DataSetから「Sales」テーブルを取り込むコードとピボットテーブルのテンプレートを生成するコードを追加します。

アプリケーションを実行すると、次のようにピボットテーブルが表示されるはずです。


ピボットテーブルの概念

PivotTableオブジェクトに表示されるピボットテーブルの行や列は、最初のテーブルまたは他のデータソースの列から取得したデータが基になっています。

ピボットテーブルのセル情報は、該当する行や列を集計したデータです。

一般的に、OLAPキューブとはマルチディメンションのOLAPデータ、つまりディメンション（マルチディメンションキューブの軸を構成する記述データ）とファクト（コンピュータの数値）を含む構造のことです。ディメンションは値の多層階層を含んでおり、ファクトはデータソースのフィールドを基にした集計データ（合計、平均、最小値、最大値、レコードの数など）です。

ピボットテーブルを作成するには前もって次のことを行っておかなければなりません。

・データのグループ化

・サブグループごとの中間結果の計算

・最終結果の計算

フィールドオブジェクトはファクトやディメンションを定義するために使用します。フィールドには、データの表現方法を指定するだけでなく、ピボットテーブルを計算するためのデータを指定できます。ディメンション内のフィールド順を指定するのにも内部データのグループ化を割り当てます。

フィールド値（ファクトとディメンションの両方）はユーザにより定義されます。フィールドにスクリプトを割り当てることにより値を定義できます。ファクトにも集計関数を指定できます。したがって、ファクトの値はスクリプトを実行して取得した集計です。結果として、ピボットテーブルは次のように構成されます。

  • データをグループ化する段階で、ツリー型テーブルのディメンション構造の形態が取られます。データソースの情報に応じてそのフィールドのスクリプトの計算が各ツリーノード（ディメンションのオブジェクトの値）に行われます。しかも、グループ化も行われます。グループはツリーノード（ディメンションのオブジェクト一覧のフィールドがノードに関連付けられます）になり、サブグループはこのノードのリーフ（ディメンションのオブジェクト一覧の下のフィールド）になります。
  • 中間結果を計算する段階で、結果となるピボットテーブルが直接取り込まれます。ディメンションの交差セルについては、フィールドのスクリプトに応じてファクトの値が計算されます。スクリプトの計算は、データのグループ化段階で構成された、すべてのディメンショングループの値を基にして行われます。
  • 最終結果の計算はサブグループのテーブルをすべて取り込むよう同時に行われます。この計算はフィールドに指定した集計関数と、既に計算されたファクトの値を基にして行われます。ソートを変更したり、データを任意に組み合わせてフィルタ処理の式を割り当てたり、さまざまなテーブル変換を行うことができます。

Copyright(c) by Perpetuum Soft.


データソース

ReportManagerオブジェクトのDataSourcesプロパティに指定したデータソースは、PivotTableオブジェクトを使用してクロスレポートを作成するためのデータソースとして使用されます。Report Sharp Shooterのデータソースに関する詳細は、このユーザガイドの「データソース」の章を参照してください。


PivotTableコンポーネントについて

PivotTableコンポーネントの設定に次のプロパティが使用されます。

プロパティ名 | 説明
AutoColumnWidthプロパティ | このプロパティを設定すると、テーブルの作成時にセルの内容に応じて（テーブルセルの）幅が調整されます
AutoRowHeightプロパティ | このプロパティには3つの値があります。 None - 行の高さ調節なし Dissimilar - 各テーブルのセルの高さは、その行で一番高いものに合わせて設定されます Similar - すべてのテーブルの行高が同じになります（全行で一番高い行と同じになります）
DimensionOnEveryPageプロパティ | このプロパティを設定すると、レポートの各ページにディメンションのヘッダーが表示されます
ShowRepeatTextプロパティ | このプロパティを設定すると、セルを他のページに移動した時にそのセルのテキストが表示されます
ShowSingleFactプロパティ | このプロパティを設定すると、ファクトが１つだけの場合、レポートにそのファクト名を表示します
TableCaptionプロパティ | ピボットテーブルのキャプションとして表示されるテキストです
ShowTableCaptionプロパティ | このプロパティを設定しなかった場合、レポートにはピボットテーブルのキャプションは表示されません
DataSourceプロパティ | ピボットテーブルを作成するために使用されるデータソース名です
NestedFieldsプロパティ | ピボットテーブルのビルドに使用する、DataSourceプロパティで指定したソースのデータソースコレクションです
FilterExpressionプロパティ | Report Sharp Shooterでサポートされているプログラミング言語のうちの1つで書かれた式（条件部）です。FilterExpressionプロパティに書かれた条件を満たさないデータのセットはピボットテーブルの計算に含まれません。
Stylesプロパティ | 個々のピボットテーブルオブジェクトの描画スタイルを定義します。希望のスタイルをドキュメントのStyleSheetプロパティのコレクションに設定してください。
Layoutプロパティ | ピボットテーブルのレイアウト（ディメンションオブジェクトとファクトオブジェクトの状態、ディメンション内のオブジェクトのグループ順、ソート方法、値の構成ルール）を設定します。Layoutプロパティを簡単に設定するために専用エディタ（レイアウト エディタ）が使用されます。

Layoutプロパティのレイアウトエディタは次のように表示されます。

このエディタには「ソースフィールド」一覧と、下記のようなピボットテーブルの構成に必要なフィールドの一覧が4つあります。

フィールド名 | 説明
ソースフィールド | 全データソースフィールドの一覧です
除外するフィールド | ピボットテーブルの構成に含まれていても計算には含まれないフィールドの一覧です
X ディメンションフィールド | データソースから取得したフィールドまたはディメンションの列を構成するためにユーザが作成したフィールドの一覧です
Y ディメンションフィールド | データソースから取得したフィールドまたはディメンションの行を構成するためにユーザが作成したフィールドの 一覧です
ファクトフィールド | データソースから取得したフィールドまたはピボットテーブルのファクトを構成するためにユーザが作成したフィールドの一覧です

ある一覧から他の一覧にフィールドをドラッグしたり、一覧内でフィールドを移動して順番を変更することができます。それぞれの一覧にはフィールドを簡単に操作するためのボタンがいくつか付いています。

ボタン名 | 説明
「上へ」 ( [image] ) | 一覧の中から選択したフィールドを1つ上に移動します
「下へ」 ( [image] ) | 一覧の中から選択したフィールドを1つ下に移動します
「フィールドの追加」 ( [image] ) | このボタンをクリックすると、新規フィールドが作成され一覧に追加されます
「フィールドの削除」 ( [image] ) | 選択したフィールドを一覧から削除します
ファクトフィールド | データソースから取得したフィールドまたはユーザがピボットテーブルのファクトを構成するために作成したフィールド一覧です

「レイアウト エディタ」の右側に、選択したフィールドのプロパティエディタが表示されます。

プロパティ名 | 説明
Captionプロパティ | フィールドのキャプションを指定します
Formatプロパティ | フィールドのデータを表示するための文字列形式を指定します
ShowPercentプロパティ | カレントのフィールドデータをパーセントで表すかを定義します
SortOrderプロパティ | フィールドデータのソート順を指定します
TotalLabelプロパティ | フィールドの合計のラベルを指定します
Widthプロパティ | フィールドの幅を指定します
Aggregateプロパティ | フィールドデータの集計関数を指定します
Expressionプロパティ | ピボットテーブルの計算に使用する式を指定します
DisplayExpressionプロパティ | 式を割り当てます。その式の計算結果がピボットテーブルに表示されます。

「レイアウト エディタ」に、次のボタンパネルがあります。

「開く」( [image] ) ボタンはファイルからピボットテーブルの設定を読み込むことができます。

「保存」 ( [image] ) ボタンはファイルにピボットテーブルの設定を保存できます。


サブレポートの作成

SubReportコンポーネント( [image] ) はサブレポートを作成するために使用します。TemplateNameプロパティはサブレポートとして使用するレポートを定義します。簡単な例としては、サブレポートとして使用するレポートが含まれているreportSlotをreportManagerのReportsプロパティのコレクションに入れてください。他には、reportManagerのResolveSubReportイベントのハンドラを記述することもできます。そこに、希望するレポートのテンプレート名を定義して、そこへのリンクをハンドラのパラメータに渡すことができます。

サブレポートのParametersプロパティのコレクションを使用して、サブレポートにパラメータを渡すことができます。名前とスクリプトで各パラメータを指定し、その計算結果がサブレポートのドキュメントに渡されます。サブレポートにすでに指定した名前のパラメータがある場合、その値は入れ替えられます。そうでなければ追加されます。

サブレポートとして使用するレポートのセクション（例：DataBand、detailなど）しか生成されないということをお伝えしておかなければなりません。PageBandやページに直接配置されたビジュアルオブジェクトは生成されません。


BandContainerコンポーネント

Report Sharp Shooterに「BandContainer」コンポーネントが追加されました。このコンポーネントは特にユーザの利便性を考慮して追加されたもので、DataBandのInstanceCountプロパティを1に設定したのと同じです。


マスターレポートの概念

Report Sharp Shooterで「マスターレポート」を使用できます。

マスターテンプレートを使用したドキュメントが生成される際に、最終ドキュメントにはマスターテンプレートとドキュメントのテンプレートの結果が含まれます。この機能はドキュメントを均一にデザインするためです。

マスターレポートを割り当てるには、マスターテンプレートの名前をDocument.MasterReportプロパティに割り当てなければなりません。レポートの生成時に、指定した名前のテンプレートがIResolveSubReportインターフェースから取得されるはずです。例えば、指定した名前のマスターテンプレートが、最初のテンプレートが追加されたのと同じReportManagerに追加されるはずです。

マスターテンプレートの作成時に、そのテンプレート上に「Content」コンポーネントを追加しなければなりません。マスターテンプレートを使用するドキュメントは次のように作成されます。最終レポートにはマスターテンプレートの生成結果が表示され、「Content」オブジェクトには最初のレポートの生成結果が表示されます。


表形式のエクスポートとイメージの使用方法

まず、レポートをMicrosoft社のExcelなどの表形式にエクスポートする際の注意点をあげます。

表にセル枠を追加するだけでなく他の行を追加するには、TextBoxオブジェクトのBorderプロパティの使用をお勧めします。このオブジェクトはちょうど表のセル枠に変換されます。

また、エクスポートする可能性があるレポートは、オブジェクトを重ねて配置しないようにデザインしてください。オブジェクトを重ねて配置すると、エクスポート時にセルを正確に一致させることができなくなるのでオブジェクト内容が表示されない場合があります。次にその例を示します。

■正しい方法

【デザイン（オブジェクトを重ねないで配置）】

【エクスポートしたExcelデータ（品名も数量もきちんと表示されている）】

■間違った方法

【デザイン（品名用と数量用のテクストボックスを重ねて配置してある）】

【エクスポートしたExcelデータ（品名が表示されずセル枠もずれている）】

次に、レポートにイメージを使用する方法について説明します。

形態の1つはイメージそのものがデータベースに格納される場合です。この場合、イメージを使用するには、テンプレートにPictureオブジェクトを配置し、バインドのImageプロパティに値（例：dataBand1["Photo"]）を設定してください。「ReportSharpShooterSamplesCenter」の「レポートのコントロール」の「ベーシック」に「イメージ」というレポートがありますので参照してください。

【デザイン例】

【実行例】

また、イメージ利用の別の形態として、ファイル名だけがデータベースに格納される場合があります。この場合、Imageプロパティに次の値を割り当ててイメージを読み込むことができます。

Image.FromFile((string)dataBand1["Picture"])

この場合、DocumentオブジェクトのImportsプロパティ内のSystem.Drawing名前空間を指定してください。

さらに、イメージのURLがデータベースに格納されているサーバからイメージを読み込むような形態もあります。この場合、PictureオブジェクトのGenerateScriptプロパティに次のようなコードを記述し、DocumentオブジェクトのImportsプロパティにSystem.DrawingおよびSystem.IOと呼ばれる2つの名前空間を追加します。

System.Net.WebRequest req = System.Net.WebRequest.Create((string)dataBand1["Picture"]);

using(System.Net.WebResponse res = req.GetResponse())

{

  using(Stream strm = res.GetResponseStream())

  {

    picture1.Image = Image.FromStream(strm);

  }

}


アドバンステキストコンポーネントを使用する

このコンポーネントは情報を書式付きのテキストとして表示します。段落やテキストスタイルを割り当てることができ、特定のテキスト項目内に直接式を使用することもできます。書式付きテキストはHTMLのようなマークアップ言語（Textプロパティ）とサブセットのRTF形式（RtfTextプロパティ）で定義します。

＜Textプロパティの使用＞

テキストの書式を定義するのにHTML形式のようなタグを使用します。

-段落-

タグ 説明
<P></P>タグ 段落を定義します。Align属性が段落内のテキストの水平揃えを定義します。使用可能な値は下記の通りです。

  • Align = “left” – 段落を左マージンに揃えます。
  • Align = “right” - 段落を右マージンに揃えます。
  • Align = “center” – 段落を中央に揃えます。
  • Align = “justify” - 段落を両端揃えにします。

*デフォルトは、Align = “left” です。

-テキストの書式-

タグ | 説明
<Font></Font>タグ テキストの表示スタイルを定義します。フォントタグの埋め込みが可能です。テキストスタイルは次の属性で定義します。

  • face – フォント名を定義します。
  • size – フォントのサイズを定義します。

  • color – テキストの色を定義します。このプロパティは、色の名称または16進数で定義します。（例：color = red または color = #FF0000）

<B></B> タグ | テキストを太字にします
<I></I> タグ | テキストを斜体にします
<U></U> タグ | テキストに下線をつけます
<BR> タグ | 段落内の改行を定義します

-記号-

&nbsp; - スペース記号

&amp; - ‘&’ 記号

&It; - ‘<’ 記号

&#ddd; - ‘ddd’ コード付の記号

注意：

段落内にテキストがない場合、TextAlignプロパティに応じて整列されます。

一部のテキストが明確にフォント設定されていない場合、Fontプロパティの設定が適用されます。

テキストの色が設定されていない場合、TextFillプロパティが適用されます。

タグ付きテキストに折り返し、余白、不明なタグ、属性があっても無視されます。タグや属性名には意味がありません。

-式の使用-

タグ内のテキストに、式（その計算結果がテキストに置換されます）を使用することができます。式は{=<Expression>}として定義されます。<Expression>は指定されたスクリプト言語内の式です。利用可能な型やオブジェクトをすべて式に使用できます（ユーザガイドの「式やスクリプトの使用について」の章を参照してください）。計算結果がテキスト内に表示される前に、Formatプロパティで定義した形式が適用されます。式の計算過程でエラーが生じた場合、その計算結果としてテキスト内にエラーメッセージが表示されます。

-アドバンステキストの使用例-

Textプロパティに次の値を定義します。

    “<font face = "Arial" size = 14>

    Page number <Font color = red><i> {=PageNumber} </i></Font>

    of <Font color = red><i> {=PageCount} </i></Font>”

結果は下記のようになります。

＜RtfTextプロパティの使用＞

サブセットのRTF形式がテキストの書式として使用されます。次の構造体がRTF形式からサポートされます。

フォントテーブル、カラーテーブル、メモ、段落書式演算子 (“\par”, “\pard”, “\ql”, “\qr”, “\qc”, “\qj”,
                “\line”)、テキストの書式演算子 (“\fxx”,“\fsxx”,“\cfxx”,“\b”,“\i”,“\u”)。

残りの構造体や演算子は無視されます。RtfTextプロパティは設定のためだけに使用されます。RtfTextプロパティはTextプロパティと関連付けられます。RtfTextプロパティを指定すると、Textプロパティの値が自動的に定義されます。


Widgetコンポーネントの使用

Widgetコンポーネントはさまざまなビジュアルコントロールを表示するために使用します。ゲージ、ダイアル、スライダ、進捗バー、オドメータ、温度計や産業特有の計器（ロボット、スケール、範囲、専用デバイス、その他）などの一般のコントロールなどもそうです。

完全装備のデザイナでマウスを数回クリックするだけで、珍しい外観や機能を備えたコンポーネントを作成することができます。

Widgetコンポーネントに表示されるビジュアルコントロールはそれぞれ互いに相互運用し合う、ビジュアルオブジェクトと非ビジュアルオブジェクトで構成されています。これらのオブジェクトを使用して希望する任意のビジュアルコントロールをデザインすることができます。

式を使用してオブジェクトのプロパティを指定できます。計器やマウスのカレントの状態に応じてプロパティを設定できます。

WidgetオブジェクトはInstrumentation ModelKitで作成した計器を表示するよう設計されています。Instrumentation ModelKitの特徴に関する詳細は、各ユーザーガイドの章を参照してください。

Report Sharp ShooterでのWidgetコンポーネントの使用法について説明します。

レポートのシンプルなデータソースを作成します。それには、フォームにSystem.Data.DataSetオブジェクトを追加し、そこに「NameColumn」文字列フィールドとdouble型の「DataColumn」フィールドがある「SimpleTable」というテーブルを作成してください。

Loadイベントを追加してテーブルにデータを取り込んでください。

private void Form1_Load(object sender, System.EventArgs e)

{

simpleTable.Rows.Add(new object[] {"Data1", 20.0});

simpleTable.Rows.Add(new object[] {"Data2", 15.0});

simpleTable.Rows.Add(new object[] {"Data3", 35.0});

simpleTable.Rows.Add(new object[] {"Data4", 45.0});

}

では、レポートのテンプレートを作成します。フォームにReport Managerオブジェクトを追加してダブルクリックし、レポートマネージャエディタを開きます。このウィンドウでデータソースの設定やレポートのコレクションを編集できます。

ReoprtManagerのデータソース（DataSourcesプロパティ）のコレクションに「Simple Table」というテーブルを追加してください。

ReportManagerのReportsプロパティのコレクションにInlineReportSlotオブジェクトを追加し、widgetTableReportSlotという名前にします。このオブジェクトの編集が済んだら、テンプレートデザイナを起動させます。

テンプレートに「DataBand」コンポーネントを配置してください。このDataSourceプロパティの値を「Simple Table」に設定します。「DataBand」に「Detail」を追加します。

「Detail」の中にWidgetsコンポーネントを配置してください。

Widgetオブジェクトをダブルクリックしてこのオブジェクトのデザイナを立ち上げ、ウィザードから計器を選択してください。

「OK」ボタンをクリックすると、選択した計器がデザイナに表示されます。

計器の外観と機能をカスタマイズします。計器は独自のプロパティや機能を持つ個別のオブジェクトで構成されています。デザイナを使用して、オブジェクトの追加や削除、プロパティの設定が行えます。オブジェクトを操作するには、Instrumentウィンドウまたは計器の構造を示すツリーからマウスで選択してください。例えば、計器の針を選択すると下図のようになります。

次に、スケールの範囲を設定します。ツリーからScale1を選択し、プロパティグリッドのMaximumプロパティを50に設定してください。

次に、スケールに新しい色を設定します。Colorizerプロパティを選択し、色エディタを開きます。下図のような色エディタが表示されます。

このエディタで、スケールに色や境界範囲を指定できます。新しい色範囲を追加したり、既存の範囲を削除することができます。色範囲を指定するには、マウスで境界ポインタを移動します。色を指定するには、ウィンドウ右側の「色の編集」ボタンを使用してください。範囲を2つ追加し、それぞれに色を指定します。「OK」ボタンを押して変更の確認を行ってください。

「OK」ボタンをクリックしてInstrumentデザイナを閉じます。作成した計器がWidgetsコンポーネントに表示されます。

計器の準備ができました。では、カレントの DataColumnフィールドの値を表示するよう計器をデータソースにバインドします。GenerateScriptプロパティに次の式を指定してください。

(widget1.Instrument.GetByName("Slider1") as PerpetuumSoft.Instrumentation.Model.Slider).Value = (double)dataBand1["DataColumn"];

この式は「Slider」オブジェクトの値をデータソースのカレントのDataColumnにバインドします。

テンプレートを保存し、デザイナを閉じます。フォームにレポートを表示するReportViewerコントロールを配置し、SourceプロパティにデータソースとしてwidgetReportSlotを設定します。テンプレートでレポートを生成するために、フォームのLoadイベントに次のコードを追加してください。

widgetReportSlot.Prepare();

アプリケーションを起動します。

このサンプルは「GettingStartedWidget」フォルダにあります。


ChartControlコンポーネントの使用

「ChartControl」はレポートに色々なチャート型を作成するよう設計されています。完全装備のデザイナを使用してチャートの外観をカスタマイズできます。作成したチャートをファイルに保存して、後で使用できます。

「ChartControl」コンポーネントはChart ModelKitで作成したチャートを表示するためにあります。Chart ModelKitの特徴に関する詳細は、Chart ModelKitのユーザーガイドを参照してください。

Report Sharp Shooterでの「ChartControl」コンポーネントの使用例について説明します。

レポートのシンプルなデータソースを作成してください。それには、フォームにSystem.Data.DataSetオブジェクトを追加し、そこに「NameColumn」という文字列フィールドとdouble型の「DataColumn」フィールドがある「SimpleTable」というテーブルを作成します。

Loadイベントを追加してテーブルにデータを取り込んでください。

private void Form1_Load(object sender, System.EventArgs e)

{

simpleTable.Rows.Add(new object[] {"Data1", 20.0});

simpleTable.Rows.Add(new object[] {"Data2", 15.0});

simpleTable.Rows.Add(new object[] {"Data3", 35.0});

simpleTable.Rows.Add(new object[] {"Data4", 45.0});

}

では、レポートのテンプレートを作成します。それには、フォームにReportManagerオブジェクトを追加してダブルクリックするとレポートマネージャエディタが表示されます。このウィンドウでデータソースの設定やレポートのコレクションを編集できます。

ReportManagerのデータソース（DataSourcesプロパティ）のコレクションに「SimpleTable」テーブルを追加してください。

ReportManagerのReportsプロパティのコレクションにInlineReportSlotオブジェクトを追加してください。このオブジェクトを変更後にテンプレートデザイナがテンプレートのデザイナを立ち上げます。

テンプレートに「DataBand」コンポーネントを配置してください。このDataSourceプロパティの値を「SimpleTable」に設定します。「DataBand」に「Detail」を追加します。

「Detail」セクションにテキストボックスを2つ配置し、そのValueプロパティにデータソースフィールドの「nameColumn」と「dataColumn」をバインドします。レポートにはテーブルの文字列が連続で表示されます。

「dataBand」セクションに「Footer」コンポーネントを配置し、そこにチャートコントロールを追加します。

chartControlのDataSourcesプロパティに「SimpleTable」を指定します。ダブルクリックしてデザイナを立ち上げ、Chart ModelKitウィザードから「ColoredCylinder」を選択し、OKボタンをクリックします。

チャートを編集します。チャートの Title、Value Labels、AxisYのScaleLabelsを削除し、AxisYのTicks2のStepプロパティを10に設定します。

系列ポイントの引数が数値以外の値を取得するようにSeries1のScaleTypeプロパティの値を「Qualitative」に設定します。X軸のIsDiscreteプロパティをTrueに設定して軸のScaleLabelsに離散的な値を表示するようにします。

次に、チャートのデータソースを指定します。系列のDataSourceプロパティのエディタを開き、「データソース」を設定し、系列ポイントの引数（Argumentプロパティ）を「nameColumn」フィールドに、系列値（Valueプロパティ）を「dataColumn」フィールドにバインドします。

OKボタンをクリックして「データソース」エディタを閉じ、チャートデザイナも閉じます。

テンプレートを保存し、テンプレートデザイナを閉じます。フォームに「ChartViewer」コントロールを配置し、データソースとして「chartControlReportSlot」を設定し、アプリケーションを実行します。


レポートビューアの操作

レポートビューアは最終ドキュメントを表示するために使用します。これを使用して、レポートの確認、印刷、保存、利用可能な形式へのエクスポートなどが行えます。

【レポートビューア】

レポートを表示するには、ツールバーにある下記のボタンを使用するか、[ナビゲーション]メニューから選択できます。

（次のページボタン）または[ナビゲーション]メニューから[次のページ]を選択して次のページに進みます。

（前のページボタン）または[ナビゲーション]メニューから[前のページ]を選択して前のページに進みます。

（先頭のページボタン）または[ナビゲーション]メニューから[先頭のページ]を選択して先頭のページに進みます。

（最後のページボタン）または[ナビゲーション]メニューから[最後のページ]を選択して最後のページに進みます。

さらに、Page UpキーやPage Downキーを使用して希望するレポートのページを表示したり、カーソルキーを使用してレポートをスクロールすることができます。そのページの先頭/最後に移動するにはHome / Endキーを使用し、レポートの先頭/最後に移動するにはCtrl+Home / Ctrl+Endキーを使用することができます。

レポートビューアはプレビュー中にナビゲーションの履歴を保存します。 ボタンと [image] ボタンを使用して保存された履歴間を移動するか、[ナビゲーション]メニューから[後方][前方]を選択して移動してください。

レポートの特定ページを表示するには、[ナビゲーション]メニューから[ページに移動]を使用することができます。

レポートにコンテンツ（目次）がある場合、フォームの左側に表示されます。リンクをクリックした場合、レポートの該当箇所に移動します。ツールバーの [image] ボタンを使用して、これらのリンクの表示を有効/無効にできます。

レポートビューアはレポート内のテキストを検索できます。この機能は[ドキュメント]メニューから[検索]を選択するか、ツールバーの [image] ボタンまたはショートカットのCtrl+Fキーで検索できます。

次の機能もプレビューの[ドキュメント]メニューに用意されています。

  • [更新]またはCtrl+Rキーでレポートを更新できます。ツールバーの [image] ボタンでも更新できます。
  • [レポートの編集]またはCtrl+Dキーでレポートデザイナを開き、最終ドキュメントを編集できます。ツールバーの [image] ボタンを使用してレポートデザイナを開いて編集することもできます。

[表示]メニュー機能およびこのメニューに対応するツールバーボタンについて説明します。

[表示]メニューにある次のグループ項目はマウスをどのように使用するかを指定できます。

  • [パン] 、F2キー、またはツールバーの [image] ボタン - ドキュメント上で左クリックしたままドラッグすることにより、希望するドキュメントを表示することができます。
  • [ズームイン]、 F3キー 、またはツールバーの [image] ボタン - ドキュメント上で左クリックするとドキュメントがズームインされます。
  • [ズームアウト]、 F4キー、 またはツールバーの [image] ボタン - ドキュメント上で左クリックするとドキュメントがズームアウトされます。
  • [ダイナミックズーム] 、F6キー、またはツールバーの [image] ボタン - マウスを左クリックしたまま上下にドラッグさせると、ドキュメントがズームインまたはズームアウトされます。
  • [矩形に合わせてズーム] 、F5キー、 またはツールバーの [image] ボタン - 選択された矩形領域をズームインすることができます。左クリックしたまま希望する方向にマウスポインタをドラッグして領域を選択できます。

[表示]メニューの次の項目を使用してズームを自動的に調節できます。

  • [ページ全体] またはツールバーの [image] ボタン - ページ全体をレポートビューアウィンドウに収まるようにズームされます。
  • [ページの幅] またはツールバーの [image] ボタン - ページの幅に合わせて収められます。
  • [実サイズ] またはツールバーの [image] ボタン - 100%にズームされます。

[表示]メニューの[カスタムズーム]またはCtrl+Zキーを選択して、10%から10000%までの値でズームを指定できます。

[ファイル]メニューには次の項目が用意されています。

  • [開く] 、Ctrl+Oキー 、またはツールバーの [image] ボタン - 保存されているドキュメントを開きます。
  • [保存] 、Ctrl+Sキー 、またはツールバーの [image] ボタン - レポートを保存します。
  • [エクスポート] 、Ctrl+Eキー 、またはツールバーの [image] ボタン - ドキュメントを利用可能な形式の1つにエクスポートします。
  • [印刷] 、Ctrl+Pキー 、またはツールバーの [image] ボタン - ドキュメントを印刷します。
  • [ビューアの終了] - レポートビューアを終了します。

さらにツールバーには利用可能なボタンが2つあります。 - 単一ページモードで表示されます。 - 連続ページモードで表示されます。


レポートマネージャではじめよう

レポートを作成するには、フォームにPerpetuumSoft.Reporting.Components.ReportManagerコンポーネントを配置します。レポートのソースはこのコンポーネントに格納されます。すべてのレポートは ReportSlot（非ビジュアルな）コンポーネントに格納されます。このコンポーネントはレポートのテンプレートを保持しています。レポートのテンプレートには「レポートデザイナ」を起動するメソッドや、レポートの編集メソッド、最終ドキュメントを生成するメソッドがあります。この最終ドキュメントはテンプレートによりプレビューや印刷することができます。


レポート生成のしくみ

ReportGeneratorコンポーネントを使用してレポートのテンプレートをデータにバインドしていましたが、ReportManagerコンポーネントとReportSlotコンポーネントという新しい方法に代わりました。ReportManagerはReportSlotsで作成されたレポートのテンプレートにデータをバインドします。レポートのテンプレートをファイル、アプリケーションコード、またはその他のソースに保存できます。

例えば、パッケージにはユーザが指定したURLアドレスからレポートのテンプレートを取得するUrlReportSlotが含まれています。アプリケーションに応じたやり方でレポートのテンプレートを（例えばデータソースに）保存するために、ReportSlotから派生されたカスタムクラスを実装することもできます。

ReportManagerコンポーネントはレポートのテンプレートの位置に関係なく、同じデータソースを使用するレポートを処理できます。また、レポートとマスターレポート、レポートとサブレポートといった関連性のあるテンプレートもバインドできます。

ReportManagerのデータはDataSourcesプロパティに指定します。DataSourcesプロパティはデータソースのコレクションです。オブジェクトソースとそのソース名がすべてのデータソースに指定されます。オブジェクトソースは任意のオブジェクト（ADO.NETオブジェクト、ビジネスオブジェクト）です。また、ReportManagerはResolveDataSourceイベントを使用してデータを呼び出すこともできます。

テンプレートをReportManagerのReportsプロパティに指定します。レポートはIReportSourceインターフェースを実装するオブジェクトのコレクションです。

IReportSourceは、レポートのテンプレートに応じてレポート生成を行うためのインターフェースです。

Documentプロパティはレポートのテンプレートを提供します。

RenderDocument()メソッドは生成されたレポートを返します。

Prepare()メソッドはレポートを生成します。

RenderCompletedメソッドはレポートが生成されたことを通知します。

IReportSourceインターフェースはデフォルトで ReportSlot 型に対して実装されます。ReportSlotはすべてのスロット型の基本クラスです。

ReportSlotの基本プロパティは下記の通りです。

プロパティ名 | 説明
Managerプロパティ | ReportSlotコンポーネントに含まれているReportManagerのオブジェクトです
StyleSheetプロパティ | レポートの生成に使用するスタイルです。nullに設定した場合、ドキュメントに保存されたスタイルが使用されます。
ReportNameプロパティ | ReportManagerで実装されるI ResolveSubReportインターフェースから呼び出せるレポートのテンプレート名です
SupportSaveプロパティ | レポートのテンプレートを保存できるかどうかを定義します

ReportSlotの基本メソッドは下記の通りです。

メソッド名 説明
SaveReport(


デザイン時および実行時のレポートの編集

開発環境からレポートデザイナを立ち上げるか、実行中のアプリケーションからレポートデザイナを開いてレポートのテンプレートをデザインすることができます。IDE でレポートデザイナを呼び出すには、ReportManagerのReportsプロパティを選択してください。必要なソースを追加し、Documentプロパティのエディタを開いてください。一部のデータソース（例：実行時に追加したデータソース）は使用できません。原則として、利用可能なソースは空です（データをソースに読み込めません）。最終ドキュメントをプレビューできないのはそのためです（最終ドキュメントがどのように表示されるかを確認してみてください）。従って、すべてのデータソースが利用できてデータがデータソースにアップロードされた時に、起動したアプリケーションでレポートのテンプレートをデザインすることをお薦めします。

それには、レポートデザイナを呼び出すボタンを1つアプリケーションに一時的に追加し、必要なレポートのテンプレートをすべて用意し、ディスクに保存してからボタンを削除することができます。レポートデザイナを呼び出すには次のコードが必要です。

reportSlot.DesignTemplate();


Webアプリケーションでレポートを使用する

WebFormsアプリケーションでReport Sharp Shooterを使用する場合、レポートは常にサーバ側で生成され、クライアントに送られます。この場合、htmlやpdfなどのさまざまな形式でレポートをクライアントに送ることができます。レポート全体を一度に送ったり、必要なページだけを送ることもできます。ウェブアプリケーションでのさまざまなReport Sharp Shooterの使用例を紹介していきます。


SharpShooterWebViewerコンポーネントを使用する

Report Sharp ShooterにはASP.NETアプリケーションからレポートを表示するためのSharpShooterWebViewer（PerpetuumSoft.Reporting.Web.SharpShooterWebViewer）という特別なWeb用コンポーネントがあります。

【Visual Studio .NETツールボックスのWebフォーム用コンポーネント】

サンプルプログラム「WebDemo（VBではVBWebDemo）」はSharpShooterWebViewerの使用例です。

このSharpShooterWebViewerコンポーネントにはPerpetuumSoft.Reporting.Web.ViewMode列挙体から下記の値を取得できる、ViewMode（レポートの表示モード）をカスタマイズするためのプロパティがあります。

  • HtmlSinglePage - 1ページを表示
  • HtmlWholeReport - レポート全体を表示
  • WindowsForms - PerpetuumSoft.Reporting.View.ReportViewerのレポートを表示（Windows Formsアプリケーションでレポートを表示するためのコンポーネント）

SharpShooterWebViewerドキュメントのソースはReportSlotが継承されるReportBase型のSourceプロパティに指定します。また、SharpShooterWebViewerはレポート全体をpdf形式で表示することもできます。

SharpShooterWebViewerは表示されたドキュメントをすべてキャッシュし、レポートがキャッシュに保存される時間はCacheTimeOutプロパティに指定します。Pageカテゴリからのプロパティを使用して、レポートのページを切り替える行の表示をカスタマイズすることができます。例えば、NextTextは次のページにリンクするためのテキストを定義し、PagerPositionはレポートのページを切り替える行の表示位置を定義します。ImageFormatプロパティはレポートから送られるイメージ形式を定義します。


WebViewerコンポーネントを使わずにブラウザにレポートを表示する

ウェブ用サンプルの「WebPublish」はSharpShooterWebViewerを使用せずにウェブページにレポートを表示する方法を示しています。

MainPageはレポートタイトルとレポート形式を選択するために使用します。「表示」ボタンをクリックすると、ClickイベントハンドラがReportPageのページへ転送します。

Response.Redirect("ReportPage.aspx?format="+DropDownList1.SelectedItem.Value.ToString()+"&title="+TextBox1.Text)

ReportPageのLoadイベントハンドラがレポートを指定した形式にエクスポートし、クライアントに送ります。

【実行例】


Httpハンドラを使用する

SharpShooterWebViewerを使用せずにレポートを表示する方法のもう1つに、独自のHTTPリクエストハンドラを作成し、それを特殊な拡張子（例：*.rst）として構成できる、System.Web.IHttpHandlerインターフェースを実装することがあげられます。このハンドラはリクエストで指定されたテンプレートで生成されたドキュメントを返します。HttpHandlerの例でIHttpHandlerインターフェースが使用されます。リクエスト処理はReportHttpHandlerクラスのProcessRequestメソッドで実装されます。リクエストハンドラはレポートを要求された形式にエクスポートし、応答するストリームに配置します。このようなハンドラを使用するには、下記のような情報をWeb.configに挿入してください。

<configuration>

  <system.web>

  <httpHandlers>

    <add verb="*" path="*.rst" type="HttpHandler.ReportHttpHandler,HttpHandler"/>

  </httpHandlers>

  </system.web>

</configuration>

verb属性はこのハンドラを呼び出すためのHTTP命令のリストを定義し、path属性はこのハンドラを呼び出すURLまたはURLマスクを定義し、type属性はそれを含めるハンドラクラスとアセンブリを定義します。

この場合、Webサーバ設定の「Home directory」タブ上の「Settings」ボタンをクリックし、 .rst拡張子を「Assignment」タブの{disk}:\{Microsoft.NET Framework path}\aspnet_isapi.dll.に割り当ててください。


アプリケーションでレポートビューアコンポーネントを使用する

レポートビューアは外観をカスタマイズできるプロパティを持つコンポーネントです。これらのプロパティはツールバーの特定のボタンや列グループだけでなく、ステータスバー、ツールバーの表示を有効/無効にできます。これらのプロパティ一覧が下記にあります。

プロパティ | 説明
ShowContentプロパティ | 「コンテンツの表示」ボタンを表示/非表示にします
ShowDesignerプロパティ | 「編集」ボタンを表示/非表示にします
ShowExportプロパティ | 「エクスポート」ボタンを表示/非表示にします
ShowFindプロパティ | 「検索」ボタンを表示/非表示にします
ShowNavigatorプロパティ | 「後方」「前方」ボタンを表示/非表示にします
ShowOpenプロパティ | 「開く」ボタンを表示/非表示にします
ShowPageNavigatorプロパティ | 「先頭ページに移動」「次のページに移動」「最後のページに移動」ボタンを表示/非表示にします
ShowPrintプロパティ | 「印刷」ボタンを表示/非表示にします
ShowRefreshプロパティ | 「更新」ボタンを表示/非表示にします
ShowSaveプロパティ | 「保存」ボタンを表示/非表示にします
ShowScaleプロパティ | 「パン」、「ダイナミックズーム」、「ズームイン」、「ズームアウト」、「矩形に合わせてズーム」、「ページ全体」、「ページの幅」、「実サイズ」ボタンを表示/非表示にします
ShowStatusBarプロパティ | ステータスバーを表示/非表示にします
ShowStatusBarGripプロパティ | ステータスバーのグリップを表示/非表示にします
ShowToolBarプロパティ | ツールバーを表示/非表示にします

レポートビューアにはすべての命令にアクセスしたり、再定義することができるActionsプロパティがあります。下記にコマンドの一覧があります。

コマンド | 説明
Print | 「印刷」ボタンがクリックされた場合に呼び出されます
Load | 「開く」ボタンがクリックされた場合に呼び出されます
Save | 「保存」ボタンがクリックされた場合に呼び出されます
Export | 「エクスポート」ボタンがクリックされた場合に呼び出されます
Pan | 「パン」ボタンがクリックされた場合に呼び出されます
DynamicZoom | 「ダイナミックズーム」ボタンがクリックされた場合に呼び出されます
ZoomIn | 「ズームイン」ボタンがクリックされた場合に呼び出されます
ZoomOut | 「ズームアウト」ボタンがクリックされた場合に呼び出されます
ZoomRectangle | 「矩形に合わせてズーム」ボタンがクリックされた場合に呼び出されます
Content | 「コンテンツの表示」ボタンがクリックされた場合に呼び出されます
WholePage | 「ページ全体」ボタンがクリックされた場合に呼び出されます
PageWidth | 「ページの幅」ボタンがクリックされた場合に呼び出されます
ActualSize | 「実サイズ」ボタンがクリックされた場合に呼び出されます
Zoom25 | 25%にズームします
Zoom50 | 50%にズームします
Zoom75 | 75%にズームします
Zoom100 | 100%にズームします
Zoom125 | 125%にズームします
Zoom150 | 150%にズームします
Zoom200 | 200%にズームします
Zoom300 | 300%にズームします
Zoom500 | 500%にズームします
Forward | 「前方に移動」ボタンがクリックされた場合に呼び出されます
Backwards | 「後方に移動」ボタンがクリックされた場合に呼び出されます
CustomZoom | Ctrl+Zキーが押された場合、またはズーム領域のステータスバーでコンテキストメニューの「カスタムズーム」がクリックされた場合に呼び出されます
FirstPage | 「先頭のページ」ボタンがクリックされた場合に呼び出されます
PrevPage | 「前のページ」ボタンがクリックされた場合に呼び出されます
NextPage | 「次のページ」ボタンがクリックされた場合に呼び出されます
LastPage | 「最後のページ」ボタンがクリックされた場合に呼び出されます
GotoPage | 現在ページや全ページ数に関する情報が表示されるステータスバーをクリックした場合に呼び出されます
EditReport | 「編集」ボタンがクリックされた場合に呼び出されます
RefreshReport | 「更新」ボタンがクリックされた場合に呼び出されます
SinglePage | 「単一ページ」ボタンがクリックされた場合に呼び出されます
ContinuedPage | 「連続ページ」ボタンがクリックされた場合に呼び出されます

デフォルトのアクションを再定義するには、Executingイベントハンドラを記述してください。イベントハンドラに送られたExecutingEventArgsオブジェクトのHandledプロパティをTrueに設定した場合、Executeイベントで定義される標準アクションは呼び出されないことに注意してください。

例： Exportアクションを再定義し、ハンドラを記述する場合

reportViewer1.Actions["Export"].Executing += new Action.ExecutingEventHandler(Export);

private void Export(object sender, ExecutingEventArgs e)

{

  // Do something

  e.Handled = true;

}


レポートビューアコンポーネントをカスタマイズする

レポートビューアコンポーネントの標準のインターフェースを変更する場合があります。例えば、アプリケーションのスタイルに合わない場合や、ツールバーを変更する必要がある場合に変更しなければならないかもしれません。

この例は「CustomDesignerViewer」フォルダにあります。

例として、ツールバーなしでレポートビューアを作成し（これを行うには、レポートビューアのShowToolBarプロパティをfalseに設定してください）、前のページ、次のページ、印刷ボタンの3つのボタンをフォームに配置します。これを行うには、ReportGeneratorコンポーネントのActionsのコレクションを使用します。ActionBind型のメソッドによりコンポーネントとActionの関連が設定されます。3つのボタンを特定のアクションにバインドするには、ActionBindから派生したクラスを実装する必要があります。

下記に例があります。

public class ButtonActionBind : ActionBind
{
    public ButtonActionBind(Button button)
    {
      SetComponent(button);
    }
    public Button Button
    {
      get
      {
        return this.Component as Button;
      }
    }
    protected override void Bind()
    {
      Button.Click += new EventHandler(Button_Click);
    }
    protected override void Unbind()
    {
      Button.Click -= new EventHandler(Button_Click);
    }
    public override void Update()
    {
      if (Action != null)
      {
        Button b = Button;
        b.Enabled = Action.Enabled;
        b.Text = Action.Text;
        b.Visible = Action.Visible;
      }
    }
    private void Button_Click(object sender, EventArgs e)
    {
      if (Action != null)
        Action.ExecuteAction();
    }
  }

                では、レポートビューアのボタンをActionsにバインドします。

PerpetuumSoft.Reporting.Windows.Forms.Action action = reportViewer1.Actions["PrevPage"];

  ButtonActionBind bind = new ButtonActionBind(prevPageButton);

  action.Bind(bind);

  action = reportViewer1.Actions["NextPage"];

  bind = new ButtonActionBind(nextPageButton);

  action.Bind(bind);

  action = reportViewer1.Actions["Print"];

  bind = new ButtonActionBind(printButton);

  action.Bind(bind);

このように、ボタンをレポートビューアの指定したアクションにバインドしました。ReportViewerで生成されたレポートのソースをReportBase型のSourceプロパティに指定します。ReportViewerが置かれているフォームデザイナが、ReportBase型のパラメータを取得してSourceプロパティに割り当てます。

【デザイン例（カスタムビューアのフォーム）】

【実行例（カスタムビューア）】


アプリケーションでレポートデザイナコンポーネントを使用する

アプリケーションからレポートデザイナを開くには、ReportSlotコンポーネントのDesignTemplate()メソッドを呼び出してください。


レポートデザイナコンポーネントをカスタマイズする

標準のレポートデザイナのインターフェースに満足していない場合、ツールバー、ステータスバー、エラーリストなどのエレメントすべてが個別のコンポーネントとして用意されているので、容易に独自のインターフェースを開発することができます。これらのコンポーネントの一覧は次の通りです。

コンポーネント | 説明
DesignerDataSourceTree | データソースを表示するコンポーネントです。標準のレポートデザイナでは、ツールウィンドウの「データソース」タブにあります。
DesignerDocumentTree | ドキュメント構成を表示するコンポーネントです。標準のレポートデザイナでは、ツールウィンドウの「ドキュメントツリー」タブにあります。
DesignerErrorList | スクリプト内でエラーリストを表示するコンポーネントです。標準のレポートデザイナでは、[スクリプトのチェック]関数が呼び出される場合、またはレポートの生成時にレポートにエラーが生じた場合にフォーム下部に表示されます。
DesignerPropertyGrid | 選択したオブジェクトのプロパティ一覧を表示するコンポーネントです。標準のレポートデザイナでは、ツールウィンドウのプロパティタブにあります。
DesignerStatusBar | レポートデザイナのステータスバーです
DesignerToolBar | レポートデザイナのツールバーです
DesignerToolBox | ツールボックスコンポーネントです。標準のレポートデザイナでは、フォームの左側のドックに入れられます。
ReportDesigner | ドキュメントのテンプレートを編集する主要コンポーネントです。その他のコンポーネントはすべてレポートデザイナによって共にリンクされます。これを行うには、対応するレポートデザイナコンポーネントを示すようにDesignerプロパティを設定してください。

レポートデザイナのカスタム例が「CustomDesignerViewer」フォルダにあります。

【デザイン例（カスタムデザイナのフォーム）】

【実行例（カスタムデザイナ）】

カスタムなレポートデザイナを開くには、メインフォームに「カスタムデザイナ」というボタンがあります。このボタンをクリックすると、button1_Clickイベントハンドラが実行されます。最初の行はレポートデザイナのフォームを作成します。

CustomDesignerForm f = new CustomDesignerForm();

レポートデザイナ型のDesignerプロパティはフォーム内で宣言されます。レポートや編集したレポートのテンプレートのデータソースを指定するには、このプロパティを使用し （下記コードの1～3行）、画面にフォームを表示（下記コードの4行目）します。

f.Designer.DataSourceManager = reportManager1.DataSources;

f.Designer.SubReportResolver = reportManager1;

f.Designer.Document = reportSlot1.LoadTemplate();

f.ShowDialog();

最終ドキュメントがカスタムなレポートビューアに表示されるようにレポートのプレビュー [image] ボタンのクリック処理も再定義していきます。これを行うには、レポートデザイナコンポーネントのActionsプロパティを使用します。Actionsプロパティはアクションのコレクションです。必要なアクションは、プレビューです。アクションを呼び出す場合、まずExecutingイベントが呼び出され、次にExecuteイベントが呼び出されます。Executingイベントハンドラが処理されない場合、Executeイベントは呼び出されません。Executeイベントが呼び出されると、このイベントの標準ハンドラが呼び出されます。したがって、レポートビューアを開き、イベントが処理されたことを示すフラグを設定する、独自のExecutingイベントハンドラを記述してください。

private void Preview(object sender, ExecutingEventArgs e)

{

  if (reportDesigner1.Document != null)

  {

ReportManager manager = new ReportManager();
InlineReportSlot slot = new InlineReportSlot();
manager.Reports.Add(slot);
manager.DataSources = this.DataSources;
slot.SaveReport(this.Document);
manager.OwnerForm = ParentForm;
manager.ResolveSubReport += new ResolveSubReportEventHandler(manager_ResolveSubReport);
slot.RenderCompleted += new EventHandler(slot_RenderCompleted);
slot.HyperlinkClick += new HyperlinkEventHandler(slot_HyperlinkClick);
slot.GetReportParameter += new GetReportParameterEventHandler(slot_GetReportParameter);
slot.Prepare();
    e.Handled = true;

  }

}

private void slot_RenderCompleted(object sender, EventArgs e)
{
ReportSlot slot = sender as ReportSlot;
  using(ViewerForm f = new ViewerForm(slot))

  {

    f.WindowState = FormWindowState.Maximized;

    f.ShowDialog(this);

  }

}

この手続きをPreviewアクションのExecutingイベントハンドラとして設定します。

reportDesigner1.Actions["Preview"].Executing +=

new Action.ExecutingEventHandler(Preview);


オブジェクトモデル

テンプレートや最終ドキュメントの作成に使用されるクラスの階層構造について説明します。

Report Sharp Shooterの全クラスの基本クラスはPerpetuumSoft.Basic.Atomです。これはSystem.Objectクラスから継承され、System.IClonableインターフェースを実装します。AtomクラスはReportComponentの親クラスで、すべてのReport Sharp Shooterコンポーネントの基本クラスです。ReportComponentと後述のすべてのクラスやインターフェースはPerpetuumSoft.Reporting.DOM名前空間にあります。このクラスには、オブジェクト名を定義するNameプロパティがあります。DocumentクラスとReportControlクラスはReportComponentから継承されています。Documentクラスを使用してレポートのテンプレートや最終ドキュメントを表示し、Pagesと呼ばれるドキュメントページのコレクションを格納します。ReportControlクラスはテンプレートまたは最終ドキュメントの全オブジェクトの基本クラスです。ContainerControlクラスとVisualControlクラスはReportControlから継承されています。ContainerControlクラスはすべての非ビジュアルレポートオブジェクトの基本クラスで、ReportControlクラスから継承されたオブジェクトを格納することができます。VisualControlクラスはレポート内のすべてのビジュアルオブジェクトの基本クラスです。

ContainerControlクラスについて説明します。このクラスはControlsプロパティ（このメソッドとIsValidChildメソッドの両方に埋め込まれたオブジェクトのコレクション）を含むIContainerControlインターフェースを実装します。IsValidChildメソッドはReportControl型のパラメータを取得し、送られたオブジェクトをこの中に埋め込むことができる場合にtrueを返します。ContainerControlクラスから継承されたクラスの階層が下記にあります。

PageおよびSectionオブジェクトはContainerControlから直接継承されています。Pageオブジェクトはテンプレートや最終ドキュメントのページを表します。Sectionオブジェクトはすべてのセクションの基本オブジェクトで、CrossBandとBandBaseセクションはSectionオブジェクトから継承されています。CrossBandセクションはレポートを左から右に表示することができます。PageBandとRegularBandセクションはBandBaseから継承されています。PageBandセクションは各ページに表示するPageHeader、PageFooter、PageOverlayセクションの基本セクションです。RegularBandクラスはその他の全セクションの基本クラスです。この中に集計コレクション（Aggregatesプロパティ）が格納されており、DataBand型のMasterBandプロパティがあります。したがって、RegularBandクラスから継承されているこれらのオブジェクトをDataBandセクションに配置することができます（DataBand自体も含む）。入れ子レベルの階層表示型のリンクを持つレポートを作成することができます。

DetailBaseクラスはRegularBandクラスから継承されています。このクラスはすべてのセクションの基本クラスで、ビジュアルコントロール要素を入れることができ、最終ドキュメントにセクション内容を表示するRenderメソッドがあります。HeaderやFooterはDetailBaseから直接継承されています。これらはDataBandセクションのヘッダーとフッターです。各データレコードとGroupBandを表示するDetailセクションもRegularBandから継承されています。GroupBandはGroupHeaderとGroupFooterの基本クラスで、GroupHeaderとGroupFooter内のどのビジュアルコントロール要素を最終ドキュメントに表示するかを定義するGroupプロパティがあります。

では、VisualControlクラスから継承されたオブジェクトについて説明します。

ShapeとBoxクラスはVisualControlクラスから継承されています。Shapeクラスはレポートにさまざまな形状を表示することができます。Boxクラスは矩形領域に配置されるコントロール要素の基本クラスで、領域の枠を指定するBorderプロパティとその領域の塗りつぶしを指定するFillプロパティ、マージンを定義するMarginsプロパティがあります。Boxクラスから継承されているクラスは次の通りです。

BarCode - バーコードを表示するためのコントロール要素

Picture - イメージを表示するためのコントロール要素

RichText - RTF形式でテキストを表示するためのコントロール要素

WinFormsControl - Windows Formsコントロール要素を表示するためのコントロール要素

ZipCode - 郵便番号を表示するためのコントロール要素

TextControlクラス

TextControlクラスはレポートにテキスト情報を表示するための基本クラスです。Angleプロパティはテキストの角度を定義します。CanGrowプロパティとCanShrinkプロパティは表示されるテキストに合わせてオブジェクトの高さを自動変更します。Fontプロパティはフォントを定義します。TextAlignプロパティはテキストの整列を定義します。TextFillプロパティはテキストの塗りつぶしを定義します。TextFormatプロパティはテキストの形式を定義します。TextBoxメソッドとFindTextメソッドはTextControlから継承されています。TextBoxメソッドにはテキストのスタティック値を定義するTextプロパティと、レポートの生成時に計算される式を定義するValueプロパティがあります。FindTextメソッドを使用してテキスト情報の検索を行います。


レポートの生成過程を制御する

Report Sharp Shooterは必要に応じてユーザが標準のレポートの生成過程を変更することができます。これを行うには、PageオブジェクトのManualBuildScriptプロパティにコードを記述してください。

カスタムなレポート生成のサンプルが「ManualBuildExample」フォルダにあります。

このサンプルには2つのレポートがあります。最初のレポートは乗算テーブルを表示し、もう一方はReport Sharp Shooterがインストールされているフォルダのツリーを表示します。

まず、簡単な乗算テーブルの例から説明します。レポートのテンプレートにDetailが1つあり、その中にTextBoxが3つあります。この3つのTextBoxオブジェクトのValueプロパティはそれぞれa、b、cに設定されています。a、b、 cはDocumentオブジェクトのCommonScriptプロパティで宣言されている、int型の変数です。そのページのManualBuildScriptプロパティに次のコードが挿入されています。

for (a = 1; a < 10; a++)
  for (b = 1; b < 10; b++)
  {
    c = a*b;
    detail1.Render();
  }

したがって、aとbの変数に1から10までの利用可能なすべての値を割り当てるループを使用して値cを計算し、detail1.Render()の行がレポートにDetailセクションを表示します。このセクションのTextBoxオブジェクトに表示される変数a、b、c に新しい値を割り当てました。

【デザイン例】

【実行例】

では、フォルダのツリーを表示する例について説明します。テンプレートに、detail1セクションが1つあり、その中にはtextBox1オブジェクトがあります。このTextBoxオブジェクトはカレントのフォルダまたはファイルを表示するために使用されます。DocumentオブジェクトのCommonScriptプロパティには次のコードが設定されています。

private string fileName;
private float x = 0;
private void walkTree(DirectoryInfo dirInfo, int c)
{
  x = (float)c * 0.5f;
  fileName = "[" + dirInfo.Name + "]";
  detail1.Render();
  DirectoryInfo[] di = dirInfo.GetDirectories();
  foreach(DirectoryInfo d in di)walkTree(d,c+1);
  FileInfo[] fi = dirInfo.GetFiles();
  x = (float)(c+1) * 0.5f;
  foreach(FileInfo f in fi)
  {
    fileName = f.Name;
    detail1.Render();
  }
}
private void buildTree()
{
  string path = (string)Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\\PerpetuumSoft\\Report Sharp Shooter").GetValue("Reports");
  path = path.Substring(0,path.LastIndexOf("Examples\\Reports"));
  DirectoryInfo dirInfo = new DirectoryInfo(path);
  walkTree(dirInfo,0);
}

fileNameとｘの2つの変数がスクリプトで宣言されています。変数「fileName」がtextBox1オブジェクトのValueプロパティに設定されており、変数「ｘ」はtextBox1オブジェクトのLocationプロパティとSizeプロパティの新しい値を計算するために使用されています。buildTree()メソッドはReport Sharp Shooterがインストールされるディレクトリを探したり、3つのフォルダを再帰的に検索してディレクトリ名やファイル名を表示するwalkTree()メソッドを呼び出すために使用します。レポートの生成時に3つのフォルダを表示するには、PageオブジェクトにManualBuildScriptプロパティを追加し、buildTree()メソッドの呼び出しを追加します。


動的にレポートのテンプレートを作成する

ウィザードを使用して動的（ダイナミック）にレポートのテンプレートを作成したり、 ウィザードを使わずに動的にテンプレートを作成することができます。

動的にテンプレートを作成しているサンプルが「Dynamic」フォルダにあります。

メインフォームには「ウィザード」と「ダイナミック」というボタンが2つあります。「ウィザード」ボタンはウィザードを使用してテンプレートを作成し、「ダイナミック」ボタンは独自にレポートを作成します。

まず、「ウィザード」を使用した例から見ていきます。テンプレートを作成するためにPerpetuumSoft.Reporting.Wizards名前空間のクラスが使用されています。テンプレートの作成における主なクラスはStandartWizardに基づいています。StandartWizardクラスにはレポートに段組みを設定するためのプロパティ、ページパラメータや計測単位やスクリプトの記述に使用する言語を設定するプロパティ、データセクションを作成するためのプロパティなどがあります。詳細は、Report Sharp Shooterのクラスレファレンスを参照してください。レポートの全情報の準備ができると、レポートを作成するためにStandartWizard.BuildTemplate()関数が呼び出されます。

レポートのデータセクションはDataSectionsコレクションに格納されます。DataWizardInfoクラスはセクションを表示するために使用します。このクラスのプロパティはデータソース、セクションに表示するフィールド、セクションに組み合わせるオブジェクト、グループ、埋め込まれるセクションの指定ができます。

FieldInfoWizardクラスはフィールドを表すために使用し、GroupInfoWizardクラスはグループを表すために使用します。

【実行例（ウィザード）】

【ビュー例（ウィザード）】

もちろん、「ウィザード」を使用せずに動的なレポートを生成する方がフレキシブルです。Report Sharp Shooterのすべての機能を使用できますが、この方法は「ウィザード」を使用して作成するよりも難しくなります。

Documentクラスはテンプレートと最終ドキュメントの両方を表現するために使用されますが、レポートのテンプレートはIsTemplateプロパティをtrueに設定しなければなりません。オブジェクトのサイズや位置を定義するすべてのプロパティは内部の計測単位を使用することに注意してください。使用する計測単位を変換する必要があるのはこのためです。これを行うには、Vectorと呼ばれる構造メソッドを使用するか、Unitと呼ばれるスタティック構造メソッドを使用できます。

public Vector ConvertUnits( Unit fromUnit, Unit toUnit)
public static float Convert(float value, Unit fromUnit, Unit toUnit )


ライブレポートを作成する

Report Sharp Shooterはレポートにある任意のオブジェクトだけでなく、リンク上のクリック処理の標準メカニズムを再定義できます。

このサンプルは「LiveReportExample」フォルダにあります。

【実行例】

■「新規レポートの表示」部分をクリックすると新しいレポートが生成され、表示される。
■ひし形や楕円をクリックするとShapeオブジェクトの名前が表示される。

このサンプルには、レポートのテンプレートにTextBoxオブジェクトと2つのShapeオブジェクトがあります。”新規レポートの表示”というTextBoxオブジェクトのHyperlinkプロパティには、リンク名「新規レポート」が設定されています。このリンクのクリックを取得するには、ReportManagerコンポーネントのHyperlinkClickイベントを使用します。このリンクをクリックすると本当に希望通りに新規レポートが表示されるようにしていきます。HyperlinkClickイベントハンドラのコードが下記にあります。

(C#)
private void reportManager1_HyperlinkClick(object sender, PerpetuumSoft.Reporting.Components.HyperlinkEventArgs e)
{
if(e.Hyperlink == "New report")
{
e.Handled = true;
try
 {
reportSlot2.RenderDocument();
using(PerpetuumSoft.Reporting.View.PreviewForm previewForm = new PerpetuumSoft.Reporting.View.PreviewForm(reportSlot2))
{
previewForm.WindowState = FormWindowState.Maximized;
previewForm.ShowDialog(this);
}
}
catch (Exception exception)
{
MessageBox.Show(exception.Message, "Report Sharp-Shooter", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}

(VB)
Private Sub reportManager1_HyperlinkClick(ByVal sender As Object, ByVal e As PerpetuumSoft.Reporting.Components.HyperlinkEventArgs)
If (e.Hyperlink = "New report") Then
e.Handled = True
Try
 reportSlot2.RenderDocument()
Dim previewForm As PerpetuumSoft.Reporting.View.PreviewForm = New PerpetuumSoft.Reporting.View.PreviewForm(reportSlot2)
previewForm.WindowState = FormWindowState.Maximized
previewForm.ShowDialog(Me)
Catch exception As Exception
MessageBox.Show(exception.Message, "Report Sharp-Shooter", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End If
End Sub

HyperlinkEventArgsクラスには2つの重要なHyperlinkプロパティがあります。1つはリンクのテキストで、もう1つはイベントが処理した値を返すHandledプロパティです。

サンプルではひし形や楕円のShapeオブジェクトをクリックすると、その名前が画面に表示されます。それにはレポートビューアコンポーネントのViewObjectClickイベントが使用されています。このイベントハンドラには次のコードが記述されています。

(C#)
private void reportManager1_ViewObjectClick(object Sender, PerpetuumSoft.Reporting.View.ReportViewEventArgs e)
{
if(e.Control is PerpetuumSoft.Reporting.DOM.Shape)
{
MessageBox.Show("クリックした形状: " + (e.Control as PerpetuumSoft.Reporting.DOM.Shape).Name);
e.Handled = true;
}
}

(VB)
Private Sub reportManager1_ViewObjectClick(ByVal sender As Object, ByVal e As PerpetuumSoft.Reporting.View.ReportViewEventArgs)
If (e.Control.GetType() Is GetType(PerpetuumSoft.Reporting.DOM.Shape)) Then
MessageBox.Show("クリックした形状: " + e.Control.Name)
e.Handled = True
End If
End Sub

ReportViewEventArgsにはPerpetuumSoft.Reporting.DOM.ReportControl型の2つのControlプロパティがあります。1つはクリックされたオブジェクトで、もう1つはイベントの処理に関係なく値を返すために使用される、ブール型のHandledプロパティです。


カスタムコンポーネントを作成する

カスタムコンポーネントの使用例が「CustomReportControlDemo」フォルダにあります。

このサンプルにはBoxオブジェクトから継承されたカスタムコンポーネントがあります。

新しいコンポーネントに、色を定義するColorプロパティとCheckedプロパティの2つのプロパティが追加されました。Checkedプロパティがtrueの場合、オブジェクトが使用する領域は2本の対角線で交差されます。Stored属性はドキュメントが保存される際にこのプロパティが保存されることを表します。ReportBindable属性はこのプロパティ値を計算する式を記述することができます。

あるクラスの一部のプロパティのデフォルト値を変更する場合、対応するコードをInitNew()メソッドに記述してください。PaintContentメソッドはコンポーネントを描きます。最も重要なメソッドはRender()メソッドです。このメソッドは最終ドキュメントにコンポーネントを表示するために呼び出されます。このメソッドにオブジェクトの新しいインスタンスを作成してください。

(C#)

CheckBoxReportControl result = new CheckBoxReportControl();

(VB)

Dim result As CheckBoxReportControl = New CheckBoxReportControl

次に、メソッドを呼び出してそのプロパティに必要な値を割り当て、

Then you should assign the necessary values to its properties by calling the method

(C#)

PopulateProperties(result);

(VB)

PopulateProperties(result)

最終ドキュメント内でコンポーネントの配置位置を探し、

(C#)

RenderLocation(result);

(VB)

RenderLocation(result)

最終ドキュメントのカレントページに配置してください。

(C#)

Engine.ProductionPage.Controls.Add(result);

(VB)

Engine.ProductionPage.Controls.Add(result)

コンポーネントを登録し、レポートのテンプレートに追加するには、フォームのLoadイベントハンドラに次のコードを記述します。

(C#)

PerpetuumSoft.Reporting.DOM.ReportControl.RegisterControlType(typeof(CheckBoxReportControl));
CheckBoxReportControl customControl = new CheckBoxReportControl();
customControl.Location = new Point(300, 300);
customControl.Size = new  Size(300, 300);
Document template = reportSlot.LoadReport();
template.Pages[0].Controls.Add(customControl);
reportSlot.SaveReport(template);

(VB)

PerpetuumSoft.Reporting.DOM.ReportControl.RegisterControlType(GetType(CheckBoxReportControl))
Dim customControl As CheckBoxReportControl = New CheckBoxReportControl
customControl.Location = New PerpetuumSoft.Basics.Drawing.Vector(300, 300)
customControl.Size = New PerpetuumSoft.Basics.Drawing.Vector(300, 300)
Document template = reportSlot.LoadReport()
template.Pages[0].Controls.Add(customControl)
reportSlot.SaveReport(template)


集計計算について

Report Sharp Shooterはセクションにデータやグループなどを組み合わせることができます。どのグループを計算するかをレポートジェネレータに正確に伝えるにはいくつかの手順を行います。これには次の利点があります。

  • 集計関数の使用に関して融通が利き、さまざまな条件部にクエリーを追加して計算することができます。
  • 常に何が行われているかを把握できます。
  • 利用可能な関数を使用して、どんな式の集計でも計算できます。
  • レポートの生成プロセスを最適化します（ほとんどの場合、レポートは1つのパスで作成されます）。

更に、ほとんどの場合ウィザードが全作業を行います。

レポートジェネレータは5つの内蔵された集計関数をサポートしています。

  • Sum – 合計
  • Avg – 平均
  • Min – 最小値
  • Max – 最大値
  • Count – 個数

集計関数はセクションにバインドされます。これはレポートに表示されているレコードのみを確実に計算するためです。計算を行うには、集計フィールドを該当セクションのAggregatesプロパティのコレクションに追加し、スクリプトの書き込みに選択した言語の構文を使用して集計式と集計名を指定してください。

集計関数の呼び出しは次のようになります。

band.Sum ([int pageNumber], string aggregateName, [groupCondition1 [, groupCondition2]…])

この関数のパラメータの内容は次のようになります。

  • pageNumber - 集計を行うページ番号を定義する任意のパラメータです。このパラメータがない場合、全ドキュメントに対して合計計算が行われます。
  • aggregateName - 集計フィールドの名前です。
  • groupCondition1以降 - 計算を行うグループの条件です。グループ条件がない場合は、無効になります。

集計値の計算は最初のパスのドキュメント生成時に行われます。現在、2番目のパスのドキュメント生成時にRunningプロパティを使用して集計の再計算を行うことができます。つまり、このプロパティが True の場合に、2番目のパスのドキュメント生成時に集計の再計算を行います。従って、累計計算を行う場合は、RunningプロパティをTrueに設定するだけです。


階層型レポートで集計を使用する

階層型レポートでの集計の使用例について説明します。これを行うには、前の「データリレーションを使用した階層型レポートの作成」で使用したレポートに「顧客別担当者別の注文明細の合計金額」と「顧客別の総売上」を追加します。

このサンプルは「MasterDetailAggregates」のフォルダにあります。

これらの2つの計算を行うには、レポートに2つのセクション（footer1およびfooter2）を追加し、dataBand3セクションのAggregatesプロパティの [image] ボタンを押して「コレクションエディタ」を開きます。「追加」ボタンで、TotalAggr（集計）を追加します。NameプロパティにはTotalAggr、ExpressionプロパティにはdataBand3[“Total”]を設定します。

次に 、「コレクションエディタ」のTotalAggrプロパティの中のGroupsのコレクションの [image] ボタンを押してコレクションエディタを開き、グループ条件を2つ追加します。まずはExpressionプロパティにdataBand1["CustNo"]、2番目のExpressionプロパティにdataBand2["OrderNo"]を設定します。

ここまでで、集計の準備ができました。

レポートの生成時に、dataBand1["CustNo"] とdataBand2["OrderNo"]のカレントのキー値の他にdataBand3[“Total”]の値がこの集計コレクションに保存されます。後で、dataBand1["CustNo"]とdataBand2["OrderNo"]、それからdataBand3[“Total”]に適用したい関数を指定する際に、いつでもこの集計を参照できます。この関数はdataBand1["CustNo"]とdataBand2["OrderNo"]に指定した値から計算されたdataBand3[“Total”]の値だけを使用して計算されます。

上述したように、レポートには2つのフッターが追加され、そこに集計が表示されます。

dataBand2内のfooter1セクションは、顧客別の売上合計を表示するために使用します。このセクションにはtextBox21があり、このValueプロパティに、dataBand3.Sum("TotalAggr", dataBand1["CustNo"])が設定されています。この関数の意味はdataBand1["CustNo"]のカレントの値、つまり顧客別の「TotalAggr」集計の合計を表します。 ２つ目のグループ条件の値は指定されていないので無効となります。

dataBand3内のfooter2セクションは、顧客別で担当者別の注文の合計を表示するために使用します。この中には、2つのTextBoxがあり、最初のTextBoxは「合計」を表示し、次のTextBoxはValueプロパティがdataBand3.Sum("TotalAggr",dataBand1["CustNo"],dataBand2["OrderNo"])に設定されています。これは 、dataBand1["CustNo"]とdataBand2["OrderNo"]の値、つまり顧客別・担当者別のTotalAggr集計の合計を表します。

【実行例】


グループ単位で集計する

「グループの使用」で使用したレポートのテンプレートに国の州別の顧客数の計算を追加していきます。

このサンプルは「GroupsAggregates」フォルダにあります。

detail2セクションには「Count」という集計関数が追加されています。これは、detail2セクションのAggregatesプロパティからAggregateコレクションエディタを開きます。
数量を計算するために、Expressionプロパティは1に設定されています。グループ条件としてGroupsプロパティにdataBand1["Country"]とdataBand1["State"]が設定されています。

groupFooter1のtextBox6は顧客数を表示するために使用します。textBox6のValueプロパティにはdetail2.Sum("Count",dataBand1["Country"],dataBand1["State"])が設定されています。つまり、detail2の集計はグループ条件のdataBand1["Country"] とdataBand1["State"]、つまり国別および州別の集計になります。。

集計のExpressionプロパティは1に設定されており、指定した国の州別の顧客数が計算されます。

【実行例】


ページ集計

前述したように、集計はレポート全体だけでなく特定ページの計算も行えます。

「スタイルの使用」で紹介したサンプルを使用して、各ページのフッターに全商品中、何品が表示されているかを示すよう変更していきます。

このサンプルは「PageAggregates」フォルダにあります。

detail2セクションのAggregatesプロパティのコレクションに「Count」集計を追加します。グループ条件は必要ないので、この集計のGroupsプロパティは設定されていません。pageFooter1にtextBox8を追加します。textBox8のValueプロパティにはdetail2.Count(PageNumber,"Count")+"/"+ detail2.Count("Count")+"品"を設定します。この式のdetail2.Count(PageNumber,"Count")の部分は、PageNumberのページの「Count」集計の要素数（ページ単位のアイテム数）を表します。PageNumberはレポートの生成時に使用することができる特別な変数で、カレントのページ番号を格納するために使用します。この式のdetail2.Count("Count")の部分は、「Count」集計の全要素数（ページ全体のアイテム数）を表します。

通常、合計の前にデータが表示されます。しかし、ヘッダー内に何らかの合計を表示したい場合は例外です。さらに、ページに直接配置されているオブジェクトまたはPageHeader、PageFooter、PageOverlayなどページセクションのオブジェクトが他のセクションのオブジェクトより先に計算されるので注意してください。上記のほとんどの場合に集計関数を正確に計算するには、レポートはダブルパスでなければなりません。レポートをダブルパスにするには、ドキュメントのDoublePassプロパティをtrueに設定してください。

今回は集計値をPageFooterセクションに表示し、各ページには全数量に対するアイテム数が表示されます。この数はレポート全体を処理した後にのみわかります。つまり、レポートはダブルパスにしなければなりません。

【実行例】


Instrumentation ModelKitの目的と基本的な機能

Instrumentation ModelKitはGUIで操作するメータやゲージ等を作成したり使用するコンポーネントコンポーネントです。

最近のアプリケーションプログラムは見た目が自然で利便性が高くかつ独創的なアプリケーションインターフェースを備えていますが、Instrumentation ModelKitはこれらを簡単に実装することができます。

専用のグラフィックエディタを使用することにより簡単に独創的な外観と機能を備えた新しい可視コンポーネントを作成することができます。進捗バー、メーター、ダイアル、シリンダ、ゲージ、オドメータ、温度計、スイッチなどの一般的なコントロールや、マニピュレータ、スケール、専用デバイス、その他色々な計器のコンポーネントを作成することができます。

Instrumentation ModelKitの各コントロールはビジュアルオブジェクトと非ビジュアルオブジェクトで構成されており、互いに関連して動作します。これらのオブジェクトを使用することにより、希望する可視コントロールを作成することができます。

各オブジェクトのプロパティに式を設定できるので、マウスによる操作だけでなくカレントの計器の状態に応じてプロパティを調整することができます。

OPCChannelコンポーネントを使用すれば、OPC業界基準に合ったリアルタイムデータチャンネルが使用できます。読み取り専用モードと書き込みモードの両方でバインドできます。

作成した計器をファイルに保存して再利用することができます。


Instrumentation ModelKitの概念

ModelKitの主なコンセプトは、開発者が専門な知識や高度な能力がなくても設定した条件に応じて独創的なコントロールを早く作成することができるということです。

Instrumentation ModelKitには計器の表示や管理を行うためのコンポーネントが含まれています。

Instrument ModelKitは階層構造を持った複合オブジェクトです。計器の構造には、外観や動作を割り当てるためのプリミティブがあります。計器を使用して何らかのコントロールオブジェクトをデザインできます。

計器の作成には、デザイナを使用します（Instrumentation ModelKitの配布パッケージにも含まれています）。デザイナを使用することにより、単純なオブジェクトを色々組み合わせて計器を作成します。また、プリミティブ（便利な基本図形）の各プロパティを設定することも可能です。式を使用してプリミティブを一緒にバインドしたりその複雑な機能を割り当てることができます。

計器に含まれているプリミティブを色々と組み合わせたり、色々なオブジェクトのプロパティをフレキシブルに設定したり、式を使用して開発者の要求に応じたコントロール要素を作成することができます。


基本的な使い方(Instrumentation ModelKit編)

Instrumentation ModelKitを使用して、シンプルなWindows Formsのコントロール要素を作成する方法を説明します。

このサンプルはInstrumentation ModelKitの「GettingStartedExample」フォルダにあります。

Microsoft Visual Studioを起動し、新規プロジェクト（ここでは、C#アプリケーション）を作成します。

フォームに「IndicatorWidget」コンポーネントを配置します。（このコンポーネントがInstrumentation ModelKitのツールボックスに表示されていない場合は、ユーザガイドの「インストール」を参照してください。）IndicatorWidgetは計器を表示するための可視コンポーネントです。

次にダブルクリックしてデザイナを立ち上げてください。デザイナが立ち上がると、計器のテンプレートを選択するためのダイアログウィンドウ（下図）が表示されます。

ウィンドウ左側には、使用可能な計器のテンプレートが表示されます。テンプレートはすべて機能別にグループ化されています。では、希望する計器のテンプレートを選択します。

ここでは、「Dials」グループの「Dial4」を選択してください。

「OK」をクリックすると選択したオブジェクトがデザイナに追加され、編集することができます。

計器の機能と外観を編集します。計器は個別のオブジェクトで構成されており、それぞれ独自の機能やプロパティがあります。

デザイナでプロパティの追加、削除、編集が可能です。オブジェクトを操作するには、Instrumentウィンドウまたは計器構造を示すツリーからマウスでオブジェクトを選択します。ここではダイアルの内側の円（Circle2）を選択してください。

ここで、Circle2のプロパティの編集や削除が行えます。「削除」ボタンを押してCircle2を削除してください。

では、スケール値の範囲を設定します。オブジェクトツリーから「Scale1」を選択し、プロパティウィンドウのMaximumプロパティの値を100に設定してください。

次に、スケールに新しい色を設定します。Colorizerプロパティを選択し、色エディタを開きます。色エディタは次のように表示されます。

このエディタを使用して、スケールの各部分の色や境界範囲を指定できます。新しい境界範囲を追加したり既存の境界範囲を削除できます。境界範囲や色を指定するには、ポインタをマウスで移動したり、エディタ右側にあるボタンを使用します。スケールから最初のポインタを削除し、二つ目のポインタを80の手前までマウスで移動して変更し、色を黒にしてください。

「OK」ボタンをクリックします。

次に、トラジェクトリの角度を設定します。それには、ツリーからJoint1オブジェクトをを選択します。プロパティグリッドのStartAngleプロパティとTotalAngleプロパティを変更するか、マウスでJoint1オブジェクト（ジョイントの領域）を動かして変更します。

針の外観を変更していきます。デザイナを使用して針の大きさを変更してください。80を超えるとポインタの色が赤になるように機能を変更してください。それには、Instrument.Stylesプロパティに「HotValue」というスタイルを追加し、そのFillプロパティとColorプロパティにそれぞれ「SolidFill」と「red」を設定してください。「Needle1」を選択し、次の式を式エディタ（デザイナ下部）のStyleプロパティに設定します。

if(Pressed, if(Slider1.Value >= 80, "HotValue", "NeedlePressed"), "Needle")

この式は指定した条件に応じてNeedle1オブジェクトにHotValueというスタイル名を割り当てます。変数「Pressed」はマウスがクリックされたことを表します。

Circle3オブジェクトにも同じような式を記述します。式エディタはデザイナ下部に表示されます。 「スクリプトのチェック」 [image] ボタンをクリックして記述した式が正しいか確認してください。

スライダのカレント値を表示するために、新しいオブジェクトを追加します。まず、「Slider1」に「Labelオブジェクト」を追加し、次の式を式エディタのTextプロパティに設定してください。

format(Slider1.Value, "##0.0")

この式は、マスクどおりにフォーマットされた「Slider1」の値が「Label1」のTextプロパティに割り当てられることを示しています。

この計器を後で使えるように、[ファイル]メニューの[保存]を使用してファイルに保存します。画面左下の「OK」ボタンをクリックして、デザイナを終了します。最終的な計器はIndicatorWidgetコンポーネントで使用されます。

IndicatorWidgetコンポーネントにValueプロパティを取得するためのスライダを指定します。それには、プロパティウィンドウのSliderNameプロパティに「Slider1」を設定してください。

IndicatorWidgetのカレント値を表示するために、フォームにLabelコンポーネントを配置してください。 IndicatorWidget1のValueChandedイベントハンドラを記述します。

private void indicatorWidget1_ValueChanged(object sender, PerpetuumSoft.Framework.Model.PropertyEventArgs args)
{
  label1.Text = "indicatorWidget1.Value プロパティ値　= " + indicatorWidget1.Value.ToString();
}

            アプリケーションの実行画面です。


計器について

計器は階層構造からなる複合オブジェクトです。任意のオブジェクトを計器に含めることができます。オブジェクトは構造的に「複合」と「単一」の2つのグループに分けることができます。複合オブジェクトは他の任意のオブジェクトを含めることができるオブジェクトです。

オブジェクトは機能的に「可視」と「非可視」に分けることができます。可視オブジェクトは計器の外観に関するものです。非可視のオブジェクトは計器の機能性に関するだけでなく、オブジェクトをバインドしたりグループ化するためのものです。オブジェクトは色々な組み合わせで計器に含めることができます。しかし実際は、ある特定の値を表示したり割り当てるために計器が使用されます。

このようなオブジェクトは次のようにして作成されます。値の範囲を割り当てたり、表示するスケール（1つまたは複数）が計器に含められます。カレントの値を表示（割り当てる）する複数のスライダが含められます。別のフォーム（例：テキスト行のフォーム）に、値を表示するオブジェクトを含めることもできます。

スケールを作成するには、「トラジェクトリ」オブジェクトと「Scale」オブジェクトを使用します。「トラジェクトリ」オブジェクトの線内にスケールを配置させます。Scaleオブジェクトはスケールの範囲を割り当てます。トラジェクトリを割り当てるには、ITrajectoryインターフェースをサポートする、「Guide」オブジェクト（線状のトラジェクトリ）や「Joint」オブジェクト（円状のトラジェクトリ）を使用します。スケールの値を表示させるには、ScaleElementの基本クラスから継承された、「NumericLabels」、「ScaleLabels」、「TextLabels」、「Ticks」などのオブジェクトを使用します。スライダを割り当てるには、カレントのスケールの値を表示し、その値をマウスで変更できるSliderオブジェクトを使用します。スライダの表記にはさまざまな可視オブジェクト（例：値マーカや目盛など）を使用でき、式でスライダにバインドさせます。

例えば、簡単な計器を下の構造を使用して作成します。

上記のルートオブジェクトは「Scale1」が配置されている円状のトラジェクトリ（「Joint1」）を含む「Instrument」です。スケールの表記には、Ticks1（目盛）とNumericLabels1（値ラベル）が使用されます。スライダ（Slider1）はスケールづたいに動かすことができます。スライダのカレント値を表すためにポインタ（Needle1）が使用されます。上記の構造は、下図に示されているような複数のスケールやスライダを含むInstrumentに似ています。


オブジェクトの階層

計器の作成時に使用するクラス階層について説明します。

Instrumentation ModelKitのすべてのオブジェクトの基本クラスはElementクラスです。これはSystem.Objectから継承されており、次のインターフェースを実装します。

インターフェース | 説明
PerpetuumSoft.Framework.Model.IElement | Elementオブジェクトが、あるドキュメントのオブジェクトモデルのオブジェクトであることを示します
PerpetuumSoft.Framework.Model.Runtime.IActiveElement | オブジェクトがマウスイベントを処理できることを示します
PerpetuumSoft.Framework.Expressions.IExpressionSite | オブジェクトが式の関数やオブジェクトソースであることを示します

Elementクラスにはオブジェクトに名前を割り当てるNameプロパティと、オブジェクトの描画時に使用するStyleプロパティ、Fillプロパティ、Strokeプロパティなどがあります。

ElementクラスはComposite、ScaleElement、Circle、CircularShape、LineElement、RectangleElementクラスの親です。

Circleクラスは円形を表します。

CircularShapeクラスは中心や半径を含むすべての形の基本クラスを示します。

LineElementクラスは開始点と終了点を持つすべての形の基本クラスです。

RectangleElementクラスは中心、幅、高さを含むすべての形の基本クラスです。

ScaleElementクラスはスケールに配置された全オブジェクトの基本クラスを示します。

Compositeクラスは全コンテナ要素、つまり必然的に他のオブジェクトを含めることが可能なオブジェクトの基本クラスです。

●Compositeクラス

Compositeクラスは、このクラスが他のオブジェクトのコンテナであることを示すICompositeElementインターフェースを実現し、これらのオブジェクトへのアクセスを提供します。Instrument、Group、Scale、SliderBase、DockableTrajectoryクラスはこのCompositeクラスから継承されています。

Instrumentクラスのオブジェクトは全オブジェクトの階層型のルートオブジェクトを表し、それがルートオブジェクトであることを示すIRootElementインターフェースを実現します。

Groupクラスのオブジェクトは他のオブジェクトをグループ化するための「非ビジュアル」要素です。

Scaleクラスのオブジェクトはスケールの範囲を割り当てる「非ビジュアル」要素です。

SliderBaseクラスはスライダの基本クラスを表します。スライダにはマウスで変更可能なカレントの値があります。スライダが含まれているトラジェクトリから少し離れたところにあるスライダのカレントの値のポイントを定義できます。Sliderクラス（このオブジェクトはカレントの値を表す非ビジュアルオブジェクトである）はSliderBaseクラスから継承されています。

GuideクラスとJointクラスはこの2つのクラスがトラジェクトリを表現することを示すITrajectoryインターフェースを実現します。Guideクラスは線状のトラジェクトリです。Jointクラスは弧のトラジェクトリです。

DockableTrajectory抽象クラスはこのクラスがTrjectoriesを表現することを示すITrajectoryインターフェースを実現します。Guideは線状のトラジェクトリです。Jointは円状のトラジェクトリです。

●ScaleElementクラス

ScaleElementクラスの後続のオブジェクトはスケールの表記に使用するクラスです。

ScaleMarksBaseクラスはスケールのマーカを表します。このクラスはTicksクラスとScaleMarksクラスの基本クラスです。Ticksクラスのオブジェクトはスケールの目盛です。ScaleMarksクラスのオブジェクトはスケールのマーカです。

ScaleLabelsBase抽象クラスはスケールにテキストラベルを表示します。このクラスはScaleLabelsクラス、CustomLabelsクラス、ScaleTitleクラスの基本クラスです。ScaleLabelsクラスはスケール内に数値ラベルを表示します。CustomLabelsクラスはスケールのテキストラベルのコレクションを表します。ScaleTitleクラスはスケールのタイトルを表します。

ValuePresenterScaleElementの抽象的な後続のオブジェクトはスケールの値を表示するためにあります。Tankクラスはタンクの計量を目盛線で表します。LevelBase抽象クラスはLinearLevelクラスとRangedLevelクラスの基本クラスです。LinearLevelは計量範囲を縦棒で表示します。RangedLevelはスケール値を異なる幅で表します。

●CircularShapeクラス

CircularNotchesクラス、Polygonクラス、Gearクラス、HighlightクラスはCircularShapeクラスから継承されます。

CircularNotchesクラスのオブジェクトはノッチ（切り込み）を描画します。これはスライダの外観のデザインに使用します。

Polygonクラスは多面体を表し、面の数を表すSidesプロパティがあります。星型のStarクラスはPolygonクラスから継承されています。

Gearクラスはギアを表します。

Highlightクラスはハイライトをつけるためにあります。

●LineElementクラス

LineElementクラスはLineクラス、Needleクラス、Springクラス、LinearNotchesクラスの基本クラスです。Lineクラスは線を表します。

Needleクラスは針（この形はNeedlePointsプロパティを使用して割り当てられます）を表します。スライダの針として使用します。

Springクラスはスプリングを表します。

LinearNotchesクラスのオブジェクトは線形ノッチ（切り込み線）を描画します。スライダの外観のデザインに使用します。

●RectangleElementクラス

Ellipseクラス、Rectangleクラス、RoundedRectangleクラス、Frameクラス、ArcBaseクラス、Pictureクラス、PictureSetクラス、Labelクラス、Digitsクラス、OdometerクラスはRectangleElementクラスから継承されます。

Ellipseクラスは楕円を表します。

Rectangleクラスは矩形を表します。

RoundedRectangleクラスは角丸四角を表します。

Frameクラスは矩形枠を表します。

ArcBaseクラスは、弧を表すArcクラス、パイスライスを表すPieクラス、ドーナツ状の一部を表すRingSectorクラスの基本クラスです。

PictureクラスのオブジェクトはImageプロパティで割り当てられたイメージを表示するためにあります。

PictureSetクラスのオブジェクトは割り当てられたイメージのコレクションからイメージを1つ表示するためにあります。

Labelクラスのオブジェクトはラベルを表示するためにあります。

Digitsクラスのオブジェクトはデジタル表示のためにあります。

Odometerクラスのオブジェクトは機械メータ（オドメータ）を表示するためにあります。


一般的なプロパティについて

Instrumentクラスのプロパティの一覧です。

プロパティ名 | 説明
Nameプロパティ | すべての計器の中で1つしかない名称を割り当てます
Fillプロパティ | オブジェクトを描画するための塗りつぶしを割り当てます
Strokeプロパティ | オブジェクトを描画するための線のトレーススタイルを割り当てます
Styleプロパティ | オブジェクトを描画するためのオブジェクトのスタイル名を割り当てます。 *オブジェクトにFillプロパティと/またはStrokeプロパティが割り当てられていない場合、Styleプロパティに割り当てられたスタイルが使用されます。
Stylesプロパティ | オブジェクトを含んでいる計器のStylesプロパティに利用可能なスタイルが割り当てられます
Smoothプロパティ | 出力するイメージの質を割り当てます
Visibleプロパティ | オブジェクトの可視性を割り当てます
Activeプロパティ | オブジェクトがマウスからイベントを認識するかどうかを示します
BreakEventBubblingプロパティ | その先の処理を行うためにマウスからのイベントを親オブジェクトに渡すかどうかを示します。 *Falseの場合、イベントをその親に渡します。
RecalculateAllプロパティ | オブジェクトの状態が変わった場合に、どのオブジェクトに対して式の再計算を行うかを示します。 *Falseの場合、選択したオブジェクトとそこに含まれるすべてのオブジェクトに対してのみ式の再計算を行います。それ以外はすべての計器のオブジェクトの式が再計算されます。

マウスからイベントを受け取るプロセスとそのイベント処理は次のように行われます。

オブジェクト上にマウスがある場合、ビジュアルオブジェクトはマウスからイベントを受け取ります。ビジュアルオブジェクトがこれらのイベントを処理し、BreakEventBubblingプロパティがFalseの場合は処理するためにイベントをその親に渡します。従って、マウスから受け取ったイベントはビジュアルオブジェクトからドキュメントツリーにまで渡されます。非ビジュアルオブジェクトは含んでいるビジュアルオブジェクトからのみ、マウスからのイベントを受け取ることができます。


全コンポーネントとそのプロパティについて

すべてのコンポーネントには、ユーザガイドの「一般的なプロパティについて」で説明したプロパティがあります。ここでは、計器を作成するために使用するコンポーネントについて説明します。

Instrumentコンポーネント

Instrumentコンポーネントは計器を作成するための基礎です。Instrumentコンポーネントには次のプロパティがあります。

プロパティ名 | 説明
Size | 計器の作業領域の大きさです
Enabled | 計器がユーザの動作に反応するかどうかを示します
Focused | 計器がフォーカスされているかどうかを示します

これらの値は計器の開発時に任意に設定できます。「ウィジェット」に計器を表示する際にWidgetのEnabledプロパティとFocusedプロパティに応じて上記のプロパティが設定されます。これらのプロパティは「ウィジェット」（この中に計器が表示されます）の状態に応じて計器の外観と動作を実装します。

次のプロパティは計器のデザイン時にのみ使用され、計器と一緒に保存されます。

プロパティ名 | 説明
SnapToGrid | グリッドに合わせるかどうかを定義します
ShowGrid | グリッドを表示するかどうかを定義します
GridStep | グリッドのステップ数を定義します
MeasureUnit | 計測単位を定義します

Jointコンポーネント

Jointコンポーネントは弧のトラジェクトリで、ダイアルを作成するために使用します。
プロパティ名 | 説明
Center | 弧の中心を割り当てます
Radius | 弧の半径を割り当てます
StartAngle | 弧の開始角度を割り当てます
TotalAngle | 弧の全角度を割り当てます

*角度は水平軸から時計周りです。

Jointコンポーネント

Guideコンポーネント

Guideコンポーネントは線状のトラジェクトリで、線状のスケールを作成するために使用します。
プロパティ名 | 説明
StartPoint | 線の開始点を割り当てます
EndPoint | 線の終了点を割り当てます

Guideコンポーネント

Scaleコンポーネント

Scaleコンポーネントは非可視コンポーネントです。
プロパティ名 | 説明
Minimum | 変動範囲（最小値）を割り当てます
Maximum | 変動範囲（最大値）を割り当てます

スケール値の変動範囲を割り当てます。スケール表記のために、スケールにTicksコンポーネント（目盛）、NumericLabelsコンポーネント（値ラベル）、TextLabelsコンポーネント（テキストラベル）を含めます。

Sliderコンポーネント

Sliderコンポーネントは非可視コンポーネントです。
プロパティ名 | 説明
Value | （スライダに含まれている）スケールにカレントの値を割り当てます
MaxLimit | 値の変動範囲（上限）を割り当てます
MinLimit | 値の変動範囲（下限）を割り当てます
UseLimit | 割り当てた変動範囲を使用するかどうかを定義します

*MaxLimitプロパティとMinLimitプロパティは絶対値と相対値の両方を処理することができます。

Sliderコンポーネントはマウスからのイベントを次のように処理します。マウスポインタのカレントの位置とトラジェクトリの形状に応じてValueプロパティを同期させて（マウスからのイベントを）処理します。Sliderコンポーネントは非可視コンポーネントなので直接マウスからイベントを受け取ることができません。マウスからのイベントはSliderに含まれている可視コンポーネントから渡されるので、Sliderコンポーネントをマウスの移動に反応させるには可視コンポーネントを含めなければなりません。

式にバインドされているスライダ内のさまざまな可視コンポーネントはカレントのスライダ値を表記するために使用できます。

Groupコンポーネント

Groupコンポーネントは非可視コンポーネントで、他のコンポーネントをグループ化するために使用します。

CustomLabelsコンポーネント

プロパティ名 | 説明
Labels | Autoの場合、ラベルはOriginプロパティに設定した基準に従ってスケールに沿って均等に配置されます
Distance | スケールとの間隔を定義します
Padding | ボーダーからCustomLabelsコンポーネントまでの間隔を定義します
Dock | Paddingプロパティに割り当てた間隔に応じてCustomLabelsコンポーネントの相対位置を定義します
OddLabelDistance | 奇数ラベルの間隔を偶数ラベルからどれくらいあけるかを定義します
Position | ラベルをどの位置に配置するかを定義します（例：近く、中間、遠く）
TextAlingment | スケール値からのラベルの配置場所を定義します（例：（値の）近く、中間、遠く）
Angle | テキストの角度を定義します
TextRotationMode | テキストの向きを定義します
ItemMargins | ラベル領域のマージンからテキストまでの距離を定義します
ShowSuperposableLabels | ラベルを重ね合わせて表示するかどうかを定義します
MaxLimit/MinLimit | ラベルを指定した範囲にだけ表示するために境界範囲を割り当てます
UseLimit | 指定した範囲にのみカスタムラベルを表示します

CustomLabelsコンポーネントはスケール値にバインドされていないテキストラベルをスケールに表示します。このコンポーネントはスケールに含まれています。該当するスケール値の他に、Labelsプロパティのコレクションにテキストラベルが割り当てられます。スケール値は絶対値と相対値（スケール範囲からのパーセント）の両方を割り当てられます。

CustomLabelsコンポーネント

ScaleLabelsコンポーネント

ScaleLabelsコンポーネントはスケールに数値ラベルを表示します。このコンポーネントはスケールに含まれています。
プロパティ名 | 説明
Step | ラベルの間隔を定義します。Autoの場合、Divisionsプロパティで設定した間隔が使用されます。
Origin | 基準を定義します
Divisions | StepプロパティがAutoの場合に、ラベルの間隔を定義するためにScaleLabelsコンポーネントを何分割にするかを設定します。 例えば、このプロパティに10を設定すると、ScaleLabelsコンポーネントは10分割され、ラベルの間隔もそれに比例して表示されます。
UseRoundValues | Trueの場合、数値ラベルの値は小数点以下の桁数が丸められて表示されます（Falseの場合は小数点以下の桁数がすべて表示されます）。 分割数はDivisionsプロパティの値と同じかそれより少なくなります。
Distance | スケールとラベルとの間隔を定義します
Padding | ボーダーからScaleLabelsコンポーネントまでの間隔を定義します
Dock | Paddingプロパティに割り当てた間隔に応じてスケールラベルの相対位置を定義します
OddLabelDistance | 偶数ラベルからの奇数ラベルの間隔をどれくらいあけるかを定義します
Position | ラベルをどの位置に配置するかを定義します（例：近く、中間、遠く）
TextAlignment | スケール値からのラベルの位置を定義します（例：（値の）近く、中間、遠く）
Angle | ラベルの角度を定義します
TextRotationMode | ラベルの向きを定義します
ItemMargins | ラベル領域のマージンからテキストまでの距離を定義します
ShowSuperposableLabels | ラベルを重ね合わせて表示するかどうかを定義します
MaxLimit/MinLimit | ラベルを指定した範囲にだけ表示するために境界範囲を割り当てます
UseLimit | Trueの場合、指定した範囲にのみスケールラベルを表示します

値はスケールに設定した範囲内に、Stepプロパティで定義した間隔で表示されます。ScaleLabelsコンポーネントの描画時に、数値ラベルはスケールに沿って均等に配置されます。

ScaleLabelsコンポーネント

ScaleTitleコンポーネント

ScaleTitleコンポーネントはスケールのタイトルを表します。
プロパティ名 | 説明
Text | タイトルテキストを定義します。
Origin | 基準を定義します
Padding | ボーダーからScaleTitleコンポーネントまでの間隔を定義します
Dock | Paddingプロパティに設定した間隔に応じてScaleTitleコンポーネントの相対位置を割り当てます
TextAlignment | タイトルの配列を定義します
Angle | テキストの角度を定義します
TextRotationMode | テキストの向きを定義します

ScaleTitleコンポーネント

Ticksコンポーネント

Ticksコンポーネントはスケールの目盛で、スケールに含まれています。
プロパティ名 | 説明
Step | 主目盛の間隔を定義します
Divisions | 主目盛の数を定義します。
Origin | 基準を定義します
UseRoundValues | Trueの場合、スケールの主目盛には小数点以下の桁数が丸められた値が表示されます（Falseの場合は小数点以下の桁数がすべて表示されます）。 Divisionsプロパティの値と同じかそれより少なくなります。
Length | 主目盛の目盛の長さを定義します
SubDivisions | 副目盛の数を定義します
SubLength | 副目盛の長さを定義します
SubTicksPosition | 主目盛と副目盛の相対位置を定義します
Distance | スケールとの間隔（インデント量）を定義します
Padding | ボーダーからTicksコンポーネントまでの間隔を定義します
Dock | Paddingプロパティに設定した間隔に応じてTicksコンポーネントの位置を定義します
MaxLimit/MinLimit | 指定した範囲にだけ目盛を表示させるための境界範囲を定義します
UseLimits | Trueの場合、指定した範囲にのみ目盛を表示します

値はスケールに設定した範囲内に、Stepプロパティで定義した間隔で表示されます。副目盛は主目盛と主目盛の間に表示されます。主目盛はTicksコンポーネントの描画時にスケールの線に均等に配置されます。

Ticksコンポーネント

ScaleMarksコンポーネント

ScaleMarksコンポーネントはスケールにマーカを表します。
プロパティ名 | 説明
Shape | マーカの形状を定義します
Step | マーカの間隔を定義します。Autoの場合、Divisionsプロパティに設定した間隔が使用されます。
Divisions | 主マーカの数を定義します
Origin | 基準を定義します
MarkSize | 主マーカの大きさを定義します
SubDivisions | 副マーカの（分割）数を定義します
SubMarkSize | 副マーカの大きさを定義します
SubTicksPosition | 主マーカと副マーカの相対位置を定義します
Distance | スケールとの間隔（インデント量）を定義します
Padding | ボーダーからマーカまでの間隔を定義します
Dock | Paddingプロパティに設定した間隔に応じてマーカの相対位置を定義します
MarksAngle | マーカの角度を定義します
MaxLimit/MinLimit | マーカを指定した範囲にだけ表示させるための境界範囲を定義します
UseLimits | Trueの場合、マーカを指定した範囲にだけ表示します
値はスケールに設定した範囲内に、Stepプロパティに割り当てた間隔で表示されます。副マーカは主マーカと主マーカの間に表示されます。 マーカはScaleMarksコンポーネントの描画時にスケールに沿って均等に配置されます。ScaleMarksコンポーネントはスケールに含められます。

ScaleMarksコンポーネント

RangedLevelコンポーネント

RangedLevelコンポーネントはスケールに例えば強弱、高低などの度合いを表示するためのものです。例として、タコメータでスピードの安全/危険範囲を表すために使用されます（RangedLevelコンポーネントの使用例がInstrumentation ModelKitのSamplesCenterサンプル内にあります）。
プロパティ名 | 説明
Value | RangedLevelコンポーネントをいくつ（最大値）まで表示するかを定義します
StartWidth | RangedLevelコンポーネントの開始幅を設定します
EndWidth | RangedLevelコンポーネントの終了幅を定義します
Fill | 塗りつぶしの色を定義します
Colors | Fillプロパティが設定されていない場合、Colorsプロパティに割り当てられた色で描画されます
StartColor/EndColor | Colorsプロパティが設定されていない場合、StartColorプロパティとEndColorプロパティに設定された色で描画されます
Divisions | RangedLevelコンポーネントを何分割するかを定義します
DivisionsStroke | 分割線の種類を定義します
AlignmentMode | スケールにRangedLevelコンポーネントをバインドする方法を割り当てます
MaxLimit/MinLimit | 指定した範囲にのみ表示させるための境界範囲を定義します
UseLimits | Trueの場合、指定した範囲にのみ表示します

RangedLevelコンポーネント

LinearLevelコンポーネント

LinearLevelコンポーネントは線スケールに例えば強弱、高低などの度合いを表示するためのものです。
プロパティ名 | 説明
Value | コンポーネントをいくつ（最大数）まで表示するかを設定します
Divisions | 分割数を定義します
DivisionsStroke | 分割線の種類を定義します
Fill | コンポーネントの塗りつぶしの色を定義します
Colors | Fillプロパティが設定されていない場合、Colorsプロパティに設定された色で描画されます
StartColor/EndColor | Colorsプロパティが設定されていない場合、StartColor/EndColorプロパティに設定された色で描画されます
Width | コンポーネントの幅を定義します
StartCap/EndCap | コンポーネントの開始スタイルと終了スタイルを定義します
Effect3D | コンポーネント全体の表示スタイルを定義します
ShowAsThermometer | コンポーネントを温度計として表示するかどうかを定義します。スケールの始めに温度計の玉（PocketRadiusプロパティで設定）がついて表示されます
PocketRadius | 温度計の玉の半径を定義します
Dock | コンポーネントをスケールにドッキングさせる型を定義します

LinearLevelコンポーネント

Tankコンポーネント

Tankコンポーネントは液体の入ったタンクを表す可視コンポーネントです。
プロパティ名 | 説明
Width | タンクの幅を定義します
Depth | タンクの深さを定義します
TankWidth | タンクの厚さを定義します
TankColor | タンクの色を定義します
LiquidColor | 液体の色定義します
Effect3D | コンポーネント全体の表示スタイルを定義します
Dock | コンポーネントをスケールにドッキングさせる型を定義します

Tankコンポーネント

Circleコンポーネント

Circleコンポーネントは円を表す可視コンポーネントです。
プロパティ名 | 説明
Center | コンポーネントの中心を定義します
Radius | コンポーネントの半径を定義します

Circleコンポーネント

Ellipseコンポーネント

Ellipseコンポーネントは楕円を表す可視コンポーネントです。
プロパティ名 | 説明
Center | コンポーネントの中心を定義します
Size | コンポーネントの大きさを定義します
Angle | 楕円の回転角度を定義します（中心から時計回り）

Ellipseコンポーネント

Rectangleコンポーネント

Rectangleコンポーネントは矩形を表す可視コンポーネントです。
プロパティ名 | 説明
Center | コンポーネントの中心を定義します
Size | コンポーネントの大きさを定義します
Angle | 矩形の回転角度を定義します（中心から時計回り）

Rectangleコンポーネント

RoundedRectangleコンポーネント

RoundedRectangleコンポーネントは角丸矩形を表す可視コンポーネントです。
プロパティ名 | 説明
Center | コンポーネントの中心を定義します
Size | コンポーネントの大きさを定義します
Radius | 角を丸める半径を定義します
Angle | 角丸矩形の回転角度を定義します（中心から時計回り）

RoundedRectangleコンポーネント

Arcコンポーネント

Arcコンポーネントは（楕円状の）弧を表す可視コンポーネントです。
プロパティ名 | 説明
Center | 楕円の中心を定義します
Size | 楕円の大きさを定義します
StartAngle | 弧の開始角度を定義します
SweepAngle | 弧の終点までの角度を定義します
Angle | 弧の回転角度を定義します（中心から時計回り）

Arcコンポーネント

Pieコンポーネント

Pieコンポーネントはパイを表す可視コンポーネントです。
プロパティ名 | 説明
Center | パイの中心を定義します
Size | パイの大きさを定義します
StartAngle | パイの開始角度を定義します
SweepAngle | パイの終点までの角度を定義します
Angle | パイの回転角度を定義します（中心から時計回り）

Pieコンポーネント

RingSectorコンポーネント

RingSectorコンポーネントは（楕円状の）ドーナツ型を表す可視コンポーネントです。
プロパティ名 | 説明
Center | ドーナツの楕円の中心を定義します
Size | ドーナツの楕円の大きさを定義します
StartAngle | ドーナツ型の開始角度を定義します
SweepAngle | ドーナツ型の終点までの角度を定義します
InternalRadius | 内輪と外輪の半径の比率を定義します
Angle | ドーナツ型の回転角度を定義します（中心から時計回り）
RingSectorコンポーネント

Lineコンポーネント

Lineコンポーネントは線を表す可視コンポーネントです。
プロパティ名 | 説明
StartPoint | 開始点を定義します
EndPoint | 終了点を定義します

Lineコンポーネント

Needleコンポーネント

Needleコンポーネントは針を表す可視コンポーネントです。このコンポーネントはスライダのカレントの値を示すのに使用します。

プロパティ名 | 説明
StartPoint | 針の開始点を定義します
EndPoint | 針の終点を定義します
StartWidth | 針の底辺の幅を定義します
EndWidth | 針の先の幅を定義します
NeedlePoints | 複雑な針の形を割り当てます
ShowMode | 針の表示モードを定義します

*NeedlePointsプロパティは針の中間ポイントの記述子のコレクションです。各中間ポイントの記述子は指定したポイントの針幅、針の底辺から指定したポイントまでの距離と針の長さの割合で割り当てられます（下図参照）。

Needleコンポーネント

Springコンポーネント

Springコンポーネントはスプリングを表す可視コンポーネントです。

プロパティ名 | 説明
StartPoint | 開始点を定義します
Amplitude | スプリングの幅を定義します
CoilCount | コイル数を定義します

Springコンポーネント

Starコンポーネント

Starコンポーネントは星型を表す可視コンポーネントです。

プロパティ名 | 説明
Center | 星型の中心を定義します
Radius | 星型の外輪半径を定義します
InternalRadius | 星型の内輪半径を定義します
Sides | 星型の角の数を定義します
Angle | 星形の回転角度を定義します（中心から時計回り）

Starコンポーネント

Polygonコンポーネント

PolygonコンポーネントはCenterプロパティで割り当てた中心を持つ円に内接した正多角形を表す可視コンポーネントです。

プロパティ名 | 説明
Center | 多角形の中心を定義します
Radius | 多角形を囲んでいる円の半径を定義します
Side | 多角形の角の数を定義します
Angle | 多角形の回転角度を定義します（中心から時計回り）
Polygonコンポーネント

Labelコンポーネント

Labelコンポーネントは可視コンポーネントで、テキストの出力に使用します。

プロパティ名 | 説明
Text | 出力テキストを定義します
Center | テキストを表示する領域の中心を定義します
Size | テキストを表示する領域の大きさを定義します
TextAlign | 表示領域でのテキストの配列を定義します
Font | テキストのフォントを定義します
Angle | テキストの回転角度を定義します（中心から時計回り）

Labelコンポーネント

Frameコンポーネント

Frameコンポーネントは可視コンポーネントで、傾斜のついた枠を表すために使用します。

プロパティ名 | 説明
Center | 枠の中心を定義します
Size | 枠の大きさを定義します
BevelStyle | 枠の種類を定義します
DarkColor | 枠のダークカラーを定義します
LightColor | 枠のライトカラーを定義します
OuterColor | 外枠の色を定義します
InnerColor | 内枠の色を定義します
Angle | 枠の回転角度を定義します（中心から時計回り）

Frameコンポーネント

Pictureコンポーネント

Pictureコンポーネントはイメージを表示するために使用します。

プロパティ名 | 説明
Image | イメージを定義します
Center | イメージの中心を定義します
Size | イメージの大きさを定義します
Angle | イメージの回転角度を定義します（中心から時計回り）
Pictureコンポーネント

PictureSetコンポーネント

PictureSetコンポーネントは複数のイメージの中から1つのイメージを表示するために使用します。

プロパティ名 | 説明
Images | イメージのコレクションを割り当てます
ImageIndex | 出力イメージの数を定義します
Center | イメージの中心を定義します
Size | イメージの大きさを定義します
Angle | イメージの回転角度を定義します（中心から時計回り）

CircularNotchesコンポーネント

CircularNotchesコンポーネントは円形ノッチ（刻み目）を作成します。コントロール要素のデザインとして使用され、CenterプロパティとRadiusプロパティで設定した円の内側に表示されます。

プロパティ名 | 説明
Center | ノッチを描画する円の中心を定義します
Radius | ノッチを描画する円の半径定義します
Count | ノッチの数を定義します
Length | ノッチの長さを定義します
DarkColor | ノッチのダークカラーを定義します
LightColor | ノッチのライトカラーを定義します
Angle | ノッチの回転角度を定義します（中心から時計回り）

CircularNotchesコンポーネント

LinearNotchesコンポーネント

LinearNotchesコンポーネントは線形ノッチ（刻み目）を作成します。コントロール要素のデザインとして使用され、StartPointプロパティとEndPointプロパティに割り当てられた線に並列して配置されます。

プロパティ名 | 説明
StartPoint | ノッチの開始点を定義します
EndPoint | ノッチの終了点を定義します
Width | ノッチの端から端までの距離を定義します
Count | ノッチの数を定義します
DarkColor | ノッチのダークカラーを定義します
LightColor | ノッチのライトカラーを定義します
LinearNotchesコンポーネント

Digitsコンポーネント

Digitsコンポーネントはデジタルなインジケータで、値をデジタル表示します。

プロパティ名 | 説明
Text | インジケータに表示するテキストを定義します
Center | インジケータの中心を定義します
Size | インジケータの大きさを定義します
Angle | インジケータの回転角度を定義します（中心から時計回り）
SegmentThickness | デジタル数字の線の太さを定義します
SegmentSpace | デジタル数字の断片（切れ目）の間隔を定義します
DigitWidth | デジタル数字の表示幅を定義します
DigitHeight | デジタル数字の高さを定義します
DigitSpace | 数値と数値の間隔を定義します
ActiveColor | 数値の色を定義します
InactiveColor | デジタル表示のアクティブではない部分（断片）の色を定義します

0から9までの数値、点、ダッシュ、コロン、スペースを使用できます。インジケータの数値はデジタル（数字が途切れたような感じ）で表示されます。

Digitsコンポーネント

Odometerコンポーネント

Odometerコンポーネントは機械のメータで、値を表示します。割り当てた値は各メータ盤に表示されます。
プロパティ名 | 説明
Value | 表示する数値を割り当てます
Center | オドメータの中心を定義します
Size | オドメータの大きさを定義します
Angle | オドメータの回転角度を定義します（中心から時計回り）
Font | フォントを定義します
FirstDigitBackFill | 最小桁のディスクの色を定義します
FirstDigitForeFill | 最小桁の数字の色を定義します
BackFill | 最小桁以外のメータ盤の色を定義します
ForeFill | 最小桁以外のメータ盤に表示される記号の色を定義します
Odometerコンポーネント

HighLightコンポーネント

HighLightコンポーネントは円形の計器にハイライトをつけるために使用します。
プロパティ名 | 説明
Center | ハイライトの中心座標を定義します
Radius | ハイライトの半径を定義します
Angle | ハイライトの開始角度を定義します
SweepAngle | ハイライトの終点までの角度を定義します
K | ハイライトの幅を定義します
Highlightコンポーネント

Gearコンポーネント

Gearコンポーネントはギアを表すために使用します。

プロパティ名 | 説明
Center | ギアの中心を定義します
Radius | ギアの半径を定義します
Count | ギアの歯車の数を定義します
Depth | 歯車の大きさを定義します
DimentionsRatio | 歯車の相対幅を定義します

Gearコンポーネント

DigitalTextコンポーネント

DigitalTextコンポーネントはテキストを表示するために使用します。 インジケータのテキストは四角形の断片で表わされます。
プロパティ名 | 説明
Text | インジケータに表示するテキストを割り当てます
Center | インジケータの中心を定義します
Size | インジケータの大きさを定義します
Angle | インジケータの回転角度を定義します（中心から時計回り）
ActiveColor | アクティブな断片の色を割り当てます
InactiveColor | アクティブではない部分の色を割り当てます
SegmentSize | 断片の縦横の大きさを割り当てます
SegmentSpaces | 断片の間隔を割り当てます
TextHorizontalOffset | インジケータの左端からのテキストのオフセットを割り当てます
TextVerticalOffset | インジケータの上からのテキストのオフセットを割り当てます
Font | フォントを割り当てます

DigitalTextコンポーネント


式の使用目的とそのしくみ

式は計器やすべてのオブジェクトに使用できます。式（式の計算結果はプロパティにバインドされます）は計器のほとんどのプロパティに割り当てることができます。オブジェクトを相互に作用させたり、計器に必要な機能を割り当てるために式を使用します。

式を計算する順番は次の通りです。オブジェクトの状態が変わると、そのオブジェクトとそれに含まれているすべてのオブジェクトの式が再計算されます。式の計算結果はオブジェクトのプロパティに割り当てられます。

オブジェクトの状態が変わった時に計器の全オブジェクトの値の式を再計算させるには、RecalculateAllプロパティをTrueにする必要があります。

FillプロパティやStrokeプロパティなど、オブジェクトの外観を定義するプロパティを変更しても式の再計算は行われません。従って、これらのプロパティの値に適用する必要はありません。

式に構文が含まれている場合、計算プロセスに意味上の誤りまたは例外が表示され、式は無効になります。


式の言語構文と意味論について

式は公式の計算に関するタスクです。式の値は計算結果です。式は定数、オブジェクトおよびそのプロパティ・メソッド・演算子・関数の呼び出し、括弧で構築されます。

<使用するデータ型>

.NET frameworkで利用可能なすべてのデータ型が式に使用されます。また、整数値、不動小数点数、論理値、文字列やベクトル用の特別なサポートもあります。

PerpetuumSoft.Framework.Drawing.Vectorのデータ型がベクトルに使用されます。

次の演算子を式に使用することができます。

算術演算子

記号 | 説明
+ | 加算。 数値とベクトルに定義されます。
- | 減算。数値とベクトルに定義されます。
- | 単項マイナス。 数値に定義されます。
* | 乗算。最初の引数には数値とベクトルを使用できます。二番目の引数には数値を使用してください。
/ | 除算。数値に定義されます。
% | 除算の剰余。 数値に定義されます。

論理演算子

記号 | 説明
or | 論理和を表すOR。論理値に定義されます。
and | 論理積を表すAND。 論理値に定義されます。
= | 等しい。 数値、論理値、ベクトルに定義されます。
! = | 等しくない。数値、論理値、ベクトルに定義されます。
< | ～より小さい。数値に定義されます。
<= | ～と同じか小さい。数値に定義されます。
> | ～より大きい。数値に定義されます。
>= | ～と同じか大きい。数値に定義されます。
not | 反転。 論理値に定義されます。

文字列演算子

記号 | 説明
& | 文字列の結合。文字列の値に定義されます。

演算子の優先順位（降順）

‘–’(単項マイナス), ‘not’

‘*’, ‘/’, ‘%’

‘+’, ‘–’, ‘&’

‘>’, ‘>=’, ‘<’, ‘<=’

‘=’, ‘!–’

‘and’

‘or’

定数の割り当て

記号 | 説明
* | 値全体
*.* | 値

例えば、1234は全体で、1234.1234は不動小数点数です。

一般的な単位で線の長さを割り当てるには、定数の後に後置記法を使用します。

記号 | 説明
in | インチ
mm | ミリメートル
cm | センチメートル
pt | 1/72 インチポイント
px | ピクセル

例えば、3inは3インチで3cmは3センチメートルです。

文字列の定数はダブルアポストロフィ（”）で割り当てます。

例：“これは文字列の値です”

ベクトルは“[” и “]”で割り当てます。

例：[,< 数値>] – ベクトルの割り当て。

論理定数は‘true’と‘false’の2つのキーワードで割り当てます。

<変数、オブジェクト、オブジェクトフィールドやメソッドへのアクセス>

式では、計器に利用可能な変数を名前で適用できます。変数名やオブジェクト名での検索は次のように行われます。式に、オブジェクト名によるアドレスがある場合、式に書かれているオブジェクトに対してGetObject関数（希望するオブジェクトを返します）が呼び出されます。GetObject関数はどのオブジェクトに対しても次のことを行います。その名前が要求した名前と一致した場合、オブジェクトそのものを返します。そうでなければ親からGetObject関数を呼び出します。オブジェクトコンテナは、含まれているすべてのオブジェクトから希望するオブジェクトを検索します。従って、計器の全オブジェクトを式に使用できます。一部のオブジェクト（例：Slider）に関しては、GetObject関数は特別変数を返します。上述の規則に従って、オブジェクトコンテナとそれに含まれるオブジェクトに対してそういった変数が利用できます。オブジェクトの構造は下図の通りです。

どのオブジェクトの式にでもInstrument、Joint1、Scale1、NumericLabels1、Ticks1、Slider1、Needle1などの計器オブジェクトを適用できます。

Slider1とNeedle1オブジェクトの式に、Sliderの特別変数を使用できます。

特別変数

SliderBaseオブジェクトの後続のオブジェクト（例：Sliderオブジェクト）に、次の特別変数を使用できます。

特別変数 | 説明
value | ダブル型の変数。Sliderのカレント値。
hot | 論理型変数。マウスポインタがオブジェクト上にある場合、HotはTrueに設定されます。
pressed | 論理型変数。ポインタがオブジェクト上にある時にマウスボタンを押すと、PressedがTrueに設定されます。
center | ベクトル型変数。Sliderのカレント値に該当するポイントで、トラジェクトリの中心0から離れたポイント。

Jointオブジェクトの後続のオブジェクト（Jointオブジェクト）に、次の特別変数を使用できます。

特別変数 | 説明
JointRadius | Jointの半径
JointCenter | ベクトル型の変数。Jointのカレント値に該当するポイントで、トラジェクトリの中心0から離れたポイント
JointTotalAngle | Jointの全角度
JointStartAngle | Ｘ軸からJointの始点までの角度（時計回り）

Guideオブジェクトの後続のオブジェクト（Guideオブジェクト）に、次の特別変数を使用できます。

特別変数 | 説明
GuideLength | Guideの長さ
GuideCenter | Guideの中心ポイント
GuideEndPoint | Guideの終点
GuideStartPoint | Guideの始点

オブジェクトのフィールドやメソッドを適用するには、点‘.’を使用します。

例:

記述例 | 説明
Slider1.Value | Slider1オブジェクトのValueプロパティを適用します。
Slider1.ToString() | Slider1オブジェクトのToString()メソッドを呼び出します。
Line1.StartPoint.Rotate(30) | Line1オブジェクトのStartPointプロパティのRotateメソッドを呼び出します。
[10, 20].Rotate(30).X | Xのベクトル座標[20, 30]。30度回転されます。

注意： オーバーロードされた場合、オブジェクトのメソッドを呼び出すことはできません。

式の言語が型指定されていない場合、どのメソッドを起動させるか定義することはできません。

式では、計器に利用可能な関数を名前で適用できます。検索もオブジェクト名の場合と同じように名前で検索されます。

どのオブジェクトにでも次の関数を使用できます。

条件付き関数

関数 | 説明
If(condition, value1, value2) | 最初のパラメータは論理型で、二番目と三番目はオブジェクト型になります。最初のパラメータがTrueの場合、関数は二番目のパラメータの値を返します。そうでなければ三番目のパラメータの値を返します。
switch (condition[0], value[0], … , value by default) | condition[i]がTrueの場合、関数はvalue[i]を返します。任意のiのcondition[i]がFalseの場合、デフォルトでvalueが返されます。

形式関数:

関数 | 説明
format (object, mask) | objectはオブジェクト型で、maskは文字列型です。マスクに応じてオブジェクトの文字列を返します。

数学的関数:

関数 | 説明
sin(argument) | 引数のサインを計算します。argumentはダブル型で、その計算結果はダブル型になります。
cos(argument) | 引数のコサインを計算します。argumentはダブル型で、その計算結果はダブル型になります。
tan(argument) | 引数のタンジェントを計算します。argumentはダブル型で、その計算結果はダブル型になります。
atan(argument) | 引数のアークタンジェントを計算します。argumentはダブル型で、その計算結果はダブル型になります。
sqr(argument) | 引数を二乗に計算します。argumentはダブル型で、その計算結果はダブル型になります。
sqrt(argument) | 引数の平方根を計算します。argumentはダブル型で、その計算結果はダブル型になります。
log(argument) | 引数の自然対数を計算します。argumentはダブル型で、その計算結果はダブル型になります。
exp(argument) | eを底とする数値のべき乗を計算します。argumentはダブル型で、その計算結果はダブル型になります。
sign(argument) | 引数が負の場合は-1、0の場合は0、正の場合は1を返します。argumentはダブル型で、その計算結果はint型になります。
abs(argument) | 引数の絶対値を返します。argumentはダブル型で、その計算結果はダブル型になります。
round(argument1, argument2) | argument1に四捨五入の対象となる数値を、argument2に基準値を指定します。argument1はダブル型で、argument2はint型で、計算結果はダブル型になります。

式は任意の関数やメソッドの引数になることができます。式の計算結果が引数型に合わない場合、式は計算されません。

日付関数:

関数 | 説明
getMonth (argument) | argumentに割り当てられた日付で月を返します。argumentはSystem.DateTime型になります。
getDayOfWeek (argument) | argumentに割り当てられた日付で曜日を返します。argumentはSystem.DateTime型になります。
getQuarter (argument) | argumentに指定した日付の四半期を返します。argumentはSystem.DateTime型になります。

また、他の日付値を取得するためにSystem.DateTime型の他のプロパティやメソッドを使用することもできます。

範囲関数:

関数 | 説明
Range (currentValue, range, zeroPoint) | データの間隔を取り出します。すべての引数は数値型になります。
currentValue | カレント値。
range | 範囲。
zeroPoint | 原点。

PerpetuumSoft.Framework.Vector型のオブジェクトを作成するための構造が式の言語内に提供されています。ベクトルは次の構造で作成されます。

[, ] 直接、式に他の型のオブジェクトを作成することはできませんが、カスタムな関数（希望する型のオブジェクトを作成するために式で使用します）を実現できます。

SliderBase型のオブジェクト（例：Slider）やそれに含まれるオブジェクトに次のような特別関数が使用できます。

関数 | 説明
r(radius) | Sliderのカレント値を示すポイントで、トラジェクトリの半径（中心から）の距離を返します。
r(value, radius) | Valueパラメータのポイントで、トラジェクトリの半径（中心から）の距離を返します。
a() | スライダの回転角度を返します。

<式で利用可能なカスタム関数やカスタム変数の実現>

オブジェクトの式で利用可能なカスタム関数やカスタム変数を作成するには、カスタムなオブジェクトを実現する必要があります（それに応じてPerpetuumSoft.Framework.Expressions.IExpressionSiteインターフェースを実現します）。

その後で関数を登録する必要があります。登録は次のように行えます。

PerpetuumSoft.Framework.Expressions.BuiltInFunctions.RegisterFunction(<Function name>, <inplemented IFunction object>);


.NET ModelKit Suite User(s)Guide

Instrumentデザイナの使用法とその機能について

Instrumentation ModelKitのデザイナは計器の作成に使用します。デザイナの外観は下図の通りです。計器はさまざまなオブジェクトが配置されているオブジェクトを表します。各オブジェクトにはプロパティがあり、プロパティウィンドウに表示されます。このウィンドウでプロパティ値を編集できます。ほとんどのプロパティは特別な言語で割り当てられた式にバインドできます。式は式ウィンドウに表示されます。このウィンドウ内で式を編集できます。

Instrumentation ModelKitのデザイナで計器を作成するために、[挿入]メニューまたはコンポーネントツールボックス（Elements toolbar）のボタンにビジュアルオブジェクトや非ビジュアルオブジェクトが用意されています。計器にコンポーネントを配置するには、「コンポーネントツールボックス（Elements toolbar）」内のメニューから希望するコンポーネントを選び、作業領域内で左マウスボタンをクリックするか、左マウスボタンを押したままコンポーネントを希望するサイズまで引き伸ばしてください。

計器の構造はInstrumentのオンラインウィンドウに表示されます。マウスでドラッグしてオブジェクトの位置関係を変更できます。

[ファイル]メニュー

コマンド | 説明
[ファイル]/[新規]/[白紙] | 新しい白紙の計器を作成します
[ファイル]/[新規]/[ウィザード] | ウィザードを使用して新しい計器を作成します
[ファイル]/[開く Ctrl+O] | ファイルから計器を読み込むためにダイアログボックスを呼び出します
[ファイル]/[開いて結合] | ファイルから計器を読み込むためにダイアログボックスを呼び出します。同時に新しい計器が既存の計器に追加されます。
[ファイル]/[ウィザードで開いて結合] | 計器を読み込むウィザードを呼び出します。同時に新しい計器が既存の計器に追加されます。
[ファイル]/[保存 Ctrl+S] | 計器を保存します
[ファイル]/[名前を付けて保存] | 計器に名前を付けて保存します
[ファイル]/[エクスポート] | 計器を一般的なビットマップまたはベクトル形式（JPEG、GIF、PNG、BMP、SVG、Macromedia Flash）にエクスポートし、[ファイルに保存]ダイアログボックスを呼び出します

セパレータの下にファイルシステムのパスを含む、最近使ったファイルの履歴を見ることができます。

[編集]メニュー

コマンド | 説明
[編集]/[元に戻す Ctrl+Z] | 計器で行った変更をキャンセルします
[編集]/[やり直し Ctrl+Y] | 計器の編集時に元に戻した動作をやり直します
[編集]/[切り取り Ctrl+X] | 選択したオブジェクトを切り取ります
[編集]/[コピー Ctrl+C] | 選択したオブジェクトをコピーします
[編集]/[貼り付け Ctrl+V] | 選択したオブジェクトがコンテナではない場合、バッファから選択したオブジェクトまたはその親に貼り付けます
[編集]/[削除 Ctrl+Del] | 選択したオブジェクトを削除します

[表示]メニュー

コマンド | 説明
[表示]/[ルーラの表示] | 作業領域にルーラを表示するかどうかの切り替えを行います
[表示]/[グリッドの表示] | 作業領域にグリッドを表示するかどうかの切り替えを行います
[表示]/[グリッドに合わせる] | オブジェクトの制御ポイントをグリッドに合わせるかどうかの切り替えを行います

[ツール]メニュー

コマンド | 説明
[ツール]/[選択 F2] | [選択]ツールを有効にします。[選択]ツールは作業領域のオブジェクトを選択したり、デザイナで編集することができます。
[ツール]/[テスト F3] | 編集した計器をテストするために[テスト]ツールを有効にします
[ツール]/[パン F4] | 作業領域のイメージをパンします
[ツール]/[ズームイン] | オブジェクトをズームインします
[ツール]/[ズームアウト] | オブジェクトをズームアウトします
[ツール]/[矩形に合わせてズーム] | 選択した矩形をズームインするために[矩形に合わせてズーム]ツールを有効にします
[ツール]/[ダイナミックズーム] | 選択した領域のズームを変更するために[ダイナミックズーム]ツールを有効にします

[挿入]メニュー

挿入コマンドはオブジェクトの挿入先ごとにグループ化されています。

[挿入]\[構造]メニューにあるオブジェクトは計器構造を割り当てるために使用します。

コマンド | 説明
[挿入]/[構造]/[ジョイント] | 円状のトラジェクトリ（Jointオブジェクト）を追加します
[挿入]/[構造]/[ガイド] | 線状のトラジェクトリ（Guideオブジェクト）を追加します
[挿入]/[構造]/[スケール] | スケール（Scaleオブジェクト）を追加します
[挿入]/[構造]/[スライダ] | スライダ（Sliderオブジェクト）を追加します
[挿入]/[構造]/[グループ] | オブジェクトをグループ化するコンテナ（Groupオブジェクト）を追加します

[挿入]\[プリミティブ] メニューにはプリミティブ（基本図形）を追加するためのコマンドがあります。

コマンド | 説明
[挿入]/[プリミティブ]/[線] | 線（Lineオブジェクト）を追加します
[挿入]/[プリミティブ]/[円] | 円（Circleオブジェクト）を追加します
[挿入]/[プリミティブ]/[楕円] | 楕円（Ellipseオブジェクト）を追加します
[挿入]/[プリミティブ]/[矩形] | 矩形（Rectangleオブジェクト）を追加します
[挿入]/[プリミティブ]/[角丸矩形] | 角丸矩形（RoundedRectangleオブジェクト）を追加します
[挿入]/[プリミティブ]/[枠] | 枠（Frameオブジェクト）を追加します
[挿入]/[プリミティブ]/[イメージ] | イメージ（Pictureオブジェクト）を追加します
[挿入]/[プリミティブ]/[イメージセット] | イメージセット（PictureSetオブジェクト）を追加します
[挿入]/[プリミティブ]/[ラベル] | ラベル（Labelオブジェクト）を追加します
[挿入]/[プリミティブ]/[弧] | 弧（Arcオブジェクト）を追加します
[挿入]/[プリミティブ]/[パイ] | パイ（Pieオブジェクト）を追加します
[挿入]/[プリミティブ]/[ドーナツ型] | ドーナツ型（RingSectorオブジェクト）を追加します

[挿入]\[スケール要素]メニューにはスケールをデザインするためにオブジェクトを追加するコマンドがあります。

コマンド | 説明
[挿入]/[スケール要素]/[スケールラベル] | スケールの分割領域に番号を表示するためにスケールラベルを（ScaleLabelsオブジェクト）を挿入します
[挿入]/[スケール要素]/[スケールマーカ] | スケールにマーカ（ScaleMarksオブジェクト）を追加します
[挿入]/[スケール要素]/[目盛] | スケールに目盛（Ticksオブジェクト）を追加します
[挿入]/[スケール要素]/[カスタムラベル] | スケールにテキストラベル（CustomLabelsオブジェクト）を追加します
[挿入]/[スケール要素]/[RangedLevel] | RangedLevelオブジェクトを追加します
[挿入]/[スケール要素]/[LinearLevel] | LinearLevelオブジェクトを挿入します
[挿入]/[スケール要素]/[タンク] | Tankオブジェクトを挿入します
[挿入]/[スケール要素]/[スケールタイトル] | スケールタイトル（ScaleTitleオブジェクト）を挿入します

[挿入]\[上級] には特別な目的を持ったオブジェクトを追加するためのコマンドがあります。

コマンド | 説明
[挿入]/[上級]/[針] | 針（Needleオブジェクト）を追加します
[挿入]/[上級]/[円形ノッチ] | 円形ノッチ（CircularNotchesオブジェクト）を追加します
[挿入]/[上級]/[線形ノッチ] | 線形ノッチ（LinearNotchesオブジェクト）を追加します
[挿入]/[上級]/[スプリング] | スプリング（Springオブジェクト）を追加します
[挿入]/[上級]/[星型] | 星型（Starオブジェクト）を追加します
[挿入]/[上級]/[ポリゴン] | 正多角形（Polygonオブジェクト）を追加します
[挿入]/[上級]/[ハイライト] | HighLightオブジェクトを挿入します
[挿入]/[上級]/[ギア] | Gearオブジェクトを挿入します
[挿入]/[上級]/[デジタル] | デジタルインジケータ（Digitsオブジェクト）を追加します
[挿入]/[上級]/[オドメータ] | オドメータオブジェクト（Odometerオブジェクト）を追加します

[ヘルプ]メニュー

ツールバーには選択したオブジェクトの出力順を変更するためのボタンもあります。

ボタン | 説明
[選択したオブジェクトを前方に移動]* | 選択したオブジェクトを１つ上に移動します
[選択したオブジェクトを後方に移動]* | 選択したオブジェクトを１つ下に移動します
[選択したオブジェクトを先頭に移動]* | 選択したオブジェクトを先頭に移動します
[選択したオブジェクトを最後に移動]* | 選択したオブジェクトを最後に移動します
[スクリプトのチェック] | （計器で使用する）構文チェックを行います。スクリプトをチェックしてください。

*選択したオブジェクトのグループ順を変更しても、グループ内の順序関係はそのままです。

作業領域での[選択]ツールの使用法について説明します。

[選択]モードが有効の場合、作業領域内（Work area）のビジュアルオブジェクトをマウスで選択できます。オブジェクトのグループを選択するにはCtrlキーを押したまま各オブジェクトを選択するか、左マウスボタンを押したままオブジェクトのグループを選択できます。

円の制御ポイントは選択したオブジェクト内に表示されます。

選択したオブジェクトは計器構造のツリーに強調表示されます。

選択したオブジェクトに次のような編集処理を行うことができます。

・クリップボードへのコピー（クリップボード）

・クリップボードからの貼り付け

・削除

・出力順の変更

・プロパティウィンドウ（Properties window）を使用してプロパティを変更する

・マウスでのオブジェクトの位置変更

・オブジェクトの制御ポイントを移動して、あるオブジェクトのプロパティを変更する

選択したオブジェクトの制御ポイントは主要なプロパティを変更するために使用します。ポイントの位置はマウスでドラッグして変更できます。

各オブジェクトには独自の制御ポイントが設定されています。例えば、矩形オブジェクトには10個のポイントがあり、そのうちの1つは中心を変更するためのもので、1つは回転角度を変更するためのもので、それ以外のポイントは矩形領域のサイズを変更するために使用します。

矩形オブジェクトのデザイナの制御ポイント

線形オブジェクトのデザイナの制御ポイント

一部のオブジェクトのデザイナには特定のオブジェクト型（例：RingSectorオブジェクトのデザイナ）専用のプロパティを変更するための制御ポイントがあります。

RingSectorのデザイナの制御ポイント

制御ポイントの位置が変わると、そのオブジェクトのプロパティも変わります。しかし、そのプロパティに式が割り当てられている場合は制御ポイントの位置を変えても意味がありません。そのような制御ポイントは赤く表示されます。プロパティにバインドされた式をデザイナが自動的に変更できる場合、その制御ポイントは黄色で表示されます。

制御ポイントに式がバインドされているオブジェクトのデザイナ例

カレントの値を示すためにSliderオブジェクトにオブジェクトが含まれている場合、デザイナでオブジェクトの位置をSliderのカレント値にバインドできます。それには、Cｔｒｌボタンを押したまま制御ポイントをクリックしてください。式のバインドは同様なアクションでキャンセルされます。

「Instrument Outline」ウィンドウはカレントの計器構造をツリー表示します。作業領域（Work area）にオブジェクトを配置すると、そのオブジェクトが「Instrument Outline」ウィンドウに自動的に表示されます。選択したオブジェクトは青色でツリーに表示されます。オブジェクトをマウスでドラッグすることにより、このウィンドウ内でオブジェクトの相対位置を変更することができます。

“Needle1”を“Slider1”にドラッグする

「式ウィンドウ」はオブジェクトのプロパティにバインドした式を編集するために使用します。左側には、式を割り当てることができるプロパティ名が表示されます。右側では、式のスクリプトを記述したり、スクリプトエディタを実行することができます。プロパティにスクリプトが割り当てられていない場合は、右欄の四角形が空白で表示されます。スクリプトが正確に割り当てられている場合、その四角形に青いチェックマークが表示されます。割り当てたスクリプトに構文エラーがある場合は、四角に赤いバツ印が表示されます。

「プロパティウィンドウ」は選択したオブジェクトのプロパティを表示したり編集するために使用します。


.NET ModelKit Suite User(s)Guide

Windows Formsアプリケーションで使用するコンポーネント

Windows Formsアプリケーションで計器を表示したり編集するために、「Widget」と「IndicatorWidget」という2つのコンポーネントが使用されます。「Widget」コンポーネントは計器を表示したりマウスで制御するために使用します。「IndicatorWidget」コンポーネントは「Widget」コンポーネントの派生コンポーネントです。これはSliderオブジェクトを含む計器を表示するために使用します。また、「IndicatorWidget」コンポーネントは表示されたスライダのValueプロパティやValueChangedイベントにアクセスするための追加機能を提供します。


.NET ModelKit Suite User(s)Guide

Widgetコンポーネントの使用法とその機能

Widgetコンポーネントの使用法について例を挙げて説明します。

この結果はWidgetUseExampleで確認することができます。

Windows Formsアプリケーションを作成します。そしてフォームにWidgetコンポーネント（Instrumentation ModelKitのツールボックスにあります）を配置します。

コンポーネント上をダブルクリックすると、Instrumentデザイナが立ち上がります。デザイナに、Instrumentation ModelKitのウィザードから既存のオブジェクトを開きます。例えば、Dialsフォルダから「Double Dial1」を開き、「Ok」ボタンをクリックします。選択したオブジェクトがWidgetコンポーネントに表示されます。

計器を使用できるかどうかを確認するためにアプリケーションを実行します。

Widgetコンポーネントに取得したコントロール要素が表示され、ユーザの動作に応じて反応します。次に、コントロール要素のカレント値を取得したり設定する機能が必要です。それにはInstrumentオブジェクトを返すwidget1.Instrumentプロパティを使用します。例えば、Slider1またはSlider2に必要なオブジェクトを取得するために、InstrumentのGetObject関数を使用します。次に、フォームにLabelコンポネントを配置してコントロール要素の値をテキストで表示するようにします。

プログラムコードに次のコードを追加してください。ここでは、Form1_LoadがプログラムのメインフォームのLoadイベントハンドラです。

    private Slider slider1 = null;
    private Slider slider2 = null;

    private void Form1_Load(object sender, System.EventArgs e)

    {

      slider1 = widget1.Instrument.GetObject("Slider1") as Slider;

      slider2 = widget1.Instrument.GetObject("Slider2") as Slider;

      slider1.ValueChanged += new PerpetuumSoft.Framework.Model.PropertyEventHandler(slider1_ValueChanged);

      slider2.ValueChanged += new PerpetuumSoft.Framework.Model.PropertyEventHandler(slider2_ValueChanged);

    }

    private void slider1_ValueChanged(object sender, PerpetuumSoft.Framework.Model.PropertyEventArgs args)

    {

      label1.Text = "Slider1.Value プロパティ値 = " + slider1.Value.ToString("0.00");

    }

    private void slider2_ValueChanged(object sender, PerpetuumSoft.Framework.Model.PropertyEventArgs args)

    {

      label2.Text = "Slider2.Value プロパティ値 = " + slider2.Value.ToString("0.00");

    }

プログラムの実行結果は次の通りです。

指定したポイントに配置する計器オブジェクトを取得するには、GetElementAtメソッドを使用できます。

次のようにMouseMoveイベントハンドラを記述します。

    private void widget1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)

    {

      PerpetuumSoft.Instrumentation.Model.Element element = widget1.GetElementAt(e.X, e.Y);

      label3.Text =  "マウスは " + element.Name + "上にあります";

    }

プログラムの実行結果は次の通りです。

Widgetコンポーネントには次の専用プロパティがあります。

  •
                ZoomScale - 計器のズーム倍率を割り当てます

  •
                HideFocusRectangle - フォーカス時にコントロールの周りに矩形を描画するかどうかを定義します

  •
                    InvalidateInterval - この値がゼロ以上の場合、計器の領域を更新するためのタイマが使用されます

    •

*InvalidateIntervalプロパティはミリ秒単位で更新間隔を割り当てます。


.NET ModelKit Suite User(s)Guide

IndicatorWidgetコンポーネントの使用法とその機能

IndicatorWidgetコンポーネントの使用法はWidgetコンポーネントと似ています。

しかし、IndicatorWidgetコンポーネントには複数のスライダの1つのカレント値を簡単に取得できるプロパティが追加されています。

IndicatorWidgetコンポーネントにはValueプロパティとValueChangedイベントが追加されています。これらはIndicatorWidgetコンポーネントで使用する複数のスライダの1つのスライダのValueプロパティとValueChangedイベントに対応します。利用可能なスライダを割り当てるには、SliderNameプロパティにスライダ名を割り当てます。

さらに、IndicatorWidgetコンポーネントはキーボードを使用して、指定したスライダを自動的に移動することができます。

移動量はIncrementプロパティに割り当てます。

MinimumプロパティとMaximumプロパティを使用して、選択したスライダのスケール値（最小値/最大値）を変更できます。

上述したプロパティはすべて、IndicatorWidgetコンポーネントに計器またはスライダ名を指定しなければ意味がないので十分注意してください。計器を割り当てたら、使用するスライダ名をSliderNameプロパティのプルダウンリストから指定する方が便利です。計器のスライダ名がすべてそこに表示されます。

IndicatorWidgetコンポーネントの使用例について説明します。

この例は「IndicatorWidgetUseExample」サンプルで確認できます。

フォーム付きのWindowsFormsアプリケーションを作成し、そのフォームにIndicatorWidgetコンポーネントを配置します。

IndicatorWidgetコンポーネントをダブルクリックしてInstrumentデザイナを立ち上げ、Instrumentation ModelKitのウィザードから既存の計器を開きます。例えば、Dialsフォルダから「Dial4」を開き、「Ok」ボタンをクリックします。選択した計器がIndicatorWidgetコンポーネントに表示されます。

計器を使用できるかどうかを確認するためにアプリケーションを実行します。

フォームにLabelコンポーネントを配置してコントロール要素のカレント値をテキストで表示するようにします。スライダ値にアクセスするには、SliderNameプロパティに「Slider1」を割り当てます。次のようにValueChangedイベントハンドラを記述します。

    private void indicatorWidget1_ValueChanged(object sender, PerpetuumSoft.Framework.Model.PropertyEventArgs args)

    {

      label1.Text =  "カレント値 = " + indicatorWidget1.Value.ToString("0.00");

    }

プログラムの実行結果は次の通りです。

スライダのカレント値にアクセスするのは簡単です（Widgetコンポーネントのサンプルと比較してみてください）。 スライダのカレント値にアクセスする場合はIndicatorWidgetコンポーネントの使用をお勧めします。

ここでは、MinimumプロパティとMaximumプロパティを使用してスライダのスケール値の最小値/最大値を変更します。最大値を100に設定してください。

キーボードからスライダ値を変更するのに都合がいいように、Incrementプロパティを10に設定してください。ここで左ボタンキーまたは下ボタンキーを押すたびに、スライダ値が10づつ減ります。右ボタンまたは上ボタンを押すたびに、スライダ値は10づつ増えます。

IndicatorWidgetコンポーネントはWidgetコンポーネントから継承されているので、ZoomScaleプロパティ、HideFocusRectangleプロパティ、InvalidateIntervalプロパティを使用することができます。


.NET ModelKit Suite User(s)Guide

Webアプリケーションで使用するコンポーネント

Webアプリケーションで計器を表示したり制御するには、WidgetProducerコンポーネントとWidgetHolderコンポーネントを使用します。WidgetProducerコンポーネントには表示する計器が含まれています。このコンポーネントはそれぞれのページに配置されます。このページが適用されると、WidgetProducerコンポーネントはページ内容を計器のイメージに置き換えます。WidgetHolderコンポーネントは計器を表示したりマウスで制御するために使用します。WidgetHolderコンポーネントはWidgetProducerコンポーネントに含まれている計器を表示します。


.NET ModelKit Suite User(s)Guide

WidgetProducerコンポーネントとWidgetHolderコンポーネントの使用法とその機能

WidgetProducerコンポーネントとWidgetHolderコンポーネントの使用法について例を挙げて説明します。

この結果はWebサンプルで確認できます。

Webアプリケーションを作成し、WidgetProducerコンポーネントを表示するページを追加します。追加したページに「ProducerPage」という名前をつけます。

（コンテキストメニュから「Run Designer」を選んで）Instrumentエディタを開き、表示する計器を割り当てます。

ウィザードを使用してデザイナで使用する計器を選ぶか、新しい計器を作成します。「Ok」ボタンをクリックして計器の設定を行います。

アプリケーションのスタートページにWidgetHolderコンポーネントを配置します。ProducerUrlプロパティに、WidgetProducerコンポーネントが置かれているページアドレス（ProducerPage.aspx）を設定します。計器の2つの針値を割り当てるためにそのページにコントロール要素を追加します。

上部の入力ウィンドウに、計器の上の針の値が割り当てられます。

下部の入力ウィンドウに、計器の下の針の値が割り当てられます。

「更新」ボタンを押すと、計器の値が更新されます。

次のように、「更新」ボタンのClickイベントハンドラを記述します。

    private void Button1_Click(object sender, System.EventArgs e)

    {

      WidgetHolder1.Parameters["Slider1", "Value"] = value1TextBox.Text;

      WidgetHolder1.Parameters["Slider2", "Value"] = value2TextBox.Text;

    }

ここで、Parametersプロパティは典型的なコレクションを表します。各コレクションオブジェクトは「オブジェクト」、「プロパティ」、「値」の3つを表します。

プログラムを実行します。

WidgetHolderコンポーネントはSystem.Web.UI.IPostBackEventHandlerインターフェースを実現します。EnablePostBackプロパティがTrueに設定されている場合、計器上でのマウスクリックはInstrumentClickイベントで処理されます。その記述例が下記にあります。WidgetHolderコンポーネントのInstrumentClickイベントハンドラは次のように記述します。

    private void WidgetHolder1_InstrumentClick(object sender, PerpetuumSoft.Instrumentation.Web.InstrumentClickEventArgs args)

    {

      PerpetuumSoft.Instrumentation.Model.Instrument instrument = args.Element.Instrument;

      PerpetuumSoft.Instrumentation.Model.Scale scale = instrument.GetByName("Scale1") as PerpetuumSoft.Instrumentation.Model.Scale;

      WidgetHolder1.Parameters["Slider1", "Value"] = scale.PointToValue(new PerpetuumSoft.Framework.Drawing.Vector(args.X, args.Y)).ToString(System.Globalization.CultureInfo.InvariantCulture);

    }


.NET ModelKit Suite User(s)Guide

スライダ付きの簡単な計器をデザイン

計器のデザインで使用するInstrumentデザイナについて説明します。

このサンプルはInstrumentデザイナに含まれているHorisontalSlider.imkファイルで確認できます。

＜スライダ付きの計器を作成する＞

デザインする計器の必要条件を定義します。

1. 0から100までの範囲をスライダに設定する

2. スケールの0～80までと80～100までの範囲にそれぞれ違う色を設定

3. スライダの値が80を超えると、針の色を変更

4. マウスをスライダ上に移動させると、近くにカレント値をテキストとして表示

条件1： 0～100までの範囲をスライダに設定

計器に線状のトラジェクトリ( [image])を配置します。トラジェクトリはスケールの形状を割り当てるために使用します。計器にScaleコンポーネント( [image])を配置します。スケールには値の範囲（最小値/最大値）を割り当てます。スケールをトラジェクトリ上に配置させるには、トラジェクトリ内にスケールを配置してください（それには、スケールをInstrumentのツリーにドラッグしてください）。

計器の構造は次のようになります。

スケールオブジェクトの表記には、スケールオブジェクトに目盛やテキストマーカを付けてください。それには、コンポーネントツールボックスからTicksコンポーネントとScaleLabelsコンポーネントをScale1オブジェクトに追加します。追加した後の計器の構造は次のようになります。

計器自体は次のように表示されます。

Ticks1のDistanceプロパティを10に設定し、NumericLabelsのDistanceプロパティは20に設定します。

カレント値を表示したり、マウスで変更するために、計器にSliderコンポーネント( [image])を追加します。計器の構造は次のようになります。

スライダの表記には、Needleコンポーネント( [image])をSlider1に追加してください。

Needle1をスライダの値にバインドします。それには、Needle1の式ウィンドウの各プロパティに以下の式を記述してください。

プロパティ名 | 式
StartPointプロパティ | “r(0px)”
EndPointプロパティ | "r(-50px)"

これで、マウスでスライダを動かせます。

条件2： スケールの0～80までと80～100までの範囲にそれぞれ違う色を設定

色エディタを使用して、Scale1オブジェクトのColorizerプロパティを変更してください。

変更後、計器は次のように表示されます。

条件3： スライダの値が80を超えると、針の色を変更

計器のスタイルコレクション（Instrument.Stylesプロパティ）に、「ColdColor」（針を青色で表示）と「HotColor」（針を赤色で表示）という2つのスタイルを追加してください。Needle1オブジェクトの（式ウィンドウの）Styleプロパティに次の式を記述してください。

if (Slider1.Value < 80, "ColdColor", "HotColor").

カレント値が80未満の場合

カレント値が80以上の場合

条件4： マウスをスライダ上に移動させると、近くにカレント値をテキストとして表示

Slider1オブジェクトにLabelコンポーネント( [image])を追加してください。

Label1オブジェクトのBreakEvenBubblingプロパティをTrueに設定します。これはマウスイベントがLabel1からSlider1に渡されないようにするためです。

Label1オブジェクトの式ウィンドウのCenterプロパティに、"r(-38px) + [120, 20]"を記述してください。Label1の中心はスライダの値に応じて設定され、少し移動します。

（式ウィンドウの）Visibleプロパティを“hot”に設定します。マウスがNeedle1上にきたときだけLabel1オブジェクトが表示されます。


複雑な式を使用して計器を作成

スライダを平面内で移動させられる計器を作成します。

この計器はInstrumentデザイナのGauge2D.imkファイルにあります。

まず、計器の必要条件を定義します。

1. 計器に基準線（軸）を2つ設定

2. 平面内でスライダを移動

3. 各軸にスライダの中心を示す線を表示

4. 平面上のスライダの脇に位置を示すテキストを表示

条件1： 計器に基準線（軸）を2つ設定

スケールの形状を割り当てるために、計器にGuide( [image])を配置します。

計器にScaleコンポーネント( [image])を配置します。Scaleには範囲（最小値/最大値）を割り当てました。トラジェクトリに沿ってScaleを配置するために、トラジェクトリ内にScaleを配置しなければなりません（ただオブジェクトツリーにScaleをドラッグアンドドロップするだけです）。

カレント値を表したり、マウスを移動させて変更できるように、Sliderコンポーネント( [image])を追加します。

スケールの表記には、スケールに目盛やテキストを配置します。それには、コンポーネントツールボックスからTicksコンポーネントとNumericLabelsコンポーネントをScale1オブジェクトに追加してください。追加後のオブジェクトの構造は次のように表示されます。

計器自体は次のように表示されます。

Ticks1のDistanceプロパティを10に、NumericLabels1のDistanceプロパティを20に設定してください。

スライダの表記には、Slider1オブジェクトにNeedleコンポーネント( [image])を追加します。

Needle1オブジェクトのStrokeプロパティを「SimpleStroke」に設定します。

では、Needle1オブジェクトをスライダ値にバインドします。Needle1の式ウィンドウに次の式を記述してください。

プロパティ名 | 式
StartPointプロパティ | “r(1.3cm)”
EndPointプロパティ | “r(0.8cm)”

マウスでスライダを動かすと移動します。

結果的にはOX軸を取得します。

別の線形トラジェクトリ、スケール、スライダを割り当てるために上述した手順を繰り返し行い、OY軸を取得します。オブジェクトの構造は下図のようになるはずです。

計器自体は次のように表示されます。

条件2： 平面内でスライダを移動

OX軸とOY軸に共通のスライダを作成します。それにはSlider2にRectangleコンポーネント( [image])を追加し、Rectangle( [image])のStrokeプロパティを「SimpleStroke」に設定します。同時にGuide2をSlider1オブジェクトに配置します。追加後のオブジェクトの構造は次のようになります。

では、Rectangleオブジェクトの式ウィンドウのCenterプロパティに、次の式をを記述します。

“[Slider1.GetPosition(0).X, Slider2.GetPosition(0).Y]”

SliderのGetPosition関数は引数によって割り当てられた値のポイントを返します。

これでRectangle1オブジェクトをマウスで動かすと、Slider1とSlider2の値が変わります。

条件3： 各軸にスライダの中心を示す線を表示

Slider1オブジェクトにLine1コンポーネント( [image])を追加します。Line1のStrokeプロパティをSimpleStrokeに設定し、線の色を赤に設定します。Line1オブジェクトの式ウィンドウに次の式を記述してください。
プロパティ名 | 式
StartPointプロパティ | “r(0.42cm)”
EndPointプロパティ | “r(-5.93cm)”
OX軸にスライダの中心を示す線が取得されます。

Slider2にLine2コンポーネント( [image])を追加します。Line2のStrokeプロパティを「SimpleStroke」に設定し、線の色を青に設定します。Line2オブジェクトの式ウィンドウに次の式を記述してください。

プロパティ名 | 式
StartPointプロパティ | “r(7.2cm)”
EndPointプロパティ | “r(-0.42cm)”

OY軸にスライダの中心を示す線が取得されます。

結果的にオブジェクトの構造は次のようになります。

計器自体は次のように表示されます。

条件4： 平面上のスライダの脇に位置を示すテキストを表示

Slider2オブジェクトにLabelコンポーネント( [image])を作成します。

Label1オブジェクトのFillプロパティの塗りつぶしの色を緑色に設定します。Label1オブジェクトの式ウィンドウのCenterプロパティとTextプロパティに次の式を設定します。

プロパティ名 | 式
Centerプロパティ | “[Slider1.GetPosition(0).X, Slider2.GetPosition(0).Y] + [35px, -15px]”
Textプロパティ | " "(" & format(Slider2.Value, "00.0") & "; " & format(Slider1.Value, "00.0") & ")" ”


OPCについて

Instrumentation ModelKitにはOPCサーバとデータ交換を行う機能があります。OPCはリアルタイムデバイスと相互運用するための業界標準のものです。複雑なCOMインターフェースを使用せずに、OPCConnectionとOPCChannelの2つのコンポーネントの間でデータ交換を行うことができます。


OPCConnectionコンポーネント

OPCConnectionコンポーネント( [image])はCOMサーバへの接続設定を行うために使用します。デザイン時の編集は標準的なインターフェースを使用して行われます。フォームにコンポーネントを配置し、プロパティグリッドから接続設定ウィンドウを呼び出すだけです。

このウィンドウはローカルのOPCサーバを表示していますが、ローカルネットワーク内で利用可能な任意のサーバへの接続が可能です（DCOM許可を含む許可が必要です。）。


OPCChannelコンポーネント

OPCChannelコンポーネント( [image])は選択した接続データ伝送チャンネルを設定するために使用します。データ伝送チャンネルを設定する前に、プロパティグリッドのOPCConnectionプロパティを使用して、必要なOPCConnectionをコンポーネントに設定する必要があります。デザイン時にOPCConnectionが設定されている場合、または実行時でのユーザの要求に応じて（EstablishConnectionメソッド）、OPCサーバへの接続が行われます。 接続設定を行った後、プロパティグリッドのItemsプロパティを使用してサーバで利用可能な任意の位置を選択できます。

位置を選択すると、ID、アクセス権限、正規のデータ型など、位置に関するプロパティが表示されます。

正規のデータ型とは標準のCLS対応の.NET型です。

データチャンネルからの読み取り/データチャンネルへの書き込みはOPCChannelのパブリックメソッドで処理されます。

AsynchronousRead - 非同期のデータスライスの読み取り

AsynchronousSubscription - 頻度と1回のデータスライスの数を定義する、データスライスへの非同期のサブスクリプション

Write - 書き込み

どの操作結果も非同期で返されます。この場合、OPCChannelがイベントを発生します。非同期の読み取り（AsynchronousReadメソッド）または非同期のサブスクリプション（AsynchronousSubscriptionメソッド）で取得したデータの伝送時に、DataTransmissionイベントが発生します（このイベントの引数には要求されたデータとITransactionの伝送記述子が含まれます）。WriteStatusイベントは書き込み処理の結果を返すために使用します。

イベントを処理するには、次のようなイベントハンドラを指定する必要があります。

opcChannel1.DataTransmission += new PerpetuumSoft.Framework.Connectivity.DataTransmissionEventHandler(this.handler);

詳細はパッケージに含まれているクラスレファレンスやサンプルを参照してください。サンプルをきちんと操作するには、Matrikon社のOPCのシミュレーションサーバをインストールする必要があります。


アプリケーションの作成手順

OPCChannelコンポーネントとOPCConnectionコンポーネントの使用法について例を挙げて説明します。フォーム付きのWindowsFormsアプリケーションを立ち上げます。次に、Instrumentation ModelKitツールボックスからIndicatorWidgetコンポーネント（取得可能な値を表示する）とOPCConnectionをフォームに配置します。

プロパティグリッドのOPCServerプロパティを使用して、接続するOPCサーバを選択します。OPC接続のダイアログウィンドウからローカルホストまたはローカルネットワークにインストールされているOPCサーバを1つ選択します。

次に、Instrumentation ModelKitツールボックスタブからOPCChannelコンポーネントをフォームに配置します。

あらかじめ指定しておいた接続にOPCChannelをバインドします。それには、プロパティグリッドのOPCConnectionプロパティを設定してください。

次に、プロパティグリッドのOPCChannelのItemsプロパティに、データを受け取るOPCサーバの位置を指定します。任意の位置を選択できますが、各OPCChannelに同じ位置を設定しないよう注意してください。

チャンネル設定が済んだら、データを読み取るためにクエリをチャンネルにディスパッチする必要があります。フォームのアップロードまたはユーザの要求で、AsynchronousSubscriptionメソッドを呼び出すだけです。このメソッドはオーバーロードされます。このオーバーロードされた最初のメソッドにはパラメータが1つあります（イベントの間隔はミリ秒）。

    private void Form1_Load(object sender, System.EventArgs e)

    {

      opcChannel1.AsynchronousSubscription(500);

    }

次に、OPCChannelがOPCサーバからデータを受け取る際に発生するDataTransmissionイベントのイベントハンドラを作成します。それには、プロパティグリッドのEventsタブをダブルクリックして新しいメソッド（DataTransmissionイベントハンドラ）を追加してください。

    private void opcChannel1_DataTransmission(object sender, PerpetuumSoft.Framework.Connectivity.DataSlicesEventArgs e)

    {

      DataSlice slice = e[0];

      double d = System.Convert.ToDouble(slice.GetDataPoint(opcChannel1.Items[0].Item.ItemID).Value);

      this.indicatorWidget.Value = Math.Abs(d);

    }

この場合、イベントが発生するたびに最初のデータ片の最初の位置を取得します。複数のデータ片の処理はAsynchronousSubscriptionメソッドの拡張バージョンとともに動作するためのものです。このAsynchronousSubscriptionメソッドはデータの転送のたびに最新のデータを取得します。

アプリケーションを起動すると、計器が表示するOPCサーバのデータをリアルタイムモードでご覧になれます。


DataChannelコンポーネントの機能性

DataChannelコンポーネントの基礎となるDataChannelのコンセプトは、仮想データプロバイダを使用してリアルタイムのデータ伝送チャンネルの作成を可能にすることです。


デザイン

カスタムなDataChannelを実装するには、抽象的なDataChannelから継承されたコンポーネントクラスと抽象的なConnectionを継承するコンポーネントクラスを作成するだけです。機能的なDataChannelを実装するのに、すべてのメソッドやプロパティを実装する必要はありません。追加のサービス（CultureInfo、ProviderCurrentTimeなど）を提供する多数のメソッドやプロパティは実装しません。


OLAP ModelKitの目的と基本的な機能

OLAP ModelKitは大量の統計データに基づいてクロスレポートを開発したり処理するためのものです。近頃は、大量の統計データの処理は自動的に行う以外には不可能なようです。同じ1つのデータセットのデータを同時に動的に変更しようとすると、行き詰ってしまうことがよくあります。OLAP ModelKitはそのようなことを処理する有効的な解決法と言えます。

OLAP ModelKitにはピボットテーブルを操作するためにグラフィカルデザイナが完全装備されています。これを使用してレポート作成に使用するデータを表現できます。レポートを生成するには、必要なフィールドをデータセットからデザイナのフィールドにドラッグするだけです。ボタンをいくつかクリックするだけでレポートのスタイルを設定できます。

可能な限りのすべてのディメンショングループを考慮して同じデータを表示するのも簡単に行えます。ただグループヘッダをテーブルのフィールドにドラッグするだけです。

テーブルのディメンションとディメンションの交差セルに値を計算するための法則を割り当てるには、さまざまな式を使用できます。データセットに含まれる情報に応じてテーブルを編集することができます。式を使用することにより、希望するレポート内での複数のデータセットのフィールド値の基本的な足し算から、色々なグループのソート（例えば、年月日を年、月、四半紀、曜日ごとでソートしたり、グループ内で値の間隔を示してソートするなど）まで、色々なことを行うことができます。

ピボットテーブルのディメンションの交差値を計算するには、集計関数の1つを使用することができます（例：平均値計算または最大値/最小値の検索）。

事前に設定されたピボットテーブルの表示スタイルから1つを選択するか、XPのスタイルを使用することができます。また、独自のスタイルを作成して、ファイルに保存して後で使用することもできます。

生成したピボットテーブルを使用するのはアプリケーションだけではありません。クロスレポートを印刷したり、カレントのピボットテーブルの全設定（ユーザが指定したグループ化、データのソートやフィルタ処理、表示スタイルなど）が考慮されるExcelテーブル、PDF、HTMLドキュメントへのエクスポートが可能です。

すべてのピボットテーブル設定をファイルに保存できるので、テーブルをいつでも構成前の状態に瞬時に戻すことができます。


基本的な使い方（OLAP編）

DataCubeコンポーネントは外部のデータソースのデータをピボットテーブルで管理するためのものです。テーブルを指定するには、各ディメンションフィールド（行や列ごと）を指定しなければなりません。また、行と列の交差セルの値を計算するために、どのフィールﾄﾞ（ファクト）のデータを取得するかも指定しなければなりません。

データにアクセスする法則は、式を使用してフィールドに割り当てます。

簡単な算術演算や論理演算を式に使用することができます。変数としてソースフィールドも式に使用することができます。

行と列の交差セルのデータ集計に使用する集計関数をファクトフィールドにも割り当てることができます。

DataCubeGridコンポーネントはDatacubeのデータを表示するためのものです。それには、DataCubeGridに対してSourceプロパティを指定する必要があります。

ここに、簡単なOLAP ModelKitの使用例があります。このサンプルはOLAP ModelKitの「GettingStarted」フォルダにあります。

ある製品の各企業の売上に関するデータを表すピボットテーブルを作成します。

最初のデータテーブルの構造は下図の通りです。

処理後のテーブル内のデータのグループ化は下図のようになります。

列には「会社名」が、行には「商品分類」と「商品名」が表示されます。ファクトフィールドには商品の価格、数量、割引を考慮した「金額」が表示されます。

ソースデータにデモのデータベースの「Access NWind.mdb」を使用します。

Microsoft Visual Studioを立ち上げ、新規のC#のWindows Applicationプロジェクトを作成します。

始めに、レポートのデータソースを作成します。それには、フォームにSystem.Data.DataSetオブジェクトを追加して最初のデータテーブル構造と同じフィールドがあるSalesテーブルを作成します。

フォームにDataCubeオブジェクトを追加します。DataSourceの値としてDataSetのSalesテーブルを設定します。DataCubeオブジェクトをダブルクリックするか、DataCubeオブジェクトのスマートタグから「Run Designer」を選択してデザイナ（データキューブウィザード）を立ち上げます。

[ソースフィールド]にある「CompanyName」を[Xディメンションフィールド]にドラッグし、キャプションを「会社名」に変更します。[ソースフィールド]の「CategoryName」と「ProductName」を[Yディメンションフィールド]にドラッグして追加し、キャプションをそれぞれ「商品分類」と「商品名」に変更します。

[ファクトフィールド]の追加ボタンをクリックします。新規フィールドに、次のプロパティを定義します。

プロパティ名 | コード
Expressionプロパティ | UnitPrice * Quantity * (1 - Discount)
Captionプロパティ | 金額（割引後）
FieldTypeプロパティ | FactOnly
Formatプロパティ | 0.00
Widthプロパティ | 150
TotalLabelプロパティ | Total price

「スタイルシート」タブで、ピボットテーブルの表示スタイルを指定します。既存のスタイルから1つ選択できます。

フォームに「DataCubeGrid」オブジェクトを追加します。

「DataCubeGrid」のSourceプロパティに、編集した「DataCube」オブジェクトを設定します。

フォームのuploadイベントハンドラに、DataSetのSalesテーブルを表示させるコードを追加します。

アプリケーションを実行すると、フォームに作成したピボットテーブルが表示されます。

このテーブル内で、フィールドのヘッダーをドラッグしてレイアウトを変更できます。また、値や条件によるソートやフィルタ処理の割り当ても可能です。


.NET ModelKit Suite User(s)Guide

ピボットテーブルの概念

OLAP ModelKitのピボットテーブルは複数データの統計の分析に使用するよう設計されたインタラクティブなテーブルのようなものです。このようなインタラクティブなテーブルの行や列は、初期テーブルの複数の列から取得したデータ、または他のデータソースから取得したデータに基づいています。

ピボットテーブルのセル情報は対象となる行や列の集計データです。

一般的に、OLAPキューブはマルチディメンションのOLAPデータ、つまりディメンション（マルチディメンションキューブの軸を形成する記述データ）やファクト（計算量の値）を含む構造を表します。ディメンションには値のマルチレベル階層を含めることができ、メジャーは統計分析において興味のあるデータソースフィールドに基づいた集計データ（合計、平均値、最大値または最小値、レコード数）です。

ピボットテーブルを作成するには前もって以下の操作を行っておかなければなりません。

  • データのグループ化
  • サブグループの小計計算
  • トータルの計算

フィールドオブジェクトはディメンションやファクトを定義するために使用します。ピボットテーブルの計算に使用する初期テーブルのデータとピボットテーブルの提供方法をフィールドに指定できます。1つのディメンションのフィールドの表示順も、このディメンション内でデータのグループ化を割り当てます。

ユーザが（ディメンションとファクトの両方の）フィールド値を定義します。これはフィールドに式を割り当てることにより実装できます。集計関数はファクトに割り当てます。従って、ファクトに表示される値は式の集計結果となります。したがって、ピボットテーブル構造のプロセスは次のように構成されます。

「データのグループ化」段階

この段階で、テーブルのディメンションのツリー構造が構成されています。各ツリーノード（ディメンションオブジェクトの値）については、データソース情報に関して該当するフィールドの式が計算されます。ここでは次のグループ化が考慮されています。

グループ： ツリーノード（ディメンションオブジェクト一覧の対象フィールドが挿入されています）

サブグループ： このツリーノードのリーフ（ディメンションオブジェクト一覧の後続フィールド）

「サブグループの小計計算」段階

この段階で、結果となるピボットテーブルに直接読み込まれます。ファクト（ディメンションの交差セル）の値はファクトのフィールドの式（Expressionプロパティ）により計算されます。式の計算は「データのグループ化」の段階で構成された、すべてのディメンションのグループの値に応じて行われます。

「トータルの計算」段階

一般的には、トータルの計算はサブグループのテーブルの読み込みと同時に行われます。計算済みのファクト値を基にして、フィールドに指定した集計関数を考慮しながらトータルの計算が行われます。

さらに、ソート順を変更してデータをランダムに組み合わせてフィルタ処理を行ったり、データをパーセント表示にしたり、ピボットテーブルを色々と便利に変換したりすることができます。


.NET ModelKit Suite User(s)Guide

OLAP ModelKitのデータソース

OLAP ModelKitのデータソースとして次のクラスが使用可能です。

- ADO.NETオブジェクト – System.Data.DataSet、System.Data.DataView、System.Data.DataTable

- System.ComponentModel.IListSourceまたはSystem.Collections.Ilistインターフェースを実装するユーザ定義のクラス (ビジネスオブジェクト)

ピボットテーブルのデータソースはDataCubeクラスのDataSourcesプロパティから指定されます。このプロパティはSystem.Object型です。

プロパティエディタからピボットテーブルのデータソースを指定するには、DataCubeオブジェクトを選択し、プロパティウィンドウのDataSourceプロパティを有効にしてください。フォーム上にあって、データソースとして使用するのに適したオブジェクト名を含むリストが表示されます。データソースとして使用するオブジェクト名を選択する必要があります。

その後、データソースとして選択したオブジェクトのプロパティがピボットテーブルを編集するためにDataCubeオブジェクトで使用可能になります。

＜入れ子のデータソース＞

OLAP ModelKitは入れ子のデータソースをサポートします。現在は、計算に必要な特別なデータアクセスを用意する必要はありません。接続した複数のテーブルから単一のデータセットにデータをアップロードするだけです。次に、親テーブルをDataCubeオブジェクトのDataSourceプロパティに指定します。JointFieldsプロパティ（文字列配列）には、データソースの子要素との接続を行うデータソースフィールドのリストを含むよう設定します。

例えば、下図のデータスキーマを使用する場合、CustomersテーブルはDataCubeオブジェクトのDataSourceプロパティに指定され、JointFieldsプロパティは次のように設定されなければなりません。

“CustomersTable”

“CustomersOrders”

ディメンションオブジェクトとファクトオブジェクトの式にソースへのパス（例：«CustomersTable.tableRowValue» または «CustomersOrders.OrderId»）を指定して、入れ子のデータソースフィールドを参照することができます。


DataCubeGridコンポーネントの使用法（ピボットテーブルの表現と操作法）

DataCubeGridオブジェクトはピボットテーブルをアプリケーションのフォームに表示する、インタラクティブなコントロールです。ユーザはそこで最終的なピボットテーブルを表示したり、外観や内容を編集したり、印刷またはテーブルを他のファイル形式にエクスポートできます。

DataCubeGridは次のように表示されます。

「除外するフィールド」の領域にはDataCubeで指定したフィールドヘッダーが表示されますが、ピボットテーブルの計算には使用されません。

「Xディメンションフィールド」の領域にはピボットテーブルの列を定義するフィールドヘッダーが表示されます。

「Yディメンションのフィールド」の領域にはピボットテーブルの行を定義するフィールドヘッダーが表示されます。

「ファクトフィールド」の領域にはピボットテーブルのファクトのフィールドヘッダーが表示されます。

「Xディメンションフィールド」の領域のフィールドにはピボットテーブルの行を指定し、「Yディメンションフィールド」の領域のフィールドにはピボットテーブルの列を指定します。DataCubeGridの列幅は枠をマウスでドラッグして変更できます。

ディメンションのフィールドヘッダーの直下に、（グループ化に応じた）ディメンションの値が表示されます。グループ化はデータキューブフィールドの表示順で定義されます。また、条件の [image] ( / [image] ボタン)で、グループ値をドリルダウン/ロールアップすることができます。このグループ値には合計とは別のサブグループの値があります。

フィールドヘッダーをドラッグできます。ヘッダーは「除外するフィールド」、「Xディメンションフィールド」、「Yディメンションフィールド」、「ファクトフィールド」の領域に移動できます。また、1つの領域内でフィールドの順番を変更することもできます。

フィールド値のフィルタ処理には、「値によるフィルタ処理」と「条件によるフィルタ処理」の2つの方法があります。

値によるフィルタ処理を設定するには、表示するフィールド値を選択してください。また、「すべて選択」 [image] ボタンをクリックすると、すべてのフィールド値にフィルタ処理を設定することもできます。フィルタ処理をキャンセルするには、「すべて解除」 [image] ボタンをクリックしてください。フィルタ処理の選択を反転するには、「すべて反転」 [image] ボタンをクリックしてください。

条件によりデータをフィルタ処理するには、必要なフィールド値を選択するための式を指定してください。Okボタンをクリックするとフィルタ処理の条件を保存し、あらかじめ設定したフィルタ処理の条件に応じてピボットテーブルの再計算が行われます。「キャンセル」ボタンはすべてのフィルタ処理の変更を無視してダイアログウィンドウを閉じます。

ピボットテーブルの計算に使用するフィールドヘッダーを使用してピボットテーブルのソート指定が行えます。ディメンションのフィールドヘッダーをクリックすると、グループ化を考慮しながらそのディメンションのソートが行われます。テーブルのファクトを定義するフィールドヘッダーをクリックすると、そのディメンションを考慮しながらファクト値の列のソートが行われ、文字列表示順が変わります。合計の列でソート機能を使用すると、容易に量的分析が行えます。

右マウスボタンをクリックすると、次のコンテキストメニューが表示されます。

このコンテキストメニューには次の項目が含まれています。

メニュー | 説明
昇順 | 昇順ソートの設定に使用します
降順 | 降順ソートの設定に使用します
すべて折りたたむ | すべてのフィールドグループを折りたたむために使用します
すべて開く | すべてのフィールドグループを開くために使用します
フィールドの幅を揃える | フィールドの幅を最大幅に合わせるために使用します
ファクトに移動 | フィールドをファクトに移動するために使用します
行に移動 | フィールドを行のディメンションに移動するために使用します
列に移動 | フィールドを列のディメンションに移動するために使用します
除外するフィールドに移動 | フィールドをピボットテーブルの計算から除外するために使用します
グループ設定 | フィールドのグループ設定を行うウィンドウを開くために使用します

DataCubeGridツールのセットにはツールボックスも含まれます。

次のボタンがあります。

ボタン | 説明
「開く」ボタン | DataCubeのレイアウトや/または表示スタイルをダウンロードするファイルを選択することができます。
「保存」ボタン | ファイルの保存ダイアログを呼び出します。ここで何を保存するか（DataCubeレイアウト、ピボットテーブルの表示スタイル、両方）を定義できます。
「HTMLにエクスポート」ボタン | HTMLへのエクスポートダイアログボックス（名前を付けて保存ダイアログボックス）を入力できます。しかも、ピボットテーブルのカレントの状態（レイアウト、スタイル、列幅、ソート、フィルタ処理、ディメンションのオブジェクトグループの折りたたみ）が考慮されます。
「エクセルにエクスポート」ボタン | MS Excelへのエクスポートダイアログ（名前を付けて保存ダイアログボックス）を開きます。ファイルはピボットテーブルのカレントの状態のまま保存されます。
「PDFにエクスポート」ボタン | PDFエクスポート設定ダイアログボックスを開きます。「ページ設定」タブで、最終的なPDFドキュメントの設定（ページサイズ、用紙の向き、インデント）を指定できます。
「印刷設定」ボタン | 印刷設定ダイアログを開きます。
「印刷プレビュー」ボタン | 印刷前にピボットテーブルのプレビューが行えます。しかも、印刷設定ダイアログウィンドウで指定した設定はそのままで、ピボットテーブルはページごとに表示されます。
「印刷」ボタン | ピボットテーブルの印刷を行います。
「再計算」ボタン | ピボットテーブルの再計算を行います。
「自動再計算」ボタン | テーブルのレイアウトやフィルタ処理の条件が変わった場合にピボットテーブルの自動再計算を行うかどうかの切り替えをオン/オフにします。このボタンは大量のデータを操作する場合に使用すると合理的です。設定を指定した後にピボットテーブルを再計算するには、「自動再計算」ボタンをオンにして「再計算」ボタンを押してください。
「ウィザード」ボタン | ピボットテーブルを編集するためにDataCubeウィザードを開きます。

PDFの「ページ設定」タブは次のように表示されます。

下図の「エクスポート設定」タブで、PDFドキュメントのピボットテーブルの外観を設定できます。ここで、ピボットテーブルのディメンション、ディメンションのヘッダー名やフィールド名、ファクトをドキュメントの各ページに表示するかどうかを定義できます。さらに、ピポットテーブルで使用するフォントをドキュメントに組み込むかどうかも指定できます。

DataCubeウィザードは下図のように表示されます。


式の使用目的とそのしくみ

ピボットテーブルに指定するすべてのフィールド（ファクトやディメンション）に式を割り当てることができます。式の計算結果はフィールド値と、その結果ディメンションオブジェクトの値とファクト値を定義します。ファクトに関しては、式の結果として定義された値は集計に使用されます。

式が使用される順番は次の通りです。ピボットテーブルの構成時に、ディメンションオブジェクトまたはファクトに関連するフィールドがディメンションオブジェクトまたはファクトセルの値を計算するために割り当てられます。ファクトとディメンションの交差部分やディメンションオブジェクトのデータソースの値を考慮しながらフィールドの式の計算が行われます。計算された値はテーブルに記録されます。

計算時に式に構文エラー、意味上の誤りまたは例外が生じた場合、例外メッセージが生成され、ユーザにエラーの種類やその位置に関する情報を提供します。


式の言語構文について

式は公式計算に関するタスクです。式の値は計算結果です。式は定数、オブジェクトおよびそのプロパティ・メソッド・演算子・関数の呼び出し、括弧で構築されます。

＜使用するデータ型＞

.NET Frameworkで利用可能なすべてのデータ型が式に使用されます。また、不動小数点数や論理値、文字列、DataTime型の特別なサポートもあります。

＜式に使用可能な演算子＞

算術演算子：

記号 | 説明
+ | 加算。 数値に定義されます。
- | 減算。数値に定義されます。
- | 単項マイナス。 数値に定義されます。
* | 乗算。数値に定義されます。
/ | 除算。数値に定義されます。
% | 除算の剰余。数値に定義されます。

論理演算子：

記号 | 説明
or | 論理和を表すOR。論理値に定義されます。
and | 論理積を表すAND。 論理値に定義されます。
= | 等しい。 数値、文字列、論理値に定義されます。
! = | 等しくない。数値、文字列、論理値に定義されます。
< | ～より小さい。数値に定義されます。
<= | ～と同じか小さい。数値に定義されます。
> | ～より大きい。数値に定義されます。
>= | ～と同じか大きい。数値に定義されます。
not | 反転。 論理値に定義されます。

文字列演算子：

記号 | 説明
& | 文字列の結合。文字列の値に定義されます。

演算子の優先順位（降順）
‘-’(単項マイナス), ‘not’
‘*’, ‘/’, ‘%’
‘+’, ‘?’, ‘&’
‘>’, ‘>=’, ‘<’, ‘<=’
‘=’, ‘!?’
‘and’
‘or’

定数の割り当て：

< decimal numeral >* - 整数値

< decimal numeral >*.< decimal numeral >* - 値

例：

1234 - 整数値

1234.1234 - 不動小数点数

文字列定数はダブルクォーテーションマーク(“)で割り当てられます。

例：”それは文字列の値です”

論理的な定数は2つのキーワード、「True」と「False」で割り当てられます。

「Null」定数 - この定数は不定値を割り当てるのに使用します。

＜変数、オブジェクト、オブジェクトフィールドやメソッドへのアクセス＞

式に、フィールドに利用可能な変数を名前で適用できます。名前による変数やオブジェクトの検索は次のように行われます。式の中にオブジェクト名のアドレスがある場合、GetObject関数（希望するオブジェクトを返します）は式が書かれているフィールドに呼び出されます。

オブジェクトとしてのフィールドは「値」名で利用可能です。

点「.」はオブジェクトフィールドやメソッドを適用するために使用します。

例：

Value.Year - フィールドのYearプロパティ（DateTime型の値）への参照

Field1.ValueToString() - フィールド：Field1 ValueToString()メソッドの呼び出し

注意! オブジェクトのメソッドがオーバーロードの場合、呼び出すことはできません。

式の言語が型で示されていない場合、何のメソッドを呼び出すか定義することはできません。

式に、フィールドで利用可能な関数を名前で適用することができます。検索はオブジェクト同様、名前で検索されます。

＜利用可能な関数＞

条件付き関数

関数 | 説明
If(condition, value1, value2) | 最初のパラメータは論理型で、二番目と三番目はオブジェクト型になります。最初のパラメータがTrueの場合、関数は二番目のパラメータの値を返します。そうでなければ三番目のパラメータの値を返します。
switch (condition[0], value[0], … , value by default) | 条件[i]がTrueの場合、関数は[i]の値を返します。任意のiの条件[i]がFalseの場合、デフォルトでその値が返されます。

形式関数:

関数 | 説明
format (object, mask) | objectはオブジェクト型で、maskは文字列型です。マスクに応じてオブジェクトの文字列表現を返します。

数学的関数:

関数 | 説明
sin(argument) | 引数のサインを計算します。引数はダブル型で、その計算結果はダブル型になります。
cos(argument) | 引数のコサインを計算します。引数はダブル型で、その計算結果はダブル型になります。
tan(argument) | 引数のタンジェントを計算します。引数はダブル型で、その計算結果はダブル型になります。
atan(argument) | 引数のアークタンジェントを計算します。引数はダブル型で、その計算結果はダブル型になります。
sqr(argument) | 引数を二乗に計算します。引数はダブル型で、その計算結果はダブル型になります。
sqrt(argument) | 引数の平方根を計算します。引数はダブル型で、その計算結果はダブル型になります。
log(argument) | 引数の自然対数を計算します。引数はダブル型で、その計算結果はダブル型になります。
exp(argument) | eを底とする数値のべき乗を計算します。引数はダブル型で、その計算結果はダブル型になります。
sign(argument) | 引数が負の場合は-1、0の場合は0、正の場合は1を返します。引数はダブル型で、その計算結果はint型になります。
abs(argument) | 引数の絶対値を返します。引数はダブル型で、その計算結果はダブル型になります。
round(argument1, rgument2) | 第一引数に四捨五入の対象となる数値を、第二引数に基準値を指定します。最初の引数はダブル型で、二番目の引数はint型で、計算結果はダブル型になります。

式は任意の関数やメソッドの引数になることができます。式の計算結果が引数の型に合わない場合、式は計算されません。

文字列関数:

関数 | 説明
сoncat(string1, string2) | パラメータに指定した2つの文字列を結合して返します。
indexOf(string1, string2[, start]) | string1の指定した位置からstring2のインデックスを返します。
insert (string, position, subString) | positionの位置からsubStringをStringに貼り付けます。
length(string1) | string1の長さを返します。
padLeft(string, length, char) | 左から指定した長さ（length）までstringにcharの文字を補足します。
padRight(string, length, char) | 右から指定した長さ（length）までstringにcharの文字を補足します。
remove (string1, start, length) | string1のstart位置からlengthまでsubstringを削除します。
replace(string, subString, newSubString) | string内のsubstringをnewSubStringに置換します。
subString(subString (string, start, length)) | 文字列内の指定位置からの指定された長さを持つ部分を返します。
toLower(string) | stringを下のレジストリにキャストします。
toUpper(string) | stringを上のレジストリにキャストします。
trim(string) | stringの空白文字を削除します。
trimEnd(string) | stringの終わりにある空白文字を削除します。
trimStart(string) | stringの始めにある空白文字を削除します。
regIsMatch(string, expressionString) | expressionStringの正規表現に一致するstringの文字を返します。
regReplace(string, expressionString, newString) | string内のexpressionStringの正規表現に該当するsubstringをnewStringで置換します。

日付関数

関数 | 説明
getMonth (argument) | 引数に割り当てられた日付で月を返します。引数はSystem.DateTime型とします。
getDayOfWeek (argument) | 引数に割り当てられた日付で曜日を返します。引数はSystem.DateTime型とします。
getQuarter (argument) | 引数に指定した日付の四半期を返します。引数はSystem.DateTime型とします。
addDays(date, n) | Dateオブジェクトにｎ日を追加します。
addHours(date, n) | Dateオブジェクトにｎ時（Hour）を追加します。
addMinutes(date, n) | Dateオブジェクトにｎ分を追加します。
addMonths(date, n) | Dateオブジェクトにｎ月を追加します。
addSeconds(date, n) | Dateオブジェクトにｎ秒を追加します。
addYears(date, n) | Dateオブジェクトにｎ年を追加します。
getDate(date) | 時間なしのDateオブジェクトを返します。
getDayOfMonth(date) | Dateオブジェクトの月の日（何日か）を返します。
getDayOfYear(date) | Dateオブジェクトの年間の通算日を返します。
getHour(date) | Dateオブジェクトの指定した日の時（Hour）を返します。
getMinute(date) | Dateオブジェクトの指定した日の分を返します。
getSecond(date) | Dateオブジェクトの指定した日の秒を返します。
getTime(date) | Dateオブジェクトの指定した日の時間を返します。
getYear(date) | Dateオブジェクトの指定した日の年を返します。
toShortDateString(date) | 日付の文字列を返します。
toShortTimeString(date) | 時間の文字列を返します。

範囲関数:

関数 | 説明
Range (currentValue, range, zeroPoint) | データの間隔を取り出します。すべての引数は数値型になります。
currentValue | カレント値
range | 範囲
zeroPoint | 原点

例：

新しいフィールドを作成してExpressionプロパティに"Range(OrderDate.Year, 4,
                0)"を指定します。ここでは、OrderDateはSystem.DateTime型のデータソースフィールドです。 結果は下図のようになります。

式に、カスタム関数や変数を記述できます。

オブジェクトの式に使用可能なカスタム関数や変数を作成するには、PerpetuumSoft.Framework.Expressions.IExpressionSiteインターフェースを実現するカスタムなオブジェクトを実装する必要があります。その後、カスタム関数を登録してください。登録は次のように行ってください。

PerpetuumSoft.Framework.Expressions.BuiltInFunctions.RegisterFunction(<Function name>, <inplemented IFunction object>);

＜データソースの入れ子フィールドへのアクセス＞

式で、データソースの入れ子フィールドを参照することができます。参照自体はメインソースに関連するフィールドの完全なパスをDataCube.DataSourceプロパティに指定することにより参照されます。例えば、下図のデータスキーマを使用する場合、Orders
                tableのOrderDateフィールドとFreightフィールドのアクセスコードは次のようになります。

≪CustomersOrders.OrderDate≫ と≪CustomersOrders.Freight≫


Windows Formsアプリケーションで使用するコンポーネント

Windows Formsアプリケーションでピボットテーブルを表示したり操作するには、以下の4つのコンポーネントを使用します。

コンポーネント | 説明
DataCube（ [image] ） | 外部ソースからのデータをピボットテーブルで構成します。DataCubeはピボットテーブルのレイアウト、表示スタイルを格納し、ピボットテーブルの印刷やエクスポートが可能です。
DataCubeGrid（ [image] ） | DataCubeで示されたデータを表示します。DataCubeGridは印刷やエクスポートを行うだけでなく、ピボットテーブルのレイアウトや表示スタイルをインタラクティブに変更できます。
DataCubePrintDocument（ [image] ） | ピボットテーブルをページ分割して印刷デバイスに送ります。
DataCubeView（ [image] ） | DataCubeオブジェクトに格納されたデータ表現を作成できます。同じ情報を使用する（チャートコンポーネントやダイアグラムコンポーネントのような）他のコンポーネントからDataCubeに格納されたデータにアクセスするには、インターフェースを提供する必要があります。DataCubeViewコンポーネントはデータを線形テーブルとして提供して、ピボットテーブルのディメンションキューブを展開します。線形テーブルの列には最初のキューブのファクトと1つのディメンションフィールドがあります。DataCubeViewはどのディメンションでも1つのキューブを線形テーブルに再編成できます。


DataCubeの使用法とその機能

次のサンプルを使用してDataCubeコンポーネントの使用法について説明します。

このサンプルは「DataCubeUseExample」フォルダにあります。

Windows Formsアプリケーションを作成し、OLAP ModelKitタブにあるDataCubeコンポーネントオブジェクトをフォームに追加します。その新たに作成したオブジェクトに「salesDataCube」という名前を付けます。データソース（DataSourceプロパティ）を指定してください。それには、フォームにDataSetオブジェクトを追加し、このオブジェクトに「Sales」テーブルを作成します。「Sales」テーブルの構造は下図の通りです。

ピボットテーブルのレイアウトを編集するには、「salesDataCube」オブジェクトをダブルクリックするか、「salesDataCube」を右クリックして「Run Designer」オプションを選択しデータキューブウィザードを呼び出します。

デザイナの「ソースフィールド」には「Sales」テーブルのフィールド名が表示されています。ピボットテーブルの行ディメンションを割り当てます。それには、「ソースフィールド」にある「CategoryName」フィールドと「ProductName」フィールドを「Yディメンションフィールド」にドラッグしてください。これが行ディメンションになり、品名別、カテゴリ別でグループ化されます。次に、列ディメンションに、売上のあった年、四半期、月、会社名を割り当てていきます。「Xディメンションフィールド」に次の3つのフィールドを作成し、その新たに作成したフィールドのExpressionプロパティを次のように設定します。

Year    -  OrderDate.Year

Quarter -  getQuarter(OrderDate)

Month   -  getMonth(OrderDate)

また、「ソースフィールド」の「CompanyName」フィールドを「Xディメンションフィールド」にドラッグします。これで列ディメンションができました。ここに、会社名、年、四半期、月別にデータがグループ化されます。

すべてのディメンションフィールドのFieldTypeプロパティを「DimensionOnly」に指定します。

ピボットテーブルにファクトを指定します。まず、「ファクトフィールド」にフィールドを1つ作成し、このフィールド名を設定するためにCaptionプロパティに「Sales sum」を割り当てます。このフィールドのExpressionプロパティに、“UnitPrice*Quantity*(1 - Discount)”を定義します。このファクトは単価、数量、値引きを考慮した、ある会社の指定した日の商品の最終的な売上合計を表します。また、「ソースフィールド」の「Discount」フィールドを「ファクトフィールド」にドラッグしてください。次に、ShowPercentプロパティとShowProgressプロパティをTrueに設定します。その後、そのファクトの集計関数を選択します。Aggregateプロパティに「平均」を指定してください。このファクトは指定した商品の平均的な値引額をパーセントで表します。また、「ファクトフィールド」のすべてのフィールドのFormatプロパティに”0.00”を設定します。

ピボットテーブルのレイアウトは次の通りです。

では、データキューブウィザードの「スタイルシート」タブでピボットテーブルの表示スタイルを指定します。

それには、 [image] ボタンをクリックして「自動フォーマット」ダイアログを開き、あらかじめ定義されているピボットテーブルの表示スタイルのうちの1つを選択します。次に、保存ダイアログボックスを開いてファイルの種類を「Layout and sheet」に指定してピボットテーブルの設定を保存します。


DataCubeGridの使用法とその機能

DataCubeGridの機能について例をあげて説明します。

このサンプルは「DataCubeGridUseExample」フォルダにあります。

Windows Formsアプリケーションを作成し、OLAP ModelKitタブにあるDataCubeGidコンポーネントオブジェクトをフォームに追加します。

「DataCubeGrid」を使用するには、「DataCubeGrid」に「DataCube」を指定します。フォームに「DataSet」と「DataCube」を追加して作成します。DataCubeの使用法とその機能で紹介したように「DataCube」と「DataSet」を設定してください。

「DataCube」（サンプルではsalesDataCube）のShowSingleFactプロパティをTrueに設定します。これはファクトヘッダーが1つ表示されるようにするためです。

取得した「DataCube」を「DataCubeGrid」のSourceプロパティに設定します（サンプルではsalesDataCube）。

form_loadイベントに、「DataSet」の「Sales」テーブルを埋めるコードを追加してください。

それから、form_loadイベントハンドラに次のコードを記述してください。

salesDataCube.RaiseDataCubeChanged();

「DataCube」の設定を（DataCubeGridからではなく）コードから変更する場合、「DataCubeGrid」に設定変更を通知するようDataCube.RaiseDataCubeChanged()を発生させる必要があります。この場合のみ、正しく変更されたピボットテーブルが表示されます。

アプリケーションを実行します。ピボットテーブルがフォームに表示されます。

「DataCubeGrid」はピボットテーブルにビジュアルコントロールを実装できます。

保存ダイアログボックスのファイルの種類を“Layout and sheet”に指定して、ピボットテーブルの設定をファイルに保存します。目的は割引を考慮せずに、ある期間の、ある商品の金額を示すためにピボットテーブルを作成することです。まず、ファクトフィールﾄﾞ、Xディメンション、Yディメンションから不要なフィールドを除きます。ここでの不要なフィールドは月、四半期、会社名、割引です。この4つのフィールドヘッダーを「DataCubeGrid」の「除外するフィールド」にドラッグすると、ピボットテーブルの計算から除外できます。

他には、フィールド上で右マウスボタンをクリックして、コンテキストメニューの「除外するフィールドに移動」を選択しても計算から除外できます。

指定したフィールドを計算に入れる必要がなくなった場合、データキューブウィザードを立ち上げて該当するフィールド一覧から削除することによってテーブルから除外できます。

それから、ファクトフィールﾄﾞの「金額」のExpressionプロパティに“UnitPrice * Quantity”を設定します。これは割引を計算から除外します。OKボタンを押してデザイナを閉じます。

ピボットテーブルの構成サイクルを指定するためにフィルタ処理機能を使用します。「Year」フィールドヘッダーにある [image] ボタンをクリックしてフィルタリングダイアログを呼び出してください。ここで、「条件によるフィルタ処理」を選択してください。例：「value < 1996 and value > 1994」

結果として、次のピボットテーブルが表示されます。

次に、保存しておいたピボットテーブルの設定を開きます。いらないグループを折りたたんだり、ソート順を変更してピボットテーブルの外観を変更できます。それには、いらないグループの「-」ボタンをクリックして折りたたむか、フィールドのコンテキストメニューから変更内容を選択して外観を変更できます。

カレントの設定のままでこのテーブルを印刷したり/またはExcel、PDF、HTMLドキュメントにエクスポートできます。

テーブルの印刷はカレントの印刷設定通りに行われます。印刷設定ダイアログを開いて設定を変更します。

次のように変更します。

「色を無効にする」（あらかじめ設定したピボットテーブルの表示スタイルを無視して印刷されます）と「各ページにフィールドタイトルを表示」（ピボットテーブルのフィールドタイトルがドキュメントの各ページに表示されます）を設定します。

また、「各ページにディメンションを表示」と「各ページにタイトルを表示」を無効にします（ディメンションのグループが1回しか印刷されません）（ピボットテーブルのヘッダーが1回しか印刷されません）。

その後、この設定通りに印刷プレビューや印刷が行われます。


グループを使用する

ピボットテーブルのディメンション内のデータをグループ化することにより、さらに詳細なレポートを作成できます。OLAP ModelKitはデータを表すフィールドを指定する順番を考慮しながらデフォルトでディメンション内のデータをグループ化することができます。グループ化をさらにフレキシブルにするために、OLAP ModelKitはグループ化の規則をカスタマイズすることができます。この機能を示した例について説明します。

このサンプルは「CustomGrouppingExample」にあります。

国とその国の地域を示すことにより売上の詳細情報を取得する必要があるとします。

WindowsFormsアプリケーションを作成し、フォームにDataCubeコンポーネントオブジェクトを追加します。その新たに作成したオブジェクト名を「salesDataCube」にします。ピボットテーブルのレイアウトが下図のようになるように、「salesDataCube」オブジェクトを編集します。

結果としてピボットテーブルは次のようになるはずです。

希望するグループ化を指定するために、データキューブウィザードを使用してピボットテーブルにフィールドをもう1つ作成します。その新しく作成したフィールドに次のプロパティを割り当てます。

Caption = 「地域」

Expression = 「Country」

ピボットテーブルは次のようになります。

次に、「地域」フィールド上を右クリックしてコンテキストメニューから「グループ設定」を選択します。

これで、このフィールドの「グループ設定」ダイアログが表示されます。

項目リストに、式の計算結果として取得したすべてのフィールド値が表示されます。この場合は、国名が表示されます。これらの国を地域ごとにグループ化するには、グループを追加する必要があります。「追加」ボタンをクリックして、グループ名を指定します（例：America）。

「America」のグループに、Brazil、Canada、USAを追加します。それには、国を選択し、下図にあるようにマウスで希望するグループまでドラッグします。

値を「グループ」に追加すると項目リストからなくなり、グループのツリーにリーフのように表示されます。

同じように「Asia」と「Europe」を追加します。

「Oｋ」ボタンを押します。結果としてこのピボットテーブルは下図のようになります。

式を使用することにより、グループ化をもっとフレキシブルに行うことができます。

例えば、前のサンプルで示した国のグループ化を国名の頭文字で行うことができます。それには、「アルファベット」フィールドを作成し、Expressionプロパティに、subString(ProductName, 0, 1)を指定してください。このグループ化の実行結果は下図の通りです。

グループを指定するには、式言語で定義された範囲関数を使用することもできます（ユーザガイドの「式の言語構文と意味論について 」を参照してください）。


大量のデータを扱うには

OLAP ModelKitは大量のデータを使用するピボットテーブルを作成できます。その際に、さらに便利に使用できるようにOLAP ModelKitには特別な機能が提供されています。

ピボットテーブルの計算は独立したスレッドで行われます。これはユーザがいつでも計算を中断できるようにするためです。「DataCubeGrid」を使用する際に、次のように中断できます。ピボットテーブルの再計算が始まると、計算の進捗状況を示すダイアログボックスが表示されます。このダイアログボックスにもキャンセルボタンがあるので、これを押すだけで正確に計算を中断できます。

ピボットテーブルの同時計算をオン/オフにするには、DataCubeGrid.CalculationModeプロパティを使用してください。

「DataCubeGrid」の対話型処理を一時的にオフにできます。従って、テーブルの再計算に必要な設定を行う際には計算は行われません。結果として、大量のデータを扱う際に、ピボットテーブルのレイアウトを変更したり、必要なフィルタ処理を設定したり、値をグループ化することができ、その後にしか再計算を行うことができません。この操作を行うために、再計算 [image] ボタンと自動再計算 [image] ボタンが「DataCubeGrid」ツールバーに追加されています。自動再計算 [image] ボタンはインタラクティブにオン/オフにできます。


セルスタイルのカスタマイズ

DataCubeGridコンポーネントを使用する際に、表示されたデータキューブのスタイルシートのセルスタイルを部分的に変更する場合があります。

セルスタイルをカスタマイズする方法を示したサンプルは「DataCubeGridCustomDrawing」にあります。

セルスタイルを変更するには、DataCubeGridオブジェクトのDrawCellイベントを使用してください。

DrawCellイベントはDataCubeGridオブジェクトが描画されるたびに呼び出されます。しかも、このイベントハンドラは引数としてDrawCellEventArgsオブジェクトを取得します。

DrawCellEventArgsオブジェクトの次のプロパティを使用してください。

プロパティ | 説明
CellStyle | PerpetuumSoft.Olap.CellStyle型のオブジェクトで、描画されたテーブルのオブジェクトのカレントのスタイル情報を含んでいます。セルの表示スタイルをカスタマイズするには、このプロパティを変更してください。
CellInfo | テーブルのセルに関する情報です。PerpetuumSoft.OlapCellInfo型についての詳細は、クラスリファレンスを参照してください。
IsActiveCell | 指定したセルがアクティブなテーブルセルかどうかを定義します。

DrawCellイベントハンドラの例は次の通りです。

private PerpetuumSoft.Olap.CellStyle customStyle = new CellStyle(Color.Purple, Color.Black);

private void dataCubeGrid1_DrawCell(object sender, PerpetuumSoft.Olap.DrawCellEventArgs e)

{

    if (e.CellInfo.XFieldItem != null && e.CellInfo.YFieldItem != null)

    {

        bool contains = CanChangeStyle(e.CellInfo.XFieldItem, textBox1.Text);

        if (contains && !e.IsActiveCell)

            e.CellStyle = customStyle;

        contains = CanChangeStyle(e.CellInfo.YFieldItem, textBox2.Text);

        if (contains && !e.IsActiveCell)

            e.CellStyle = customStyle;

    }

}

private bool CanChangeStyle (PerpetuumSoft.Olap.FieldItem item, string text)

{

    PerpetuumSoft.Olap.FieldItem fi = item;

    while(fi != null && fi.Value != null)

    {

        if ((text.Length > 0) && (fi.Value.ToString().IndexOf(text) >= 0))

            return true;

        fi = fi.Parent;

    }

    return false;

}


カスタム描画

DataCubeGridコンポーネントを使用する際にテーブルの各オブジェクトのスタイルを変更できるだけでなく、1つもしくは別のテーブルのオブジェクトを手で書くことができます。グリッドセルを描画する際に、DataCubeGrid.DrawGridItemイベントが呼び出されます。従って、特定のテーブルセルの描画メソッドを変更するには、このイベントにハンドラを実装する必要があります。引数としてこのイベントハンドラにDrawGridItemEventArgsオブジェクトが渡されます。

DrawGridItemEventArgsオブジェクトの次のプロパティを使用してください。

プロパティ | 説明
Graphics | System.Drawing.Graphics型のオブジェクトで、テーブルを描画するためにあります。
Bounds | System.Drawing.Rectangle型のオブジェクトで、テーブル内のオブジェクトの位置情報を含んでいます。
CellStyle | PerpetuumSoft.Olap.CellStyle型のオブジェクトで、描画されたテーブルのカレントのスタイル情報を含んでいます。
CellInfo | テーブルセルに関する情報です。PerpetuumSoft.OlapCellInfo型の詳細はクラスリファレンスを参照してください。
Handled | Trueの場合、DataCubeGridはオブジェクト自体を描画しません

DrawGridItemCellイベントハンドラの例は次の通りです。

private void dataCubeGrid1_DrawGridItem(object sender, PerpetuumSoft.Olap.DrawGridItemEventArgs e)
{
    if ((e.CellInfo.XFieldItem != null && e.CellInfo.YFieldItem == null && e.CellInfo.XFieldItem.Value.ToString().IndexOf(textBox1.Text) >= 0 && textBox1.Text.Length > 0)
        ||(e.CellInfo.XFieldItem == null && e.CellInfo.YFieldItem != null && e.CellInfo.YFieldItem.Value.ToString().IndexOf(textBox2.Text) >= 0 && textBox2.Text.Length > 0))
    {
        Brush b = new System.Drawing.Drawing2D.LinearGradientBrush(e.Bounds, Color.White, Color.Purple, 30);
        e.Graphics.FillRectangle(b, e.Bounds);
        e.Graphics.DrawString(e.Value, new Font("Arial", 8, FontStyle.Bold), Brushes.Black, e.Bounds);
        e.Handled = true;
    }
}

カスタム描画を使用したサンプルは「DataCubeGridCustomDrawing」フォルダにあります。

前述したイベント（DataCubeGrid.DrawCellイベントやDataCubeGrid.DrawGridItemイベント）が提供する機能で、テーブルを特殊なタスク向けのカスタムメイドな外観にできます。しかし、それでも十分ではない場合は、DataCubeGridオブジェクトに完全なカスタム描画を割り当てることができます。それには、PerpetuumSoft.Olap.Painter抽象クラスから派生したクラスを作成し、そのクラスを主要のピボットテーブルのペインタ（myDataCubeGrid.Painter = myCustomPainter）として指定してください。


DataCubePrintDocumentの使用法とその機能

DataCubePrintDocumentコンポーネントはピボットテーブルを印刷デバイスに出力するために使用します。

このサンプルは「DataCubePrintDocumentUseExample」フォルダにあります。

Windows Formsアプリケーションを作成し、フォームにOLAP ModelKitタブのDataCubePrintDocumentコンポーネントオブジェクトを追加します。

後で使用するためにDataCubeをDataCubePrintDocumentに指定する必要があります。フォームに、DataSetとDataCubeを追加し、ユーザガイドの「DataCubeの使用法とその機能」で説明したように設定します。

取得したDataCubeをDataCubePrintDocumentのDataCubeプロパティに指定していきます。

次のコードをDataCubePrintDocumentオブジェクトのBeginPrintイベントに追加してください。

MessageBox.Show("Start of printing.");

MessageBox.Show("End of printing.");

DataSetのSalesテーブルを埋めるコードをフォームのfillingイベントに追加してください。

また、フォームに次の4つのSystem.Windows.Forms.CheckBoxオブジェクトも追加してください。

    isMultiColorCheckBox;

    dimensionsOnEveryPageCheckBox;

    titleOnEveryPageCheckBox;

    fieldCaptionsOnEveryPageCheckBox;

そして、そのプロパティを下図のように設定してください。

次に、フォームにSystem.Windows.Forms.PrintDialogコンポーネントを追加し、そのDocumentプロパティにDataCubePrintDocumentオブジェクトを設定します。

フォームにSystem.Windows.Forms.ButtonコンポーネントのprintButtonオブジェクトを追加し、button pressイベントハンドラに次のコードを記述してください。

PerpetuumSoft.Olap.DataCubePrintSettings settings = new PerpetuumSoft.Olap.DataCubePrintSettings();
settings.IgnoreColors = isMultiColorCheckBox.Checked;
settings.DimensionsOnEveryPage = dimensionsOnEveryPageCheckBox.Checked;
settings.TitleOnEveryPage = titleOnEveryPageCheckBox.Checked;
settings.FieldCaptionsOnEveryPage = fieldCaptionsOnEveryPageCheckBox.Checked;
dataCubePrintDocument.PrintSettings = settings;
dataCubePrintDocument.PrinterSettings = printDialog.PrinterSettings;
dataCubePrintDocument.Print();

System.Windows.Forms.ButtonコンポーネントのprinterSettingsButtonオブジェクトをフォームに追加し、button pressイベントハンドラに次のコードを記述してください。

printDialog.ShowDialog();

アプリケーションを実行します。

次に、ピボットテーブルの印刷に必要な設定をすべて指定します。「印刷設定」ボタンを押して希望する印刷設定を指定し、「印刷」ボタンをクリックしてください。ピボットテーブルが印刷されます。


サードパーティコンポーネントでOLAP ModelKitを使用する

OLAP ModelKitは大量の統計データを基にしてクロスレポートを作成したり使用するためのものです。OLAP ModelKitは最終的なレポートデータをテーブル以外でも表現できます。サードパーティのチャートコンポーネントで使用できるように情報を構成することもできます。現在はチャート、ダイアグラム、レポート、グリッドを作成するためのコンポーネントが多数あります。

ピボットテーブルコンポーネントやイメージ表示コンポーネントのようなインターフェースを実装するためにOLAP ModelKitパッケージに含まれているDataCubeViewコンポーネントを使用できます。DataCubeViewはDataCubeオブジェクトに格納されたデータ表現を作成することができます。DataCubeViewコンポーネントはデータを線形テーブル（この列は最初のキューブのファクトとディメンションの1フィールドです）として表して、ピボットテーブルのディメンションキューブを「詳細に表現」します。DataCubeViewは1つのディメンションから別のディメンションへ、同じディメンション内の1つのグループから他のグループに移動することができます。

ピボットテーブルのデータ表現を他のコンポーネントで構成するには、DataCubeViewコンポーネントの使用をお勧めします。ご存知のように、データソースとして表現するのに必要なインターフェースをきちんと実装しないイメージ表示コンポーネントが沢山あるので、OLAP ModelKitがADO.NETオブジェクトを使用して他のコンポーネントと相互作用するためのツールを提供しています。

DataCubeViewコンポーネントは、エンドユーザが意のままに使用できるADO.NETオブジェクトに、DataCubeViewコンポーネントで表したピボットテーブルを部分的に転送できます。


.NET ModelKit Suite User(s)Guide

ADO.NETオブジェクトによるOLAP ModelKitとの相互作用

DataCubeオブジェクト内でFill()オープンメソッドにアクセスできます。Fill()オープンメソッドはピボットテーブルのデータをADO.NETデータオブジェクトに転送します。

Fill()オープンメソッドはオーバーロードされます。その簡単な使用法を詳しく説明します。

PerpetuumSoft.Olap.DataCube.Fill(PerpetuumSoft.Olap.ViewDimension primaryDimension, System.Data.DataSet dataSet, int depth)メソッドはprimaryDimensionリストの値（X - 列ごと、Y - 行ごと）で定義したディメンションによりピボットテーブルのデータ転送を行います。データはディメンション内の最大グループの入れ子の深さ（depthパラメータ）に応じてdataSetオブジェクトに転送されます。必要に応じてここでテーブルを作成したり、データセットにテーブルを追加します。各テーブル名はグループの値を計算するフィールド名と一致します。depthパラメータの値が指定したディメンションのグループ数を超えないようにしてください。

PerpetuumSoft.Olap.DataCube.Fill(PerpetuumSoft.Olap.ViewDimension primaryDimension, System.Data.DataSet dataSet, params string[] tableNames)メソッドはprimaryDimensionリストの値（X - 列ごと、Y - 行ごと）で定義したディメンションによりピボットテーブルのデータをdataSetに転送します。しかも、文字列の名前の配列で割り当てたテーブルがデータセットに作成されます。その配列内のテーブル名の数が指定したディメンションのグループ数を超えないようにしてください。

PerpetuumSoft.Olap.DataCube.Fill(PerpetuumSoft.Olap.ViewDimension primaryDimension, System.Data.DataSet dataSet, params System.Data.DataTable[] tables)メソッドはprimaryDimensionリストの値（X - 列ごと、Y - 行ごと）で定義したディメンションによりピボットテーブルのデータをテーブル配列に含まれたDataTableオブジェクトに転送します。必要条件は1つのDataSetオブジェクトにすべてのテーブルを含むことです。配列のテーブル数が指定したディメンションのグループ数を超えないようにしてください。

バインドされて埋められたテーブルのセットはこの結果またはFill()メソッドの実装結果を表します。テーブルには次のものが含まれます。

- 指定したディメンション内のグループの値（テーブルの列の名前はグループの値を計算するフィールド名と一致します）

- ファクト値（列の名前はファクトの値を計算するフィールド名と一致します）

- さまざまなテーブル間のバインドの構成に使用するプライマリ値と外部キーの値

Fill()メソッドの実行時に、親テーブルが下位のテーブルのグループより下の入れ子レベルのディメンショングループに対応するように、テーブルは”one-to-several”リレーション型で接続されています。

下図のピボットテーブルについて説明します。

Fill(PerpetuumSoft.Olap.ViewDimension.Y, System.DataSet dataSet, 3)メソッドの呼び出し（dataSetにはテーブルやバインドはありません）はdataSetオブジェクトを次のように出力します。


.NET ModelKit Suite User(s)Guide

DataCubeViewコンポーネントによるOLAP ModelKitとの相互作用

DataCubeViewオブジェクトはDataCubeプロパティに指定したテーブルのデータをスライスにします。DataCubeViewオブジェクトのPrimaryDimensionプロパティに、どのキューブを「スライス」にするかを定義する値（サンプルではXまたはY）を指定します。

DataCubeViewコンポーネントの使用時に、1つのディメンショングループ（親）から入れ子のサブグループ（子）に移動できます。

注意！DataCubeViewオブジェクトを正確に動作させるには、コンポーネントがIList、IBindingList、ICollection、IEnumerable、ITypedListインターフェースをきちんとサポートしているかを確認してください。

例：

フォームにDataCubeViewオブジェクトを追加します。DataCubeプロパティの値としてピボットテーブルを指定します。下図のピボットテーブルをご覧ください。

次に、DataCubeViewオブジェクトのPrimaryDimensionプロパティにYを指定してください。これで、DataCubeViewオブジェクトを使用してピボットテーブルのデータを表すことができます。

下図に示されている結果はChart ModelKitコンポーネントの出力で、DataCubeViewで作成したピボットテーブルのデータをチャートのデータソースとして使用しています。


.NET ModelKit Suite User(s)Guide

Chart ModelKitの目的とその機能

Chart ModelKitはいろいろな種類のチャートをデザインするためのものです。製品にはWindows Formアプリケーションにチャートを表示するためのChartViewerコンポーネントが含まれています。

Chart ModelKitはチャートの作成や外観のカスタマイズ、いろいろなイメージ形式への保存、印刷することができます。このコンポーネントはデータソースとの動作が非常にフレキシブルで、バインドなしのチャートを作成できます。

デザイナだけでチャートをコードを使わずに見ながら設定できます。作成したチャートはファイルに保存していつでも使用できます。


.NET ModelKit Suite User(s)Guide

Chart ModelKitのしくみ

Chat ModelKitの主な概念は開発者が専門知識や高度な技術がなくてもユーザの条件にあったチャートを早く作成できるようにすることです。この製品にはチャートを表示したり処理するためのコンポーネントが含まれています。

チャートは階層型表示の構造を持つ複合オブジェクトです。チャートには外観や動作を割り当てるプリミティブが含まれています。

チャートを作成するにはデザイナを使用します。単純なオブジェクト（色々組み合わせてチャートに含められます）を使用したり、便利なイメージ方法を使用して各オブジェクトのプロパティを設定してチャートをデザインできます。プリミティブのバインドや複雑な機能を割り当てるために式を使用できます。色々な組み合わせでプリミティブを結合したり、オブジェクトのプロパティをフレキシブルにカスタマイズしたり、式を使用することにより、エンドユーザの条件に合ったチャートを作成できます。


.NET ModelKit Suite User(s)Guide

ウィザードを使用した簡単なチャートの作成

Chart ModelKitを使用して簡単なチャートを作成します。

この例での説明に類似した「GettingStarted」サンプルが製品及び体験版に含まれています。

Microsoft Visual Studioで新規のC#Windowアプリケーションを作成し、フォームにChartViewerコンポーネントを配置します。

DataSetテーブルをデータソースとして使用するチャートをデザインします。

フォームにDataSetを配置し、その中にdouble型のColumn1を持つテーブルを作成します。フォームのロード時に、テーブルにデータを埋める次のコードを追加してください。

private void GettingStartedForm_Load(object sender, System.EventArgs e)

{

dataTable1.Rows.Add(new object[] {7});

dataTable1.Rows.Add(new object[] {4});

dataTable1.Rows.Add(new object[] {9});

}

ChartViewerに新しいデータソースを追加し、データソース名とデータソース（DataSourceプロパティ）を割り当ててください。

ChartViewerコンポーネントをダブルクリックしてデザイナを立ち上げます。デザイナを開くと、ウィザードウィンドウも開きます。ここで、既存のテンプレートからチャートを選択できます。

リストからチャートを選択してください。

「OK」ボタンをクリックします。選択したチャートがデザイナに読み込まれます。

デザイナを使用してチャートやすべてのオブジェクトの外観をすばやくカスタマイズできます。

ウィンドウの左側にはチャートを作成するためのオブジェクトが含まれます。各オブジェクトの説明は次の通りです。

オブジェクト名 | 説明
ChartArea（チャート領域） | 他のチャートオブジェクト（軸、系列、タイトルなど）をすべて含むオブジェクトです。チャートには1つまたは複数のチャート領域を含むことができます。
Axis（軸） | （パイチャート以外の）あらゆる系列型の値が軸に沿って配置されます。チャートを正確に作成するには、チャート領域に別方向の2つの軸（X方向とY方向）を含めてください。
Series（系列） | 単一セットのデータを表し、データの表示方法を定義するプロパティが含まれています。表示モードはSeriesViewプロパティで割り当てます。系列を作成するためのデータはデータソースから取得するか、直接系列に割り当てることができます。
Legend（凡例） | チャートを凡例に表示します
ValueLabels （値ラベル） | チャート上の各ポイントの値を表示します
Title（タイトル） | チャートのタイトルを割り当てます
ScaleLabels（スケールラベル） | 軸に値を表示します
CustomLabels（カスタムラベル） | 軸に任意のテキストラベルを表示します
GridLines（グリッド線） | 軸にグリッドを表示します
Ticks（目盛） | スケールに目盛を割り当てます
ScaleMarks（スケールマーカ） | 軸にマーカを配置します
ScaleTitle（スケールタイトル） | 軸のタイトルを割り当てます

ウィザードを使用して作成したチャートは複数の値を含んでいるので、チャートをデータソースにバインドしなくてもチャートの外観を割り当てることができます。

チャートの外観をカスタマイズします。チャートのタイトルを変更します。それには、チャートツリーから「Title」オブジェクトを選択してください。

必要なオブジェクトをデザイナでクリックして選択することも可能です。選択したオブジェクトはチャートツリーでハイライトされ、利用可能なプロパティがすべてデザイナ右側のプロパティグリッドに表示されます。「Title」オブジェクトのTextプロパティを「My simple chart」に変更してください。

マウスでX軸のスケールラベルを選択し、一部のプロパティ（例：FontプロパティとStepプロパティ）を変更してください。チャートツリー内の「ScaleLabels1（スケールラベル）」は「ChartArea（チャート領域）」ではなく、「AxisX（X軸）」に配置されています。

X軸の「Ticks」オブジェクトのStepプロパティを変更してください。X軸に「GridLines」オブジェクトを追加し、Strokeプロパティ、Stepプロパティ、Originプロパティを割り当ててください。

作成したチャートをファイルに保存し、「OK」ボタンを押してデザイナを閉じてください。

テーブルのデータを使用してチャートを作成します。作成したチャートを実行し、 [image] ツールバーボタンを押してデザイナウィンドウを開きます。「Series」オブジェクトをマウスでクリックして選択します。DataSourceプロパティを選択し、チャートのデータソースプロパティのウィンドウを編集するために開いてください。

チャートのデータソースにdataSourceオブジェクトを選択し、系列のValueフィールドに「Column1」をバインドしてください。

「OK」ボタンをクリックします。系列のAutoArgumentプロパティをTrueに変更して、引数が各チャートポイントに自動的に代入されるようにしてください。

指定したデータソースが値と一緒に引数を含んでいたら、系列の「Argument」フィールドにこのフィールドのバインドを割り当てることができます。

変更したチャートをファイルに保存して、そのチャートをデザイン時にChartViewerに読み込んでください。

このサンプルはウィザードを使用したチャートの作成方法を示しています。しかし、これ以外にもチャートの作成方法はあります。ウィザードを使用しないチャートのデザイン方法については次の章で説明します。


.NET ModelKit Suite User(s)Guide

ウィザードを使用しない簡単なチャートの作成方法

ChartViewerコンポーネントをダブルクリックし、デザイナウィンドウを開いて新規にチャートを作成します。

チャートに「ChartArea」コンポーネントを配置し、オブジェクトの塗りつぶしと枠を設定するFillプロパティとStrokeプロパティを「SolidFill」に設定してください。Dockプロパティを「Client」に設定して、「ChartArea」オブジェクトが作業領域全体に収まるよう自動的に拡張します。

「ChartArea」に軸を2つ配置し、AxisYの軸の向きを設定するためにDirectionプロパティを「Y」に変更してください。

「ChartArea」に「Series」コンポーネントを追加します。まず、データソースを使わずに系列に直接データを割り当てます。それには、DataSourceプロパティエディタを開き、「系列ポイント」タブを選択します。

コレクションに値をいくつか追加してください。「UserData」フィールドを埋める必要はありません。「ValueLabels」オブジェクトの値をバインドしないで情報を出力するためにこのフィールドを使用できます。

その後、「OK」ボタンを押すと、下図のようなチャートが生成されます。

次に、チャートの外観を割り当てます。ChartAreaに「Title」コンポーネントを追加して外観をカスタマイズしてください。

軸の外観を設定します。「SｃaleLabels」コンポーネントを使用して軸に数値を割り当てます。X軸に「ScaleLabels」を配置し、OriginプロパティとStepプロパティを割り当てます。「ScaleLabels」に応じて軸のサイズを自動的に割り当てるために、Dockingプロパティを設定してください。

「Ticks」コンポーネントを追加し、「ScaleLabels」と同様にカスタマイズしてください。

Y軸に「ScaleLabels」コンポーネントと「Ticks」コンポーネントを配置し、X軸のオブジェクトと同じように設定してください。Y軸に「GridLlines」コンポーネントを配置し、StepプロパティとOriginプロパティをTicksプロパティやScaleLabelsプロパティと同様に設定してください。FillプロパティとAlternativeFillプロパティを使用して背面のストライプの塗りつぶしを割り当ててください。

「Series1」に「ValueLabels」コンポーネントを配置してください。これはデフォルトでチャートにすべての値を表示します。

「ValueLabels」のFormulaフィールドに式を指定できます。この式を使用して、出力される値が割り当てられます。このプロパティを次のように設定してください。

UserData & ' = ' & Value

ViewTypeプロパティを使用して、表示するオブジェクトの型を矩形から円筒に変更してください。

チャートのデザインは終了です。「OK」ボタンをクリックしてデザイナを閉じます。


.NET ModelKit Suite User(s)Guide

チャートについて

チャートは階層表示型のツリー型構造を持つ複合オブジェクトです。チャート全体は個別のシンプルなオブジェクトで構成されています。チャート各オブジェクトに分解でき、さまざまなオブジェクトを組み合わせて色々なチャート型を作成できます。オブジェクトのプロパティ設定がより直感的で容易になります。

チャートには次の構成要素が含まれています。

・系列 - データを表示します

・軸 - チャートのメートル法を割り当てます

・軸や系列上のさまざまなラベル

・凡例 - 注釈規約を表示します（チャート内で使用）

・その他のチャートの装飾オブジェクト（チャートのデザインに使用）

これらのチャートのオブジェクトはすべてさまざまなプロパティを持った個別のオブジェクトとしてChart ModelKitで表現されます。オブジェクトを好きなだけチャートに組み合わせることができます。しかし、通常チャートには次のような典型的な構造があります。「ChartArea」はチャート内に配置されます。このオブジェクトは軸、系列、凡例、いろんな説明をするラベル、タイトル、イメージなどを含みます。

軸に向きと最小値/最大値を割り当てます。値を表示するために、軸に「Ticks」、「ValueLabels」、「CustomLabels」、「GridLines」、「ScaleTitle」を含めることができます。

系列はデータセットを表示するために使用します。指定した「SeriesView」に応じて、系列はデータを色々な形（例：縦棒チャート、リボンチャートなど）で表示できます。値を表示するために、特定ポイントにマーカを付ける「ValueLabels」や「ValueMarkers」を系列に含めることができます。

オブジェクトは構造上、複合と単一の2つのグループに分けられます。複合オブジェクトには他のチャートオブジェクトを含めることができます。単一オブジェクトには他のチャートオブジェクトを含めることができません。


.NET ModelKit Suite User(s)Guide

共通プロパティについて

Elementクラスのプロパティ、特にすべての従属オブジェクトについて説明します。

プロパティ名 | 説明
Nameプロパティ | 計器全体で固有のオブジェクト名を割り当てます
Fillプロパティ | （オブジェクトを描画する際に使用する）塗りつぶしを割り当てます
Smoothプロパティ | 表示するイメージ品質を設定します
Visibleプロパティ | オブジェクトの可視性を割り当てます
Activeプロパティ | マウスイベントをオブジェクトに渡すかどうかを指定します
BreakEventBubblingプロパティ | 更なる処理のためにマウスイベントを親オブジェクトに渡すかどうかを指定します
RecalculateAllプロパティ | オブジェクトが変更された場合にオブジェクトの式を再計算するかどうかを指定します。Falseの場合、指定したオブジェクトとその中に含まれているすべてのオブジェクトにしか式の再計算が行われません。Trueの場合は、すべての計器オブジェクトに対して式の再計算が行われます。

マウスイベントを受け取るプロセスとその処理は次のように行われます。マウスがオブジェクト上にある場合、オブジェクトはマウスからイベントを受け取ります。オブジェクトはこれらのイベントを処理することができ、BreakEventBubblingプロパティがFalseの場合、その親にイベントを渡します。従って、マウスイベントは可視オブジェクトから計器のツリーにまでも渡されます。


.NET ModelKit Suite User(s)Guide

ChartAreaコンポーネント

ChartAreaコンポーネント [image] はチャートを描画する矩形領域で、すべてのチャートコンポーネントのコンテナです。位置はSizeプロパティとCenterプロパティで定義します。Dockプロパティには親のChartオブジェクトにドッキングさせるChartAreaの位置を割り当てます。DockプロパティがChartAreaDockStyle.Noneの場合、「ChartArea」の位置は親チャートの位置に関係なく、SizeプロパティとCenterプロパティで割り当てられます。DockプロパティがChartAreaDockStyle.Clientの場合、「ChartArea」の位置とサイズは親チャートの位置とサイズに収められます。MarginsプロパティはChartAreaの境界からのインデントを定義します。PrimaryArgumentAxisプロパティとPrimaryValueAxisプロパティはデフォルトで系列に使用される引数軸と値軸を定義します。


.NET ModelKit Suite User(s)Guide

チャートの系列

Chart ModelKitは縦棒、リボン、パイ、株式など一般的な系列型をサポートします。Chart ModelKitの概念はデータの格納と表示を個別に提供するということです。つまり、系列データを変更せずに系列型を変更できます。

系列型はViewプロパティで割り当てます。

Chart ModelKitで提供されている系列型についての説明は次の章で取り上げます。


.NET ModelKit Suite User(s)Guide

縦棒チャート

縦棒チャートはBarSeriesView、StackedBarSeriesView、Stacked100BarSeriesViewクラスで表現されます。「SeriesValue」クラスはデータ型として使用されます。

BarSeriesViewは各系列の値を表す縦棒を並列に配置した縦棒チャートです。

StackedBarSeriesViewは各系列と1つの引数の縦棒を積み重ねた縦棒チャートです。

Stacked100BarSeriesViewは各系列と1つの引数の縦棒を積み重ねた縦棒チャートですが、指定したポイントに指定した系列型の値の合計から相対値を表します。

TankSeriesViewは各系列の値をタンク型の縦棒で表し、並列に配置した縦棒チャートです。

LevelSeriesViewは各系列の値をレベル型の縦棒で表し、並列に配置した縦棒チャートです。UpperレイヤとLowerレイヤはAciveLayerプロパティとInactiveLayerプロパティを使用して設定されます。

ThermometerSeriesViewは各系列の値を温度計型の縦棒で表し、並列に配置した縦棒チャートです。UpperレイヤとLowerレイヤはActiveLayerプロパティとInactiveLayerプロパティで設定されます。

縦棒チャートには縦棒の相対幅（AreaWidthプロパティ）やオブジェクトの表示型（縦棒、円筒、3Dバー、ピラミッド）を割り当てることができます。


.NET ModelKit Suite User(s)Guide

リボンチャート

リボンチャートはLineSeriesView型、StepLineSeriesView型、SplineSeriesView型で表されます。

LineSeriesViewはすべての系列ポイントを通過する折れ線を作成します。

StepLineSeriesViewはデータをすべての系列ポイントを通過する階段状の線（垂直間隔と水平間隔で構成されます）で表します。

SplineSeriesViewはデータをすべての系列ポイントを通過するスプライン曲線で表します。


.NET ModelKit Suite User(s)Guide

面チャート

AreaSeriesViewはデータをすべての系列ポイントを通過する折れ線で囲まれた面として表します。

StackedAreaSeriesViewは各系列の面を積み重ねたチャートです。

Stacked100AreaSeriesViewは各系列の面を積み重ねたチャートですが、指定したポイントに系列値の合計から相対値を表します。

SplineAreaSeriesViewはデータをすべての系列ポイントを通過するスプライン曲線で囲まれた面として表します。


.NET ModelKit Suite User(s)Guide

散布図チャート

PointSeriesViewはデータをさまざまな直径の円で表示します。座標（ArgumentとValue）で割り当てたポイントに、半径と中心を持つ円をすべての系列値に対して作成します。MinRadiusプロパティとMaxRadiusプロパティは表示される円の最小半径と最大半径を設定します。


.NET ModelKit Suite User(s)Guide

パイチャート

PieSeriesViewはデータをパイで表します。すべての値は個別のパイスライスで表示されます（パイスライスの角度は系列全体の角度と指定した値の比率で決まります）。各パイスライスに塗りつぶし、中心からの移動量、内径、外径を割り当てることができます。

ChartAreaにPieSeriesView型の系列が複数ある場合、水平、垂直、重ね合わせ（1つの系列の内側）に配置できます。

,


.NET ModelKit Suite User(s)Guide

株式チャート

株式チャートはStockSeriesViewとCandleStickSeriesViewで表されます。StockSeriesViewは株式情報をHi、Lo、Open、Closeパラメータで表示するために使用します。線のサイズや位置はHiプロパティとLoプロパティで定義します。矩形サイズはOpenプロパティとCloseプロパティで定義します。

矩形の線の色や塗りつぶしはColorプロパティやReductionColorプロパティに設定します。ReductionValueに割り当てたカレントのフィールドがその前の系列の値のフィールドより低い場合、ReductionColorプロパティを使用します。それ以外はColorプロパティを使用します。Open値（始値）がClose値（終値）より低い場合、矩形は塗りつぶされます。

CandleStickSeriesViewはHi、Lo、Open、Closeパラメータで株式情報を表示するために使用します。線の色はColorプロパティやReductionColorプロパティで定義します。

Chart ModelKitは1つのチャートに色々な系列型を組み合わせることができます。


.NET ModelKit Suite Documentation

系列とデータソースの割り当て

Seriesコンポーネント [image] はデータを格納したり表示するために使用します。

プロパティ名 | 説明
Viewプロパティ | チャート型を割り当てます
ArgumentAxisプロパティ | 引数軸を設定します
ValueAxisプロパティ | 値軸を設定します
ScaleTypeプロパティ | スケールの引数型（QualitativeとNumerical）を定義します。Numericalの場合、すべての系列の引数はdouble型に設定されて検索されます。double型以外の引数（例：文字列、日付）を割り当てるには、「Qualitative」に設定してください。

これらの系列はデータソースを使用するか、Valuesプロパティのコレクションを埋めることにより割り当てることができます。データの取得方法に関係なく、SeriesValueBase型のオブジェクトのコレクションを表します。チャートの作成時に、各データソースの値が単一チャートの値と一致するようになります。よくある例で、SeriesValeBase型にはオブジェクト型のArgumentとオブジェクト型のUserDataプロパティ（二次データを格納します）があります。SeriesValueBase型の後続のオブジェクトには特殊なチャートを作成するために必要なフィールドがあります。単純な例で、SeriesValueオブジェクトにもdouble型のValueプロパティがあります。


.NET ModelKit Suite User(s)Guide

データのバインド

Chart ModelKitはチャートを作成するためのデータソースとしてADO.NETオブジェクトから取得したデータ、またはさまざまなコレクションから取得したデータを使用できます。IListインターフェースを実現するどのオブジェクトでもデータソースとして使用できます。データソースはSeries DataSourceプロパティに割り当てます。

データのバインドはSeriesValueBase型のオブジェクトフィールドとデータソースフィールドを照合させて行われます。照合はすべてSeriesBndingTypeオブジェクトで割り当てられます。SeriesBndingTypeオブジェクトにはSeriesValueNameプロパティ名を指定するSeriesValueName文字列プロパティとデータソースからプロパティ名または式を指定するPropertyName文字列プロパティがあります。SeriesBindingオブジェクトはSeriesBindingCollection型のBindingsプロパティに格納されます。従って、Bindingsプロパティにはデータソースフィールドと系列の値フィールドとの照合を記述します。

Series.AutoArgumentプロパティがTrueの場合、Argumentフィールドの値は昇順で自動的に割り当てられます。Argumentフィールドに照合させる必要はありません。簡単な例としてデータソースとコレクションの照合を割り当てると、系列が1つだけ作成されます。このようなデータのバインドを図で示すと以下のようになります。

データソースに2つ以上の似たような値がある場合、これらの値はチャートの作成時にまとめられます。

あるデータソースフィールドがIListリストの場合、DataMemberプロパティを使用して系列を入れ子リストのデータで作成できます。すべての入れ子データを含んでいるフィールド名をDataMemberプロパティに指定する必要があります。照合を割り当てる際に、この入れ子のデータソースのプロパティ名を使用できます。

入れ子のデータソースによるチャートのバインドは次のように行われます。個別の系列がすべてのオブジェクトに対してデータソースから作成されます。対応する入れ子のデータソースから系列値が取得されます。これは次のように図式的に表すことができます。

1つのデータソースから複数の系列を作成しなければならない場合があります。その場合、あるパラメータによりデータソースのデータは別々の系列に分類されます。そのために、データを系列に分類するための式をSeriesSplitterプロパティに割り当ててください。

作成したすべての系列内のデータをソートできます。Sortプロパティにはソートを割り当て、SortingTypeプロパティにはソート順（昇順または降順）を割り当てます。


軸と軸コンポーネント

＜軸＞

大半のチャート型のデザインに必要なのは2つの軸です（その軸の中に引数とチャートのポイントの値が置かれます）。軸はスケールです（その軸の中にチャートの値が置かれます）。軸は垂直線または水平線で、Marginsプロパティに割り当てた移動量に応じてChartAreaの高さまたは幅に収まるよう引き伸ばすことができます。

プロパティ名 | 説明
ArgumentAxisプロパティ/ValueAxisプロパティ | 系列を軸にバインドします。軸の種類は軸の向きとは関係ありませんが、デフォルトではArgumentAxisは水平軸で、ValueAxisは垂直軸になっています。
MinValueプロパティ/MaxValueプロパティ | スケールの最小値と最大値を定義します。軸はこの軸を使用して、取得した系列ポイントの値に応じたスケールの範囲を自動的に計算できます。これらのプロパティを「Auto」に設定する必要があります。定数値を取得する場合、スケールの範囲は自動的に計算された値ではなく定数値が割り当てられます。これらのプロパティは自動的に計算された範囲から相対値をパーセントで取得することができます。自動的に範囲が計算された場合、範囲は完全に負の値または完全に正の値になり得ます。
StartFromZeroプロパティ | 範囲にゼロポイントを含めるかどうかを定義します
IsDiscreteプロパティ | 軸に離散値を表示するか数値を表示するかを指定します。このプロパティは軸を数値以外の値を含む系列の引数軸として使用できます。
Marginsプロパティ | ChartAreaの高さ/幅に収めるための軸の移動量を割り当てます
Strokeプロパティ | 軸線の種類、色、太さを設定します
Arrowプロパティ | 軸の矢印型を割り当てます
Directionプロパティ/Reverseプロパティ | 軸の向きを設定します
AxisIndentプロパティ | 軸の矢印からスケールの終点までの間隔を設定します
CrossValueプロパティ | PerpendicularAxisプロパティ（垂直軸）に設定したもう一方の軸との相対位置を割り当てます

＜軸コンポーネント＞

Chart ModelKitにはスケールや目盛、ラベル、その他の情報を表示するためのコンポーネントがあります。

Ticksコンポーネント

Ticksコンポーネント [image] はスケールに主目盛を表示するよう設計されています。主目盛はTicksコンポーネントが描画される際にスケールに均等に配置されます。

プロパティ名 | 説明
Strokeプロパティ | 主目盛の太さを設定します
Stepプロパティ | 主目盛の間隔を割り当てます
Divisionsプロパティ | StepプロパティがAutoの場合、主目盛の分割数を割り当てます
Originプロパティ | 目盛の基準点（原点）を設定します
UseRoundValuesプロパティ | Trueの場合、スケールの目盛は小数点以下の桁数が丸められた値が表示され、主目盛の数はDivisionsプロパティの値より少ないか同じになります
Lengthプロパティ | 主目盛の長さを設定します
SubDivisionsプロパティ | 副目盛の分割数を割り当てます
SubLengthプロパティ | 副目盛の長さを設定します
SubTicksPositionプロパティ | 主目盛と副目盛の相対位置を割り当てます
UseDircreteValueプロパティ | 目盛を離散的なスケールに表示します。Trueの場合、離散的なスケール値にのみ主目盛が表示されます。

ScaleMarksコンポーネント

ScaleMarksコンポーネント [image] はスケールマーカを表示するためのものです。

プロパティ名 | 説明
Shapeプロパティ | マーカの種類を設定します
MarkSizeプロパティ | マーカの大きさを定義します
SubMarkSizeプロパティ | サブマーカの大きさを定義します

*スケールにマーカの位置を割り当てる論理やプロパティはTicksコンポーネントと同じです。

ScaleLabelsコンポーネント

ScaleLabelsコンポーネント [image] は軸の値を表示するよう設計されています。軸が離散的な場合、ScaleLabelsコンポーネントは離散的な軸の値を表示します。軸が離散的でない場合、ラベルはスケールに沿って均等に表示されます。

プロパティ名 | 説明
Stepプロパティ | ラベルの間隔を設定します
Divisionsプロパティ | StepプロパティがAutoの場合、ラベルの数を割り当てます
Originプロパティ | ラベルの基準点（原点）を割り当てます
UseRoundValuesプロパティ | Trueの場合、スケールラベルは小数点以下の桁数が丸められた値が表示され、ラベルの数はDivisionsプロパティの値より少ないか同じになります。
Angleプロパティ | ラベルの角度を設定します
TextRotationModeプロパティ | ラベルの向きを設定します
Fillプロパティ/Strokeプロパティ | 塗りつぶしの種類とラベルの枠を設定します
ItemMarginsプロパティ | ラベルの領域を広げます
ShowSuperposableLabelsプロパティ | スケールラベルを重ねて表示するかどうかを指定します

CustomLabelsコンポーネント

CustomLabelsコンポーネント [image] はScaleLabelsコンポーネントと似ていますが、軸の値にバインドされない任意のスケールマーカを割り当てることができます。各ラベルは「テキスト」 - 「スケール値」の組み合わせで割り当てられ、Labelsコレクションに格納されます。1つまたは複数のラベルが「Auto」の値を含んでいる場合、そのラベルはスケールに均等に配置されます。

ScaleTitleコンポーネント

ScaleTitleコンポーネント [image] は軸のタイトルを割り当てるために設計されています。Textプロパティで設定したラベルは軸の最後に配置されます。

ScaleLabels、CustomLabels、ScaleTitleコンポーネントの共通プロパティ

ScaleLabels、CustomLabels、ScaleTitleコンポーネントにはラベルの外観や位置を割り当てるプロパティがいくつかあります。

プロパティ名 | 説明
OddLabelsDistanceプロパティ | 偶数ラベルに対する奇数ラベルの間隔を設定します
TextAlignmentプロパティ | ラベルの値に一致する軸ポイントのラベルの位置を割り当てます
Positionプロパティ | 一番幅の広いのラベルに対するラベルの位置を設定します
Fomulaプロパティ | ラベルの値を計算するための式を設定します
TextFormalプロパティ | ラベルのテキストを書式設定するための文字列（形式）を割り当てます

Ticks、ScaleMarks、ScaleLabels、СustomLabels、ScaleTitleコンポーネントの共通プロパティ

プロパティ名 | 説明
MaxLimitプロパティ/MinLimitプロパティ | 指定した範囲内だけに軸コンポーネントを表示したい場合に境界範囲を割り当てます
UseLimitsプロパティ | 指定した範囲内にオブジェクトを表示するかどうかを定義します
Distanceプロパティ | スケールからコンポーネントまでの間隔を設定します。Dockプロパティが「None」の場合、このプロパティがコンポーネントの位置を定義します。
Dockプロパティ | 軸に含まれているTicksやScaleLabelsなどの複数のスケールコンポーネントとの相対位置を割り当てます。 このプロパティが「None」の場合、軸上にあるコンポーネントの位置は他のどの軸コンポーネントとも依存しません。この場合、コンポーネントの位置はDistanceプロパティの値で定義されます。 「Center」の場合、コンポーネントは他のどの軸コンポーネントにも関係なく軸の中央に配置されます。 「Inside」の場合、コンポーネントは軸の内側にPaddingプロパティで割り当てた間隔で配置されます。 「Outside」の場合、コンポーネントは軸の外側にPaddingプロパティで定義した間隔で配置されます。
Colorizerプロパティ | スケールコンポーネントの色を設定します。軸のColorizerプロパティを割り当ててすべての軸コンポーネントの色を設定することもできます。

軸に、複数のコンポーネント（DockプロパティがNone以外）がある場合、Dockプロパティの値が「Center」に設定されているコンポーネントがまず配置され、その後に他のすべてのコンポーネントが軸に追加された順にすでに配置されているコンポーネントの大きさに応じて配置されます。

GridLinesコンポーネント

GridLinesコンポーネントはチャートのグリッドに値を表示するよう設計されています。
プロパティ名 | 説明
Stepプロパティ | グリッドの間隔を割り当てます
Divisionsプロパティ | StepプロパティがAutoの場合に、グリッドの分割数を設定します
Originプロパティ | グリッドの基準点（原点）を定義します
UseRoundValuesプロパティ | Trueの場合、値に小数点以下の桁数が丸められた値が表示されます。Divisionsプロパティの値より少ないか同じになります。
SubLinesCountプロパティ | 副線の数を設定します
Fillプロパティ/AlternativeFillプロパティ | 交互のグリッド線の塗りつぶしを割り当てます
Strokeプロパティ/SubStrokeプロパティ | 主線と副線の線種を定義します


その他のチャートコンポーネント

Chart ModelKitにはチャートのデータを簡単に理解するためのコンポーネントや補助的な機能もあります。

＜Legendコンポーネント＞

Legendコンポーネント [image] はチャートで使用した系列を表示するよう設計されています。

Series.DisplayingInLegendTypeプロパティは凡例に表示する系列情報の種類を割り当てます。

「None」の場合は、系列の情報が表示されません。「Series」の場合は、系列の情報が表示されます。

「Values」の場合、各系列の値に関する情報が表示されます。

Centerプロパティは凡例の中心位置を割り当てます。LegendTypeプロパティは凡例項目の整列（垂直方向、水平方向）を設定します。

ColumnsCountプロパティは凡例の列数を定義します。ItemMarginsプロパティは凡例の各項目のマージンを割り当て、Marginsプロパティは凡例全体のマージンを割り当てます。Paddingプロパティは凡例の枠からのマージンを割り当てます。

LegendExpressionプロパティには式を設定し、その結果が凡例に表示されます。すべての系列の値に関する情報だけでなく、系列に関する情報を表示するために式を設定できます。例えば、式：“Argument & '=' & Value”を設定した場合、凡例は下図のように表示されます。

＜Titleコンポーネント＞

Titleコンポーネント [image] はデータにバインドされていないチャートのタイトルや様々なラベルを作成するよう設計されています。ラベルのテキストはTextプロパティで設定します。テキストのフォントはFontプロパティで設定します。TextFillプロパティはタイトルのテキストの塗りつぶしを割り当て、Fillプロパティはタイトルの背景の塗りつぶしを割り当てます。Strokeプロパティはタイトルの境界を定義します。Angleプロパティはテキストの回転角度を割り当てます。Marginsプロパティはタイトル領域内のタイトルテキストの位置を設定します。Paddingプロパティは色付けされた領域からタイトル領域までの間隔（左、上、右、下）を設定します。

TitleコンポーネントとLegendコンポーネントは「ChartArea」領域にバインドすることにより自動的に配置できます。DockingTypeプロパティはコンポーネントのドッキング位置（None、Left、Right、Top、Bottom）を定義します。「None」に設定した場合、ChartAreaの側面にバインドされないので、好きな場所にコンポーネントを配置できます。

DockingStyleプロパティはコンポーネントの配置位置（ChartAreaの内側か外側）を定義します。このプロパティが「Outside」の場合、コンポーネントはChartAreaの外側に配置され、チャートの作成領域が少なくなります。「Inside」の場合、コンポーネントはChartAreaの内側に配置され、チャートの作成領域に部分的に重なります。

Alignmentプロパティは選択した領域内のコンポーネントの整列を設定します。

＜ValueLabelsコンポーネント＞

ValueLabelsコンポーネント [image] は各系列ポイントに値または他の情報を表示するよう設計されています。

Distanceプロパティは対象のポイントからValueLabelまでの距離を割り当てます。AngleプロパティはValueLabelsの角度を設定します。LineStrokeプロパティはラベルとポイントとをつなぐ線種を定義します。

Positionプロパティはチャート内のラベルの位置（Top、Center、Bottom）を定義します。

Expressionプロパティには式を割り当てることができ、その計算結果がラベルに表示されます。

＜ValueMarkersコンポーネント＞

ValueMarkersコンポーネント [image] は系列にマーカを表示するよう設計されています。Shapeプロパティはマーカの種類を設定します。Sizeプロパティはマーカの大きさを設定します。

Distanceプロパティは対象のポイントからマーカまでの（垂直方向の）距離を定義し、Shiftプロパティは対象のポイントからマーカまでの移動量（X、Y）を割り当てます。LineStrokeプロパティはマーカとポイントを結ぶ線種を定義します。

Positionプロパティはチャート内のマーカの位置（Top、Center、Bottom）を定義します。


パレット

Chart ModelKitはあらかじめ定義された色、線種、形状のセットを使用して系列やそれぞれの値に色を設定できます。

パレットは系列やそれぞれの系列オブジェクトに色や塗りつぶしを割り当てます。また、パレットはリボンチャートの色や線種、ValueMarkersオブジェクトのマーカの種類も割り当てます。

ChartAreaのPaletteプロパティは系列のパレットを設定し、SeriesのPaletteプロパティは系列オブジェクトのパレットを設定します。下図はChartAreaでのパレットの使用法を示しています。ChartAreaには3つの系列があり、SeriesのFillプロパティは設定されていません。この場合、系列はパレットの色を使用します。

SeriesのPaletteプロパティは各系列オブジェクトの色を定義します。

リボンチャートのPaletteプロパティは線の色だけでなく線種も設定できます。

CustomPaletteクラスはカスタムパレットを設定できます。このクラスはオブジェクトのセットで構成されており、各オブジェクトにはValueMarkersやオブジェクトの線種を表示するための塗りつぶし、色、形状を含んでいます。


チャートビューア

ChartViewer [image] は.NetのWindowsFormsアプリケーションにチャートを表示するために設計されたコンポーネントです。ChartオブジェクトはChartStreamプロパティの他にChartプロパティでも割り当てることができます。文字列にシリアライズ化したチャートをChartViewerにアップロードできます。

ツールバーはChartViewerの上部に配置されており、その他はチャートを表示するために使用します。

ツールバーには次のボタンがあります。

ボタン | 説明
「新規チャート」 | 新規のチャートを作成します
「チャートを開く」 | ファイルに保存したチャートを開くダイアログを呼び出します
「チャートの保存」 | チャートをファイルに保存するダイアログを呼び出します
「イメージとして保存」 | チャートをイメージとして保存するダイアログを呼び出します
「クリップボードにコピー」 | チャートをイメージとしてクリップボードにコピーします
「印刷」 | 印刷ダイアログを呼び出します
「デザイナの起動」 | デザイナを立ち上げます

ボタンをツールバーに表示させるには、それぞれShowNewプロパティ、ShowOpenプロパティ、ShowSaveプロパティ、ShowSaveAsImageプロパティ、ShowCopyToClipboardプロパティ、ShowPrintプロパティ、ShowDesignerプロパティで設定します。ツールバーの表示はToolBarVisibleプロパティで設定します。

DataSourceプロパティはチャートのデータソースを割り当てます。

それ以上の開発では、系列のデータソースを割り当てる際にDataSourceNameプロパティを指定する必要があります。

実行時にChartViewerをダブルクリックするとデザイナが呼び出されます。


デザイナ

Chart ModelKitのデザイナはチャートを作成するために使用します。デザイナは下図のように表示されます。チャートはさまざまなオブジェクトを含むオブジェクトです。すべてのオブジェクトにはプロパティがあり、プロパティウィンドウに表示されます。このウィンドウでプロパティを編集できます。

ビジュアルオブジェクトと非ビジュアルのオブジェクトは[挿入]メニューかツールボックスのボタンから利用できます。チャートにコンポーネントを配置するには、[挿入]メニューまたはツールバーのオブジェクトを選択し、作業領域でマウスをクリックしてください。オブジェクトの大きさはマウスを押しながら希望するサイズまで引き伸ばしてください。チャートの構造はチャートのアウトラインウィンドウに表示されます。オブジェクトの位置はマウスでドラッグして変更できます。

[ファイル]メニューから利用可能な機能について説明します。ファイルに関するコマンドは次の通りです。

コマンド | 説明
[ファイル/新規/白紙] | 白紙の新規チャートを作成します
[ファイル/新規/ウィザード] | ウィザードで新規チャートを作成します
[ファイル/開く Ctrl+O] | ファイルからチャートを読み込むダイアログボックスを呼び出します
[ファイル/開いて結合] | ファイルからチャートを読み込むダイアログボックスを呼び出します。同時に、新規チャートが既存チャートに追加されます。
[ファイル/ウィザードで開いて結合] | チャートを読み込むウィザードを呼び出します。同時に新規チャートが既存チャートに追加されます。
[ファイル/保存 Ctrl+S] | チャートを保存します
[ファイル/名前を付けて保存] | チャートに新しい名前を付けて保存します
[ファイル/エクスポート] | チャートを一般的なビットマップ形式またはベクトル形式(JPEG、GIF、PNG、BMP、SVG、Macromedia Flash)にエクスポートし、保存ダイアログボックスを呼び出します。

セパレータより下のファイルシステムパスを含む最近使ったファイルの履歴を見ることができます。

[編集]メニューから利用可能な機能について説明します。

コマンド | 説明
[編集]/[元に戻す Ctrl+Z] | チャートでの変更をキャンセルします
[編集]/[やり直し Ctrl+Y] | チャートの編集時にキャンセルした動作をやり直します
[編集]/[切り取り Ctrl+X] | 選択したオブジェクトを切り取ります
[編集]/[コピー Ctrl+C] | 選択したオブジェクトをコピーします
[編集]/[貼り付け Ctrl+V] | 選択したオブジェクトがコンテナでない場合、バッファから選択したオブジェクトまたはその親に貼り付けます
[編集]/[削除 Ctrl+Del] | 選択したオブジェクトを削除します

[表示]メニューから利用可能な機能について説明します。デザイナの外観を制御するコマンドは次の通りです。

コマンド | 説明
[表示]/[ルーラの表示] | 作業領域にルーラを表示するかどうかの切り替えを行います
[表示]/[グリッドの表示] | 作業領域にグリッドを表示するかどうかの切り替えを行います
[表示]/[グリッドに合わせる] | オブジェクトの制御ポイントをグリッドに合わせるかどうかの切り替えを行います

[ツール]メニューで使用可能な機能について説明します。さまざまなツールを有効にするコマンドは次の通りです。

コマンド | 説明
[ツール]/[選択 F2] | [選択]ツールを有効にします。[選択]ツールは作業領域のオブジェクトを選択したり、デザイナで編集できます。
[ツール]/[パン F4] | 作業領域のイメージをパンします
[ツール]/[ズームイン] | オブジェクトをズームインします
[ツール]/[ズームアウト] | オブジェクトをズームアウトします
[ツール]/[矩形に合わせてズーム] | 選択した矩形をズームインします
[ツール]/[ダイナミックズーム] | 選択した領域のズームを変更するために[ダイナミックズーム]ツールを有効にします
[挿入]メニューから利用可能な機能について説明します。チャートにさまざまなコンポーネントを追加するためのコマンドは次の通りです。コンポーネントの挿入先に応じてグループ化されています。

[挿入]/[チャート]メニューのコンポーネントはチャートの構造を割り当てるために使用します。

コマンド | 説明
[挿入]/[チャート]/[チャート領域] | ChartAreaコンポーネントを追加します
[挿入]/[チャート]/[軸] | 軸コンポーネント（Axisコンポーネント）を追加します
[挿入]/[チャート]/[凡例] | 凡例（Legendコンポーネント）を追加します
[挿入]/[チャート]/[系列] | チャートの系列（Seriesコンポーネント）を追加します
[挿入]/[チャート]/[値ラベル] | 値ラベル（ValueLabelsコンポーネント）を追加します
[挿入]/[チャート]/[タイトル] | チャートのタイトル（Titleコンポーネント）を追加します
[挿入]/[チャート]/[系列] | チャートにグリッド（GridLinesコンポーネント）を追加します
[挿入]/[チャート]/[値マーカ] | 値マーカ（ValueMarkersコンポーネント）を追加します
[挿入]/[スケール要素]メニューにはスケールをデザインするためにコンポーネントを追加するコマンドがあります。
コマンド | 説明
[挿入]/[スケール要素]/[スケールラベル] | スケールに値を表示するためのオブジェクト（ScaleLabelオブジェクト）を追加します
[挿入]/[スケール要素]/[スケールマーカ] | スケールマーカを表示するためのオブジェクト（ScaleMarksオブジェクト）を追加します
[挿入]/[スケール要素]/[目盛] | 軸に目盛を表示するためのオブジェクト（Ticksオブジェクト）を追加します
[挿入]/[スケール要素]/[カスタムラベル] | 軸にテキストラベルを表示するようデザインされたオブジェクト（CustomLabelsオブジェクト）を追加します
[挿入]/[スケール要素]/[スケールタイトル] | スケールタイトル（ScaleTitleオブジェクト）を追加します

[挿入]/[プリミティブ] メニューにはプリミティブ（幾何学的な図形やその他の基本的な図形）を追加するためのコマンドがあります。

コマンド | 説明
[挿入]/[プリミティブ]/[線] | 線（Lineコンポーネント）を追加します
[挿入]/[プリミティブ]/[円] | 円（Circleコンポーネント）を追加します
[挿入]/[プリミティブ]/[楕円] | 楕円（Ellipseコンポーネント）を追加します
[挿入]/[プリミティブ]/[矩形] | 矩形（Rectangleコンポーネント）を追加します
[挿入]/[プリミティブ]/[角丸矩形] | 角丸矩形（RoundedRectangleコンポーネント）を追加します
[挿入]/[プリミティブ]/[枠] | 枠（Frameコンポーネント）を追加します
[挿入]/[プリミティブ]/[イメージ] | イメージ（Pictureコンポーネント）を追加します
[挿入]/[プリミティブ]/[イメージセット] | イメージセット（PictureSetコンポーネント）を追加します
[挿入]/[プリミティブ]/[ラベル] | ラベル（Labelコンポーネント）を追加します
[挿入]/[プリミティブ]/[弧] | 弧（Arcコンポーネント）を追加します
[挿入]/[プリミティブ]/[パイ] | パイ（Pieコンポーネント）を追加します
[挿入]/[プリミティブ]/[ドーナツ型] | ドーナツ型（RingSectorコンポーネント）を追加します
[ヘルプ]メニューにはソフトウェアに関する情報を表示するためのメニュー項目があります。

また、ツールバーには選択したオブジェクトの出力順を変更するためのボタンもあります。

ボタン | 説明
[選択したオブジェクトを前方に移動]* | 選択したオブジェクトを１つ上に移動します
[選択したオブジェクトを後方に移動]* | 選択したオブジェクトを１つ下に移動します
[選択したオブジェクトを先頭に移動]* | 選択したオブジェクトを先頭に移動します
[選択したオブジェクトを最後に移動]* | 選択したオブジェクトを最後に移動します

*選択したオブジェクトのグループ順を変更しても、グループ内の順序関係はそのままです。

作業領域での[選択]ツールの使用法について説明します。

[選択]モードが有効の場合、ビジュアルオブジェクトを左マウスでクリックして選択できます。オブジェクトのグループを選択するにはCtrlキーを押したまま各オブジェクトを選択するか、左マウスボタンを押したままオブジェクトのかたまりを選択できます。

選択したオブジェクト内に円形の制御ポイントが表示されます。

選択したオブジェクトはチャートのツリーでハイライトされます。

選択したオブジェクトに次のような編集処理を行うことができます。

  • クリップボードにコピー（クリップボード）
  • クリップボードからの貼り付け
  • 削除
  • 出力順の変更
  • プロパティウィンドウでのプロパティの変更
  • マウスによるオブジェクトの位置変更
  • オブジェクトの制御ポイントを移動して、あるオブジェクトのプロパティを変更する

選択したオブジェクトの制御ポイントは主要のプロパティを変更するために使用します。ポイントの位置はマウスでドラッグして変更できます。

各オブジェクトには独自の制御ポイントが設定されています。例えば、矩形オブジェクトには10個のポイントがあり、1つは中心を変更するためのもので、1つは回転角度を変更するためのもので、それ以外のポイントは矩形領域のサイズ変更に使用します。

矩形オブジェクトのデザイナの制御ポイント

制御ポイントの位置を変更すると、そのオブジェクトのプロパティも変更されます。

チャートのアウトラインウィンドウにはカレントのチャートの構造をツリーで示します。作業領域にオブジェクトが追加されると、自動的にアウトラインウィンドウに表示されます。選択したオブジェクトはツリーにハイライトされます。このウィンドウ内でオブジェクトをマウスでドラッグすると、オブジェクトの相対位置を変更できます。


DashboardViewerの使用

DashboadViewerコントロールはChart ModelKitのチャート機能とInstrumentation ModelKitのゲージ機能を組み合わせることができます。このコントロールは様々なオブジェクトやゲージを含むチャートをWindows Formsアプリケーションに表示できます。

イメージのDashboardViewerコントロールでは、温度を温度計ゲージで表示し、それまでの温度の推移をチャートのラインで表示しています。現在の温度が定義した温度より高くなると点灯するLightインジケータもチャートに配置されています。同じ1つの軸がチャートや温度計のインジケータとして使用されます。

このサンプルは「ChartSamplesCenter」の「DashboardViewerコントロールの使用」にあります。

DashboardViewerコントロールにはビジュアルデザイナがあり、チャートやゲージの作成、カスタマイズ、組み合わせが可能です。また、オブジェクトのプロパティに式を使用したり、インタラクティブな計器をテストするためのTestToolモードも利用できます。

DashboardViewerの使用法はChartViewerの使用法と似ています。ユーザガイドの「チャートビューア」を参照してください。デザイナの使用法はチャートまたは計器を作成するためのデザイナの使用法と似ています。ユーザガイドのChart ModelKitの「デザイナ」またはInstrumentation ModelKitの「Instrumentデザイナの使用法とその機能について」を参照してください。計器の作成方法はInstrmentation ModelKitと似ています。チャートの作成方法はChart ModelKitと似ています。

計器オブジェクトとチャートオブジェクトを組み合わせて使用する場合、何の制限もないのでどれを組み合わせても構いません。ただ、Chartオブジェクトを最上位のオブジェクトにしてください。ChartオブジェクトはInstrumentから派生しているので、計器として使用しても支障はありません。


Chart ModelKitとOLAP ModelKitの併用

ここでは、OLAP ModelKitとChart ModelKitの併用について説明します。併用方法をご理解いただくために簡単なアプリケーションを作成します。

まず、使用するデータを定義しなければなりません。Accessでwork.mdbという小さなデータベースを作成します。データベースのスキーマは下図の通りです。

商品（Goods）、顧客（Customer）、受注（CustomerOrder）という3つのテーブルがあります。キーはすべてint32型で、CountとCost以外のフィールドは文字列型です。

アプリケーションを作成していきます。

まず、データソースの構造について考えなければなりません。これにはDataSetを使用します。DataSetにCustomerOrderというテーブルを作成します。フィールド一覧は下図の通りです。

Cust_name、country、nameフィールドは文字列型で、countとcostフィールドはDouble型で、id_orderフィールドはint32型です。

次のコードをOnLoadイベントに記述して、データベースからDataSetを読み込みます。

private void Form1_Load(object sender, EventArgs e)

{

OleDbConnection Connection = new

OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"..\\..\\Work.mdb\"");

OleDbDataAdapter adapter2 = new OleDbDataAdapter("SELECT id_order, count, cost, cust_name, country, name FROM (CustomerOrder INNER JOIN Customer ON CustomerOrder.id_customer = Customer.id_customer) INNER JOIN goods on CustomerOrder.id_goods = Goods.id_goods", Connection);

adapter2.Fill(customerOrder);

Connection.Close();

}

DataSetの用意ができました。BindingSourceを追加して、作成したsatSetをデータソースとして指定します。忘れずにDataMemberプロパティにCustomerOrderテーブルを設定してください。

フォームにDataCubeコンポーネントとDataCubeGridコンポーネントを追加します。

DataCubeのデータソース（DataSourceプロパティ）に作成したBindingSourceを設定し、次のパラメータを指定してピボットテーブルを作成します。

DataCubeGrid.SourceプロパティにこのDataCubeを設定します。

このようにピボットテーブルが表示されます。列には明細ＩＤが、列には商品アイテムが表示されます。列と行の交差セルには各アイテムの明細ごとの金額が表示されます。

このテーブルを基にしたチャート（Ｘ軸に明細ＩＤ、Ｙ軸に明細ごとの金額）を作成します。列や行ごとの金額をフィルタにかけるとチャートが書き直されるようにします。

手順1：フォームにDataCubeViewコンポーネントを追加します。データを取得するDataCube（DataCubeプロパティ）と引数があるDataCubeの軸（PrimaryDimensionプロパティ）を設定します。この場合、明細ＩＤがＸ軸に配置されるので、PrimaryDimensionプロパティがＸに設定されるのはそのためです。

手順2：ChartViewerコンポーネントを追加し、作成したDataCubeViewをデータソース一覧に追加します。これは一般的なDataSetの設定と同じです。

手順3：テンプレートを使用してチャートを作成するか、1からチャートを作成し、系列のデータソースの編集に進みます。チャートのソースを選択してください。

それからArgumentプロパティとValueプロパティを設定します。変数が2つあります。ArgumentプロパティにはGenericCaptionを引数として設定し、ValueプロパティにはGenericFactを値として設定できます。GenericCaptionはDataCubeViewで指定した軸から取得され、GenericFactはこのGenericCaption単位の金額です。この場合、GenericCaptionはid_orderで、GenericFactはid_order IDを持つ明細ごとの金額です。

メモ：フィールド名をそれぞれ引数、値として設定しても構いませんが、Ｘディメンション、Ｙディメンション、もしくはファクトの値を変更した場合、チャートも変更しなければなりません。これは利便性に欠けるのでGenericCaptionとGenericFactを使うよう強くお勧めするのはそのためです。

次に、テキストをDataCubeViewのchangeイベントハンドラ（ListChangedイベント）に追加するだけです。このイベントはデータのフィルタ処理を行った場合を含め、ピボットテーブルが再計算された時に呼び出されます。従って、チャートが更新されるようそのイベントにテキストを記述することによって、テーブル内のデータが変わる度にチャートを書き直すことができます。更に、アプリケーションの起動時にDataCubeを再計算するメソッドを設定しなければなりません。OnLoad formハンドラにそのメソッドを追加してください。

最終的な変数をこのように取得します。

private void Form1_Load(object sender, EventArgs e)

{

OleDbConnection Connection = new

OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data

Source=\"..\\..\\Work.mdb\"");

OleDbDataAdapter adapter2 = new OleDbDataAdapter("SELECT id_order, count, cost,

cust_name, country, name FROM (CustomerOrder INNER JOIN Customer ON

CustomerOrder.id_customer = Customer.id_customer) INNER JOIN goods on

CustomerOrder.id_goods = Goods.id_goods", Connection);

adapter2.Fill(customerOrder);

Connection.Close();

dataCube1.Recalculate();

}

DataCubeViewのrefreshハンドラのサンプルコードは以下の通りです。

delegate void DataChangedDelegate();

private void dataCubeView1_ListChanged(object sender, ListChangedEventArgs e)

{

DataChangedDelegate dataChangedDelegate = chartViewer1.Chart.DataChanged;

chartViewer1.BeginInvoke(dataChangedDelegate);

}

DataCubeGridのデータの再計算は非同期モード（CalculationModeプロパティ）で行われるので、BeingInvokeメソッドを使うのが妥当です。このモードでデータを計算する必要がなければ、次のコードを使用できます。

private void dataCubeView1_ListChanged(object sender, ListChangedEventArgs e)

{

chartViewer1.Chart.DataChanged();

}

アプリケーションを実行します。

列または行の値をフィルタにかけてみます。ご覧のように、チャートは変更されるたびに書き直されます。


WebFormsアプリケーションでチャートを使用する

WebChartViewerコンポーネントはWebFormsでチャートを表示するために使用します。

このコンポーネントはチャートをデータソースにバインドでき、その作成したチャートをウェブページに表示できます。WebChartViewerはDataBoundControlから派生しており、DataBoundControlに使用可能なデータソース（例：SqlDataSource、XmlDataSource、ObjectDataSourceなどのさまざまなDataSourceControl）を使用できます。DataSourceIDプロパティはデータソースを設定するのに使用します。

チャートはイメージとして最終的にHTMLページに表示されます。

WebChartViewerはチャートを表すイメージ形式を割り当てる機能（PuctureFormatプロパティ）を提供します。このプロパティには下記の値のうちの1つを設定できます。

  • Jpeg - Jpeg (Joint Photographic Experts Group) 形式
  • Png - Png (Portable Network Graphics) 形式
  • Gif - Gif (Graphics Interchange Format) 形式
  • Bmp - Bmp (Bitmap) 形式
  • Svg - Svg (Scalable Vector Graphics) 形式
  • Flash - Flash (Flash) 形式

JPEG形式を割り当てた場合、JpegQualityプロパティはJpegイメージの質を割り当てます。


チャートの使用例

ASP.NETのページにWebChartViewerコンポーネント（Chart ModelKitタブにあります）を配置し、位置と大きさを割り当ててください。スマートタグパネルから「データソースの選択」を選び、チャートのデータソースを割り当ててください。ObjectDataSource（座標で割り当てられたポイント）をデータソースとして割り当てます。

スマートタグパネルから「Run Designer」を選択し、チャートデザイナを立ち上げ、表示するチャートを割り当てます。

デザイナとチャートの作成方法はChartViewerと似ています。

PictureFormatプロパティにイメージ形式（ここではJpeg）を割り当てます。

アプリケーションを実行してください。ページにはデータソースのデータで設計されたチャートが表示されます。


WebFormsアプリケーションでダッシュボードを使用する

WebDashboardViewerコンポーネントはWebFormsアプリケーションでチャートと計器を組み合わせて使用します。このコンポーネントはDashboardViewerと似ていますが、WebFormsにダッシュボードを表示するために使用します。

WebDashboardViewerコンポーネントはWebChartViewerから派生しているので使用法が似ています。

WebDashboardViewerコンポーネントはチャートと計器を同時に表示できます。

WebDashboardViewerのデザイナの機能性は強化されており、同時にチャートと計器を作成できます。


付録1 - 式エディタの操作

式エディタは下図のように表示されます。

典型的な演算子や式言語の関数は「演算子」タブと「関数」タブのTreeView要素にカテゴリ別で配置されます。ウィンドウの右側のTreeViewには入れ子のデータソースフィールドがあります。どのツリーのどの構造でもドラッグアンドドロップしてテキストの入力フィールドに移動できます。ツリーにある要素をダブルクリックすると、その入力フィールドのカレントの位置にその構造を貼り付けることができます。

入力し終わったら、「Ok」ボタンをクリックするか、「Cancel」ボタンをクリックしてキャンセルしてください。「Ok」ボタンを押すと、ウィンドウが閉じる前に構文チェックが行われます。

式エディタには次のボタンパネルがあります。

ボタン | 説明
「保存」 | ファイルに式を保存します
「開く」 | ファイルから式を読み込みます
「式のチェック」 | 構文チェックを行います。構文エラーが見つかると、間違っている構造の先頭位置を示した警告が表示されます。