- chiroru
- ベテラン
- 会議室デビュー日: 2008/10/02
- 投稿数: 59
|
投稿日時: 2009-02-19 11:54
「名前を付けて保存」ダイアログボックスでファイル名のチェック
<環境>
Microsoft Visual Studio 2008
SQL Server 2005
ActiveReports for .NET 3.0J
「名前を付けて保存」ダイアログボックスで、 拡張子が「.PDF」でなければダイアログを閉じないように実装したいと思っています。
FileOk イベントというのがあるみたいなのですが、SaveFileDialogをNEWして作っているのでどうしたらいいのかわかりません。
ご教授お願いします。
尚プログラムは下記の通りです。これだと「保存ボタン」をクリックしてからエラーチェックしているのでダイアログが
閉じてしまいます。
<フォーム1>PDF作成ボタン
コード: |
|
Private Sub btnPDF_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPDF.Click
Dim pdfExport As PdfExport = New PdfExport()
Dim ShowDInfo As New ShowDialogInfo
Select Case strReportID
Case "100"
Dim rpt As DataDynamics.ActiveReports.ActiveReport3
rpt = New rpt100
Dim RptInfo As New clsReportInfo
RptInfo.ShowDialog(ShowDInfo)
If ShowDInfo.DialogResult = True Then
rpt.Run()
pdfExport.Export(rpt.Document, ShowDInfo.FileName)
End If
End Select
If ShowDInfo.DialogResult = True Then
'完了メッセージ
End If
End Sub
|
<class>共通で使用 ダイアログボックスを表示
コード: |
|
Public Class clsReportInfo
Public Function ShowDialog(ByRef ShowDInfo As ShowDialogInfo) As String
Dim dialog As SaveFileDialog = New SaveFileDialog()
Dim res As DialogResult
dialog.Filter = "PDFファイル(*.pdf)|*.pdf"
dialog.FileName = ""
dialog.Title = "保存先のファイルを選択してください"
dialog.RestoreDirectory = True
dialog.AddExtension = True
res = dialog.ShowDialog()
If res = Windows.Forms.DialogResult.OK Then
If System.IO.Path.GetExtension(dialog.FileName).ToLower() <> ".pdf" Then
MessageBox.Show("拡張子を「.PDF」にしてください", "エラー")
ShowDInfo.DialogResult = False
ShowDInfo.FileName = Nothing
Return ""
Exit Function
End If
ShowDInfo.DialogResult = True
ShowDInfo.FileName = dialog.FileName
Else
ShowDInfo.DialogResult = False
ShowDInfo.FileName = Nothing
End If
dialog.Dispose()
Return ""
End Function
End Class
Public Structure ShowDialogInfo
Public DialogResult As Boolean
Public FileName As String
End Structure
|
|
- masa
- 大ベテラン
- 会議室デビュー日: 2004/10/28
- 投稿数: 161
|
投稿日時: 2009-02-19 12:22
> FileOk イベントというのがあるみたいなのですが、SaveFileDialogをNEWして作っているのでどうしたらいいのかわかりません
イベントハンドラの定義の仕方がわからないということでしょうか。
addhandler ダイアログ.FileOk, addressof イベントハンドラ
で定義できます。MSDN などでそれぞれのキーワードを調べてみてください。
|
- chiroru
- ベテラン
- 会議室デビュー日: 2008/10/02
- 投稿数: 59
|
投稿日時: 2009-02-19 14:55
引用: |
|
masaさんの書き込み (2009-02-19 12:22) より:
イベントハンドラの定義の仕方がわからないということでしょうか。
addhandler ダイアログ.FileOk, addressof イベントハンドラ
で定義できます。
|
イベントハンドラを調べたのですが、まだ解決できずにいます。
下記のコードのように記述しましたが、エラーが発生します。
どこが悪いのでしょうか?
エラー:'SaveFileDialog_FileOk' は 'system名.frm001' のイベントではありません。
@form001にツールボックスの「SaveFileDialog」を貼り付ける。
Aform001のコード
コード: |
|
Public Class frm001
Public Sub SaveFileDialog_FileOk(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles SaveFileDialog.FileOk
If System.IO.Path.GetExtension(SaveFileDialog.FileName).ToLower() <> ".PDF" Then
MessageBox.Show("拡張子を「.PDF」にしてください", "エラー")
e.Cancel = True
End If
End Sub
End Class
|
BclsReportInfo.vbのコード
コード: |
|
Public Class clsReportInfo
Public Function ShowDialog(ByRef ShowDInfo As ShowDialogInfo) As String
Dim dialog As SaveFileDialog = New SaveFileDialog()
Dim res As DialogResult
dialog.Filter = "PDFファイル(*.pdf)|*.pdf"
dialog.FileName = ""
dialog.Title = "保存先のファイルを選択してください"
res = dialog.ShowDialog()
If res = Windows.Forms.DialogResult.OK Then
’***** ここで入力チェックを行いたい
AddHandler frm001.SaveFileDialog_FileOk, AddressOf ShowDialog
’*****
ShowDInfo.DialogResult = True
ShowDInfo.FileName = dialog.FileName
Else
ShowDInfo.DialogResult = False
ShowDInfo.FileName = Nothing
End If
dialog.Dispose()
Return ""
End Function
End Class
Public Structure ShowDialogInfo
Public DialogResult As Boolean
Public FileName As String
End Structure
|
|
- rain
- ぬし
- 会議室デビュー日: 2006/10/19
- 投稿数: 549
|
投稿日時: 2009-02-19 15:06
引用: |
|
chiroruさんの書き込み (2009-02-19 14:55) より:
コード: |
|
’***** ここで入力チェックを行いたい
AddHandler frm001.SaveFileDialog_FileOk, AddressOf ShowDialog
|
|
とりあえず、ここが変。
AddHandler ステートメント
|
- chiroru
- ベテラン
- 会議室デビュー日: 2008/10/02
- 投稿数: 59
|
投稿日時: 2009-02-19 15:22
AddHandler frmB9_20.SaveFileDialog.FileOk, AddressOf frmB9_20.SaveFileDialog_FileOk
とすることでエラーはなくなりました。
ですが、SaveFileDialog_FileOkのイベントに通りません。
|
- rain
- ぬし
- 会議室デビュー日: 2006/10/19
- 投稿数: 549
|
投稿日時: 2009-02-19 15:33
使用する SaveFileDialog オブジェクトの FileOk イベントを、目的のメソッドに紐付けてください。
そのコードだと、使用しているのとは別のオブジェクトの FileOk イベントと紐づけているので、意味がありません。
また、紐づけるのは SaveFileDialog.ShowDialog() を行う前でないと意味がありません。
そのコードだと、ShowDialog() を実行した後…つまり、名前をつけて保存ダイアログを開いて、閉じた後に紐づけているので、意味がありません。
|
- chiroru
- ベテラン
- 会議室デビュー日: 2008/10/02
- 投稿数: 59
|
投稿日時: 2009-02-19 15:56
なんとなくこういう意味でしょうか?
"frm001"に"SaveFileDialog_FileOkイベント"を記述しているが、
"clsReportInfo"で作成した"ShowDialog"はNEWしているため別オブジェクトである。
この場合、"SaveFileDialog_FileOkイベント"をNEWしたオブジェクトのイベントに作成することはできるのですか?
すみません。「紐づける」方法がわかりません。
もう少しお願いします。
|
- rain
- ぬし
- 会議室デビュー日: 2006/10/19
- 投稿数: 549
|
投稿日時: 2009-02-19 16:27
引用: |
|
chiroruさんの書き込み (2009-02-19 15:56) より:
なんとなくこういう意味でしょうか?
"frm001"に"SaveFileDialog_FileOkイベント"を記述しているが、
"clsReportInfo"で作成した"ShowDialog"はNEWしているため別オブジェクトである。
この場合、"SaveFileDialog_FileOkイベント"をNEWしたオブジェクトのイベントに作成することはできるのですか?
すみません。「紐づける」方法がわかりません。
もう少しお願いします。
|
clsReportInfo クラスの ShowDialog() メソッドで、dialog という SaveFileDialog クラスのインスタンスを作成して使っていますよね? ですので、dialog の FileOk イベントを frm001 クラス(のインスタンス)の SaveFileDialog_FileOk() メソッドで処理するように AddHandler で記述しないとだめですよね? という意味です。
また、FileOk イベントは、ユーザーがファイル名を選択した後、ダイアログが閉じる前に発生します。つまり、dialog.ShowDialog() の実行が終わって、clsReportInfo.ShowDialog() に制御が戻ってきたときには、すでに FileOk イベントの発生タイミングを過ぎています。したがって、AddHandler の記述は、dialog.ShowDialog() の実行より前に行う必要があります。
まとめるとこういうことです。
コード: |
|
Public Class clsReportInfo
Public Function ShowDialog(ByRef ShowDInfo As ShowDialogInfo) As String
Dim dialog As SaveFileDialog = New SaveFileDialog()
Dim res As DialogResult
dialog.Filter = "PDFファイル(*.pdf)|*.pdf"
dialog.FileName = ""
dialog.Title = "保存先のファイルを選択してください"
AddHandler dialog.ShowDialog, AddressOf frmB9_20.SaveFileDialog_FileOk
res = dialog.ShowDialog()
If res = Windows.Forms.DialogResult.OK Then
ShowDInfo.DialogResult = True
ShowDInfo.FileName = dialog.FileName
Else
ShowDInfo.DialogResult = False
ShowDInfo.FileName = Nothing
End If
dialog.Dispose()
Return ""
End Function
End Class
Public Structure ShowDialogInfo
Public DialogResult As Boolean
Public FileName As String
End Structure
|
ちなみに、私はコードを読んで気がついた点を指摘しただけで、実際にコードを書いて動かしたわけではありませんので、このように直せばうまくいくかどうかは保証しません。
|