C# MDI Form

A Multiple Document Interface (MDI) programs can display multiple child windows inside them. This is in contrast to single document interface (SDI) applications, which can manipulate only one document at a time. Visual Studio Environment is an example of Multiple Document Interface (MDI) and notepad is an example of an SDI application. MDI applications often have a Window menu item with submenus for switching between windows or documents.

mdiform

Any windows can become an MDI parent, if you set the IsMdiContainer property to True.

IsMdiContainer = true;

The following C# program shows a MDI form with two child forms. Create a new C# project, then you will get a default form Form1 . Then add two mnore forms in the project (Form2 , Form 3) . Create a Menu on your form and call these two forms on menu click event.

NOTE: If you want the MDI parent to auto-size the child form you can code like this.

  form.MdiParent = this;
  form.Dock=DockStyle.Fill;
  form.Show();

Full Code

using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            IsMdiContainer = true;
        }

        private void menu1ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Form2 frm2 = new Form2();
            frm2.Show();
            frm2.MdiParent = this;
        }

        private void menu2ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Form3 frm3 = new Form3();
            frm3.Show();
            frm3.MdiParent = this;
        }
    }
}

 

Insert hình ảnh vào Sql Server trong C#

Insert hình ảnh vào Sql Server trong C#
Insert hình ảnh vào Sql Server trong C#

Khi làm việc với các ứng dụng quản lý trên C# như ứng dụng quản lý sinh viên, quản lý nhân viên, … chúng ta có nhiều tình huống cần lưu trữ hình ảnh, ví dụ như là hình ảnh của sinh viên, nhân viên… Làm sao chúng ta giải quyết vấn đề đó?
Các giải pháp nào để lưu trữ hình ảnh. Nếu muốn lưu hình ảnh đó vào Cơ sở dữ liệu Sql Server thì làm thế nào? Làm sao để hiển thị chúng ra ngoài ứng dụng?

Video Insert hình ảnh vào Sql Server trong C#

Tóm tắt Video

  • Các loại lưu trữ hình ảnh. Ưu và nhược điểm?
  • Tạo Cơ sở dữ liệu bảng Student (lưu thông tin sinh viên)
  • Tạo dự án WindowForm mới
  • Tạo form thêm sinh viên
  • Tạo DataGridview load danh sách sinh viên
  • Code xử lý chuyển ảnh thành byte.
  • Code xử lý chuyển byte thành ảnh
  • Code xử lý dữ liệu, (select, insert….)
Nếu bạn đã hoàn thành theo hướng dẫn mà vẫn gặp khó khăn, hãy tải mã nguồn ứng dụng tại đây:  Download

Cảm ơn bạn đọc và mình luôn đánh giá cao phản hồi của bạn.

Vừa gà vừa chó, bó lại cho tròn, ba mươi sáu con, một trăm chân chẵn. Hỏi mấy gà, mấy chó?

Vừa gà vừa chó, bó lại cho tròn, ba mươi sáu con, một trăm chân chẵn. Hỏi mấy gà, mấy chó?
Vừa gà vừa chó, bó lại cho tròn, ba mươi sáu con, một trăm chân chẵn. Hỏi mấy gà, mấy chó?

Có một bài toán dân gian khá thú vị như sau:

Vừa gà vừa chó
Bó lại cho tròn
Ba mươi sáu(36) con
Một trăm(100) chân chẵn
Hỏi mấy gà, mấy chó?

Đây là bài toán vui, từ khi học tiểu học mình đã biết, lên trung học, học giải phương trình cũng gặp lại nó. Và bây giờ, làm lập trình, tự dưng nhớ tới nó, nên viết ra đây, coi như chia sẻ cho các bạn mới học lập trình có thêm hào hứng, giải quyết các bài tập nho nhỏ, vui vẻ tương tự.

Cách giải nó như sau:

