现在的位置: 首页 > 综合 > 正文

异类HOW TO:适时弹出指示框(四)

2011年12月21日 ⁄ 综合 ⁄ 共 5510字 ⁄ 字号 评论关闭
Author:水如烟

指示框的实现:
MessageFormAttribute.vb

Namespace uRemoting.MethodWatcher
    
<AttributeUsage(AttributeTargets.Class)> _
    
Public Class MessageFormAttribute
        
Inherits MethodWatcherBaseAttribute

        Protected Overrides Function GetMethodWatcherProperty() As MethodWatcherBaseProperty
            
Return New MessageFormProperty
        
End Function
    
End Class

End Namespace

MessageFormProperty.vb

Namespace uRemoting.MethodWatcher

    Public Class MessageFormProperty
        
Inherits MethodWatcherBaseProperty

        Protected Overrides Function CreateSink(ByVal nextSink As System.Runtime.Remoting.Messaging.IMessageSink) As System.Runtime.Remoting.Messaging.IMessageSink
            
Return New MessageFormSink(nextSink)
        
End Function

    End Class

End Namespace

MessageFormSink.vb

Imports System.Runtime.Remoting.Messaging

Namespace uRemoting.MethodWatcher

    Public Class MessageFormSink
        
Inherits MethodWatcherBaseSink

        Sub New(ByVal nextSink As IMessageSink)
            
MyBase.New(nextSink)
        
End Sub

        Protected Overrides Sub After_MethodCall(ByVal replyMsg As System.Runtime.Remoting.Messaging.IMethodReturnMessage, ByVal MethodAppendType As System.Type)
            
If replyMsg Is Nothing Then
                
Return
            
End If
            MessageFormCenter.Close(replyMsg, MethodAppendType)

            MyBase.After_MethodCall(replyMsg, MethodAppendType)
        
End Sub

        Protected Overrides Sub Before_MethodCall(ByVal callMsg As System.Runtime.Remoting.Messaging.IMethodCallMessage, ByVal MethodAppendType As System.Type)
            
If callMsg Is Nothing Then
                
Return
            
End If

            MessageFormCenter.ShowForm(callMsg, MethodAppendType)

            MyBase.Before_MethodCall(callMsg, MethodAppendType)
        
End Sub

        Protected Overrides ReadOnly Property MethodWatcherAppendAttributeType() As System.Type
            
Get
                
Return GetType(MessageFormAppendAttribute)
            
End Get
        
End Property
    
End Class

End Namespace

MessageFormAppendAttribute.vb

Namespace uRemoting.MethodWatcher
    
<AttributeUsage(AttributeTargets.Class, allowmultiple:=True)> _
    
Public NotInheritable Class MessageFormAppendAttribute
        
Inherits MethodWatcherAppendBaseAttribute

        Private gMessage As String = "处理中"
        
Private gTitle As String = "请稍候"
        
Private gFormType As ApplicationBase.MessageFormType = ApplicationBase.MessageFormType.Message

        Sub New(ByVal methodName As String)
            
MyBase.New(methodName)
        
End Sub

        Public Property Message() As String
            
Get
                
Return gMessage
            
End Get
            
Set(ByVal value As String)
                gMessage 
= value
            
End Set
        
End Property

        Public Property Title() As String
            
Get
                
Return gTitle
            
End Get
            
Set(ByVal value As String)
                gTitle 
= value
            
End Set
        
End Property

        Public Property FormType() As ApplicationBase.MessageFormType
            
Get
                
Return gFormType
            
End Get
            
Set(ByVal value As ApplicationBase.MessageFormType)
                gFormType 
= value
            
End Set
        
End Property
    
End Class

End Namespace

MessageFormCenter.vb

Imports System.Runtime.Remoting.Messaging

Namespace uRemoting.MethodWatcher

    Public Class MessageFormCenter

        Private Shared gWaitingFormCollection As New Dictionary(Of String, ApplicationBase.WaitingForm)

        Private Sub New()
        
End Sub

        Public Shared Sub ShowForm(ByVal callMsg As IMethodCallMessage, ByVal MethodAppendType As System.Type)

            NowMethodName = MethodWatcherCommon.GetFullMethodName(callMsg, MethodAppendType)
            IsClose.Add(NowMethodName, 
False)
            
Dim td As New Threading.Thread(New Threading.ThreadStart(AddressOf Show))
            td.Start()
        
End Sub

        Public Shared Sub Close(ByVal replyMsg As IMethodReturnMessage, ByVal MethodAppendType As System.Type)

            NowMethodName = MethodWatcherCommon.GetFullMethodName(replyMsg, MethodAppendType)
            IsClose(MethodWatcherCommon.GetFullMethodName(replyMsg, 
GetType(MessageFormAppendAttribute))) = True
            
While IsClose.ContainsKey(NowMethodName)
                Windows.Forms.Application.DoEvents()
            
End While
            gWaitingFormCollection.Remove(MethodWatcherCommon.GetFullMethodName(replyMsg, MethodAppendType))
        
End Sub

        Private Shared Function WaitingForm(ByVal methodName As StringAs ApplicationBase.WaitingForm

            If Not gWaitingFormCollection.ContainsKey(methodName) Then

                Dim a As MessageFormAppendAttribute = CType(MethodCollection.DefaultInstance(methodName), MessageFormAppendAttribute)
                
Dim f As New ApplicationBase.WaitingForm(a.FormType)
                
With f
                    .ReceiveMessage(a.Title, 
True)
                    .ReceiveMessage(a.Message)
                
End With
                gWaitingFormCollection.Add(methodName, f)
            
End If
            
Return gWaitingFormCollection(methodName)
        
End Function

        Private Shared IsClose As New Dictionary(Of StringBoolean)
        
Private Shared NowMethodName As String

        Private Shared Sub Show()
            WaitingForm(NowMethodName).Show()

            Do While Not IsClose(NowMethodName)
                Windows.Forms.Application.DoEvents()
            
Loop

            IsClose.Remove(NowMethodName)
        End Sub
    
End Class

End Namespace

抱歉!评论已关闭.