水如烟

                 顺其自然,水到渠成 LzmTW

文或代码皆是面向初学者.我是爱好者,也是初学者.那些"文章",只按自己理解写,我是不知术语名词的.所以只供参考,也仅供参考.

导航

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

Posted on 2006-05-30 12:00  水如烟(LzmTW)  阅读(369)  评论(0编辑  收藏  举报
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