Gọi x là số gà
Số chó là: 36 – x
Số chân gà: 2x
Số chân chó: 4(36-x)
theo đề bài ta có:
2x + 4(36 – x) =100
2x + 144 – 4x = 100
2x = 144 – 100
2x = 44
x = 22
Vậy số gà là 22 con
Số chó : 36 – 22 = 14

Bạn bảo mấy con chó đặt 2 chân trước lên ghế,tổng số chân dưới đất sẽ là 36 x 2  = 72 chân. Suy ra số chân trên ghế là 28 chân.
Vậy có 14 con chó ….

Dùng hệ phương trình
Gọi x là gà, y là chó
Ta có hệ pt:
x + y = 36
2x + 4y = 100
Giải hệ pt
x = 22,y = 14
Vậy gà có 22 con, chó có 14 con. Mời các bạn chia sẻ thêm cách giải hay, thú vị khác nữa nhé.

Vậy thì làm sao để giải nó bằng cách lập trình. Đây không phải vấn đề khó với nhiều bạn, tuy nhiên mình thấy vui vẻ, nên vẫn viết ra đây.

Sau đây là cách giải trong một số ngôn ngữ lập trình như Pascal, C++, C#, Java, PHP, ASP.NET, Javascript. Trường hợp máy bạn không cài sẵn IDE, bạn có thể sử dụng trang web http://ideone.com để chạy thử code.

Vì số con là 36 và số chân là 100. Giả sử tất cả là chó, thì số con tối đa là 100/4 = 25 (con). Tối thiểu là 36 / 4 = 9 (con). Như vậy chúng ta chỉ cần sử dụng vòng lặp for từ 9->25. Tối ưu hơn so với từ 0 -> 36

Pascal

program HelloWorld;
var i :Integer;
begin
  	writeln('Giai bai toan dan gian bang Pascal');
	writeln('Vua ga vua cho');
	writeln('Bo lai cho tron');
	writeln('Ba muoi sau(36) con');
	writeln('Mot tram(100) chan chan');
	writeln('Hoi may ga, may cho?');
	for i:= 9 to 25 do
		if((i * 2 + (36 - i) * 4) = 100) then
			writeln('So ga la: ', i);
			writeln('So cho la: ', 36 - i);
	
end.

C++

#include <string>
#include<iostream>;
#include<stdio.h>;
 
using namespace std;

int main(){
	cout << "Gia bai toan dan gian trong C++\n";
	cout << "Vua ga vua cho\n";
	cout << "Bo lai cho tron\n";
	cout << "Ba muoi sau(36) con\n";
	cout << "Mot tram(100) chan chan\n";
	cout << "Hoi may ga, may cho?\n";
	cout << "\n";
	for (int i = 9; i < 25; i++)
	{
		if ((i * 2 + (36 - i) * 4) == 100){
			cout << "So ga la: " << i << "\n";
			cout << "So cho la: " << (36 - i) << "\n";
                        break;
		}
	}
}

Java

public class Main {

	public Main() {
		// TODO Auto-generated constructor stub
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("Giải bài toán dân gian trong Java");
		System.out.println("Vừa gà vừa chó");
		System.out.println("Bó lại cho tròn");
		System.out.println("Ba mươi sáu(36) con");
		System.out.println("Một trăm(100) chân chẵn");
		System.out.println("Hỏi mấy gà, mấy chó?\n");
		for(int i = 9; i < 25; i++){
			if((i*2+(36-i)*4)==100){
				System.out.println("Số gà là: " + i);
				System.out.println("Số chó là: " + i);
			}
		}
	}
}

C#

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Gia bai toan dan gian trong C#");
            Console.Write("Vua ga vua cho\n");
            Console.Write("Bo lai cho tron\n");
            Console.Write("Ba muoi sau(36) con\n");
            Console.Write("Mot tram(100) chan chan\n");
            Console.WriteLine("Hoi may ga, may cho?\n");
            for (int i = 9; i <= 25; i++)
            {
                if ((2 * i + (36 - i) * 4) == 100)
                {
                    Console.WriteLine("So ga la: " + i);
                    Console.WriteLine("So cho la: " + (36 - i));
                    break;
                }
            }

            Console.ReadKey();
        }
    }

