LastUpdate: 2009/04/16 05:04:17

戻る

001 プロジェクトに組み込むには
002 オブジェクト名はどこで指定するの?
003 出力文字の属性を動的に変えるには?
004 アンバウンド出力の一番簡単な例
005 シンプルにプリンタに出力するパターンの例
006 Runメソッドは早い Showメソッドは遅い
007 イベントの発生順序は保証されないぞ
008 グループ機能を使用した時に、ページカウントが正しく表示されない。
20050325 CanGrowのフィールドに対応して、セッションの罫線を伸ばしたい
20050330_縦線が有るときに、CanGrowが有効になってくれない


001 プロジェクトに組み込むには

Helpをみると、コントロールの追加から行なうよう書いてあったが、「名前が不正」と怒られた。
しかし、いきなり、メニューからの[追加]で、出来たぞ!?

2002/07/23 ver1.5

002 オブジェクト名はどこで指定するの?

アクティブレポートのデザイナを開いた状態で、プロパティ(F4)を選択すると、指定できる。
各セクション以外の所を選択するのがポイント

2002/07/23 ver1.5

003 出力文字の属性を動的に変えるには?

フォントプロパティをプログラムから変更すれば良いです。


'アンダーバーを引く
rpt.Field1.Font.Underline = True

2002/08/29 

004 アンバウンド出力の一番簡単な例

 アンバウンドフィールドタイプの一番簡単な実装

アクティブレポート内のコーディング


Option Explicit
Private ix As Long

Private Sub ActiveReport_FetchData(EOF As Boolean)
    
    Field4.Text = ix
    
    If ix > 100 Then
        EOF = True
    Else
        ix = ix + 1
        EOF = False
    End If
    
End Sub

サンプル例にあるような、Fieldsコレクションを使用しなくても、これでできました。
ただし、EOFは、セットしないとTrueになってしまうようなので、Falseをセットしないとダメですねー

アクティブレポートを制御する側のVBの方はこんな感じです。これは、プレビュー画面を出す例です。
アクティブレポートは、Formオブジェクトと違い、必ずnewして使う必要があります。


Dim acc As New ActiveReport1
    acc.Field1.Text = Text1
    acc.Show

2003/02/11

005 シンプルにプリンタに出力するパターンの例


    Dim acc As New ActiveReport1
    acc.Field1.Text = Text1
    
    acc.Printer.SetupDialog 'プリンタ設定ダイアログの表示
    acc.PrintReport False   '印刷の設定(前の行でプリンタ設定ダイアログを出しているのでココでは不要)

アクティブレポートは、印刷する紙面を作る段階と、スプールに飛ばす段階が分かれている。
PrintReport True にした場合に表示される、印刷設定ダイアログが表示されるタイミングは、スプールに飛ばす直前に表示される。

紙面を作る段階で、処理中ダイアログが必要な場合は、別途作成する必要がある。

ActiveReport_FetchData は、紙面を作る段階でのレコード毎のイベントである。

一方、ActiveReport_PrintProgressは、スプールに1ページづつ飛ばすタイミングで発生する。このときは既にページ分母が判っているので、アクティグレポートが分子/分母のページ数をのダイアログを表示している。さらにキャンセルボタンが実装されおり、キャンセルボタンを押下すると、ActiveReport_PrintAbortedイベントが発生する。

2003/02/20

006 Runメソッドは早い Showメソッドは遅い

プレビューするにしても、showメソッドはプレビュー画面その都度再描画しているよだ。だから遅い。

一方Runメソッドはプレビュー画面を生成する前に内部で作成するみたい。あっというま。

2003/02/25


007 イベントの発生順序は保証されないぞ

ActiveReportの特徴として、どのセクションがどういうう順番で起動するか、上から下への単純な順番ではない。あまりにも複雑なルールに乗っ取って発生するので、一般的には順番に依存したコーディングはするべきでない。

マニュアルにも書いてあるとおり、保証されているのは、

同一セクションにおいて、

  1. FetchDataイベントは、Formatイベントの直前に発生する。
  2. BeforPrintイベントは、Formatイベントよりも後に発生する。
  3. AfterPrintイベントは、BeforPrintイベントよりも後に発生する。

だけである。

BeforPrintイベントとAfterPrintイベントの間には他のイベントが発生するかもしれない〜

2003/03/01


008 グループ機能を使用した時に、ページカウントが正しく表示されない。

ActiveReportsの「ページ番号/総ページ数」 について。

オンラインヘルプの 「ページフッタ内のページ番号」 を参考にActiveReportsでページヘッダに 「ページ番号/総ページ数」 を表示するサンプルプログラムを作ったのですが、正しく表示されません。

 

お送りいただいたプロジェクトを元に検証させていただきましたところ、利用されていないグループヘッダーgphKeyとグループフッターgpfIDが存在するために発生しているようです。

現象を回避する為の方法としまして、下記の方法をご検討くださいますようお願いいたします。

方法1

方法2

2003/04/04


20050325 CanGrowのフィールドに対応して、セッションの罫線を伸ばしたい

BeforPrint イベントで、そのフィールドの高さを取得する。

高さに応じて、罫線の座標を再設定する。

K氏が実装例あり


20050330 縦線が有るときに、CanGrowが有効になってくれない

