tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^5: DLL内の複数クラスで値を参照/格納する方法は?
投稿日: 2005/08/30(Tue) 19:08
投稿者なおこ(・∀・)
お世話になります。

> > ・classは静的クラスではないですよね?
> DLLをインポートしてるわけではないので動的クラスだと思っています。
> アプリケーションと同じ場所にDLLを配置しています。
おお,書き方がまずかったでした。
これはSharedメンバやメソッドをもつクラスですか?
という意味できいていました。

> 少しソースが長くなってしまいますが、いいでしょうか?
> (これでも短くした方なんですが・・・)
ありがとうございます。
んで,見たのですが,
呼び出し元アプリで,
Dim ObjLog As New ClsOutLogとやっていて,
クラスAでも
Catchブロックで
Dim ObjLog As New ClsOutLogとやっているので,
呼び出し元アプリに制御が戻ってきた時に,
クラスAで設定した値が反映されないのは,当然といえば当然です。
呼び出し元アプリと,クラスAのCatchブロックでのObjLogは
変数名や型は同じでも全く別物ですよね。

> Public変数宣言を「Public Shared」に変更したら取得する事ができ
> ました。
Public変数はあんまりよろしくないですよ,と言う事はおいときまして,
Sharedにしたらウマい事いったのは,
Sharedにすると,Sharedという言葉の通り,変数宣言をどこでやろうと
値が共通で保持されます。
なので,思う値がとれたわけですね。

共通部品として使うのであれば,Sheredの方法はマズイっす。

なので,現状のClsOutLogのままやりたいんであれば,
ClsFileMove.FMove等のメソッドに引数として,
ClsOutLogのインスタンスを渡す方法があります。
# でも,あんまりスマートじゃないですよね。

例外クラス化する例として,コードをちょっと修正してみました。
# Catch ObjLog As ClsOutLogExcepionにブレークポイントを張って,ObjLogを見てみてください。
# これが正しいですよ。という意味ではないですので,参考程度にしてくださいね。

Class Test
    Shared Sub Main()
        Try
            Dim ObjFileMove As New ClsFileMove
            ObjFileMove.FMove("移動前ファイル", "移動後ファイル")
        Catch ObjLog As ClsOutLogExcepion
            ObjLog.WriteLog("ログファイル", "メッセージファイル")
        Catch ex As Exception
            Trace.WriteLine(ex.StackTrace)
        End Try
    End Sub
End Class

Public Class ClsFileMove

    'ファイル移動メソッド
    Public Sub FMove(ByVal StrMoveBefore As String, _
                     ByVal StrMoveAfter As String)
        Try
            System.IO.File.Move(StrMoveBefore, StrMoveAfter)
        Catch Ex As Exception
            Dim ObjLog As New ClsOutLogExcepion
            ObjLog.PropertyTest = Err.Number
            Throw ObjLog
        End Try
    End Sub
End Class

Public Class ClsOutLogExcepion
    Inherits Exception

    Private PubIntErrNo As Integer

    'Err.Number設定/取得用プロパティ
    Public Property PropertyTest() As Integer
        Get
            Return PubIntErrNo
        End Get
        Set(ByVal IntNumber As Integer)
            PubIntErrNo = IntNumber
        End Set
    End Property

    'ログ出力メソッド
    Public Function WriteLog(ByVal strLogFile As String, _
        ByVal strMsgFile As String) As String
        '様々な処理を行う
        Dim StrEC As String
        'クラスAでセットされた"Err.Number"を取得(したい)
        If PropertyTest <> 0 Then
            StrEC = "(Code=" & CStr(PubIntErrNo) & ")"
        Else
            StrEC = ""
        End If
        'ログ出力実行
    End Function
End Class

#以下蛇足。
Errオブジェクトでエラーの内容を判断するより,
折角Try〜Catchしてるのですから,
Catchした例外の種類でどんなエラーか判別するのがいいと思いますよ。

例えば,System.IO.File.Moveなんかだと,
DirectoryNotFoundException…これはディレクトリが無い時等に投げられる。
FileNotFoundException…移動元のファイルが無い時に投げられる。
…他,いろいろ

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

古いスレッドにレスはつけられません。