ASP.NET

void GiaiBaiToanDanGian()
    {
        StringBuilder sb = new StringBuilder();
        for (int i = 9; i < 25; i++)
        {
            if ((i * 2 + (36 - i) * 4) == 100)
            {
                sb.AppendLine("Số gà là: " + i);
                sb.AppendLine("Số chó là: " + (36 - i));
            }
        }
        Label1.Text = sb.ToString();
    }

PHP

<html>
	<head>
		<meta charset="UTF-8"/>
		<title>Bài toán dân gian</title>				
	</head>
	<body>
		<b>Giải bài toán dân gian trong PHP</b></br>
		Vừa gà vừa chó </br>
		Bó lại cho tròn </br>
		Ba mươi sáu(36) con </br>
		Một trăm(100) chân chẵn</br>
		Hỏi mấy gà, mấy chó?</br>
		</br>
		<?php 
			for($i = 9; $i < 25; $i ++)
			{
				if(($i * 2 + (36-$i)*4) == 100)
				{
					echo 'Số gà là: '.$i.'</br>';
					echo 'Số chó là: '.(36 - $i);
				}
			}
		?>
	</body>
</html>

Javascript

<script type="text/javascript">
	alert('Giai bai toan dan gian');
	for(i = 9; i < 25; i++)
	{
		if((i * 2 + (36-i)*4) === 100){
			alert('Số gà là: ' + i + '; Số chó là: '+(36-i));
		}
	}
</script>

Chúc các bạn học lập trình vui vẻ

Convert DataTable to List trong C#

Khi làm việc với .NET, thì MS đã cung cấp cho chúng ta đối tượng DataTable. Tuy nhiên trong nhiều trường hợp, DataTable tỏ ra không linh hoạt và tiện dụng như List. Do đó chúng ta rất có nhu cầu chuyển đổi từ DataTable sang List để tiện sử dụng.

Convert Datatable to List
Convert Datatable to List

Class này cung cấp cho các bạn 2 phương thức để chuyển đổi từ DataTable sang List và ngược lại.

/* 
FileName: ConvertListToDataTable.cs
Project Name: ColorLife
Date Created: 11/30/2014 8:44:44 AM
Description: Convert Between List and DataTable
Version: 1.0.0.0
Author:	Lê Thanh Tuấn
Author Email: tuanitpro@gmail.com
Author Mobile: 0976060432
Author URI: http://tuanitpro.com
License: 

*/

using System;
using System.Collections.Generic;
using System.Data;
using System.Reflection;

public static class ConvertListToDataTable
{
	
	// List<Student> students = Data.GetStudents();	
	// Converts List To DataTable
	// DataTable studentTbl = students.ToDataTable(); 

	public static DataTable ListToDataTable<T>(this IList<T> data)
	{
		DataTable dataTable = new DataTable(typeof(T).Name);
		PropertyInfo[] props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
		foreach (PropertyInfo prop in props)
		{
			dataTable.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
		}
		foreach (T item in data)
		{
			var values = new object[props.Length];
			for (int i = 0; i < props.Length; i++)
			{
				values[i] = props[i].GetValue(item, null);
			}
			dataTable.Rows.Add(values);
		}
		return dataTable;
	}

	//  Converts DataTable To List
	//  DataTable dtTable = GetEmployeeDataTable();
	//  List<Employee> employeeList = dtTable.DataTableToList<Employee>();
	
	public static List<T> DataTableToList<T>(this DataTable table) where T : class, new()
	{
		try
		{
			List<T> list = new List<T>();

			foreach (var row in table.AsEnumerable())
			{
				T obj = new T();

				foreach (var prop in obj.GetType().GetProperties())
				{
					try
					{
						PropertyInfo propertyInfo = obj.GetType().GetProperty(prop.Name);
						propertyInfo.SetValue(obj, Convert.ChangeType(row[prop.Name], propertyInfo.PropertyType), null);
					}
					catch
					{
						continue;
					}
				}

				list.Add(obj);
			}

			return list;
		}
		catch
		{
			return null;
		}
	}	
}

