- PR -

レポート、プリンタ設定

投稿者投稿内容
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-07-19 12:08
引用:

どらさんの書き込み (2006-07-19 11:47) より:

コンパイルエラーではなく、実行時に例外が発生してしまいます。
あと、DIM rpt は 現在Public Shared rpt と グローバルで宣言しています。


うーん、この手の実行時の例外は、[コンパイル解決] していれば発生しません。
率直に言いますと、「何故 rpt は型が指定されていないのでしょうか?」 ということです。

変数 rpt は、"New rptレポート" という構文によってインスタンスを持っています。
が、その型が正当であるかどうかは、実行時にしかわからないですよね。
(この方式は、[実行時バインディング]、[遅延バインディング] などと呼びます)

例外のメッセージを良く読んでみてください。
「実行時に取得している "rpt レポート" という型のインスタンスに、
 'PrinterSettings' という (公開されている) メンバがない」
と言っています。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
どら
ベテラン
会議室デビュー日: 2004/08/18
投稿数: 63
投稿日時: 2006-07-19 12:15
返答ありがとうございます。

型宣言がないからかと思いまして、宣言文を
Public Shared rpt As DataDynamics.ActiveReports.ActiveReport
に変更しました。

そうすると、 rpt.PrinterSettings.PrinterName = str_PName の部分でコンパイルエラーが起こり、

'PrinterSettings' は 'DataDynamics.ActiveReports.ActiveReport' のメンバではありません。

と、出てしまいました。

activ repを使った場合のプリンタ名を設定する場合は、根本的に違うのですかね・・・
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-07-19 12:44
引用:

どらさんの書き込み (2006-07-19 12:15) より:

そうすると、rpt.PrinterSettings.PrinterName = str_PName の部分でコンパイルエラーが起こり、'PrinterSettings' は 'DataDynamics.ActiveReports.ActiveReport' のメンバではありません。と、出てしまいました。


これが、型指定をすることによる 「実行前のエラー検出」 です。
型指定していないと、このような旨みも逃します。
(VB の場合は、遅延バインディングを防ぐために、Option Strict On にしましょう)

引用:

activ repを使った場合のプリンタ名を設定する場合は、根本的に違うのですかね・・・


その Report クラスのメンバ (基底クラスのメンバ含む) を、
「オブジェクト ブラウザ」 などで、もう 1 度良く見てください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
どら
ベテラン
会議室デビュー日: 2004/08/18
投稿数: 63
投稿日時: 2006-07-19 13:13
返答ありがとうございます。

いろいろ試した結果、 rpt.PrinterSettings.PrinterName = str_PNameとかで、入れるのではなく、レポートオープン時にいれる方法を見つけて、そちらでできるようになりました。

PrinterNameに入れるものだと思って、そこばかり見ていたのがだめでしたね。

いろいろありがとうございました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-07-19 14:45
引用:

どらさんの書き込み (2006-07-19 13:13) より:

いろいろ試した結果、 rpt.PrinterSettings.PrinterName = str_PNameとかで、入れるのではなく、レポートオープン時にいれる方法を見つけて、そちらでできるようになりました。
PrinterNameに入れるものだと思って、そこばかり見ていたのがだめでしたね。


その方法は具体的にどのようなものでしょうか?
同じ問題で悩む第三者のためにも、フィードバックをお願いします。

Report のオープン時... というのが良くわかりませんが、
レポート内部 / 外部に関わらず、同じことだと思います。

コード:

    Dim report1 As New OneReport()
        :
    rpt.Document.Printer.PrinterSettings.PrinterName = ...


コード:

    Private Sub OneReport_Open...
        Me.Document.Printer.PrinterSettings.PrinterName = ...
            :
    End Sub


_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
どら
ベテラン
会議室デビュー日: 2004/08/18
投稿数: 63
投稿日時: 2006-07-19 16:17
返答遅くなりました。

*グローバル*
Public Shared rpt As DataDynamics.ActiveReports.ActiveReport

*プレビュー画面load時*
  rpt = New rptレポート
  '余白設定
  rpt.PageSettings.PaperKind = str_RSize
rpt.PageSettings.Orientation = str_RDir
rpt.PageSettings.Margins.Top = str_RMtop
rpt.PageSettings.Margins.Bottom = str_RMbottom
rpt.PageSettings.Margins.Left = str_RMleft
rpt.PageSettings.Margins.Right = str_RMright
rpt.Run()
Me.Viewer1.Document = rpt.Document

*レポートReportStart時*
Private Sub rptレポート_ReportStart(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.ReportStart
Me.Document.Printer.PrinterName = str_PName '←プリンタ名
end sub

と、プレビューフォームで余白は設定し、レポートReportStart時に、プリンタ名を入れてあげることにより、動作いたしました。

もし、違うやり方で効率がいいやり方がありましたら、ご教授いただけると幸いです。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-07-19 17:04
引用:

どらさんの書き込み (2006-07-19 16:17) より:

*レポートReportStart時*
Private Sub rptレポート_ReportStart(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.ReportStart
Me.Document.Printer.PrinterName = str_PName '←プリンタ名
end sub


私の予想どおりで、やっていることは一緒ですよね。
もう 1 度、前のレスを読んで頂ければ幸いです。

レポートのインスタンス内 (Me) から Document メンバを参照するのと、
レポート外 (rpt) から Document メンバを参照するのとでは同じです。

Me.Document == rpt.Document

です。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
どら
ベテラン
会議室デビュー日: 2004/08/18
投稿数: 63
投稿日時: 2006-07-19 18:24
そうですね。

となると、レポート外 (rpt)でやったほうが、コーディング的にも見やすいですよね。

レポート外 (rpt)の方でやろうと思います。

ありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)