PDA

View Full Version : Chỉ 1 biểu mẩu được thể hiện trong ứng dụng WinForm sử dụng C#.



wachnguyen
12-08-2008, 16:50
Chỉ 1 biểu mẩu được thể hiện trong ứng dụng WinForm sử dụng C#.

Giới thiệu:

Thỉnh thoảng mình nhận được câu hỏi, trong Window Form, mình sử dụng C# làm sao có thể cho phép Form trong ứng dụng của mình chỉ chạy 1 lần duy nhất? và sẻ thông báo lổi, nếu như mình cố gắng chạy nó lần thứ 2.

Thông điệp lổi cũng giống như mình đang cố gắng cài đặt SQL Server 2005, trong khi quá trình cài đặt trước đó vẩn đang chạy.

http://flicr.us/files/2muq64047d5oej998060.png

Giải quết vấn đề như thế nào?

Với vấn đề trên thì chúng ta có thể dể dàng làm được với Visual Basic. NET, chỉ cần “quýnh dấu” cái lựa chọn Make single instance application, và viết thông điệp lồi mà bạn muốn hiển thị trong sự kiện MyApplication_StartupNextInstance.

Thế còn trong C# thì sao? Có rất nhiều giải pháp để làm việc này,ví dụ: kiểm tra tiến trình đang chạy, hoặc sử dụng code không tự quản…. Nhưng những cách trên chưa phải là 1 cách tiếp cận vấn đề tốt nhất, trong bài này mình sẻ sử dụng .NET 2.0 với sự hiện diện của Microsoft.VisualBasic.dll.

Nó cung cấp rất nhiều chức năng hửu ích, mà nhiều người vẩn ngại tham chiếu nó vào ứng dụng của mình. Cám ơn Microsoft đả tích hợp DLL này như 1 phần của Net Framework.

Được rồi, bây giờ chúng ta bắt đầu :

Đầu tiên tạo 1 project Window Form C#, đặt tên là gì tuỳ ý, mình đặt là : SingleInstanceApp, và sửa tên Form1 thành MainForm, dể dàng cho việc nhận biết. Và 1 điều rất quan trọng là chúng ta phải tham chiếu Microsoft.VisualBasic.dll.

http://flicr.us/files/1st9qpphttgeisyl6w9l.png

Để cho dể dàng, chúng tạo 1 lớp dung để xử lý việc này, đặt tên là SingleInstance.cs, lớp này sẻ kế thừa từ lớp WindowsFormsApplicationBase , chúng ta sẻ phải thêm vào câu lệnh using Microsoft.VisualBasic.ApplicationServices;

Đoạn mã sẻ trong có dạng như sau:


using System;
using System.Windows.Forms;
using Microsoft.VisualBasic.ApplicationServices;

namespace SingleInstanceApplication
{
class SingleInstance : WindowsFormsApplicationBase
{
private SingleInstance()
{
base.IsSingleInstance = true;
}

public static void Run(Form f,StartupNextInstanceEventHandler startupHandler)
{
SingleInstance app = new SingleInstance();
app.MainForm = f;
app.StartupNextInstance += startupHandler;
app.Run(Environment.GetCommandLineArgs());
}

public static void StartupNextInstanceHandler(object sender, StartupNextInstanceEventArgs e)
{
foreach (string param in e.CommandLine)
{
MessageBox.Show(param+" is running."," Error ",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
}
}
}

Chúng ta cũng đả thấy trong phương thức khởi tao của lớp, chúng ta thiết lập base.IsSingleInstance = true; nếu muốn cho phép Form của chúng ta chỉ chạy 1 lần.

Nhìn vào phương thức Run, chúng ta cũng thấy, phương thức này nhận vào 2 tham số, tham số đầu tiên là tên Form mà ta muốn thiết lập, tham số thứ 2 là sự kiện của Form, ở đây mình thiết lập sự kiện khởi động cho lần thứ 2, các bạn có thề thiết lập các sự kiện khác như StartupEventHandler cho việc khởi động, và cũng có thể là ShutdownEventHandler.

Mình cũng cài đặt phương thức thứ 2 dùng để hiển thị thông điệp đến người dùng.

Bây giờ chúng ta quay lại MainForm, nơi mà chúng ta cần cho nó thể hiện chỉ 1 lần. Thay vì Application.Run(new MainForm()); chúng ta thay thế hàm đó như sau:


static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals e);
MainForm f = new MainForm();
SingleInstance.Run(f,new StartupNextInstanceEventHandler(
SingleInstance.StartupNextInstanceHandler));
}

Mình chạy ứng dụng của mình trong thư mục Release và sẻ báo lổi điệp như thế này.

http://flicr.us/files/p9jqm6cwcbg3qz87weqr.png

Kết luận:

Vấn đề đả được sáng tỏ, 1 cách dể dàng, C# có thể sử dụng thư viện Visual Basic như Visual Basic, cám ơn Microsoft và đặc biệt là Microsoft Visual Basic team, người đả xây dựng VisualBasic.dll, có nhiều chức năng hữu dụng,cho việc xây dựng ứng dụng desktop 1 cách chắc chắn, linh động và thân thiện người dùng.

Best,
QuachNguyen
All rights reserved

Note: Thỉnh thoảng không nên sử dụng VisualBasic.dll trong ứng dụng, vì .NET thường hoạt động nhanh hơn 25%.

Feedbak: quachngochoangnguyen@gmail.com

_River_
12-08-2008, 16:59
Bác chịu khó nghiên kíu quá, Thanks!

XSolustion
02-09-2008, 12:22
cảm ơn nhiều!
Nhưng còn cách nào khác không dùng thư viện của microsoft.visualbasic.dll không? nếu form đó là form childform trong MDIForm thì sao? làm sao biết childform chỉ xuất hiện 1 lần