Lưu ý: Có thể code không chạy trong một vài trường hợp như dữ liệu kết hợp phức tạp. Tên cột trong DataTable khác với thuộc tính trong List.

Chúc các bạn thành công.

String Format for Double C#

The following examples show how to format float numbers to string in C#. You can use static method String.Format or instance methods double.ToString and float.ToString.

Digits after decimal point

This example formats double to string with fixed number of decimal places. For two decimal places use pattern „0.00“. If a float number has less decimal places, the rest digits on the right will be zeroes. If it has more decimal places, the number will be rounded.

[C#]
// just two decimal places
String.Format("{0:0.00}", 123.4567);      // "123.46"
String.Format("{0:0.00}", 123.4);         // "123.40"
String.Format("{0:0.00}", 123.0);         // "123.00"

Next example formats double to string with floating number of decimal places. E.g. for maximal two decimal places use pattern „0.##“.

[C#]
// max. two decimal places
String.Format("{0:0.##}", 123.4567);      // "123.46"
String.Format("{0:0.##}", 123.4);         // "123.4"
String.Format("{0:0.##}", 123.0);         // "123"

Digits before decimal point

If you want a float number to have any minimal number of digits before decimal point use N-times zero before decimal point. E.g. pattern „00.0“ formats a float number to string with at least two digits before decimal point and one digit after that.

[C#]
// at least two digits before decimal point
String.Format("{0:00.0}", 123.4567);      // "123.5"
String.Format("{0:00.0}", 23.4567);       // "23.5"
String.Format("{0:00.0}", 3.4567);        // "03.5"
String.Format("{0:00.0}", -3.4567);       // "-03.5"

Thousands separator

To format double to string with use of thousands separator use zero and comma separator before an usual float formatting pattern, e.g. pattern „0,0.0“ formats the number to use thousands separators and to have one decimal place.

[C#]
String.Format("{0:0,0.0}", 12345.67);     // "12,345.7"
String.Format("{0:0,0}", 12345.67);       // "12,346"

Zero

Float numbers between zero and one can be formatted in two ways, with or without leading zero before decimal point. To format number without a leading zero use # before point. For example „#.0“ formats number to have one decimal place and zero to N digits before decimal point (e.g. „.5“ or „123.5“).

Following code shows how can be formatted a zero (of double type).

[C#]
String.Format("{0:0.0}", 0.0);            // "0.0"
String.Format("{0:0.#}", 0.0);            // "0"
String.Format("{0:#.0}", 0.0);            // ".0"
String.Format("{0:#.#}", 0.0);            // ""

Align numbers with spaces

To align float number to the right use comma „,“ option before the colon. Type comma followed by a number of spaces, e.g. „0,10:0.0“ (this can be used only in String.Format method, not in double.ToString method). To align numbers to the left use negative number of spaces.

[C#]
String.Format("{0,10:0.0}", 123.4567);    // "     123.5"
String.Format("{0,-10:0.0}", 123.4567);   // "123.5     "
String.Format("{0,10:0.0}", -123.4567);   // "    -123.5"
String.Format("{0,-10:0.0}", -123.4567);  // "-123.5    "

Custom formatting for negative numbers and zero

If you need to use custom format for negative float numbers or zero, use semicolon separator;“ to split pattern to three sections. The first section formats positive numbers, the second section formats negative numbers and the third section formats zero. If you omit the last section, zero will be formatted using the first section.

[C#]
String.Format("{0:0.00;minus 0.00;zero}", 123.4567);   // "123.46"
String.Format("{0:0.00;minus 0.00;zero}", -123.4567);  // "minus 123.46"
String.Format("{0:0.00;minus 0.00;zero}", 0.0);        // "zero"

Some funny examples

As you could notice in the previous example, you can put any text into formatting pattern, e.g. before an usual pattern „my text 0.0“. You can even put any text between the zeroes, e.g. „0aaa.bbb0“.

[C#]
String.Format("{0:my number is 0.0}", 12.3);   // "my number is 12.3"
String.Format("{0:0aaa.bbb0}", 12.3);          // "12aaa.bbb3"

Nguồn: http://www.csharp-examples.net/

String Format for Int C#

Integer numbers can be formatted in .NET in many ways. You can use static method String.Format or instance method int.ToString. Following examples shows how to align numbers (with spaces or zeroes), how to format negative numbers or how to do custom formatting like phone numbers.

Add zeroes before number

To add zeroes before a number, use colon separator „:“ and write as many zeroes as you want.

[C#]
String.Format("{0:00000}", 15);          // "00015"
String.Format("{0:00000}", -15);         // "-00015"

Align number to the right or left

To align number to the right, use comma „,“ followed by a number of characters. This alignment option must be before the colon separator.

[C#]
String.Format("{0,5}", 15);              // "   15"
String.Format("{0,-5}", 15);             // "15   "
String.Format("{0,5:000}", 15);          // "  015"
String.Format("{0,-5:000}", 15);         // "015  "

Different formatting for negative numbers and zero

You can have special format for negative numbers and zero. Use semicolon separator „;“ to separate formatting to two or three sections. The second section is format for negative numbers, the third section is for zero.

[C#]
String.Format("{0:#;minus #}", 15);      // "15"
String.Format("{0:#;minus #}", -15);     // "minus 15"
String.Format("{0:#;minus #;zero}", 0);  // "zero"

Custom number formatting (e.g. phone number)

Numbers can be formatted also to any custom format, e.g. like phone numbers or serial numbers.

[C#]
String.Format("{0:+### ### ### ###}", 447900123456); // "+447 900 123 456"
String.Format("{0:##-####-####}", 8958712551);       // "89-5871-2551"

Nguồn: http://www.csharp-examples.net/

String Format for DateTime C#

This example shows how to format DateTime using String.Format method. All formatting can be done also using DateTime.ToString method.

Custom DateTime Formatting

There are following custom format specifiers y (year), M (month), d (day), h (hour 12), H (hour 24), m (minute), s (second), f (second fraction), F (second fraction, trailing zeroes are trimmed), t(P.M or A.M) and z (time zone).

Following examples demonstrate how are the format specifiers rewritten to the output.

[C#]
// create date time 2008-03-09 16:05:07.123
DateTime dt = new DateTime(2008, 3, 9, 16, 5, 7, 123);

String.Format("{0:y yy yyy yyyy}", dt);  // "8 08 008 2008"   year
String.Format("{0:M MM MMM MMMM}", dt);  // "3 03 Mar March"  month
String.Format("{0:d dd ddd dddd}", dt);  // "9 09 Sun Sunday" day
String.Format("{0:h hh H HH}",     dt);  // "4 04 16 16"      hour 12/24
String.Format("{0:m mm}",          dt);  // "5 05"            minute
String.Format("{0:s ss}",          dt);  // "7 07"            second
String.Format("{0:f ff fff ffff}", dt);  // "1 12 123 1230"   sec.fraction
String.Format("{0:F FF FFF FFFF}", dt);  // "1 12 123 123"    without zeroes
String.Format("{0:t tt}",          dt);  // "P PM"            A.M. or P.M.
String.Format("{0:z zz zzz}",      dt);  // "-6 -06 -06:00"   time zone

You can use also date separator / (slash) and time sepatator : (colon). These characters will be rewritten to characters defined in the current DateTimeForma­tInfo.DateSepa­rator and DateTimeForma­tInfo.TimeSepa­rator.

[C#]
// date separator in german culture is "." (so "/" changes to ".")
String.Format("{0:d/M/yyyy HH:mm:ss}", dt); // "9/3/2008 16:05:07" - english (en-US)
String.Format("{0:d/M/yyyy HH:mm:ss}", dt); // "9.3.2008 16:05:07" - german (de-DE)

Here are some examples of custom date and time formatting:

[C#]
// month/day numbers without/with leading zeroes
String.Format("{0:M/d/yyyy}", dt);            // "3/9/2008"
String.Format("{0:MM/dd/yyyy}", dt);          // "03/09/2008"

// day/month names
String.Format("{0:ddd, MMM d, yyyy}", dt);    // "Sun, Mar 9, 2008"
String.Format("{0:dddd, MMMM d, yyyy}", dt);  // "Sunday, March 9, 2008"

// two/four digit year
String.Format("{0:MM/dd/yy}", dt);            // "03/09/08"
String.Format("{0:MM/dd/yyyy}", dt);          // "03/09/2008"

Standard DateTime Formatting

In DateTimeForma­tInfo there are defined standard patterns for the current culture. For example property ShortTimePattern is string that contains value h:mm tt for en-US culture and valueHH:mm for de-DE culture.

Following table shows patterns defined in DateTimeForma­tInfo and their values for en-US culture. First column contains format specifiers for the String.Format method.

SpecifierDateTimeFormatInfo propertyPattern value (for en-US culture)
tShortTimePatternh:mm tt
dShortDatePatternM/d/yyyy
TLongTimePatternh:mm:ss tt
DLongDatePatterndddd, MMMM dd, yyyy
f(combination of D and t)dddd, MMMM dd, yyyy h:mm tt
FFullDateTimePatterndddd, MMMM dd, yyyy h:mm:ss tt
g(combination of d and t)M/d/yyyy h:mm tt
G(combination of d and T)M/d/yyyy h:mm:ss tt
m, MMonthDayPatternMMMM dd
y, YYearMonthPatternMMMM, yyyy
r, RRFC1123Patternddd, dd MMM yyyy HH':'mm':'ss 'GMT' (*)
sSortableDateTi­mePatternyyyy'-'MM'-'dd'T'HH':'mm':'ss (*)
uUniversalSorta­bleDateTimePat­ternyyyy'-'MM'-'dd HH':'mm':'ss'Z' (*)
(*) = culture independent

Following examples show usage of standard format specifiers in String.Format method and the resulting output.

[C#]
String.Format("{0:t}", dt);  // "4:05 PM"                         ShortTime
String.Format("{0:d}", dt);  // "3/9/2008"                        ShortDate
String.Format("{0:T}", dt);  // "4:05:07 PM"                      LongTime
String.Format("{0:D}", dt);  // "Sunday, March 09, 2008"          LongDate
String.Format("{0:f}", dt);  // "Sunday, March 09, 2008 4:05 PM"  LongDate+ShortTime
String.Format("{0:F}", dt);  // "Sunday, March 09, 2008 4:05:07 PM" FullDateTime
String.Format("{0:g}", dt);  // "3/9/2008 4:05 PM"                ShortDate+ShortTime
String.Format("{0:G}", dt);  // "3/9/2008 4:05:07 PM"             ShortDate+LongTime
String.Format("{0:m}", dt);  // "March 09"                        MonthDay
String.Format("{0:y}", dt);  // "March, 2008"                     YearMonth
String.Format("{0:r}", dt);  // "Sun, 09 Mar 2008 16:05:07 GMT"   RFC1123
String.Format("{0:s}", dt);  // "2008-03-09T16:05:07"             SortableDateTime
String.Format("{0:u}", dt);  // "2008-03-09 16:05:07Z"            UniversalSortableDateTime

 

Nguồn: http://www.csharp-examples.net/

Chương trình hẹn giờ tắt máy tính bằng C#

Chương trình hẹn giờ tắt máy tính
Chương trình hẹn giờ tắt máy tính

Khi mới làm quen với chiếc máy vi tính, tôi đã luôn tò mò làm thế nào mình có thể viết một trang web, viết một phần mềm nho nhỏ. Có lẽ đó là lý do tôi chọn theo ngành Công nghệ Thông tin. Tuy vậy, tôi cũng chưa thể viết ngay được một phần mềm cho ra hồn, khi vào ĐH. Cho đến khi học về C#, Windows Form, tôi mới bắt đầu tự viết các phần mềm nho nhỏ, như chương trình hẹn giờ tắt máy tính, chương trình nghe nhạc, chương trình xem ảnh, chương trình thay đổi màn hình desktop (Windows XP)….
Bạn thấy đấy, nó không lớn, và cũng có nhiều người làm rồi, tuy vậy với một người yêu thích lập trình giống như tôi cảm giác tự mình làm ra một phần mềm (made by tự tui) vẫn rất thú vị. Và tôi nghĩ nhiều bạn lúc mới bắt đầu cũng có suy nghĩ giống vậy. Tôi vẫn thích dùng phần mềm do mình viết ra hơn, dù nó không thực sự là hoàn hảo.
Hôm nay, tôi sẽ hướng dẫn các bạn viết một chương trình nho nhỏ, đó là chương trình hẹn giờ tắt máy tính bằng C#. Bạn có thể sử dụng nó mỗi lúc để máy nghe nhạc, hay nghe truyện ma trước khi ngủ, tặng cho bạn bè, hay tặng bạn gái của bạn… Tùy tính sáng tạo của bạn, tôi có vài gợi ý như là: Hẹn giờ tắt máy, hẹn giờ đi chơi với bạn gái, hẹn giờ cứ tới 9h tối là hát bài “Chúc bé ngủ ngon” :D. Nó cũng hữu ích trong trường hợp bạn ngồi quá lâu trước máy vi tính, nó nhắc nhở bạn bằng một bài hát yêu thích, hay hiện lên hình ảnh cô gái sexy nào đó sau mỗi 45 phút. (Ý tưởng cũng không tồi nhỉ?)
Tôi đặt tên cho ứng dụng của mình là AppAutoShutdown. Bạn có thể đặt tên nào mà bạn thích. 🙂

Video Chương trình hẹn giờ tắt máy tính C#

Tóm tắt Video

  • Tạo dự án Windows Form trong VS
  • Thiết kế giao diện màn hình chính
  • Sử dụng control Timer
  • Viết Class ExitWindows
  • Xử lý sự kiện khi hẹn giờ

Hãy sáng tạo theo cách của bạn. Nâng cao một chút như khởi động cùng windowns, thu gọn chương trình vào khay hệ thống, hay hẹn giờ vào thời gian kế tiếp, như 12h chẳng hạn, thay gì 1h30ph.

Nếu bạn đã hoàn thành theo hướng dẫn mà vẫn gặp khó khăn, hãy tải mã nguồn ứng dụng tại đây:  Download hoặc tải về file exe của chương trình. Yêu cầu Net Framework 4.0.  AppAutoShutdown.Exe

Cảm ơn bạn đọc và tôi luôn đánh giá cao phản hồi của bạn.

OOP – Interface vs Abstract class

Hiện nay mặc dù OOP đã rất phổ biến nhưng đa số vẫn còn khá mơ hồ trong việc phân biệt và định nghĩa hai khái niệm Interface và Abstract class. Có vẻ vấn đề này không được dạy rõ ràng ở trường, hoặc có thể các người dạy cũng chưa nắm rõ về nó. Ngoài ra, đây còn là một vấn đề cần giải quyết mà xác suất bạn nhận được khi đi phỏng vấn là khá cao.

Is-a và Can-do

Bỏ qua tất cả những phần về lý thuyết của việc tạo một abstract class và interface. Bạn không cần quan tâm nhiều đến việc abstract có thể khai báo những gì, hay interface có được phép định nghĩa nội dung phương thức hay không. Điểm cơ bản khi bạn được hỏi về sự khác biệt giữa chúng là gì? Đó chính là mục đích mà chúng được sử dụng:

–          Abstract class: là một class cha cho tất cả các class có cùng bản chất. Bản chất ở đây được hiểu là kiểu, loại, nhiệm vụ của class. Hai class cùng hiện thực một interface có thể hoàn toàn khác nhau về bản chất.

–          Interface: là một chức năng mà bạn có thể thêm và bất kì class nào. Từ chức năng ở đây không đồng nghĩa với phương thức (hoặc hàm). Interface có thể bao gồm nhiều hàm/phương thức và tất cả chúng cùng phục vụ cho một chức năng.

Vậy, bạn không nên nhầm lẫn khi nói về việc một class được implement hay extend. Nhiều người thường hay đồng nhất là không phân biệt hai từ này, nhưng chính chúng đã nói lên sự khác biệt giữa interface và abstract class. Bạn chỉ có thể thừa kế (extend) từ một class và chỉ có thể hiện thực (implement) các chức năng (interface) cho class của mình.

Theo cách ngắn gọn, quan hệ giữa một class khi thừa kế một abstract class được gọi là is-a, và một class khi hiện thực một interface được gọi là can-do (hoặc –able).

Hãy xem ví dụ sau, tôi có:

–          Interface: Barkable, Runable, Flyable, Swimable.

–          Abstract class Animal và các sub class: Bolt, AngryBird và Nemo.

–          Abstract class Machine và các sub class: McQueen, Siddeley.

OOP – Interface vs Abstract class
OOP – Interface vs Abstract class

Như bạn thấy, mặc dù cả McQueen và Bolt đều được hiện thực interface Runable, nhưng chúng hoàn toàn thuộc hai loại khác nhau. Và tất nhiên một class có thể can-do nhiều thứ, ví dụ như Bolt có thể chạy và “bow wow”.

Dùng Interface như một “bản thiết kế” của class?

Đây là một điều thường được dùng để trả lời cho hai câu hỏi:

–          Interface được dùng để làm gì?

–          Tại sao không thể định nghĩa phần thân cho các phương thức của interface.

Xét ở một mức độ nào đó điều này là hợp lý, nhưng như đã nói ở phần trên, nó chỉ được dùng để mô tả một “bản thiết kế” cho một chức năng của class. Nếu muốn tạo một bản thiết kế, hãy sử dụng abstract class. Một bản thiết kế tất nhiên sẽ có những thứ đã được dựng sẵn và có những thứ là abstract.

Một câu trả lời có thể lý giải phần nào câu hỏi thứ hai là việc cho phép định nghĩa thân phương thức trong các interface có thể khiến cho hiệu suất bị giảm sút. Nguyên nhân là việc tìm kiếm các phương thức sẽ diễn ra lâu hơn vì phải duyệt qua các interface, thay vì chỉ cần phải tìm trong class cha của nó.

OOP – Interface vs Abstract class
OOP – Interface vs Abstract class

Về công dụng của interface, xét ở mức ứng dụng, các interface có thể được hiểu như các plugin hoặc thư viện/phần mềm third-party. Việc hiện thực một interface cho class cũng giống như cài thêm plugin cho một phần mềm vậy.

Bảng so sánh

Cuối cùng, cũng nên liệt kê các điểm khác biệt giữa hai khái niệm này để bạn có thể sử dụng được khi cần thiết. Các điểm khác biệt này có thể khác nhau tùy vào ngôn ngữ mà bạn sử dụng. Vì vậy bạn chỉ cần nhớ các điểm căn bản sau:

InterfaceAbstract class
Multiple inheritanceMột class có thể hiện thực nhiều interface.(tạm coi là thừa kế)Không hỗ trợ đa thừa kế
Default implementationKhông thể định nghĩa code xử lý, chỉ có thể khai báo.Có thể định nghĩa thân phương thức, property.
Access ModifiersMọi phương thức, property đều mặc định là public.Có thể xác định modifier.
Adding functionalityMọi phương thức, property của interface cần được hiện thực trong class.Không cần thiết.
Fields and ConstantsKhông

Nguồn: tham khảo Internet