ravaei
جمعه 25 تیر 1395, 22:41 عصر
با سلام
بنده میخوام یک ماژول با کلاس داشته باشم که شامل 2 متد فرستادن دستور و استارت یک پروسس باشد که از تمامی فرم های برنامه به این دو متد دسترسی داشته باشم.
قابل ذکره که بنده 2 تا رویداد خواندن خروجی و خواندن ارور را هم که از سمت آبجکت پروسس ایجاد میشه رو هم هندل کنم .
این 2 تا متد ماژول :
Module Module1
Public Sub start(ByVal appName As String, ByVal outPut As Boolean, ByVal _error As Boolean)
Form1.myProcess = New Process
With Form1.myProcess.StartInfo
.FileName = appName
.UseShellExecute = False
.CreateNoWindow = True
.RedirectStandardInput = True
.RedirectStandardOutput = True
.RedirectStandardError = True
End With
Form1.myProcess.Start()
If (outPut) Then
Form1.myProcess.BeginErrorReadLine()
End If
If (_error) Then
Form1.myProcess.BeginOutputReadLine()
End If
End Sub
Public Sub sendCommand(ByVal command As String)
Form1.myProcess.StartInfo.RedirectStandardError = False
Form1.myProcess.StartInfo.RedirectStandardOutput = False
Form1.myProcess.StandardInput.WriteLine(command)
Form1.myProcess.StandardInput.Flush()
End Sub
End Module
و این هم کدهای داخل فرم 1 :
Public Class Form1
Public WithEvents myProcess As Process
Private Delegate Sub AppendOutputTextDelegate(ByVal text As String)
Private Sub AppendOutputText(ByVal text As String)
If TextBoxout.InvokeRequired Then
Dim myDelegate As New AppendOutputTextDelegate(AddressOf AppendOutputText)
Me.Invoke(myDelegate, text)
Else
TextBoxout.AppendText(text)
End If
End Sub
Private Sub MyProcess_ErrorDataReceived(ByVal sender As Object, ByVal e As System.Diagnostics.DataReceivedEventArgs) Handles myProcess.ErrorDataReceived
AppendOutputText(vbCrLf & "Error: " & e.Data)
End Sub
Private Sub MyProcess_OutputDataReceived(ByVal sender As Object, ByVal e As System.Diagnostics.DataReceivedEventArgs) Handles myProcess.OutputDataReceived
AppendOutputText(vbCrLf & "Output: " & e.Data)
End Sub
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
start("cmd.exe", True, True)
sendCommand("dir")
End Sub
End Class
همینطور که مشاهده میکنید :
در داخل ماژول من مجبور شدم به myprocess در form1 دستور بدم و در داخل فرم 1 هم رویدادهای گرفتن ارور و کرفتن خروجی رو هم باید بنویسم.
چطور میتونم تمام این کارها در داخل یک کلاس یا یک ماژول انجام بدم.
البته راهی که به ذهن من رسید اینه که یک کلاس به نام myform ایجاد کنم که از فرم ارث بری کنه و myprocess و 2 رویداد را override کنم و در زمان استفاده از متدهای ماژول
فرم 1 را نیز در وردی توابع به ماژول پاس بدم و به آبجکت process هر فرم دستورات را اعمال کنم...
بنده میخوام یک ماژول با کلاس داشته باشم که شامل 2 متد فرستادن دستور و استارت یک پروسس باشد که از تمامی فرم های برنامه به این دو متد دسترسی داشته باشم.
قابل ذکره که بنده 2 تا رویداد خواندن خروجی و خواندن ارور را هم که از سمت آبجکت پروسس ایجاد میشه رو هم هندل کنم .
این 2 تا متد ماژول :
Module Module1
Public Sub start(ByVal appName As String, ByVal outPut As Boolean, ByVal _error As Boolean)
Form1.myProcess = New Process
With Form1.myProcess.StartInfo
.FileName = appName
.UseShellExecute = False
.CreateNoWindow = True
.RedirectStandardInput = True
.RedirectStandardOutput = True
.RedirectStandardError = True
End With
Form1.myProcess.Start()
If (outPut) Then
Form1.myProcess.BeginErrorReadLine()
End If
If (_error) Then
Form1.myProcess.BeginOutputReadLine()
End If
End Sub
Public Sub sendCommand(ByVal command As String)
Form1.myProcess.StartInfo.RedirectStandardError = False
Form1.myProcess.StartInfo.RedirectStandardOutput = False
Form1.myProcess.StandardInput.WriteLine(command)
Form1.myProcess.StandardInput.Flush()
End Sub
End Module
و این هم کدهای داخل فرم 1 :
Public Class Form1
Public WithEvents myProcess As Process
Private Delegate Sub AppendOutputTextDelegate(ByVal text As String)
Private Sub AppendOutputText(ByVal text As String)
If TextBoxout.InvokeRequired Then
Dim myDelegate As New AppendOutputTextDelegate(AddressOf AppendOutputText)
Me.Invoke(myDelegate, text)
Else
TextBoxout.AppendText(text)
End If
End Sub
Private Sub MyProcess_ErrorDataReceived(ByVal sender As Object, ByVal e As System.Diagnostics.DataReceivedEventArgs) Handles myProcess.ErrorDataReceived
AppendOutputText(vbCrLf & "Error: " & e.Data)
End Sub
Private Sub MyProcess_OutputDataReceived(ByVal sender As Object, ByVal e As System.Diagnostics.DataReceivedEventArgs) Handles myProcess.OutputDataReceived
AppendOutputText(vbCrLf & "Output: " & e.Data)
End Sub
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
start("cmd.exe", True, True)
sendCommand("dir")
End Sub
End Class
همینطور که مشاهده میکنید :
در داخل ماژول من مجبور شدم به myprocess در form1 دستور بدم و در داخل فرم 1 هم رویدادهای گرفتن ارور و کرفتن خروجی رو هم باید بنویسم.
چطور میتونم تمام این کارها در داخل یک کلاس یا یک ماژول انجام بدم.
البته راهی که به ذهن من رسید اینه که یک کلاس به نام myform ایجاد کنم که از فرم ارث بری کنه و myprocess و 2 رویداد را override کنم و در زمان استفاده از متدهای ماژول
فرم 1 را نیز در وردی توابع به ماژول پاس بدم و به آبجکت process هر فرم دستورات را اعمال کنم...