2013-08-27 38 views
0

我有一個Form(ClientGUI),它有一個RichTextBox。我想要做的是從位於另一個類(MyQuickFixApp)的Sub中將文本附加到此RichTextBox。我知道Sub工作,因爲調試器經過,但它不會將文本追加到我的RichTextBox將文本從VB.NET中的另一個類別附加到RichTextBox

我該怎麼做?

感謝您的幫助!


ClientGUI.vb:

Imports QuickFix 
Imports QuickFix.Transport 
Imports QuickFix.Fields 

Public Class ClientGUI 
    Dim initiator As SocketInitiator 

    Public Sub ClientGUI_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     Dim filename As String = "Resources/initiator.cfg" 
     Dim settings As New SessionSettings(filename) 
     Dim myApp As New MyQuickFixApp() 

     Dim storeFactory As New FileStoreFactory(settings) 
     Dim logFactory As New FileLogFactory(settings) 

     initiator = New SocketInitiator(myApp, storeFactory, settings, logFactory) 
    End Sub 

    Public Sub ConnectToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ConnectToolStripMenuItem.Click 
     ToolStripDropDownButton1.Text = "Establishing connection..." 
     ToolStripDropDownButton1.Image = My.Resources.Connecting 
     initiator.Start() 
    End Sub 

    Public Sub DisconnectToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles DisconnectToolStripMenuItem.Click 
     ToolStripDropDownButton1.Text = "Disconnecting..." 
     ToolStripDropDownButton1.Image = My.Resources.Disconnecting 
     initiator.Stop() 
    End Sub 
End Class 

MyQuickFixApp.vb:

Imports QuickFix 
Imports QuickFix.Transport 
Imports QuickFix.Fields 

Public Class MyQuickFixApp 
    Inherits MessageCracker : Implements IApplication 

    Dim _session As Session = Nothing 

    Public Sub FromAdmin(message As Message, sessionID As SessionID) Implements IApplication.FromAdmin 
     ClientGUI.RichTextBox1.AppendText("") 
     ClientGUI.RichTextBox1.AppendText("IN (ADMIN): " + message.ToString()) 

     Try 
      Crack(message, sessionID) 
     Catch ex As Exception 
      ClientGUI.RichTextBox1.AppendText("") 
      ClientGUI.RichTextBox1.AppendText("==Cracker exception==") 
      ClientGUI.RichTextBox1.AppendText(ex.ToString()) 
      ClientGUI.RichTextBox1.AppendText(ex.StackTrace) 
     End Try 
    End Sub 

    Public Sub FromApp(message As Message, sessionID As SessionID) Implements IApplication.FromApp 
     ClientGUI.RichTextBox1.AppendText("") 
     ClientGUI.RichTextBox1.AppendText("IN (APP): " + message.ToString()) 

     Try 
      Crack(message, sessionID) 
     Catch ex As Exception 
      ClientGUI.RichTextBox1.AppendText("") 
      ClientGUI.RichTextBox1.AppendText("==Cracker exception==") 
      ClientGUI.RichTextBox1.AppendText(ex.ToString()) 
      ClientGUI.RichTextBox1.AppendText(ex.StackTrace) 
     End Try 
    End Sub 

    Public Sub ToApp(message As Message, sessionId As SessionID) Implements IApplication.ToApp 
     Try 
      Dim possDupFlag As Boolean = False 
      If (message.Header.IsSetField(Tags.PossDupFlag)) Then 
       possDupFlag = Converters.BoolConverter.Convert(message.Header.GetField(Tags.PossDupFlag)) 
      End If 
      If (possDupFlag) Then 
       Throw New DoNotSend() 
      End If 
     Catch ex As FieldNotFoundException 
      ClientGUI.RichTextBox1.AppendText("OUT (APP): " + message.ToString()) 
     End Try 
    End Sub 

    Public Sub OnCreate(sessionID As SessionID) Implements IApplication.OnCreate 
     '_session = Session.LookupSession(sessionID) 
     ClientGUI.RichTextBox1.AppendText("Session created - " + sessionID.ToString()) 
    End Sub 

    Public Sub OnLogon(sessionID As SessionID) Implements IApplication.OnLogon 
     ClientGUI.RichTextBox1.AppendText("Logon - " + sessionID.ToString()) 
     ClientGUI.ToolStripDropDownButton1.Text = "Connected" 
     ClientGUI.ToolStripDropDownButton1.Image = My.Resources.Connected 
     'MsgBox("onlogon") 
    End Sub 

    Public Sub OnLogout(sessionID As SessionID) Implements IApplication.OnLogout 
     ClientGUI.RichTextBox1.AppendText("Logout - " + sessionID.ToString()) 
     ClientGUI.ToolStripDropDownButton1.Text = "Disconnected" 
     ClientGUI.ToolStripDropDownButton1.Image = My.Resources.Disconnected 
    End Sub 

    Public Sub ToAdmin(message As Message, sessionID As SessionID) Implements IApplication.ToAdmin 
     ClientGUI.RichTextBox1.AppendText("OUT (ADMIN): " + message.ToString()) 
    End Sub 

    Public Sub OnMessage(message As FIX42.Heartbeat, sessionID As SessionID) 
     ClientGUI.RichTextBox1.AppendText("HEARTBEAT") 
    End Sub 
