- PR -

「名前を付けて保存」ダイアログボックスでファイル名のチェック

投稿者投稿内容
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



ちなみに、私はコードを読んで気がついた点を指摘しただけで、実際にコードを書いて動かしたわけではありませんので、このように直せばうまくいくかどうかは保証しません。

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