VB6.0用掲示板の過去のログ(No.1)−VBレスキュー(花ちゃん)
[記事リスト] [新規投稿] [新着記事] [ワード検索] [過去ログ] [管理用]

投稿日: 2004/07/28(Wed) 11:51
投稿者ken.1
Eメール
URL
タイトルRe: CRViewerについて

こんにちは、確かAPI関数を使用することで実現できたように思います。
以下は、自分が使っているMDBがデータソースの場合のソースです。
と、ここまで書いたところで CRViewer を使ってと書いてありましたね…
どうしても CRViewer を使う必要がない場合の参考にでも; 

'クリスタルレポート印刷API(ただし簡易版なので使用に注意すること)
'参照URL:http://www.int21.co.jp/pcdn/vb/noriolib/vbmag/0003/api/

'---------------------------------------------------------------------------------------------------
'APIの使用開始を宣言するAPI (1:正常 以外:エラー)
Declare Function PEOpenEngine Lib "crpe32.dll" () As Integer

'---------------------------------------------------------------------------------------------------
'印刷するrptファイル名を指定する
Declare Function PEOpenPrintJob Lib "crpe32.dll" (ByVal RptName As String) As Integer

'---------------------------------------------------------------------------------------------------
'rptファイルに設定されているテーブル(データ)の位置などを取得する(1:正常 以外:エラー)
'Declare Function PEGetNthTableLocation Lib "CRPE32.DLL" (ByVal PrintJob As Integer, _
                                                         ByVal TableN As Integer, _
                                                         Location As PETableLocation) As Integer
                                                        
'---------------------------------------------------------------------------------------------------
'テーブル位置は、PETableLocation構造体の.Locationメンバなので、
'ここにテキストファイルのファイル名を末尾にvbNull(=Chr$(0))を追加して設定する。
'Location.Location = strFileName & vbNull
Declare Function PESetNthTableLocation Lib "crpe32.dll" (ByVal printJob%, _
                                                         ByVal TableN%, _
                                                         Location As PETableLocation) As Integer

'---------------------------------------------------------------------------------------------------
'印刷元データの指定に使用(詳細は不明)
Private Const PE_TABLE_LOCATION_LEN = 256
Private Const PE_SIZEOF_TABLE_LOCATION = 258    ' # bytes in PETableLocation

Private Type PETableLocation
    ' initialize to # bytes in PETableLocation
    StructSize  As Integer
    Location    As String * PE_TABLE_LOCATION_LEN
End Type

'---------------------------------------------------------------------------------------------------
'印刷先を指定する。(プリンター)
Declare Function PEOutputToPrinter Lib "crpe32.dll" (ByVal printJob As Integer, _
                                                     ByVal nCopies As Integer) As Integer

'---------------------------------------------------------------------------------------------------
'プレビュー表示
'プレビュー表示に使用する定数
' ---------------------------
Private Const WS_MINIMIZE = &H20000000      '最小サイズのウィンドウを作る
Private Const WS_VISIBLE = &H10000000       '最初に現れるときに可視のウィンドウを作る(オーバーラップまたはポップアップウィンドウの場合)
Private Const WS_DISABLED = &H8000000       '最初に現れるときに使用不能状態のウィンドウを作る
Private Const WS_CLIPSIBLINGS = &H4000000   '子ウィンドウを互いにクリップする
Private Const WS_CLIPCHILDREN = &H2000000   '親ウィンドウの内部で描画するときに、子ウィンドウが占有する領域を除外する
Private Const WS_MAXIMIZE = &H1000000       '最大サイズのウィンドウを作る
Private Const WS_CAPTION = &HC00000         'タイトルバーを持つウィンドウを作る
Private Const WS_BORDER = &H800000          '境界を持つウィンドウを作る
Private Const WS_DLGFRAME = &H400000        '二重線の境界を持ち、タイトルを持たないウィンドウを作る
Private Const WS_VSCROLL = &H200000         '縦のスクロールバーを持つウィンドウを作る
Private Const WS_HSCROLL = &H100000         '横のスクロールバーを持つウィンドウを作る
Private Const WS_SYSMENU = &H80000          'システムメニューボックスを含む
Private Const WS_THICKFRAME = &H40000       'ウィンドウの大きさを変えることのできる太い境界を含む
Private Const WS_MINIMIZEBOX = &H20000      'アイコン化ボタンを持つ
Private Const WS_MAXIMIZEBOX = &H10000      '最大表示ボタンを持つ
Private Const CW_USEDEFAULT = &H8000        '子ウィンドウに、デフォルトの縦と横の位置およびデフォルトの幅と高さを与える

