PDA

View Full Version : نمایش Status یک تابع



reza6384
چهارشنبه 13 شهریور 1387, 11:01 صبح
سلام.
من یه کلاس دارم که توی اون کلاس یک تابع وجود داره که یک سری کار انجام میده و این کارها چند ثانیه طول میکشه. من برای این کلاس یک عضو به نام Status تعریف کردم و در زمانی که تابع داره کارش رو انجام میده Status رو تغییر میدم. حالا می خوام از جایی که یک Object از این کلاس ساختم و این تابع رو فراخوانی کردم مثلا در یک StatusBar در یک فرم وضعیت تابع رو نشون بدم.


Public Class Test
Dim Status As string

Function DoSomeWork
' Doing Step1
.
.
.
Me.Status = "Step1 Completed."
'Doing Step2
.
.
.
Me.Status = "Step2 Completed."
End Function

End Class




Public Class FrmMain()

Sub FormLoad()
CallWorker()
End Sub

Sub CallWorker()
Dim TS as New Test
TS.DoSomeWork()
Me.StatusLabel.Text=TS.Status
End Sub
End Class


خوب البته واضحه که با این کد فقط آخرین مقدار Status نمایش داده میشه.

mostafaaa
چهارشنبه 13 شهریور 1387, 12:32 عصر
برای اینکه بتونید مقدار Status رو در هر زمان که عوض میشه نشون بدین باید Status داری Event باشه حالا میتونی یه کلاس دارای Event با نام Status بنویسی یا اینکه Status رو از نوع Lable تعریف کنی که خودش Event داره، که من توی مثال زیر همین کار رو کردم.
ببین به دردت میخوره

Public Class Form1
Public Class Test
Public WithEvents Status As New Label
Public Event TextChange(ByVal sender As Object, ByVal e As EventArgs)
Private Sub Status_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Status.TextChanged
RaiseEvent TextChange(Me.Status, New EventArgs())
End Sub
Sub DoSomeWork()
' Doing Step1
For i As Integer = 0 To 1000000000
i += 10 - 1
Next
Me.Status.Text = "Step1 Completed."
'Doing Step2
For i As Integer = 0 To 1000000000
i += 10 - 1
Next
Me.Status.Text = "Step2 Completed."
End Sub
End Class
Dim WithEvents Work As New Test
Private Sub Work_TextChange(ByVal sender As Object, ByVal e As System.EventArgs) Handles Work.TextChange
Me.Label1.Text = Work.Status.Text
Me.Label1.Refresh()
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Work.DoSomeWork()
End Sub
End Class

reza6384
جمعه 15 شهریور 1387, 14:40 عصر
ببخشید ، من یه سوال دیگه داشتم. من می خوام Status یک Readonly Property باشه، با کد بالا کاربر می تونه اون رو تغییر بده.

reza6384
جمعه 15 شهریور 1387, 15:10 عصر
ببخشید، مشکلم حل شد. کافیه که Status رو Private تعریف کنیم و یک Readonly Property هم تعریف کنیم. وقتی که Status_TextChanged فراخوانی میشه مقدار Status رو عوض می کنیم که در نتیجه مقداری که Property هم برمی گردونه عوض می شه.