- PR -

vb.net 2003アプリでPDFを作成する方法?

1
投稿者投稿内容
まんちゃん
常連さん
会議室デビュー日: 2006/12/21
投稿数: 25
投稿日時: 2007-05-10 18:14
お世話になっております。どうかご教授願います。

当方vb.net2003 XP でWindowsアプリを作成中です。
この度、PDFファイルを作成することになりました。

フォームにPrintPreviewDialogとPrintDocumentコントロールを配置して、プレビューを見た後、印刷ボタンをクリックするとPDFが作成しようとしています。ところがプレビューを見た後、印刷ボタンを押すとPDFの保存場所を聞いてくるのですが(プリンタはDistillerを指定)、このとき、キャンセルしてしまうと、「ハンドルが無効です」というエラーが出てしまいます。うまく処理するためにはどうしたらいいでしょうか? 1週間ほど悩んでいます。どうかご教授ください。お願いいたします。
未記入
大ベテラン
会議室デビュー日: 2006/12/15
投稿数: 157
投稿日時: 2007-05-11 10:33
「ハンドルが無効です」エラーを出している箇所を提示されないと誰もわからないです。
スタックトレースからエラー箇所を探し出して、そのロジックの最低限のソースを提示して下さい。

「スタックトレース」でこの会議室を検索すれば効率の良い質問の仕方が理解出来るかと。

---追記---
こっちと同じ件なのかな?

[ メッセージ編集済み 編集者: 未記入 編集日時 2007-05-11 10:36 ]
まんちゃん
常連さん
会議室デビュー日: 2006/12/21
投稿数: 25
投稿日時: 2007-05-11 11:02
すみません。言葉足らずで、誰も何言ってるのか、分からなかったみたいですね。

以下にコードを示します。

'プリンタを「Acrobat Distiller」に設定
For i = 0 To Printing.PrinterSettings.InstalledPrinters.Count - 1
If Printing.PrinterSettings.InstalledPrinters.Item(i).ToString = "Acrobat Distiller" Then
.PrinterName = "Acrobat Distiller"
Next

PrintPreviewDialog.Document = PrintDocument
PrintPreviewDialog.ShowDialog() ←ここでエラーが出る

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

Private Sub PrintDocument_PrintPage(.....)

ここでmdbよりデータを取得して、描画。対象データがない場合は、描画しない。

End Sub

◎プレビューはきちんと表示されます。保存をすればPDFも作成されます。ただ、保存場所ダイアログで
キャンセルをすると、上記の場所で、エラーが出ます。あとで気付いたことなんですが、mdbファイルに
対象データがなく、描画する必要がない場合は、「キャンセル」しても、エラーは発生せずに、終了します。
処理に時間がかかることが原因なのでしょうか?


************** 例外テキスト **************
System.ComponentModel.Win32Exception: ハンドルが無効です。
at System.Drawing.Printing.StandardPrintController.OnEndPrint(PrintDocument document, PrintEventArgs e)
at System.Windows.Forms.PrintControllerWithStatusDialog.OnEndPrint(PrintDocument document, PrintEventArgs e)
at System.Drawing.Printing.PrintController.Print(PrintDocument document)
at System.Drawing.Printing.PrintDocument.Print()
at System.Windows.Forms.PrintPreviewDialog.ToolBarClick(Object source, ToolBarButtonClickEventArgs eventargs)
at System.Windows.Forms.ToolBar.OnButtonClick(ToolBarButtonClickEventArgs e)
at System.Windows.Forms.ToolBar.WmReflectCommand(Message& m)
at System.Windows.Forms.ToolBar.WndProc(Message& m)
at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

ちなみにご指摘通り、おなじ内容です。なかなか返答がなかったもので、2つ出しちゃいました。すみません。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-05-11 11:25
こんなんどうよ?
Application.ThreadException
AppDomain.UnhandledException
まんちゃん
常連さん
会議室デビュー日: 2006/12/21
投稿数: 25
投稿日時: 2007-05-11 13:25
返答ありがとうございます。
初めてみるもので、Application.ThreadExceptionは使い方がよくわかりませんでした。AppDomain.UnhandledExceptionはヘルプなんかを見て、下のようにやってみましたが、うまくエラーを捕まえられませんでした。お手数ですがコード例など、ご教授ください。すみません。なにかと初心者なもので。

以下コードを示します。
-----------------------------------------------------------------
Dim currentDomain As AppDomain = AppDomain.CurrentDomain
AddHandler currentDomain.UnhandledException, AddressOf MyHandler
PrintPreviewDialog.ShowDialog()
End Sub

Private Sub MyHandler(ByVal sender As Object, ByVal args As UnhandledExceptionEventArgs)
Dim e As Exception = DirectCast(args.ExceptionObject, Exception)
MessageBox.Show(e.Message.ToString, "caption", MessageBoxButtons.OK, MessageBoxIcon.Stop)
Application.Exit()
End Sub
-----------------------------------------------------------------
結局、エラーは捕まえられませんでした。
まんちゃん
常連さん
会議室デビュー日: 2006/12/21
投稿数: 25
投稿日時: 2007-05-12 07:54
あれから、更にネットでApplication.ThleadException検索して、フォームロード時に宣言してやってみたら、ちゃんとエラーが捕まえれました。ぶさいくろうさん、本当にありがとうございました。またお世話になります。
1

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