• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Chỉ 1 biểu mẩu được thể hiện trong ứng dụng WinForm sử dụng

Các thủ thuật liên quan đến ứng dụng, biểu mẫu và control

Điều hành viên: tungcan5diop, QUANITGROBEST

quachnguyen
Thành viên danh dự
Thành viên danh dự
Bài viết: 18
Ngày tham gia: T.Sáu 30/03/2007 7:04 pm
Đến từ: http://vi-vn.com
Liên hệ:

Chỉ 1 biểu mẩu được thể hiện trong ứng dụng WinForm sử dụng

Gửi bàigửi bởi quachnguyen » T.Ba 12/08/2008 5:11 pm

Tên bài viết: Chỉ 1 biểu mẩu được thể hiện trong ứng dụng WinForm sử dụng C#.
Tác giả: QuachNguyen
Cấp độ bài viết: novice
Tóm tắt: 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.

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.

Để 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:

Mã: Chọn hết

  1. using System;
  2. using System.Windows.Forms;
  3. using Microsoft.VisualBasic.ApplicationServices;
  4.  
  5. namespace SingleInstanceApplication
  6. {
  7.     class SingleInstance : WindowsFormsApplicationBase
  8.     {
  9.         private SingleInstance()
  10.         {
  11.             base.IsSingleInstance = true;
  12.         }
  13.  
  14.         public static void Run(Form f,StartupNextInstanceEventHandler startupHandler)
  15.         {
  16.             SingleInstance app = new SingleInstance();
  17.             app.MainForm = f;
  18.             app.StartupNextInstance += startupHandler;
  19.             app.Run(Environment.GetCommandLineArgs());
  20.         }
  21.  
  22.         public static void StartupNextInstanceHandler(object sender, StartupNextInstanceEventArgs e)
  23.         {
  24.             foreach (string param in e.CommandLine)
  25.             {
  26.                 MessageBox.Show(param+" is running."," Error ",MessageBoxButtons.OK,MessageBoxIcon.Error);
  27.             }
  28.         }
  29.     }
  30. }


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:

Mã: Chọn hết

  1.  
  2.         static void Main()
  3.         {
  4.             Application.EnableVisualStyles();
  5.             Application.SetCompatibleTextRenderingDefault(false);
  6.             MainForm f = new MainForm();
  7.             SingleInstance.Run(f,new StartupNextInstanceEventHandler(
  8.                 SingleInstance.StartupNextInstanceHandler));
  9.         }


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.

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


http://code2code.info/

nth4
Thành viên chính thức
Thành viên chính thức
Bài viết: 10
Ngày tham gia: T.Hai 07/04/2008 10:53 am

Re: Chỉ 1 biểu mẩu được thể hiện trong ứng dụng WinForm sử dụng

Gửi bàigửi bởi nth4 » T.Sáu 21/08/2009 4:52 pm

app.Run(Environment.GetCommandLineArgs());

foreach (string param in e.CommandLine)
{
MessageBox.Show(param+" is running."," Error ",MessageBoxButtons.OK,MessageBoxIcon.Error);
}

Bạn có thể giải thích giúp mình 2 dòng code trên được ko. Mình đọc ko hiểu lắm chỗ này.


Quay về “[.NET] Ứng dụng - Form và Control”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.0 khách