End Class 
+2

請發表您已經 –

+0

嗨的代碼,我已經添加了代碼 –

回答

1

我想代碼在MyQuickFixApp類訪問您的ClientGUI,而不是實例的默認實例其實際運行,每次寫入時間ClientGUI.(...)

有關默認實例的更多信息,請參閱此線程Why is there a default instance of every form in VB.Net but not in C#?,這是您應該避免使用的。

所以,你可以在MyQuickFixApp類的構造函數添加參數:

Public Class MyQuickFixApp 
    Inherits MessageCracker : Implements IApplication 

    Dim _clientGUI As ClientGUI = Nothing 
    Public Sub New(cltGui As ClientGUI) 
     _clientGUI = cltGui 
    End sub 

    (...) 
End class 

然後,替換MyQuickFixApp類的所有ClientGUI.(...),與_clientGUI.(...),以確保訪問到正確的實例。

最後,初始化MyQuickFixAppClientGUI這樣的:

Dim myApp As New MyQuickFixApp(me) 

注意,此代碼,你只能訪問類的方法在事件。如果您希望稍後從ClientGUI表單中訪問該變量,則應該在類中聲明該變量並在form_load中初始化該變量。

Public Class ClientGUI 
    Dim initiator As SocketInitiator 
    Dim myApp As MyQuickFixApp() 

    Public Sub ClientGUI_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     (...) 
     myApp =New MyQuickFixApp(Me) 
     (...) 
    End Sub 

    (...) 
End Class 
+1

非常感謝!我明白它是如何工作的,現在一切都很完美。感謝您的幫助。但是,我不得不將參數Control.CheckForIllegalCrossThreadCalls設置爲False。 –

0

在形式

private void button3_Click(object sender, EventArgs e) 
    { 
     TestClass tc = new TestClass(); 

     tc.addComment(richTextBox1); 
    } 

在類

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

public class TestClass 
{ 
    public void addComment(RichTextBox rt) 
    { 
     rt.Text = rt.Text + Environment.NewLine + "My Dynamic Text"; 
    } 
} 

你可以在VB.net做同樣它也

+0

感謝您的幫助,我會盡力 –

+0

對不起,我沒有讓自己清楚,它是不是真的我想什麼去做。我在我的消息中添加了我的代碼。問題是,當我想從MyQuickFixApp.vb追加文本時,它不起作用。 –

+0

如何將窗體的「ClientGUI」對象傳遞給「MyQuickFixApp.vb」類? –

相關問題