◆RaveReportsの日本語対応
 Delphi2009 + RaveReports BE 7.6.2 の環境では、Unicode印刷に対応しています。
 OutPut Options ダイアログで日本語プリンター名の表示も大丈夫です。
 印刷オプションの標記は英語表記ですが許容範囲でしょう。
 データベースのフィールド名に日本語が含まれていても大丈夫のようです。
 (DataView のNameプロパティに日本語が混じるとEventEditorで Error#2-[;]expected. コンパイルエラーになります。FieldName,FullNameは日本語OK )  

いろいろバグの残っているRaveReportsですが、Delphiにバンドルされているし、複数レポートを一元管理できるし、慣れればきっと「使えるツール」になるはずです。(^_^;)
 バージョン 7.6.0 :複数プリンタがインストールされている環境ではエラー発生。
 バージョン 7.6.1 :デザイナでイベントを記述してもError#2で不可。通常の印刷は可能。
 2009.8.27現在のバージョンは 7.6.2 です。必ずアップデートしましょう。


RaveReports ファーストステップ(データベース未使用)


テキストメモを使った簡単な印刷


メモボックスを使いスクリーンフォントの一覧を印刷します。



レポートデザインの作成


1.ツールメニューからRave Reports Designerを起動


2.NewProjectを作成

起動時は前回作成ファイルを表示しています。 ボタンで新規Raveプロジェクトを作成します。

3.Delphi・Rave間のデータ引渡用の変数(Parameter)を作成

(1)右側のプロジェクトツリーのReportLibrary下のReport1を選択し、
(2)左側のプロパティパネルのParamaters[…]を設定します。

StringEditorでParamaterリストを設定します(例:data1,dataMemo1 の2つ)

◆ RaveReportsでは、Parametersを設定できるのがRaveProject、Report、Pageの3ヶ所あります。
  それぞれスコープ範囲で使い分けます。

4.タイトル用テキストを設定

(1)Standerdタブから Text コンポーネントをページ上に配置
(2)Text プロパティを設定(例:レポート演習)

5.印刷オブジェクトを設定

(1)ReportタブからDataText コンポーネントをページ上に配置

(2)プロパティパネル:DataField[…]をクリックしDataTextEditor ダイアログを表示

(3)ProjectParameters から(2.で作成した)data1 を選択し
(4)InsertParameter をクリックするとDataText 欄にParam.Data1 と表示される(5)のでOKをクリック


DataMemo コンポーネントをページ上に配置

同じように、プロパティパネル:DataField[…]をクリックしDataTextEditor ダイアログを表示
ProjectParameters から(2.で作成した)dataMemo1 を選択し、InsertParameter をクリックする

6.Raveプロジェクトの保存

[ File | Save as... ]で名前をつけて保存します(例:MyRave.rav)


Delphiからの呼出し

例としてフォントリストをメモに呼び込んで印刷しますので、フォーム上にボタンとMemoを配置して下さい。

1.コンポーネントパレットのRaveページからTRvProjectをフォームに追加

2.ProjectFileプロパティに、作成したRaveファイル(MyRave.rav)を設定

3.TButtonコンポーネントのOnClickイベントに記述

	procedure TForm1.Button1Click(Sender: TObject);
	begin
	  Memo1.Lines:=Screen.Fonts;
	  with RvProject1 do begin
	    Open;										//RvProjectを開始
	    SelectReport('Report1',true);				//レポートを選択
	    SetParam('data1','フォントリスト'); 		//RaveDesignerで作成したパラメータに文字列を渡す
	    SetParam('dataMemo1',Memo1.Text);
	    Execute;									//レポートを実行
	    Close;										//RvProjectを閉じる
	  end;
	end;

実行画面

プレビュー実行画面(メモの行数が1ページに収まらないので自動的に複数ページになっています。
RavePreview

  ◆ Memo を印刷するときの注意
  ・ 制御文字(TAB)が入っていると止まります(コピペ注意)
  ・ 1行に収まらない場合、文字の途中にスペースがあると改行されます(英単語を意識した仕様です)

ページ番号・総ページの印刷


Rave Reports Designer で、ページ上にDataText を配置

DataTextプロパティ | DataFeild […]をクリックしDataTextEditor ダイアログを表示


  • ReportVariables(1)からReport.CurrentPageを選んでInsertボタン(2)をクリック
  • Data Text(3) を編集し +" / "+を入力

  • ReportVariables(1)からReport.TotalPagesを選んでInsertボタン(2)をクリック
  • Data Text(3) を編集し +" ページ "を入力


  • (4)の[+]と[&]はSpaceを挿入するかしないかの違いです。
      'ABC'+'DEF' = 'ABCDEF'
      'ABC'&'DEF' = 'ABC DEF'


DataTextコンポーネントの幅に収まらない文字が印刷されないので、
 FontJustify : pjRight(右寄せ)
 Truncate : False (文字を切断しない)に設定します。

◆プレビュー実行画面

全画面でプレビュー表示・OutPut Option ダイアログの非表示


通常TRvProjectを実行するとOutPutOptionsダイアログが表示されますが、直ぐにプレビュー表示をしたいときは、 TRvSystemを使います

1. コンポーネントパレットのRaveページからTRvSystemとTRvProjectをフォームに追加

2. RvProject1のProjectFileプロパティに、作成したRaveファイルを設定

3. RvProject1のEngineプロパティに、RvSystem1を設定

4. RvSystem1のSystemSetupsオプションでssAllowSetupをFalseで、ダイアログを表示しないでプレビュー表示(DefaultDest:rdPreview の場合)

5. SystemPreview・FormStateプロパティをwsMaximizedで全画面表示になります

[注]Rave7.6.2では、用紙サイズをA4以外にしている場合、セットアップダイアログからプリンターの用紙サイズを指定しなければうまく印刷できないようです。

SysytemSetupsオプション (初期値は全て True)
ssAllowSetupfalseセットアップダイアログ非表示
ssAllowCopiesfalsecopies(部数)の変更不可
ssAllowCollatefalsecollate(部単位で印刷)の変更不可
ssAllowDuplexfalseduplex mode(両面印刷モード)の変更不可
ssAllowDestPreviewfalse出力先にpreview(プレビュー)を選択不可
ssAllowDestPrinterfalse出力先にprinter(プリンタ)を選択不可
ssAllowDestFilefalse出力先にfile(ファイル)を選択不可
ssAllowPrinterSetupfalseプリンターセットアップボタンの選択不可
ssAllowPreviewSetupfalseプレビュー画面の印刷ボタンでクイック印刷(OutputOption非表示)

◆  TRvSystem.DefaultDest プロパティ
    rdPrinter  ・・・ プレビュー画面を表示しないで印刷する
    rdPreview ・・・ プレビュー画面を表示する

グリッドデータの印刷(データベース未使用)


SetParamを使う方法では、受け渡しするデータの数が少ないときは良いのですが、
StringGridなどの印刷データが多いときはTRvCustumConnectionsを使って印刷します。


TRvCustumConnectionsは、データベースのようにFieldを定義してRaveDesignerへ認識させるため
まず、DelphiでField定義のプログラムを実行させた状態でRaveDesignerの操作をします。

1.DelphiのフォームにTRvProject  TRvCustumConnection  TRvSystem を配置します。
  RvProject1 のEngin プロパティを、RvSystem1 に設定します。

StringGrid のサンプルとして次のようなデータを使用します。

2.TRvCustumConnection のonGetCols イベントに記述します。

procedure TForm1.RvCustomConnection1GetCols(Connection: TRvCustomConnection);
begin
  Connection.WriteField( 'dtHinmei', dtString, 30, '' , '品名' );
  Connection.WriteField( 'dtSuryo',  dtFloat,  10, '' , '数量' );
  Connection.WriteField( 'dtTanka',  dtFloat,  10, '' , '単価' );
end;	
 金額は印刷時に計算させるので、Field は3件です。

Connection.WriteField のパラメータ
パラメータRave DataViewのパラメータ説明
Field 名FieldNameフィールド名
dtString、dtInteger、dtBoolean、dtFloat、dtCurrency、dtBCD、dtDate、dtTime、dtDateTime、dtBlob、dtMemo、dtGraphic、dtInt64
サイズSizeデータサイズ(印字幅)
FullNameFullName省略時は=FieldName
説明Descriptionデータの目的と用法をRaveDesignerで見るため


3.プロジェクトを実行します(現段階では、空白のフォームが表示されるだけです)

4.プロジェクトを実行したままRave Reports DesignerでDataViewを設定します。

メニュー[File|NewDataObject] を選択し、
データ接続ダイアログボックスを表示し、[Direct Data View]を選択して[Next]をクリックします。


アクティブなデータ接続リストで[RvCustomConnections1]を選択して完了[Finish]をクリックします。


Designerの右側にある[プロジェクトツリー]にDataView1が作成され、
各Field Componentには、DelphiプロジェクトのTForm1.RvCustomConnection1GetColsイベントに記述したWriteFieldの値が表示されます。


4−2.Wizardを使用してページを作成します。

メニュー[Tools | ReportWizards | Simple Table]を選択し、ウィザードを表示します。


[DataView1]を選択して[Next]をクリックします。


フィールドリストの内、印刷する項目にチェックして[Next]をクリックします。([All]クリックで全選択)

項目の順序を変更できます。[Next]をクリックして次へ進みます。


ReportTitleで見出しテキストを入力、余白(単位はインチです)を調整できます。

フォントを設定します。デフォルトでは欧文フォントですので、[Change Font]で適当に設定します。

[Generate]ボタンをクリックして完了です。



4−3.金額欄の設定(CalOp の使い方)

Gridの金額欄をそのままField指定すれば簡単ですが演習のため、レポート印刷時に計算する方法を記します。
Wizardを使うと項目を、用紙幅いっぱいに設定されるので、金額欄用に各項目を調整・Text修正して、
項目見出しには、[Standard]タブからTextComponent をDataView1Bandに配置してTextプロパティを「金額」にします。(1)
金額表示用に、[Report]タブからCalcOp と、DataTextComponentをDataView1DataBandに配置します。(2)
CalcOpは、非ビジュアルコンポーネントなのでページ上には表示されませんのでプロジェクトツリーで選択します。(3)

CalcOp1とDataText4の順番が入れ替わると、正しく計算できませんので注意して下さい。
順番を入れ替える方法は、プロジェクトツリーのComponentで右ポップアップメニューから、[Order|MoveBehind](上へ)[Forward](下へ)移動します。

calcOpは、ソースデータ1とソースデータ2をOperatorプロパティで指定した計算結果をユーザーパラメータに保存します。
パラメータ名は、MainPageのParametersで設定します。(例:calcKingaku)

Componentのプロパティを、設定します。
CalcOp のOperatorパラメータ
coAdd加算
coSub減算
coMul乗算
coDiv除算
coMod剰余
coAverage平均
coExpべき乗
coGreater最大値
coLesser最小値

4−4.グリッドラインを配置

最後に[Drawing]タブから縦ライン・横ラインを配置します。

5.Raveプロジェクトの保存

[ File | Save as... ]で名前をつけて保存します(例:MyRave.rav)

以上で、Rave 側の準備は終了です。




Delphiからの呼出し

DataViewの設定のため実行したプロジェクトは、Dataviewの新規作成・Refleshが済めば終了して構いません。


実際にGridデータをRaveレポートに引き渡すには、

データの件数を、TRvCustumConnection の OnOpen イベントに
グリッドデータの書込を、OnGetRow イベントに記述します。

	procedure TForm1.RvCustomConnection1Open(Connection: TRvCustomConnection);
	begin
	  Connection.DataRows:=StringGrid1.RowCount-1;
	end;
	
		procedure TForm1.RvCustomConnection1GetRow(Connection: TRvCustomConnection);
		begin
		  // DataIndex が 0 から DataRows-1 まで実行される
		  Connection.WriteStrData('',StringGrid1.Cells[1,Connection.DataIndex+1]);
		  Connection.WriteFloatData('',StrToFloatDef(StringGrid1.Cells[2,Connection.DataIndex+1],0));
		  Connection.WriteFloatData('',StrToFloatDef(StringGrid1.Cells[3,Connection.DataIndex+1],0));
		end;
	

RvProject のProjectFile プロパティに、作成したRaveファイル(MyRave.rav)を設定

TButtonコンポーネントのOnClickイベントに記述

		procedure TForm1.Button1Click(Sender: TObject);
		begin
		  with RvProject1 do begin
		    Open;										//RvProjectを開始
		    SelectReport('Report2',true);				//レポートを選択
		    Execute;									//レポートを実行
		    Close;										//RvProjectを閉じる
		  end;
		end;
	

テスト用Gridデータ

		StringGrid1.RowCount:=11;
		StringGrid1.ColCount:=5;
		StringGrid1.Rows[0].CommaText:=',品名,数量,単価,金額';
		StringGrid1.Rows[1].CommaText:='1,鉛筆,50,120,6000';
		StringGrid1.Rows[2].CommaText:='2,消しゴム,20,100,2000';
		StringGrid1.Rows[3].CommaText:='3,ボールペン,30,200,6000';
		StringGrid1.Rows[4].CommaText:='4,ノート,30,250,7500';
		StringGrid1.Rows[5].CommaText:='5,定規,20,300,6000';
		StringGrid1.Rows[6].CommaText:='6';
		StringGrid1.Rows[7].CommaText:='7';
		StringGrid1.Rows[8].CommaText:='8';
		StringGrid1.Rows[9].CommaText:='9';
		StringGrid1.Rows[10].CommaText:='10';
	

プレビュー実行画面です。



もし下記のようなエラー画面が出てきたら、RvProjectのProjectFile プロパティの設定ミスです。

合計欄の印刷


Grid印刷に合計金額を印刷させます。

RaveDesignerで[Report]タブからBand コンポーネントをRegion 上に配置(1)
ControllerBand プロパティを、DataView1DataBand に設定(2)

BandStyleプロパティ(3)をクリックしてBandStyleEditor を表示します
Body Footerをチェック(1)するとBand1(b)(2)が追加されますので[OK]をクリック


[Report]タブからCalcText コンポーネントをBand1 上に配置し
Controller、DataField、DisplayFormat、Font、FontJustify パラメータを設定します。


[Standard]タブからText コンポーネントをBand1 上に配置しTextパラメータにを、'合 計' を
[Drawing]タブからRectangle コンポーネントをBand1 上に配置しFillStyleパラメータを、'fsClear' に設定します。

◆保存して実行します。(Delphi プロジェクトの変更はありません)

プレビュー実行画面

ページヘッダーの設定


印刷ページが複数になる場合のページヘッダー設定です。

Band コンポーネントのBandStyle プロパティをクリックして、BandStyleEditor を表示します。
[New Page]にチェックがないとき・2ページ目以降印刷しません。(1)
[New Page]にチェックすれば、2ページ目以降印刷します。
バンドスタイルの設定状況は、ページレイアウト上で確認できます。(2)

行番号印刷


行番号を印刷するには、CalcTextを使えば簡単に実現できます

RaveDesignerで[Report]タブからCalcText コンポーネントをDataBand 上に配置
CalcType プロパティを、ctCount に設定(1)
Controller プロパティを、明細行のDataBand に設定(2)
RunnningTotal プロパティを、True に設定(3)



プレビュー画面

数値データの書式設定


数値データを印刷するときには、DisplayFormat パラメータで設定します

Data View の数値フィールド

及び、CalcText 、CalcOp 、CalcTotal  でそれぞれ設定できます。

指定子意味
0 桁プレースホルダ。書式を設定する値の書式文字列で「0」の位置に桁がある場合,その桁は出力文字列にコピーされる。それ以外の場合は,出力文字列の該当する位置に 0 が格納される。
# 桁プレースホルダ。書式を設定する値の書式文字列で「#」の位置に桁がある場合,その桁は出力文字列にコピーされる。そうでない場合は,出力文字列のその位置には何も格納されない。
. 小数点。書式文字列内の最初のピリオド(.)は,書式指定後の小数点位置を表す。それ以降のピリオドは無視される。
, 3 桁区切り文字。
E+ 指数表記。書式文字列内に E+,E-,e+,e- のいずれかの文字列が含まれている場合,数値は指数表記の書式になる。最大 4 桁の 0 を E+,E-,e+,e- のいずれかの直後に指定することで,指数部の最小桁数を決定できる。E+ または e+ の形式を使用すると正の指数部には正符号が,負の指数部には負符号が出力される。E- または e- を使用すると,指数部が負のときだけ符号が出力される。
'xx'/"xx"   単引用符または二重引用符で囲まれる文字はそのまま出力され,形式設定には影響しない。
; 書式文字列で正の値,負の値,および 0 のセクションを分離する。
正の値,負の値,および 0 値ごとに異なる書式を指定するために,書式文字列を 1〜3 のセクションにセミコロンを使って区切ることができます。
   1 つのセクション:書式文字列はすべての値に適用される。
   2 つのセクション:最初のセクションは正の値および 0 値に適用され,2 番めのセクションは負の値に適用される。
   3 つのセクション:最初のセクションは正の値に,2 番めのセクションは負の値に,3 番めのセクションは 0 値にそれぞれ適用される。
負の値のセクションまたは 0 値のセクションが空の場合,つまりセクションを区切るセミコロンの間に何もない場合,正の値のセクションがかわりに適用されます。

表示例1234-12340.50
0000001234-012340000100000
0.001234.00-1234.000.500.00
#.##1234-1234.5 
#,##0.001,234.00-1,234.000.500.00
#,##0.00;(#,##0.00)1,234.00(1,234.00)0.500.00
#,##0.00;;Zero1,234.00-1,234.000.50Zero
0.000E+001.234E+03-1.234E+035.000E-010.000E+00
#.###E-01.234E3-1.234E35E-10E0
#,###;△#,###;-1,234△1,2341-

FontMasterを使い、数値によりフォントを変更する


印刷データのフォントを一つ一つ設定する手間を省いたり、データの値により、フォントを変更したいときにFontMasterを使用します。

RaveDesignerで[Standard]タブからFontMaster コンポーネントをPage 上に2つ配置します。
FontMasterは、非ビジュアルコンポーネントなのでページ上には表示されませんのでプロジェクトツリーで選択します。(1)

Font プロパティをクリックしてフォントダイアログで[ゴシック、11ポイント、黒色]と[明朝、11ポイント、赤色]に設定します。(2)

Name プロパティを、設定したFontが分かり易い名前に変更します。(FMGoth11Black とFMMincho11Red)(3)

データバンド上のDataText コンポーネントを選択し、それぞれFontMirror プロパティを[FMGoth11Black]に設定(4)
これで、全て同じFont が設定されます。


[ データ値によりフォントを変更する ]


 例題として、数量が30未満のとき、赤で印字するようにします。

数量を印字するDataTextを選択(5)し、Event Editor タブをクリックします(6)
Event Editor のAvailable Events からOnBeforePrint を選択します。(7)

イベントコードを記述します。else の前に;が必要だとか、end if;が必要だったりと若干Delphi と違います。(8)
[Compile] ボタンをクリックして(9)、Compile finished (10)が表示されればOKです。

保存してから、Delphi プロジェクトを実行します。

プレビュー画面

余白の設定 ・その他


プログラム実行時に余白を設定するには、Rave中のRegion コンポーネントの位置を動的に変更することで実現できます。

uses にRvClass とRvCsRpt を追加して、TButtonコンポーネントのOnClickイベントに記述

uses
	RvClass,  // TRavePage
	RvCsRpt;  // TRaveRegion
	
procedure TForm1.Button1Click(Sender: TObject);
var
      MyPage   : TRavePage;       // RvClass   uses に追加
      MyRegion : TRaveRegion;     // RvCsRpt   uses に追加
begin
  with RvProject1 do begin
    Open;										//RvProjectを開始
    SelectReport('Report2',true);				//レポートを選択
//余白の設定
    with ProjMan do begin
      MyPage   := FindRaveComponent('Report2.MainPage', nil) as TRavePage;
      MyRegion := FindRaveComponent('DataView1Region', MyPage) as TRaveRegion;
      if Assigned(MyRegion) then
      begin      // 1mm = 0.03937inch
        MyRegion.Top  := StrToFloatDef(TopMgn.Text, 0) * 0.03937;
        MyRegion.Left := StrToFloatDef(LeftMgn.Text,0) * 0.03937;
      end; {if}
    end;
//余白の設定 終了
    Execute;									//レポートを実行
    Close;										//RvProjectを閉じる
  end;
end;
	

同じようにして、テキストの文字列を変更するには、uses にRvCsStd を追加して、Execute の前に記述します。
	uses RvCsStd ;
	
	var MyText : TRaveText;		// RvCsStd
	
	// MyPage  :=FindRaveComponent...  以降に
	MyText  :=FindRaveComponent('TitleText',MyPage) as TRaveText;
    if Assigned(MyText) then MyText.Text := '変更文字列';
	
その他、
	TRaveRectangle	: RvCsDraw	// 矩形
	TRaveVLine	:   〃		// 横線
	TRaveBitMap	: RvCsStd	// Bitmap コンポーネント
	
なども動的にパラメータの変更が可能です。
	

ページ番号の制御


元帳や請求書等の印刷で、相手ごとにページ番号を1から付け直したいときがあります

その場合は、PageNumInit コンポーネントでページ番号を制御できますが
「CurrentPage」の代わりに、Report Variable の「RelativePage」を使用します。



(1)ツールバーStandard から合計欄があるBand (2)に、PageNumInit コンポーネント を配置します。
(2)のBandが印刷されたらページ番号を1に戻すようにInitValue プロパティを0に設定 (3)
DataTextコンポーネントをページヘッダー部分 (4)に配置し、DataField にDataTextEditor で、ReportVariable のRelativePageを設定します。

ページトップ