サポートに尋ねたところ、以下の回答を得た

<回答内容>
ご指摘の現象は、CanGrow/CanShrinkプロパティの仕様により発生して
います。

CanGrow/CanShrinkプロパティによって、コントロールの高さがデータ
の内容に合わせて調整されたとき、調整前のコントロールの下端以下に
配置されている他のコントロールの縦位置は、調整内容に合わせて自動
的に調整されます。
しかしながら、ご指摘の通り、CanGrow/CanShrinkプロパティによって
高さが調整されるコントロールの下端より上に上端が、位置が調整され
るコントロールの上端より下に下端がある、別のコントロールが存在
した場合、縦位置の調整は行われません。

ご要望のような動作を実現する方法としては、Visibleプロパティを
コード上で切り替える方法が考えられます。
以下のサンプルコードを参考に、ご検討ください。

◆サンプルコード
----------------------------------------
Private Sub Detail_Format()
 ' Formatイベント時には非表示にしておきます。
 Field3.Visible = False
 Line1.Visible = False
End Sub

Private Sub Detail_BeforePrint()
 ' BeforePrint内で表示し、位置を調整します。
 Field3.Visible = True
 Line1.Visible = True
 Line1.Y2 = Line2.Y1
End Sub
----------------------------------------

なお、セクションの高さを変更できるのは、Formatイベント内のみです。
BeforePrintイベント内でセクションの高さを変更することはできません
ので、あらかじめご注意ください。

つまり、Formatイベント時に、非表示のコントロールは無視される事になる。

また、Line1の位置が、Field1の中に収まっていれば、影響しない。BeforePrintの段階で希望の位置に設定しなおす…という方法も考えられるぞ。


20050331 フッダーセクションの高さのCanGrowが正しく効かない

1ページ目のフッダ

2ページ目のフッダ

Private Sub PageFooter_BeforePrint()

    Field4.Text = "PageFooter_BeforePrint Field1.Height=" & Field1.Height
    
End Sub

Private Sub PageFooter_Format()

    Field1.Text = "1行目" & vbCrLf & "2行目" & vbCrLf & "3行目"
    
    Field3.Text = "PageFooter_Format Field1.Height=" & Field1.Height
    
End Sub

Field1のCanGrowはTrueである。

フォーマットイベントで、毎回 "1行目" & vbCrLf & "2行目" & vbCrLf & "3行目" を設定しているにもかかわらず、高さが皮ならいのはなんでだ?

サポートに尋ねた所、フッダーでのCanGrow/CanShrink の動作が、1ページ遅れて発生しているようだとの事。障害と認識した模様。

回避策としてはCanGrow//CanShrink をOFFにして、手動で設定してほしいとの事だった。

ちなみに、フォーマットイベント中では、各コントロールの高さは、決定されないとの事だ。

<回答内容>
サンプルをお送りいただきまして、ありがとうございました。
弊社の環境でも、ご指摘の現象を確認いたしました。

申し訳ございません。本現象は、ページフッタ上に配置されたField
コントロールの、CanGrow/CanShrink動作の不具合と思われます。

本来の仕様では、コントロールおよびセクションのCanGrow/CanShrink
動作は、Formatイベント後(BeforePrintイベント前)に行われます。
また、セクションのCanGrow動作は、そのセクション上のコントロールが
セクションをはみ出すような場合に行われる仕様となっております。

しかしながら、サンプルのように、ページフッタのFormatイベント内で、
Fieldコントロールにデータをセットした場合、Fieldコントロールの
CanGrow/CanShrink動作が、1ページ遅れて反映されてしまうようです。

サンプルのデフォルト状態では、Field1のCanShrinkプロパティがTrueに、
Textプロパティが"Field1"に設定されております。
上記の設定で、ページフッタのFormatイベント内でField1に3行分の
文字列データをセットした場合、データ自体は正常にセットされますが、
CanShrink動作は"Field1"で計算されてしまい、Fieldの高さが1行分に
なってしまいます。

本現象を回避する方法としては、Field1のCanShrinkプロパティをFalse
に設定するか、コントロールやセクションのCanGrow/CanShrinkプロパ
ティを共にFalseに設定した上で、コード上で高さを設定する方法が考え
られます。誠に恐れ入りますが、こちらの方法をご検討いただけません
でしょうか。

◆サンプルコード
----------------------------------------
Private Sub PageFooter_Format()
 Dim FieldHeight As Integer

 ' Field1にデータをセットします。
 Field1.Text = Field1.Text & vbCrLf & "1行目" & vbCrLf & "2行目"

 Canvas.Font = Field1.Font
 FieldHeight = Canvas.MeasureParagraphHeight(Field1.Text, _
        Field1.Width - 40) + 30
 If (PageFooter.Height < (Field1.Top + FieldHeight)) Then
  ' FieldがPageFooterをはみ出す場合には、高さを調整します。
  PageFooter.Height = Field1.Top + FieldHeight
 End If
End Sub

Private Sub PageFooter_BeforePrint()
 ' Field1の高さを設定します。
 Canvas.Font = Field1.Font
 Field1.Height = Canvas.MeasureParagraphHeight(Field1.Text, _
         Field1.Width - 40) + 30
End Sub
----------------------------------------


 


戻る