Private Declare Function PEOutputToWindow Lib "crpe32.dll" (ByVal printJob%, _
                                                            ByVal Title$, _
                                                            ByVal Lft&, _
                                                            ByVal Top&, _
                                                            ByVal Wdth&, _
                                                            ByVal Height&, _
                                                            ByVal style As Long, _
                                                            ByVal PWindow As Long) As Integer

'---------------------------------------------------------------------------------------------------
'出力先も決まったら、レポートの出力を開始する。そのためには、PEStartPrintJobを使う。
Declare Function PEStartPrintJob Lib "crpe32.dll" (ByVal printJob As Integer, _
                                                   ByVal WaitNoWait As Integer) As Integer

'---------------------------------------------------------------------------------------------------
'後処理であるPECloseEngineを呼び出すためには、事前にPECanCloseEngineで処理が終了しているかを確認する必要がある。
'戻り値が1になったらプリントジョブの処理が終了したことになる
Declare Function PECanCloseEngine Lib "crpe32.dll" () As Integer

'---------------------------------------------------------------------------------------------------
'PEOpenPrintJobに対応する後処理用のAPI
Declare Function PEClosePrintJob Lib "crpe32.dll" (ByVal printJob As Integer) As Integer

'---------------------------------------------------------------------------------------------------
'PEOpenPrintJobとPEClosePrintJobが対になっているのと同じように、
'PEOpenEngineと対になるのがPECloseEngineだ。このAPIを読んで、はじめて一連の処理が終了したことになる。
Declare Sub PECloseEngine Lib "crpe32.dll" ()

'以下関数

'.rptファイルをプレビュー表示する関数
'("フルパスでのRPT名", "フルパスでのMDBソース名", ["ウィンドウタイトル"])
Public Sub goViewCrw(RepName As String, mdbSource As String, Optional Title As String = "プレビュー")
On Error GoTo Err

    Dim printJob        As Integer
    Dim Flg             As Integer
    Dim Location        As PETableLocation
    Dim style           As Long
    
    Flg = PEOpenEngine
    
    If Flg <> 1 Then
        GoTo Err
    End If
    
    printJob = PEOpenPrintJob(RepName)
    
    If printJob = 0 Then
        GoTo Err
    End If
    
    Location.StructSize = PE_SIZEOF_TABLE_LOCATION
    Location.Location = mdbSource & Chr$(0)
    
    Flg = PESetNthTableLocation(printJob, 0, Location)
    
    If Flg <> 1 Then
        GoTo Err
    End If
    
    style = WS_MAXIMIZE Or WS_SYSMENU Or WS_BORDER Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX Or WS_THICKFRAME
    Flg = PEOutputToWindow(printJob, Title, 100, 100, 100, 100, style, 0)

    If Flg <> 1 Then
        GoTo Err
    End If
    
    Flg = PEStartPrintJob(printJob, True)
    
    If Flg <> 1 Then
        GoTo Err
    End If
    
    'Flg = PECanCloseEngine
    
    If Flg <> 1 Then
        GoTo Err
    End If
    
    Flg = PEClosePrintJob(printJob)
    
    If Flg <> 1 Then
        GoTo Err
    End If
    
    'Call PECloseEngine
    
    Exit Sub
    
Err:
    Call PECloseEngine
    MsgBox "プレビュー実行時にエラーが発生しました"
    
End Sub


- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

- Web Forum -