PDA

View Full Version : [Q] Hỏi về instance của form



hunghm
07-06-2003, 18:22
Trong vb.net khi mà tớ gọi một form thì tớ thường dim new một instance của form (Tớ có 1 button để gọi một form). Nhưng nếu thế thì mỗi lần clik button nó lại gọi một form mới, bây giờ tớ phải làm sao để khi clik button thì nó sẽ chỉ gọi form nếu như form đấy chưa chạy còn nếu form đã được gọi rồi thì nó active lại form đấy

White_Rose
07-06-2003, 22:18
Dim frm2 As Form2

trong sự kiện click:


if frm2 Is Nothing Then
frm2 = New Form2()
frm2.Show()
Else
frm2.Show()
End If

hunghm
08-06-2003, 14:42
Cách này không ổn lắm bạn ạ vì:
nếu để như thế này thì không chạy được nó vẫn gọi nhiều cửa sổ
--------------------------------------------------------
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim frm2 As New Form2()
If frm2 Is Nothing Then
frm2 = New Form2()
frm2.Show()
Else
frm2.Show()
End If
End Sub
---------------------------------------------
Nếu khai báo biến frm2 là public thì nếu tắt form2 đi sau đó clik button thì sẽ gặp lỗi sau:
Cannot access a disposed object named "Form2".

danceswithwolves
08-06-2003, 19:06
...
Dim frm2 As New Form2()
If frm2 Is Nothing Then
frm2 = New Form2()
frm2.Show()
Else
frm2.Show()
End If
...

chẳng trách code snippet này sẽ tạo ra nhiều windows vì frm2 là local variable --> đoạn condition frm2 Is Nothing luôn False

trường hợp bạn đưa frm2 ra thành public member : khi bạn close frm2 cũng là lúc frm2.Dispose() được invoke --> frm2 dọn sạch resource của nó rồi. Mà khi đó, frm2 Is NOT Nothing --> đoạn condition frm2 Is Nothing sẽ là False --> frm2.Show() sẽ tặng bạn một run-time error to tướng vì frm2 disposed rồi, chả còn gì mà show với hide.

nếu tôi nhớ không lầm thì class Form có property .Closed. Bạn có thể thay điều kiện frm2 Is Nothing thành frm2.Closed.

hunghm
10-06-2003, 08:54
frm2 không có thuộc tính nào là closed cả.

itmc
10-06-2003, 14:52
Bạn đang xử lý form ở đang mdi hay sao.
Nếu thế thì khi new một instance ta gan luôn cho nó một key, ta có thể gan cho thuộc tính Tag của instance đó. Sau này dựa vào thuộc tính này mà ta có thể Activate hay new một instance mới.

danceswithwolves
10-06-2003, 15:10
thì đại khái ý tưởng là .Closed, bạn nên từ "ý tưởng" đó mà nghiên cứu tra MSDN chứ. Tôi đã tra MSDN online và kết quả : property đó có tên là .IsDisposed.

hunghm
20-06-2003, 20:16
OK cảm ơn mọi người đã giúp đỡ

hitech
20-06-2003, 23:05
Có 1 cách khác nếu bạn sử dụng MDI và biết tên của form cần hiển thị:
Dim frm As New Form()
For Each frm In Me.MdiChildren()
If frm.Name = "frmDatabaseServerSeting" Then
frm.Activate()
Exit Sub
End If
Next

itmc
26-06-2003, 07:57
Đôi lúc chúng ta cũng cần phải instance nhiều hơn một bản của form. Ví dụ chúng ta có một form (chứa đối tượng Crytasl Report View) dùng để hiển thị các mẫu báo cáo của ta. Thì việc so sánh thuộc tính name là không tiện