PDA

View Full Version : Show new Form 1 lần



npqk
10-11-2004, 00:04
Mình tạo 1 toolbar, mỗi lần click vào nút New trên toolbar thì Form2 lại được Show lên. Mình muốn chỉ mở From2 1 lần thôi, còn các lần khác, click vào nút New nữa thi Form2 0 hiện nữa thì làm thế nào. Mình viết bằnng C#

sontinh2004
10-11-2004, 05:33
Neu tui hieu dung van de cua ban, tui thay co 2 cach:

1/Disable New sau khi user click len ==> khong the click lan thu 2. (tui thich cach nay)

2/Tao mot bien phu: bool bForm2AlreadyOpened = false;
Truoc khi mo Form2, check ....
if (bForm2AlreadyOpened == false) ...OpenForm2....
else ..... //do something else

Sau khi mo Form2, set .... bForm2AlreadyOpened = true

hoangminh
10-11-2004, 06:51
Trong tất cả các phương pháp, thì cách "Disable menu New" là cách hiệu quả và tinh tế nhất.

QuanN
10-11-2004, 10:41
Có vài cách; đây là một:


Form form2; // member variable
.
.
.
void MenuNewOnClick(object obj, EventArgs ea)
{
if (form2 == null)
{
form2 = new Form();
}
form2.Show();
}

npqk
10-11-2004, 19:25
Cảm ơn các bạn, nhưng mình làm vậy cũng chư duơc, bạn có thể gởi cái source Disable New được không ?

hoangminh
11-11-2004, 06:49
ShowForm2.Enable=False

danceswithwolves
11-11-2004, 08:36
to QuanN@: sau khi đã initialized, dù có bị disposed/closed thì form2 cũng không thể null được. Phải check với form2.Disposed (hay form2.IsDisposed gì đó không nhớ) mới có kết quả mong muốn.

QuanN
11-11-2004, 10:43
form2 vẫn có thể null được chứ, nếu muốn.

form2 = null;Phần code tôi đã ghi chỉ tạo 1 instance duy nhất cho Form, tức form2. Nay đọc lại câu hỏi đầu tiên, nếu poster đó muốn form2 hiện chỉ 1 lần duy nhất thì sẽ là:

void MenuNewOnClick(object obj, EventArgs ea)
{
if (form2 == null)
{
form2 = new Form();
form2.Show();
}
}

KEM_WALL
11-11-2004, 15:28
disable button new cũng là 1 cách, nhưng npqk hỏi là

còn các lần khác, click vào nút New nữa thi Form2 0 hiện nữa thì làm thế nào
vì thế walls góp ý cách sau đây
trong class Form2, bạn thêm 1 biết static bool IsLoaded.


public static bool IsLoaded;

public Form2()
{
if (!IsLoaded)
{
// code của bạn
IsLoaded = true;
}
}

hueduongit
12-11-2004, 21:08
It có một cách giải quyết khác, mọi người thử dùng cách này được không hí, mình phân như thế này cho việc dễ viết code, It giải quyết trên bài toán ứng dụng MDI nghe:
Kiểm tra xem form con đã mở chưa, nếu rồi thì Activate nó lên


private bool IsFormActivate(string strCode)
{
for (int i = 0; i<MdiChildren.Length; i++)
{
if (MdiChildren[i].Tag.Equals(strCode))
{
MdiChildren[i].Activate();
return true;//Da mo roi
}
}
return false;//Chua mo
}


Nếu chưa có thì Show frmName, nếu có rồi thỉ frmName.Dispose()


public void ShowFormMDI(Form frmName, string strCode)
{
if(!IsDocCodeReady(strCode))
{
frmName.MdiParent = this;
frmName.Tag = strCode;
frmName.Text = strCode;
frmName.WindowState = FormWindowState.Maximized;
frmName.Show();
}
else frmName.Dispose();
}


Lời gọi từ nút lệnh


protected void Onbtn_Click(object sender, EventArgs e)
{
Form frm = new frmMy();
ShowFormMDI("Tieu de frmMy",frm);
}

hueduongit
23-11-2004, 08:05
À, tiên đây cho IT hỏi luôn.
Phải dùng các hàm API hay cách gì để chỉ chạy ứng dụng một lần trên một máy.

White Rose
24-11-2004, 23:01
Some links for you:
http://blogs.pingpoet.com/overflow/archive/2004/08/30/752.aspx
http://www.codeproject.com/cpp/avoidmultinstance.asp
http://support.microsoft.com/?kbid=210605