Wednesday, January 25, 2012

C# windowform Basic (4)

မအားလပ္ပါသျဖင့္ ေဒါင္းရန္လင့္ပါ တြဲေပးလိုက္ပါသည္။
http://www.mediafire.com/?2euzoawavq3vfuy
Post 4

ဆက္လက္၍...

Monday, January 9, 2012

C# windowform Basic (3)


ဒီတစ္ေခါက္ ေရးသားမယ့္ Project ကေတာ့ နည္းနည္းရႈပ္တယ္ေျပာရပါမယ္။ အသံုးျပဳမယ့္ အပိုင္းက႑ေတြအေနနဲ႔
(၁) Timer Control
(၂) Button Mouse Up / Mouse Down Event
(၃) TrackBar
(၄) Paint Event (Drawing Line, Circle, Curve( Array))
(၅) Paint on Bitmap
(၆) Static /Void Function/Control
(၇) ColorDialog
(၈) SaveFileDialog (save whole Form)
ရယ္လို႔ ေယဘုယ်ပါ၀င္ပါတယ္ခင္ဗ်။ နမူနာ အေနနဲ႔ ွSine Function ကို အေျခခံထားပါတယ္။ ေအာက္မွာ ေနာက္ဆံုးရလဒ္နမူနာကို ျပထားပါတယ္။ swf နဲ႔ သရုပ္ျပထားပါတယ္ခင္ဗ်။

Photobucket

(၁) Timer Control

Photobucket



အထက္ပါပံုအတိုင္း Toolbox ထဲကေန Timer ကို Drag ဆြဲယူ Form ေပၚထည့္လိုက္တာနဲ႔ ေအာက္မွာ timer1 ဆိုၿပီး ေပၚေနၿပီျဖစ္ပါတယ္။

Photobucket

timer1 ရဲ႕ Interval ဆိုတဲ့ သူေရတြက္ႏႈန္းဟာ default အားျဖင့္ 100 ms မီလီစကၠန္႔ျဖစ္ပါတယ္။ ၁ စကၠန္႔ႏူန္း သံုးခ်င္ရင္ေတာ့ 1000 ထည့္ေပါ့ဗ်ာ။
Timer ကို စေရတြက္ခ်င္ရင္ေတာ့ timer1.Enable=true; လို႔ သံုးေလ့ရွိၿပီး ရပ္ခ်င္ရင္ေတာ့ timer1.Enable=flase; ရယ္လို႔ သံုးေလ့ရွိပါတယ္။ ဒါက စအလုပ္လုပ္တာနဲ႔ ရပ္တာပဲရွိေသးတာပါ။ သူ႔ရဲ႕ ေရတြက္မႈတိုင္းမွာ ခိုင္းေစဖို႔ အတြက္ကေတာ့ သူ႔ Event ကိုသိမွာရမွာပါ။

Photobucket

Timer1 ကို Click လိုက္လို႔ျဖစ္ေစ Right Click ကေန Properties သြားလို႔ျဖစ္ေစ ေပၚလာမည့္ Box ေလးမွာ Properties နဲ႔ သူ႔ညာဘက္မွာ Event ဆိုတဲ့ Tab ေလးႏွစ္ခု ပါရွိပါတယ္။ Event ထဲမွာေတာ့ Timer အမ်ိဳးအစားအတြက္ Tick ဆိုတဲ့ Event ေလးပဲပါပါတယ္။ ( Tick ေနရာရဲ႕ေဘးမွာ နာမည္ျပင္ခ်င္တယ္ဆိုရင္ Event နာမည္ျပင္ႏိုင္မယ့္ေနရာေလးပါပါတယ္။) Tick ေနရာကေနပဲ Double click နဲ႔ ၀င္သြားတယ္ဆိုရင္ပဲ ေအာက္ပါအတိုင္း ကၽြန္ေတာ္တို႔ code ျဖည့္သြင္းႏိုင္မယ့္ အေနအထားကို ေရာက္ပါတယ္။

Photobucket

Timer ကိုေတာ့ ကၽြန္ေတာ့္အေနနဲ႔ 0 ကေန 359 ဒီဂရီမ်ားအျဖစ္ တိုးသြားလိုတာမို႔ အစပထမအားျဖင့္ ေရတြက္ခံကို သုညအျဖစ္ေပးထားလိုပါတယ္။ သုညကေန ၁ ၂ ၃ ၄ ဒီလို ေရသြားခ်င္တယ္ေပါ့ဗ်ာ။ ဒီေတာ့ ေရတြက္ခံကိန္းဟာ ဒႆမမပါတဲ့ ကိန္းျပည့္တစ္ခု ျဖစ္လိုတာေၾကာင့္ လြယ္လြယ္ကူကူပဲ int ကို ေရြးလိုက္ပါတယ္။
ဒီေနရာမွာ တစ္လက္စတည္း int အေၾကာင္းကိုပါ ထည့္ေျပာလိုက္ပါမယ္ခင္ဗ်။
int လို႔ ေရးလိုက္တဲ့ keyward ေလးဟာ Signed 32-bit integer ကို ကိုယ္စားျပဳပါတယ္။ 32 bit ဆိုတာကို ဆန္းစစ္ရင္ 1 bit မွာ 0 နဲ႔ 1 ဆိုတဲ့ ျဖစ္ႏိုင္ေျခႏွစ္ခုရွိၿပီး၊ 2 bit ဟာေတာ့ ၂ ပတ္လည္ 11,10,01,00 ဆိုတဲ့ ၄ မ်ိဳး ျဖစ္ႏိုင္ေျခရွိပါတယ္။ 3 bit ဟာ ၃ ပတ္လည္ 111,110,101,100,011,010,001,000 ဆိုတဲ့ ၈ မ်ိဳးျဖစ္ႏိုင္ေျခရွိတာေၾကာင့္၊ ေဖၚျမဴလာအားျဖင့္ 2^n ပံုစံရွိလို႔ 2^32=4294967296 ေနရာျဖစ္ႏိုင္ပါတယ္။ Signed ဆိုတာေၾကာင့္ အႏႈတ္ဘက္ျခမ္း အေပါင္းဘက္ျခမ္းနဲ႔ ထပ္ခြဲရင္ အႏႈတ္ဘက္ျခမ္းမွာ 2147483648 လံုး ရွိၿပီး အလယ္မွာ သုည၊ အေပါင္းဘက္ျခမ္းမွာ 2147483647 လံုးရွိေနပါတယ္။ ဒီေတာ့ကား int တန္ဖိုးအားျဖင့္ေရမယ္ဆိုရင္ သုညကစ ၁ စီေပါင္း ေရမယ္ဆိုရင္ေတာင္ သိန္း ၂ ေသာင္းေလာက္ ေရလို႔ရတာမို႔ လံုေလာက္ၿပီလို႔ ယူဆႏိုင္ပါတယ္။ ဒါမွ မေက်နပ္ေသးရင္ 64 bit ကိုလည္း သံုးႏိုင္ပါေသးတယ္ခင္ဗ်။
Timer ရဲ႕ သေဘာက ေပးထားတဲ့ ကာလႏႈန္းတစ္ခုအရ ၾကိမ္ဖန္မ်ားစြာ ေရသြားျခင္းပါ။ Programing Code အရေတာ့
private void timer1_Tick(object sender, EventArgs e) {} ပံုစံမွာ တြန္႔ကြင္းစဆံုးကို ထပ္ခါ ထပ္ခါ လုပ္မယ္လို႔ ဆိုလိုပါတယ္။ ဒီေတာ့ဗ်ာ ဒီကြင္းမစခင္မွာ int i=0; (သို႕) int i; လို႔ေပးၿပီး ကြင္းထဲမွာ i+1 လုပ္ရင္ ပထမအၾကိမ္ 0+1=1 ဒုတိယအၾကမ္လည္း 0+1=1 အၿမဲတမ္းၾကီး ၁ ပဲျဖစ္ေနမွာေပါ့ဗ်ာ။ ထပ္ခါထပ္ခါ ေပါင္းဖို႔ ++ ေလးသံုးမွျဖစ္မွာပါ။
(int i=0; သို႔မဟုတ္ int i; လို႔ ေရးလို႔ရတယ္ဆိုရျခင္းကေတာ့ default အားျဖင့္ 0 ေပးထားလို႔ ဒီေနရာမွာ ဘာသံုးသံုးရတာျဖစ္ပါတယ္။)
အကယ္၍သာ ကၽြန္ေတာ္တို႔ အေျဖကို label1 မွာ ေဖၚမယ္ Timer ကို ပံုေဖၚမယ္ဆိုရင္ေတာ့ ေအာက္ပါအတိုင္း ဖန္တီးႏိုင္ပါတယ္ခင္ဗ်။ (label1 ေလးကိုလည္း တည္ေဆာက္ခဲ့ဖို႔ မေမ့နဲ႔ဦးခင္ဗ်။)


int i;
private void timer1_Tick(object sender, EventArgs e)
{
label1.Text = (i++).ToString();
}


(၂) Button Mouse Up / Mouse Down Event
ဒီႏွစ္ခုကို စမ္းသံုးဖို႔ Button ေလးတစ္ခု ထည့္လိုက္ပါ။ Button ေလးရဲ႕ Events ေတြဟာ Timer တုန္းကလို တစ္ခုမကဘဲ အမ်ားၾကီးရွိေနတာကို ေအာက္ပါပံုအတိုင္း ေတြ႕ရပါလိမ့္မယ္ခင္ဗ်။

Photobucket

MouseDown ရဲ႕ အဓိပၸါယ္ကေတာ့ Button ေလးကို ဖိထားစဥ္ အေျခအေနကို ညႊန္းၿပီး၊ MouseUp ကေတာ့ ႏွိပ္ထားတာေလးက လႊတ္ထားစဥ္မွာလို႔ အဓိပၸါယ္ရပါတယ္။ ကၽြန္ေတာ္တို႔က Timer ကို ေရတြက္ဖို႔နဲ႔ label1 ကို အေျဖျပဖို႔ ေရးသားခဲ့ေပမယ့္ Timer စဖို႔ကိုေတာ့ မသတ္မွတ္ခဲ့ရေသးတာကိုးခင္ဗ်။
MouseDown ေဘးမွာ Double Click ခ်လိုက္တာနဲ႔ ကုဒ္ေပၚလာတာမွာ ေအာက္ပါအတိုင္း ျဖည့္ရိုက္လိုက္ပါခင္ဗ်။

       private void button1_MouseDown(object sender, MouseEventArgs e)
{
timer1.Enabled = true;
}


သေဘာက Mouse ဖိထားစဥ္မွာ timer1 အလုပ္လုပ္ပါလို႔ ဆိုလိုတာေပါ့ခင္ဗ်ာ။ Mouse လႊတ္ဖို႔ကိုလည္း MouseDown ေဘးကေန ၀င္ၿပီး ေအာက္ပါအတိုင္း ျပင္လိုက္ပါခင္ဗ်။


private void button1_MouseUp(object sender, MouseEventArgs e)
{
timer1.Enabled = false;
}



သေဘာကေတာ့ Mouse လႊတ္ေတာ့ Timer1 က Disable ေပါ့ဗ်ာ။ Debug လုပ္ၾကည့္မယ္ဆိုရင္ ေအာက္ပါအတိုင္း ျမင္ရပါမယ္ခင္ဗ်။ ႏွိပ္ထားရင္ ဂဏန္းေတြ ၾကီးလာၿပီး လႊတ္ထားရင္ ရပ္ေနပါလိမ့္မယ္ခင္ဗ်။

Photobucket

(၃) TrackBar
ဒီခါမွာေတာ့ Timer ေလးရဲ႕ အေႏွးအျမန္ကို ထိန္းဖို႔ TrackBar ေလးထည့္ၾကစို႔ဗ်ာ။ သူ႔ကို ဒီကယူပါတယ္။

Photobucket

သူ႔ရဲ႕ Properties မွာေတာ့ အဓိကအားျဖင့္ minimum တန္ဖိုး ,maximum တန္ဖိုး , TickFrequency တိုးသြားမယ့္ႏႈန္း နဲ႔ Value default ေပးထားမွာေတြ ပါ၀င္ပါတယ္။ ေအာက္က ပံုေလးအတိုင္း ၁ ကေန ၁၀၀၀ ၾကား ၁ စီအတိုးအေလ်ာ့လုပ္ၿပီး ကနဦး ၂၅၀ တန္ဖိုး ေပးထားလိုက္ပါတယ္ခင္ဗ်။

Photobucket

သူ႔ကိုရဲ႕ အဓိက Output ကေတာ့ trackBar1.Value ျဖစ္ပါတယ္။ int အမ်ိဳးအစားျဖစ္ပါတယ္။ ထို႔အတူ ကၽြန္ေတာ္တို႔ သံုးမယ့္ Timer ရဲ႕ Interval ကလည္း int ျဖစ္တာေၾကာင့္ သူတို႔ၾကားမွာ ဘာမွ ေျပာင္းလဲစရာမရွိဘဲ ေအာက္ပါအတိုင္း တန္းသံုးႏိုင္ပါတယ္။
timer1.Interval = trackBar1.Value;
timer1 ရဲ႕ Interval ဟာ ကနဦးက ၁၀၀ ထားခဲ့ေပမယ့္ ဒီ code ေၾကာင္းေလး အသက္၀င္ရင္ေတာ့ ၂၅၀ နဲ႔ လႈပ္ရွားမွာျဖစ္ပါတယ္။ ဘယ္နားမွာ ထည့္မလဲလည္း ေတြးစရာပါ။ အနည္းဆံုးေတာ့ Timer လုပ္ငန္းစဥ္ မစခင္မွာျဖစ္သင့္ပါတယ္။ ဒီေတာ့ Timer ရဲ႕ အဓိက လုပ္ငန္းစဥ္အျဖစ္သံုးထားတဲ့ i++ ေလးမတိုင္မီ ထည့္လိုက္ရင္ပဲ အဆင္ေျပၿပီျဖစ္ပါတယ္။ ဒါ့ေၾကာင့္ timer အတြက္ကုဒ္ေနရာမွာ ေအာက္ပါအတိုင္းျဖစ္ေနသင့္ပါၿပီခင္ဗ်။

int i;
private void timer1_Tick(object sender, EventArgs e)
{
timer1.Interval = trackBar1.Value;
label1.Text = (i++).ToString();
}


အခုခ်ိန္မွာ Debug လုပ္ရင္း TrackBar ကို ၀ဲဘက္တိုးထားရင္ ပိုျမန္ျမန္ ေရတြက္ၿပီး၊ ယာဘက္တိုးထားရင္ေတာ့ ေႏွးေႏွး ေရရင္း အလုပ္လုပ္ေနတာ ေတြ႔ႏိုင္ၿပီျဖစ္ပါတယ္။

ဒါေပမယ့္လည္း ဘယ္ေလာက္ speed နဲ႔ သြားေနမွန္းမသိဘူးျဖစ္ေနပါတယ္။ အဲဒါေလးပါျပခ်င္တယ္ဆိုရင္ေတာ့ နည္းနည္းထပ္ ႏႈိက္ၾကတာေပါ့ဗ်ာ။ trackBar ေလး ေနရာေရႊ႕တိုင္း ဘယ္ေလာက္ frequency သံုးေနလဲဆိုတာျပဖို႔ trackBar ေလးရဲ႕ Scoll ဆိုတဲ့ Event ကို သံုးရပါတယ္ခင္ဗ်။
Photobucket
Double click ခ်လိုက္မယ္ဆိုရင္ ေအာက္ပါအတိုင္း ကုဒ္ထည့္ခိုင္းႏိုင္ဖို႔ ေစာင့္ေနတယ္ခင္ဗ်။ Scoll ေလးေရႊတိုင္း ဘာလုပ္ေပးရမလဲေမးတာေပါ့ဗ်ာ။


private void trackBar1_Scroll(object sender, EventArgs e)
{

}

label2 ေလး အသစ္လုပ္ၿပီး ေအာက္ပါအတိုင္း တစ္ေၾကာင္းျဖည့္လိုက္ပါခင္ဗ်။

private void trackBar1_Scroll(object sender, EventArgs e)
{
label2.Text = (trackBar1.Value).ToString()+" ms";
}


TrackBar1.Value ကို String ေျပာင္းျပတယ္ေပါ့ဗ်ာ ေနာက္ကေန + “ ms” ဆိုတာေလးကေတာ့ ပံုေသ ms ေလးေနာက္ကပါခ်င္တာပါ။ (ဒီေနရာမွာ .ToString() မပါလဲ ေကာင္းေကာင္းျပေပးပါတယ္။ အေျခခံက်ေစခ်င္လို႔သာ ထည့္ေပးတာျဖစ္ပါတယ္ခင္ဗ်။) အခုအခ်ိန္မွာေတာ့ ေအာက္ပါအတိုင္း အလုပ္လုပ္ပါေတာ့တယ္ခင္ဗ်ာ။

Photobucket

Form1.cs မ်က္ႏွာစာက ကုတ္မ်ားကို စုျပရရင္ ေအာက္ပါအတိုင္းျဖစ္ပါတယ္။


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

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

int i;
private void timer1_Tick(object sender, EventArgs e)
{
label1.Text = (i++).ToString();
timer1.Interval = trackBar1.Value;
}

private void button1_MouseDown(object sender, MouseEventArgs e)
{
timer1.Enabled = true;
}

private void button1_MouseUp(object sender, MouseEventArgs e)
{
timer1.Enabled = false;
}

private void trackBar1_Scroll(object sender, EventArgs e)
{
label2.Text = (trackBar1.Value).ToString()+" ms";
}


}
}


သို႔ေသာ္ အထက္ပါအတိုင္း ေကာ္ပီကူးထည့္ Run လို႔ မျဖစ္ႏိုင္ပါ။ Designer side မွာ event အလိုက္ ေၾကညာမႈမ်ား လိုေနလို႔ျဖစ္ပါတယ္ခင္ဗ်။
ျပဳလုပ္ပံု အဆင့္ဆင့္ကို swf ေလးနဲ႔ ျပထားပါတယ္ခင္ဗ်။

ဆက္လက္ေရးသားပါဦးမည္။
ဆႏၵမြန္ျဖင့္
ကိုပခန္း
PDF Download
C#WF(31)

ဆက္လက္၍...

Friday, January 6, 2012

C# windowform Basic (2)


Visual C#

Visual C# က Visual Studio ထဲက အခြဲတစ္ခုေပါ့ခင္ဗ်ာ။ Visual Studio မွာေတာ့ Visual Basic, Visual C++, Visual C#, and Visual Web Developer ေတြစုေပါင္းထားတာေပါ့ခင္ဗ်ာ။ ကၽြန္ေတာ့္မွာရွိတဲ့ Microsoft.Visual.Studio.2008.Professional က 3.31GB ဆိုဒ္ ရွိပါတယ္။

http://www.microsoft.com/visualstudio/en-us/products/2010-editions/express မွာေတာ့ Visual Studio 2010 Express All-in-One ISO က 693MB ပဲရွိပါတယ္။ အဲဒီထဲက VCSExpress ဆိုတဲ့ ဖိုင္ကိုပဲ ယူရင္ ကၽြန္ေတာ္တို႔သံုးမယ့္ C# အတြက္ လံုေလာက္ၿပီလို႔ ဆိုရမွာျဖစ္ပါတယ္။ သူက 397MB ရွိပါတယ္။

ေဒါင္းလုတ္လုပ္ရန္

(၁) အင္တာနက္တပ္ဆင္ထားသူမ်ားအတြက္ကေတာ့ ေအာက္ကလင့္မွာ Visual C# ကိုေဒါင္းႏိုင္ပါတယ္ခင္ဗ်။ Install လုပ္ရင္းလည္း ထပ္ေဒါင္းပါေသးတယ္။ http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-csharp-express

(၂) အင္တာနက္ ခ်ိတ္ဆက္မထားတဲ့ စက္တစ္လံုးမွာ တပ္ဆင္ဖို႔ကေတာ့ All-in-One ISO ထဲက ယူၿပီး Install လုပ္ရမွာရယ္ ေဒါင္းရလြယ္ကူဖို႔ရယ္ ရည္ရြယ္ၿပီး 50 MB ၀န္းက်င္စီခြဲၿပီး ကၽြန္ေတာ္ Upload တင္ေပးထားပါတယ္။ ေဒါင္းဖို႔လင့္ေတြက ေအာက္မွာပါခင္ဗ်။

http://www.mediafire.com/?c9q16n6c6csczql
http://www.mediafire.com/?893c8c07x89kbn2
http://www.mediafire.com/?vr55k7yfkfrdrgp
http://www.mediafire.com/?znhtsivyjj40d9a
http://www.mediafire.com/?c5zzg05a2vayj6w
http://www.mediafire.com/?2402s0enoccng4s
http://www.mediafire.com/?puqniqppqma4959
http://www.mediafire.com/?eaxzewo8i46b9dx



Microsoft Visual C# 2010

အဖြင့္မ်က္ႏွာစာေလးက ေအာက္ပါပံုအတိုင္းျဖစ္ပါတယ္။


ကၽြန္ေတာ္တို႔က Windowform application ကိုသံုးမွာဆိုေတာ့ New Project ကိုကလစ္ၿပီး Window Forms Application ကိုေရြးလိုက္တဲ့ အခါမွာ ေအာက္ပါပံုအတိုင္း Project တစ္ခုရလာပါတယ္ခင္ဗ်။


သူ႔မွာ ဘာေတြပါလဲလို႔ အၾကမ္းဖ်ဥ္းၾကည့္မယ္ဆိုရင္ Program.cs, Form1.cs, Form1.Designer.cs, References နဲ႔ Properties ဆိုၿပီး တြဲလ်က္ပါပါတယ္ခင္ဗ်။

ဒီလိုေတြကြဲေနတာဟာ စိတ္ရႈပ္စရာလို႔ ထင္စရာရွိေပမယ့္ တကယ္ေတာ့ ေရးရလြယ္ကူေအာင္ ဖြဲ႕စည္းထားတာဆိုတာ ဖတ္ရင္းသိလာမွာပါခင္ဗ်။ ယခင္ပိုစ့္မွာတုန္းက ေရးခဲ့တဲ့ ကုဒ္နဲ႔ယွဥ္ၾကည့္ၾကစို႔ဗ်ာ။
Part1 မွာ notepad ထဲထည့္သံုးခဲ့တဲ့ System. တို႔ System.Drawing. တို႔ System.Windowws.Form. တို႔ဟာ Visual C# မွာေတာ့ References ထဲမွာ ခ်ိတ္ၿပီးသား ျဖစ္သြားပါတယ္။ အဲဒီအတြက္ ကုဒ္ေရးရာမွာ ဒီစာလံုးေတြ ခ်န္ခဲ့လို႔ရသြားပါေတာ့တယ္ခင္ဗ်။ (ေနာင္မွာ လိုအပ္သလို စက္ထဲကသာမက အြန္လုိင္းကေနလည္း References ထဲမွာ ခ်ိတ္သံုးသြားၾကရဦးမွာျဖစ္ပါတယ္။)

Program.cs, Form1.cs နဲ႔ Form1.Designer.cs သံုးခုကြဲ ေနတာကလည္း အျမင္အရသာျဖစ္ပါတယ္။ ကြဲေနပံုကို (အသံုးျပဳတဲ့ code ေတြကိုပဲေရြးၿပီး) ျပန္ဆက္ရမယ္ဆိုရင္
Program.cs ထဲမွာ ေအာက္ပါအတိုင္းပါ၀င္ပါတယ္။

Form1.cs ထဲမွာ ေအာက္ပါအတိုင္းပါ၀င္ပါတယ္။

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}

Form1.Designer.cs ထဲမွာ ေအာက္ပါအတိုင္းပါ၀င္ပါတယ္။

namespace WindowsFormsApplication1
{
partial class Form1
{
private System.ComponentModel.IContainer components = null;

protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}

#region Windows Form Designer generated code // expansible

private void InitializeComponent()
{
this.SuspendLayout();
// Form1
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(292, 271);
this.Name = "Form1";
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
this.ResumeLayout(false);

}

#endregion
}
}


Form1.cs ထဲမွာ ေအာက္ပါအတိုင္းပိုင္၀င္ပါတယ္။
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

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

private void Form1_Load(object sender, EventArgs e)
{

}
}
}


အားလံုးဟာ namespace WindowsFormsApplication1 {} ဆိုတဲ့ ကြင္းေတြနဲ႔ ခ်ိတ္ဆက္ထားၿပီး အားလံုးကို ျပန္စုလိုက္မယ္ဆိုရင္


using System;
using

namespace WindowsFormsApplication1
{
partial class Form1
{
//Code from Form1.Designer.cs
}

public partial class Form1 : Form
{
//Code from Form1.cs
}

static class Program
{
//Code from Program.cs
}

}


အဲဒီ ၃ ပိုင္းမွာ Program.cs ပိုင္းက (Form အမ်ားၾကီးေရးထားရင္ တစ္ခုခ်င္း Run ခ်င္ရင္ ျပင္သံုးတာက လြဲရင္) မသံုးျဖစ္တာ မ်ားပါတယ္။ Form1.Designer.cs ကလည္း မ်က္ျမင္ Tool ေလးတစ္ခု ထည့္လိုက္တိုင္း သူ႔အလိုလို Code ေတြထည့္ Design လုပ္သြားတဲ့အပိုင္းပါ။ (ပံုမွန္အားျဖင့္ သံုးဖို႔မလိုေပမယ့္ မၾကာခဏေတာ့ ၀င္ျပင္ရေလ့ရွိပါတယ္။) Form1.cs ကေတာ့ ကၽြန္ေတာ္တို႔ အမ်ားဆံုး ေရးထည့္ရမယ့္ အပိုင္းျဖစ္ပါတယ္။
အြန္လိုင္းမွာ ကုဒ္တစ္ခုခုလိုခ်င္လို႔ရွာၿပီးဆိုရင္ေတာ့ ဒီ ၃ ပိုင္းလံုးခြဲၿပီး ေတြ႔ရမွာမဟုတ္ပါဘူးခင္ဗ်။ အားလံုးကို စုေရးထားတဲ့ ပံုနဲ႔ေတြ႔ရမွာပါ။ အဲလိုစမ္းဖို႔ဆိုရင္ Form1.Designer.cs နဲ႔ Program.cs တို႔ကို Delete လုပ္ပစ္ၿပီး Form1.cs မွာ ကူးထည့္ Run လို႔ရပါတယ္ခင္ဗ်။

စမ္းၾကည့္ခ်င္ရင္ေတာ့ Form1.Designer.cs, Program.cs တို႔ထဲက code ေတြကို Form1.cs မွာ ကူးထည့္ဗ်ာ။ အားလံုးစံုမွ code ေတြ ကူးၿပီး Form1.cs, Program.cs နဲ႔ Form1.Designer.cs တို႔ကို Delete လုပ္ဗ်ာ။ WindowFormApplication1 ေပၚ Right Click ခ်ၿပီး Add ကိုေရြးဗ်ာ။ New Item ေခၚၿပီး Code File တစ္ခု Add လိုက္ဗ်ာ။ ေစာနက code ကို ကူးထည့္ၿပီး Run (F5 သို႔မဟုတ္ Debug>StartDebugging) လိုက္ရင္လည္း ခြဲထားစဥ္ကလို အတူတူပဲ အလုပ္လုပ္ပါတယ္။ မသိမ္းဘဲနဲ႔ အသစ္ျပန္ဖြင့္ၾကတာေပါ့ဗ်ာ။(ေအာက္မွာ နမူနာ swf ဖိုင္ေလးျပထားပါတယ္ခင္ဗ်။)




(၁) New Form & Save Form

New Project ေခၚၿပီး Form1.cs ကို ကလစ္လိုက္မယ္ဆိုရင္ ၀ဲဘက္အစြန္မွာ Toolbox ဆိုတာေလးရွိေနပါတယ္။ သူ႔အေပၚကို Mouse ေရာက္သြားတာနဲ႔ ေအာက္ပါပံုအတိုင္း All Windows Forms ဆိုၿပီး ေပၚေနပါေတာ့တယ္။ AutoHide ေလးကို ကစားၿပီး ေဘးမွာ အၿမဲေပၚေနေအာင္လည္း စီမံထားလို႔ရပါတယ္။ (ဒီ Forms ေလးေတြဟာ ေယဘုယ်သံုးျဖစ္ၿပီး ေနာက္ပိုင္းမွာ သူတို႔လို Form ေလးေတြလည္း ဖန္တီးလို႔ရႏိုင္ပါေသးတယ္။ ဥပမာ label ေအာက္မွာ Gradient Color Background ထည့္တာမ်ိဳးေပါ့ခင္ဗ်ာ။ သူ႔မူလ label မွာ ေနာက္ခံကို Gradient မပါတာကိုးဗ်။)


ေအာက္နားေလးမွာ TextBox ေလးရွိတယ္ခင္ဗ်။ သူ႔အေဖၚဖိဆြဲယူလာလိုက္တာနဲ႔ Form1 မ်က္ႏွာျပင္မွာ ထည့္သြင္းၿပီးသားျဖစ္သြားပါေတာ့တယ္။


ေနာက္တစ္ခါ TextBox တစ္ခု၊ Button တစ္ခု နဲ႔ label တစ္ခုတို႔ကို ေအာက္ပါပံုအတိုင္း တပ္ဆင္လိုက္ပါခင္ဗ်။


TextBox1 ကို ကလစ္လိုက္တာနဲ႔ ညာဘက္ေအာက္နားမွာ သူ႔ရဲ႕ Properties ေတြေပၚလာပါေတာ့တယ္။ (Right Click ေပးၿပီး Properties ေရြးရင္လည္းရတယ္ခင္ဗ်။) Text ကိုေတာ့ 10 လို႔ ေပးလိုက္တာေပါ့ဗ်ာ။


TextBox2 က Text ကို 20 ေပးလိုက္ပါ။ button1 ရဲ႕ Text ကိုလည္း Sum လို႔ေရးလိုက္ၿပီး label1 ရဲ႕ Text ကိုလည္း ans=30 လို႔ (မတြက္ေသးခင္ အမွန္ျမင္ေနရေအာင္ အေျဖေရးထားတဲ့သေဘာအေနနဲ႔) ေပးလိုက္ပါခင္ဗ်။ ေအာက္ပါပံုအတိုင္းေပါ့ဗ်ာ။


Text ေတြကို ဘယ္လိုပဲ ေရးျပ ေဖၚျပခဲ့ေပမယ့္ ကၽြန္ေတာ္တို႔က သူ႔မူရင္း နာမည္ေတြျဖစ္တဲ့ textBox1, textBox2,button1,label1 တို႔ကို မွတ္ထားရပါမယ္ခင္ဗ်။ (မ်ားလာရင္ေတာ့ မွတ္လို႔ေကာင္းမယ့္နာမည္ေလးေတြ ေပးရမွာေပါ့ဗ်ာ။)
Sum လို႔ ေဖၚျပထားတဲ့ button1 ေပၚ DoubleClick ေခါက္ခ်လိုက္ပါခင္ဗ်။ ေအာက္ပါပံုအတိုင္း Click လိုက္ရင္ ဘာလုပ္ေပးရမလဲဆိုတာ အသင့္ေစာင့္စားေနတယ္ခင္ဗ်။

Photobucket

(ဒီေနရာမွာ ကလစ္တစ္ခုထဲတင္မကပါဘူး အဲဒီ button1 ကို ဖိထားစဥ္မွာ ဘာလုပ္ပါ၊ လႊတ္လိုက္ခ်ိန္မွာ ဘာလုပ္ပါ၊ mouse ျဖတ္သြားခ်ိန္ဘာလုပ္ပါ၊ စသည္ျဖင့္ အမ်ားၾကီးခိုင္းလို႔ရပါေသးတယ္။ ေနာက္ပိုင္းမွာ နမူနာေလးေတြလုပ္ရင္း ျဖည့္သြင္းေလ့က်င့္သြားၾကတာေပါ့ခင္ဗ်ာ။)
Code ျဖည့္သြင္းၾကစို႔ဗ်ာ။ label1 မွာ အေျဖထုတ္မွာမို႔ l လို႔ စရိုက္တယ္ဆိုရင္ပဲ ေအာက္ပါအတိုင္း Label ဆိုတဲ့ Class ရယ္ (ကၽြန္ေတာ္တို႔ Form1 ေအာက္မွာ သတ္မွတ္ခဲ့တဲ့ label1 ဆိုတဲ့ Fields ေလးတစ္ခုရွိေနပါတယ္။ အထက္ေအာက္ေရြ႕ၿပီးေရြးေပးလိုက္ယံုပါပဲခင္ဗ်။

Photobucket

မွတ္ခ်က္။ ။ visual C# 2010 မွာ မပါလာတဲ့ Feature တစ္ခုက ClassDiagram ပဲျဖစ္ပါတယ္။ VisualStudio 2008 ကေန ျပန္ယူျပရရင္ ေအာက္ပါအတိုင္း ကၽြန္ေတာ္တို႔ Project က တည္ေဆာက္ထားပါတယ္။ (Form1.cs မွာ အကုန္စုျပထားတာျဖစ္ပါတယ္။) ဆိုလိုရင္းကေတာ့ အေပၚကပံုက Label ဆိုတာ Class ပန္းေရာင္ေလးနဲ႔ အျပာေရာင္ေလး စုျပထားပါတယ္။ Class ထဲမွာ ပန္းေရာင္ဆိုတဲ့ Method ေလးနဲ႔ အျပာေရာင္ Field ေလးပါတယ္လို႔ ေဖၚျပထားတာပါခင္ဗ်။ ေနာက္ပိုင္းမွာ ေခါင္းစားစရာေတြ ျဖစ္လာမယ့္ဟာေတြေပါ့ဗ်ာ။ ေသာ့ေခ်ာင္းေလးေတြ၊ ေသာ့ခေလာက္ေလးေတြဟာလည္း သူ႔အဓိပၸါယ္သူ႔အလုပ္နဲ႔သူဗ်။ ေနာက္ပို႔စ္မ်ားမွာ ေဖၚျပေပးပါ့မယ္ခင္ဗ်ာ။)

Photobucket

ဆက္ေရးၾကစို႔ဗ်ာ။ label1 ကိုေရးၿပီး . ခ်လိုက္တာနဲ႔ ေအာက္ပါပံုအတိုင္း သူနဲ႔ဆက္စပ္ေနတဲ့ Method ေတြ၊ event ေတြ Properties ေတြေပၚလာပါတယ္ခင္ဗ်။ ေလာေလာဆယ္ေတာ့ ကၽြန္ေတာ္တို႔ သူ႔ရဲ႕ေဖၚျပမယ့္ Text ကို ထိန္းခ်ဳပ္ခ်င္တာမို႔ t ကိုရိုက္ၿပီး Text ကိုေရြးလိုက္ပါမယ္ခင္ဗ်။ Text ဟာ String ျဖစ္ပါတယ္ဆိုတာကိုလည္း ျပထားပါေသးတယ္။ ဒီေတာ့ကား ကၽြန္ေတာ္တို႔ Text ေနရာကို အစားသြင္းရင္ String မွ ျဖစ္မယ္ဆိုတာကို သတိေပးလိုက္တာပဲျဖစ္ပါတယ္။ String ဆိုတာ ျမန္မာလို ၾကိဳးေပါ့ေနာ္ အကၡရာ အစဥ္အတန္းေလးေပါ့ဗ်ာ။ သူ႔ထဲမွာ ကီးဘုတ္က ရိုက္လို႔ရတာေတြ အကုန္ပါတာေပါ့ေနာ္။ ဒါေပမယ့္ ေရးမယ့္ ပရိုဂရမ္က ေပါင္းတာႏႈတ္တာ ဆိုေတာ့ ဂဏန္းေတြမွျဖစ္မွာေလ။ ဒီေတာ့ Input ျဖစ္တဲ့ အ၀င္က အကၡရာေတြနဲ႔လာမွာ ဒါကို ဂဏန္းေျပာင္းရမယ္၊ ဂဏန္းေျပာင္းၿပီး ေပါင္းႏႈတ္ရမယ္၊ ရလာတဲ့အေျဖကို ျပန္ျပေတာ့လည္း အကၡရာပဲျဖစ္ရမယ္။

Photobucket

textBox1 က ရိုက္မယ့္စာေတြကို ဂဏန္းေျပာင္းေတာ့ (ေလာေလာဆယ္ ရႈပ္ေနမွာစိုးလို႔ type ေတြအေၾကာင္း ခ်န္လွပ္ထားၿပီး double တစ္ခုကိုသာ ေရြးသံုးမွာမို႔ Convert.ToDouble(textBox1.Text) ဆိုတာေလးကိုသံုးပါမယ္။
textBox2 အတြက္ကိုလည္း Convert.ToDouble(textBox2.Text) ဆိုတာေလးကို သံုးပါမယ္။ သူတို႔ႏွစ္ခုကို ေပါင္းလိုက္ရင္ေတာ့ Double ခ်င္းေပါင္းလို႔ Double type ဂဏန္းတစ္ခုပဲရလာပါမယ္။
(Convert.ToDouble(textBox1.Text)+ Convert.ToDouble(textBox2.Text)) ရလာပါတယ္။

အဲဒီတန္ဖိုးကို label1.Text ထဲကို ထည့္ျပဖို႔ အကၡရာ ျပန္ျဖစ္ရပါမယ္။
Convert.ToString((Convert.ToDouble(textBox1.Text)+ Convert.ToDouble(textBox2.Text)))
လို႔ေျပာင္းလိုက္လည္း ရသလို
(Convert.ToDouble(textBox1.Text)+ Convert.ToDouble(textBox2.Text)).ToString()
လို႔ေျပာလည္းရပါတယ္။ အဆံုးမွာ ; ထည့္ပိတ္လိုက္တာနဲ႔ ရပါၿပီခင္ဗ်။
(ဒီေနရာမွာ Convert.ToDouble(textBox1.Text) အစား (textBox1.Text).ToDouble() လို႔ သံုးလို႔မရပါ။ .ToString() သာလွ်င္ Convert အမ်ိဳးအစားထဲမွာ ၂ မ်ိဳးသံုးလို႔ ရတာျဖစ္ပါတယ္။)

Photobucket

ကုဒ္ေတြျဖည့္ၿပီးသြားရင္ေတာ့ ေအာက္ပါပံုအတိုင္း RightClick ေထာက္ၿပီး Build လုပ္လိုက္ပါခင္ဗ်။

Photobucket

Run ဖို႔ကေတာ့ ေလာေလာဆယ္ ေအာက္ပါပံုအတိုင္း Run ပါ။ (ေနာက္ပိုင္းတစ္ေၾကာင္းခ်င္းစစ္ဖို႔လိုတဲ့အခါ ေနရာသတ္မွတ္ထားၿပီးသားအေပၚမွာ ေက်ာ္ၿပီး မရမက Run ခ်င္ရင္ေတာ့ Control+F5 နဲ႔ Run ရတတ္ပါတယ္ခင္ဗ်။)
သိမ္းဖို႔ကေတာ့ File>Save All ကေန နာမည္ေပးသိမ္းရမွာျဖစ္ပါတယ္။ C:\Documents and Settings\ZZ\my documents\visual studio 2010\Projects ကေတာ့ default location ျဖစ္ပါတယ္။ (Save All နဲ႔ မသိမ္းရင္ ျပင္သမွ် ေနရာတိုင္းကို မသိမ္းႏိုင္ဘဲ လက္ရွိ Form ကိုသာ သိမ္းသြားလို႔ ေနာင္တစ္ခ်ိန္ျပန္ဖြင့္ error ရတတ္လို႔ပါခင္ဗ်။)

သိမ္းၿပီးရင္ေတာ့ Visual C# ကို ပိတ္လိုက္ၿပီး သိမ္းခဲ့တဲ့ေနရာကိုသြားမယ္ဆိုရင္ေတာ့ C:\Documents and Settings\ZZ\My Documents\Visual Studio 2010\Projects\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug ထဲမွာေတာ့ ေအာက္ပါအတိုင္း WindowsFormsApplication1 နာမည္နဲ႔ exe ရွိေနပါတယ္ခင္ဗ်။

Photobucket

သူ႔ကို ဘယ္ေနရာသယ္သြားသြား .Net Framework ရွိတဲ့ စက္မွန္သမွ် Run ႏိုင္ၿပီျဖစ္ပါတယ္။ ေအာက္မွာ swf ဖိုင္နဲ႔ ျပထားပါတယ္ခင္ဗ်။




(၂) Open Form & Repair
New Project မဟုတ္ဘဲ Open Project ေရြးကာ နဂို ကၽြန္ေတာ္တို႔ သိမ္းခဲ့တဲ့ Form ကို ျပန္ဖြင့္လိုက္ပါမယ္။ ေအာက္ပါပံုေလးနဲ႔ Project ကိုေပါ့ဗ်ာ။

Photobucket

textBox1 အတြက္ design လုပ္ထားတဲ့ Default Setting ကေတာ့ ေအာက္ပါပံုအတိုင္းျဖစ္ပါတယ္ခင္ဗ်။

Photobucket


ေအာက္ပါပံုေလးအတိုင္း အတုယူၿပီး စားလံုး အေရာင္ျဖစ္တဲ့ ForeColor ကိုေျပာင္းလိုက္ပါ။ ေနာက္ BackColor ကိုပါေျပာင္းလိုက္ပါခင္ဗ်။

Photobucket


ဒီအခ်ိန္မွာ Designer.cs ဘက္ကို သြားၾကည့္မယ္ဆိုရင္ေတာ့ ေအာက္ပါပံုအတိုင္း code ၂ ေၾကာင္းတိုးေနၿပီျဖစ္ပါတယ္ခင္ဗ်။

Photobucket

Font ေတြဘာေတြပါ ျပင္ခ်င္တာျပင္လိုက္မယ္ဆိုရင္ေတာ့ ေအာက္ပါပံုေလးအတိုင္း Run ရင္ ျမင္ရပါလိမ့္မယ္ခင္ဗ်။

Photobucket

နမူနာ swf ေလးကိုလည္း တင္ေပးလိုက္ပါတယ္ခင္ဗ်။




ေနာက္ပိုစ့္မ်ားမွာေတာ့ Event ေတြအေၾကာင္း အရင္ စူးစမ္းၾကတာေပါ့ဗ်ာ။
C#WF(2)
ဆႏၵမြန္ျဖင့္
ကိုပခန္း
6 Jan 2012

ဆက္လက္၍...

Thursday, January 5, 2012

C# windowform Basic (1)



မဂၤလာပါခင္ဗ်ာ

ကၽြန္ေတာ္က အီလက္ထေရာနစ္နဲ႔ ဘြဲ႕ရထားၿပီး ေက်ာင္းဆက္တက္မိရာက IT ဌာနကိုေရာက္ၿပီး ေက်ာင္းသင္ခန္းစာမ်ားအရ pascal, c, c++, SQL, c# စတဲ့ Programming နဲ႔ပတ္သတ္တာေတြကို အၾကမ္းအားျဖင့္ သင္ယူခဲ့ရပါတယ္ခင္ဗ်ာ။ C# windowform application အသံုးခ်ပံုအက်ဥ္းေလာက္ သိရတယ္ဆိုရင္ပဲ အလြန္သေဘာက်မိရာက အဲဒီအပိုင္းနဲ႔ပတ္သတ္လို႔ ဟိုတစဒီတစလိုက္ဖတ္ျဖစ္ခဲ့ပါတယ္ခင္ဗ်။ ဆိုလိုရင္းကေတာ့ ကၽြန္ေတာ္ဟာ IT သမားစစ္စစ္တစ္ေယာက္မဟုတ္ေၾကာင္းနဲ႔ တတ္ကၽြမ္းမႈဟာလည္း ေလ့လာခါစ ကၾကီးခေခြးအဆင့္သာ ရွိေၾကာင္းစာဖတ္သူတို႔ သိေစခ်င္တာပါခင္ဗ်။

တစ္ကယ္ေတာ့ Programming Languages ပို႔ခ်ခ်က္မ်ားက ကၽြန္ေတာ္တို႔လက္တစ္ကမ္းမွာ ရွၾကတာပါ။ သို႔ေသာ္ မဖတ္ျဖစ္ၾကသူမ်ားပါတယ္ခင္ဗ်။ ကၽြန္ေတာ္လည္း ဒီလိုပဲ မဖတ္ျဖစ္ခဲ့ပါဘူးခင္ဗ်။ ကၽြန္ေတာ့္စိတ္နဲ႔ႏႈိုင္းေျပာရရင္ေတာ့ ဖတ္သမွ်မွတ္သမွ်ဟာ ဘာေတြျဖစ္ေအာင္လုပ္ေပးႏိုင္မယ္ဆိုတာမ်ိဳး ေသခ်ာမသိလို႔ျဖစ္ပါတယ္ခင္ဗ်။ တကၠသိုလ္ေရာက္စကလည္း မိုင္နာအျဖစ္သင္ရတဲ့ Programming သဘာ၀ဟာလည္း ေပါင္းႏႈတ္ေျမာက္စား loop ပတ္မယ္ input output ထုတ္မယ္တြက္မယ္ ဒီေလာက္ပဲရွိခဲ့တာကိုးခင္ဗ်။ ဂရပ္ဖ္တစ္ခုဆြဲဖို႔ ဖိုင္တစ္ခုသိမ္းဖို႔ ဆြဲယူဖို႔စတဲ့အရာေတြ ခိုင္းခ်င္ရင္ အေတာ္ပဲ ေခါင္းရႈပ္ခဲ့ရပါတယ္။ GUI (graphical user interface) ပိုင္းအားနည္းၾကမယ္လို႔ထင္တယ္ခင္ဗ်။

C# ကို စတင္ထိေတြတဲ့အခါမွာေတာ့ Graphic ေတြ ဆြဲရာမွာလည္း လြယ္လာတယ္။ ColorDialog အျပင္ OpenFileDialog SaveFileDialog ေတြနဲ႔အတူ သိမ္းရ ဖြင့္ရဆြဲယူသံုးရတာေလးေတြ windowform ေလးေတြ ဖန္တီးရတာ ေပ်ာ္လာတယ္။ Public Private class object ဆိုတာေတြကလည္း စာလိုဖတ္ရင္သာ ရႈတ္ေနၿပီး တကယ္တမ္းေတာ့ ေရးေနရင္းကေန အဆင္မေျပတာျပင္ရင္း ေရးေရးသိလာတယ္ခင္ဗ်။ Code မ်ားမ်ားစားစား မွတ္စရာမလိုပဲ VisualStudio အကူအညီနဲ႔ ေကာက္ေၾကာင္းေလးေတြ ဆက္ရင္း code ေတြ အစေဖၚမိတတ္လာရာကေန Programming ဟာ သိပ္လည္းစိတ္ညစ္စရာ မေကာင္းပါလားသိလာတယ္ခင္ဗ်။
ေက်ာင္းသားတစ္ေယာက္ေနရာကေန ကိုယ္ခ်င္းစားရင္း အလြယ္ဆံုးဆိုတဲ့ နမူနာေလးကေနပဲ နည္းနည္းခ်င္း တိုးၿပီးမွတ္သြားခ်င္တာမ်ိဳးလည္း ျဖစ္လာပါတယ္။ အစဆိုတာကလည္း hello world ကေနေတာ့လည္း မစခ်င္ျပန္ဘူးခင္ဗ်။ စာအုပ္ထူထူၾကီး မ်က္ႏွာမ်ားမ်ားၾကီးျမင္ရင္ေတာ့ တန္းငိုက္ျမည္းေတာ့တာပဲဗ်ိဳး။ Online က သင္ၾကားပံုတစ္ခ်ိဳ႕ကိုလည္း ေလ့လာရင္း C# စာအုပ္ထူၾကီးေတြထဲက ျဖတ္ထုတ္ရင္း ျမန္မာလိုလက္ဆင့္ကမ္းထားတဲ့ ေနာင္ေတာ့ေနာင္ေတာ္မ်ားရဲ႕ ေစတနာေလးေတြ စားသံုးရင္း ကၽြန္ေတာ္ေတာ့ နမူနာ ပရိုဂရမ္ေလးေတြ ကၽြန္ေတာ္ကိုယ္တိုင္လည္းေလ့လာရင္း ၾကိဳးစားတည္ေဆာက္သြားမယ္ခင္ဗ်။

တတ္ကၽြမ္းသူ IT သမားမ်ားကေတာ့ ကၽြန္ေတာ္ေရးတာေတြထဲက လိုအပ္ခ်က္ေတြ မွားယြင္းမႈေတြကို (ဖတ္မိရင္ေတာ့) မလြဲမေသြ ေတြ႔ေနရမွာပဲခင္ဗ်။ ျပင္ဆင္ေပးေစခ်င္ပါတယ္။ မွားမွာစိုးလို႔ မျပည့္စံုဘူးထင္လို႔ ကၽြန္ေတာ္တို႔မေရးခဲ့ရင္ ကၽြန္ေတာ္တို႔ေနာက္ ေလ့လာမယ့္ ညီငယ္ညီမငယ္ေတြဟာ ဒီပညာေတြနဲ႔ အလွမ္းေ၀ေနဦးမွာပဲခင္ဗ်။ တကယ္တန္းေတာ့ ကၽြန္ေတာ္ကလည္း သိပ္တာ၀န္ယူ ပင္ပမ္းခ်င္တဲ့သူေတာ့ မဟုတ္ပါဘူးခင္ဗ်၊ အေျခအေနအရ ႏွစ္၀က္ေလာက္ အားလပ္ေနတာရယ္၊ ကိုယ္တိုင္လည္းေလ့လာခ်င္တာရယ္ ၀ါသနာပါတာရယ္ေပါင္းၿပီး တတ္ႏိုင္သေလာက္ေလးေရးျခင္းသာျဖစ္ပါတယ္။ လူတိုင္းက ဘ၀အေရး ေျပးလႊားေနၾကရရာမွာ ေစတနာပါေသာ္လည္း အေျခအေနအခ်ိန္ဆိုတာ ျဖန္႔ေ၀ႏိုင္တာမ်ိဳးသိထားတာေၾကာင့္ မအားလပ္သူမ်ားကိုယ္စား ၾကိဳးစားတာ၀န္ယူၾကည့္ခ်င္တဲ့ သေဘာပါခင္ဗ်။ အေျခအေနအနည္းငယ္ေပးရင္သာ ကၽြန္ေတာ့္အမွားေတြကို ေထာက္ျပျပင္ဆင္ေပးေတာ္မူၾကပါရန္ ေတာင္းဆိုရင္း ႏႈတ္ခြန္းဆက္ပါသည္ခင္ဗ်ား။

ကိုပခန္း 4th Jan 2011

အပိုင္းေလး ၅ ခုနဲ႔ စၾကတာေပါ့ဗ်ာ။
(၁) Windowform ဆိုတာ
(၂) Windowform သံုးဖို႔ဘာေတြလိုလဲ
(၃) Windowform ကိုဘယ္လိုေရးလဲ
(၄) Windowform ကိုဘယ္လိုသံုးလဲ
(၅) Windowform code မွာ ဘာေတြပါ၀င္လဲ

(၁) Windowform ဆိုတာ

ျပတင္းေပါက္လို box ပံုစံေလးေပါ့ဗ်ာ။ My Computer ကို ဖြင့္လိုက္ရင္ ျမင္လာရသလို File Edit View စတဲ့ Tab ေလးေတြပါတဲ့ MenuStrip ေတြကစလို႔ Address လို စာရိုက္ထည့္လို႔ရတဲ့ TextBox ေတြ Go လို႔ေရးထားတဲ့ ကလစ္ႏွိပ္လို႔ရတဲ့ Button ေတြ ဟိုတိုးဒီေရႊ႕ scoll bar ေတြဘာညာေပါ့ဗ်ာ။ ဒါေတြဟာ Window ေတြမွာ ေတြ႔ရတဲ့ပံုစံ အဲလိုဟာက Windowform ေပါ့ဗ်ာ။ ဥပမာ ေအာက္ကၽြန္ေတာ္ျပထားတဲ့ ပံုေလးလိုဟာေပါ့ခင္ဗ်ာ။

Photobucket


(၂) Windowform သံုးဖို႔ဘာေတြလိုလဲ

လိုတာကေတာ့ .NET Framework ဗ်။ သူ႔ကိုေတာ့ 2002 Miscrosoft OS ကစလို႔ ေနာက္ပိုင္း OS ေတြမွာ ပါၿပီးသားလို႔ေတာ့ သိရတာပဲခင္ဗ်။ ကၽြန္ေတာ္ကေတာ့ http://www.microsoft.com/download/en/confirmation.aspx?id=22 ကေနယူထားတယ္ဗ်။ .NET Frameword 3.5 sp 1 ေပါ့ဗ်ာ။ ကၽြန္ေတာ္သံုးတဲ့ ဂရပ္ေတြဇယားေတြက ဒီေကာင္နဲ႔မွဆိုလို႔ဗ်ာ။

http://sevenlamp.wordpress.com/2009/07/23/dotnetframework/ မွာေတာ့ အစ္ကိုတစ္ေယာက္ .NET Framework အလုပ္လုပ္ပံုကိုရွင္းထားတယ္ခင္ဗ်။ အၾကမ္းဖ်ဥ္းေျပာရရင္ အဲဒီ .NET Framework တင္ကိုတင္ရမယ္ေပါ့ဗ်ာ။ အဲဒီထဲမွာ dll ဆိုတဲ့ Dynamic-link library ဆိုတာေလး အေတာ္မ်ားမ်ားပါသဗ်။ ေနာက္ၿပီး csc.exe ေလးလည္း ပါသဗ်။

(၃) Windowform ကိုဘယ္လိုေရးလဲ

ေလာေလာဆယ္ေတာ့ notepad ေလးလိုတယ္ဗ်။ Start>All Programs>Accessories>Notepad ေပါ့ဗ်ာ။ ဒါမွမဟုတ္လည္း Start>Run မွာ notepad လို႔ ရိုက္ Enter ေခါက္လိုက္ေပါ့ဗ်ာ။ ေပၚလာတဲ့ Notepad ေလးထဲမွာ (အေပၚက windowform ေပၚဖို႔) ေအာက္ပါအတိုင္းရိုက္လိုက္ဗ်ာ။

ဒီကေန

class xxx : System.Windows.Forms.Form
{
private System.Windows.Forms.TextBox input1;
private System.Windows.Forms.TextBox input2;
private System.Windows.Forms.Button sum;
private System.Windows.Forms.Label ans;
private xxx()
{
input1 = new System.Windows.Forms.TextBox();
input1.Location = new System.Drawing.Point(10, 10);
input1.Text = "10";
Controls.Add(input1);

input2 = new System.Windows.Forms.TextBox();
input2.Location = new System.Drawing.Point(130, 10);
input2.Text = "20";
Controls.Add(this.input2);

sum = new System.Windows.Forms.Button();
sum.Location = new System.Drawing.Point(80, 80);
sum.Text = "Sum Again!";
Controls.Add(this.sum);

ans = new System.Windows.Forms.Label();
ans.Location = new System.Drawing.Point(100, 160);
ans.Text = "ans= 30";
Controls.Add(this.ans);
sum.Click += new System.EventHandler(this.sum_Click);
}
private void sum_Click(object sender, System.EventArgs OurEvent)
{
ans.Text = "ans= " + (System.Convert.ToDouble(input1.Text)
+ System.Convert.ToDouble(input2.Text)).ToString();
}
static void Main()
{
System.Windows.Forms.Application.Run(new xxx());
}
}

ေဟာဒီထိေပါ့ဗ်ာ။ ၿပီးရင္ C ထဲကို eg1.cs လို႔နာမည္ေပးၿပီးသိမ္းလိုက္ဗ်ာ။ ဘာလို႔ ဒီလိုေရးရတာလဲဆိုတာကို အေျဖထြက္ၿပီးမွ ဆက္ေျပာမယ္ခင္ဗ်။


(၄) Windowform ကိုဘယ္လိုသံုးလဲ

သံုးတာကေတာ့ csc.exe ကေန ဖြင့္မွာဗ်။ .NET Framework ထဲက exe ကေန လွမ္းဖြင့္ရမွာေပါ့ဗ်ာ။
Start>Run ကိုသြားၿပီး cmd လို႔ရိုက္ၿပီး OK လိုက္ဗ်ာ။
C:\WINDOWS\system32\cmd.exe ဆိုၿပီး ေခါင္းစီးၾကီးနဲ႔ အနက္ခံေပၚမွာ အျဖဴေရာင္စာလံုးေတြ မ်က္ႏွာတစ္ခုပြင့္လာသဗ်။ ကၽြန္ေတာ့္နာမည္ကို ZZ လို႔ေပးထားလို႔ထင္ပါ့ C:\Documents and Settings\ZZ> ဆိုၿပီးေပၚလာသဗ်။ ကၽြန္ေတာ္ကေတာ့ ၀င္းဒိုးကို C ထဲတင္ထားေတာ့ C ထဲကို ျပန္ညႊန္းမွျဖစ္မယ္ဗ်။ cd\ လို႔ရိုက္ၿပီး Enter ေခါက္လိုက္ေတာ့ ေအာက္မွာ C:\> ဆိုၿပီး ေပၚလာတယ္ခင္ဗ်။ C ထဲကို ေတာ့ ေရာက္ၿပီေပါ့ေလ။

ကၽြန္ေတာ္တို႔ပထမလုပ္ရမွာက အသံုးခ်မယ့္ .NET Framework က csc.exe ကို ရွာရမွာဗ်။ ဒီေတာ့
C:\> ေနာက္မွာ dir csc.exe /s ဆိုၿပီး ရိုက္ Enter ေခါက္လိုက္သဗ်။ ေရာက္ေနတဲ့ C ထဲမွာ csc.exe ရွိမယ့္ dir ကိုညႊန္ျပခိုင္းတာခင္ဗ်။

Volume in drive C has no label.
Volume Serial Number is 98A0-05CB ဆိုၿပီး ဒဲ့ေတာ့မေတြ႔ေသးဘူး ရွာဦးမယ္ေျပာခ်င္ဟန္တူပါရဲ႕ အေတာ္ေလးေစာင့္လိုက္ရသဗ်။ ေနာက္မွ
Directory of C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
07/25/2008 11:16 AM 80,376 csc.exe
1 File(s) 80,376 bytes
Directory of C:\WINDOWS\Microsoft.NET\Framework\v3.5
07/29/2008 11:40 PM 1,548,280 csc.exe
1 File(s) 1,548,280 bytes
Directory of C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319
03/18/2010 01:16 PM 1,972,552 csc.exe
1 File(s) 1,972,552 bytes
Total Files Listed:
3 File(s) 3,601,208 bytes
0 Dir(s) 35,260,284,928 bytes free

ဆိုၿပီး csc.exe ေတြ႕သမွ် ေျပာလာသဗ်။ စာလံုးအရႈပ္လည္းသက္သာေအာင္ C:\WINDOWS\Microsoft.NET\Framework\v3.5 ကိုေရြးလိုက္ၾကတာေပါ့ဗ်ာ။

ေအာက္က ေပၚေနတဲ့ C:\> ေနာက္မွာ path C:\WINDOWS\Microsoft.NET\Framework\v3.5 လို႔ရိုက္ၿပီး Enter ေခါက္လိုက္သဗ်။ အဲဒီထဲကိုေရာက္ေစေပါ့ဗ်ာ။

(ေၾသာ္ဒါနဲ႔ အနက္ခံေပၚက အျဖဴစာေတြထဲက C:\WINDOWS\Microsoft.NET\Framework\v3.5 ေလးကို ေကာ္ပီကူးဖို႔ Right Click ေထာက္ၿပီး Mark ကို ေရြးရတယ္ခင္ဗ်။ C:\WINDOWS\Microsoft.NET\Framework\v3.5 ေလးကို စဆံုးလံုေအာင္ select ၿပီး Control+C ဆိုၿပီး ေကာ္ပီကူးခင္ဗ်။ C:\> ေနာက္မွာေတာ့ Control+V နဲ႔ paste လို႔ရဘူးေနာ္ အဲနား RightClick ေထာက္ၿပီး paste လုပ္ခင္ဗ်။ မွားသြားရင္ အခက္ေတြ႔တတ္လို႔ ၾကည့္ရိုက္လိုက္တာက အဆင္ေျပပါတယ္ဗ်ာ။ အေကာင္းဆံုးကေတာ့ ကၽြန္ေတာ့္ swf ေလးမွာ ျပထားသလို ေနရာလိပ္စာကူးျပလိုက္ရတာက ပိုအဆင္ေျပတယ္ခင္ဗ်။)

C:\> လို႔ပဲ ျပန္ေပၚလာရာမွာ ေနာက္ကေန csc.exe eg1.cs လို႔ရိုက္လိုက္ခင္ဗ်။ path ကို ရွာၿပီးသားမို႔ csc.exe ကိုသံုးၿပီး eg1.cs ကို exe တစ္ခုအျဖစ္ ေျပာင္းလဲေစတာေပါ့ဗ်ာ။

Microsoft (R) Visual C# 2008 Compiler version 3.5.30729.1
for Microsoft (R) .NET Framework version 3.5
Copyright (C) Microsoft Corporation. All rights reserved.

ဆိုၿပီး ခ်ိတ္ဆက္လို႔ရသေပါ့ဗ်ာ။ ကၽြန္ေတာ္တို႔ သိမ္းခဲ့တဲ့ eg1.cs ေလးကို csc.exe က ခ်ိတ္ဆြဲလိုက္ၿပီဆိုတဲ့သေဘာေပါ့ဗ်ာ။ အခုအခ်ိန္မွာ C ထဲမွာ eg1.exe ဆိုၿပီး Run လို႔ရတဲ့ ဖိုင္ေလးေပၚေနၿပီခင္ဗ်။

ေအာက္ကေပၚလာတဲ့ C:\> ေနာက္မွာ eg1.exe ကိုရိုက္ Enter ေခါက္တာနဲ႔

Photobucket


ဆိုတာေလး ေပၚလာၿပီခင္ဗ်။

၁၀ + ၂၀ = ၃၀ ေပါ့ခင္ဗ်ာ။ ၁၀ ကို select ၿပီး ဂဏန္းတစ္ခုခု ထည့္ၾကည့္ပါ။ ၂၀ ကို လည္း တျခားကိန္းေျပာင္းၾကည့္ပါဦးခင္ဗ်။ ၿပီးတာနဲ႔ Sum Again ကို ကလစ္လိုက္ခင္ဗ်။ စိတ္ၾကိဳက္ေပါင္းႏိုင္ပါတယ္ခင္ဗ်။ (အႏႈတ္ကိန္းေတြလည္း ရွင္းေပမယ္ေပါ့ဗ်ာ) ans= ေနာက္မွာ ေပါင္းလဒ္ေတြ ေျပာင္းေနပါလိမ့္မယ္ခင္ဗ်ာ။ ဒါဟာ အရိုးရွင္းဆံုး calculator ေလးပါပဲခင္ဗ်။ (အေပါင္းအႏႈတ္ပဲပါတာေလးေပါ့ဗ်ာ) ေနာက္တစ့္ခါ Run ခ်င္ရင္ေတာ့ C ထဲကိုသြားၿပီး eg1.exe ေလးကို သြားကလစ္လိုက္ေတာ့ဗ်ိဳး။ (ဟို အနက္ေပၚက အျဖဴေရာင္ စာေတြရိုက္ Enter ေခါက္ရတာ ခဏခဏမွားတတ္လြန္းလို႔ဗ်။)

ရိုက္ၿပီး enter ေခါက္သြားရတာေလးေတြက ေအာက္ပါပံုအတိုင္းပါခင္ဗ်။ အစိမ္းေရာင္ေလးေတြက ကၽြန္ေတာ္တို႔ ရိုက္ရမယ့္စာသားေတြျဖစ္ပါတယ္ခင္ဗ်။


Photobucket


ပိုစ့္ေနာက္ပိုင္းမွာလည္း video ဖိုင္ေလးနဲ႔ ျပထားပါတယ္ခင္ဗ်။

တကယ္ဆိုရင္ ဒီလိုစာေတြရိုက္စရာမလိုဘဲ တစ္ခါတည္း notepad ထဲ ထည့္ .cs အျဖစ္ သိမ္းမယ့္အစား .exe နဲ႔သာ သိမ္းႏိုင္ရင္ တန္းဖြင့္ တန္းသံုးလို႔မရလားဗ်ာ။ အဲလိုတန္းေျပာင္းေပးတာကို VisualStudio က လုပ္ေပးသဗ်။ ကၽြန္ေတာ္ကေတာ့ VisualStudio2008 ကိုသံုးပါတယ္။ VS2008 က .exe ေလးပဲ ေျပာင္းေပးသလားဆိုေတာ့ မဟုတ္ဘူးခင္ဗ်။ ဘာေတြဘယ္လို ကူညီတယ္ဆိုတာ သိသေလာက္ေလး အက်ဥ္းရံုးၿပီး ေျပာျပပါမယ္ခင္ဗ်ာ။



(၅) Windowform code မွာ ဘာေတြပါ၀င္လဲ

class xxx : System.Windows.Forms.Form
{
private System.Windows.Forms.TextBox input1;
private System.Windows.Forms.TextBox input2;
private System.Windows.Forms.Button sum;
private System.Windows.Forms.Label ans;
private xxx()
{
input1 = new System.Windows.Forms.TextBox();
input1.Location = new System.Drawing.Point(10, 10);
input1.Text = "10";
Controls.Add(input1);

input2 = new System.Windows.Forms.TextBox();
input2.Location = new System.Drawing.Point(130, 10);
input2.Text = "20";
Controls.Add(this.input2);

sum = new System.Windows.Forms.Button();
sum.Location = new System.Drawing.Point(80, 80);
sum.Text = "Sum Again!";
Controls.Add(this.sum);

ans = new System.Windows.Forms.Label();
ans.Location = new System.Drawing.Point(100, 160);
ans.Text = "ans= 30";
Controls.Add(this.ans);
sum.Click += new System.EventHandler(this.sum_Click);
}
private void sum_Click(object sender, System.EventArgs OurEvent)
{
ans.Text = "ans= " + (System.Convert.ToDouble(input1.Text)
+ System.Convert.ToDouble(input2.Text)).ToString();
}
static void Main()
{
System.Windows.Forms.Application.Run(new xxx());
}
}


အဲဒီလို notepad မွာ ကၽြန္ေတာ္ေရးခဲ့ပါတယ္။ {} ေလးေတြကို စုလိုက္ရင္

class xxx : System.Windows.Forms.Form
{

}

ဆိုတဲ့ ကြင္းစ ကြင္းပိတ္အတြင္းမွာ အျခားအစိတ္အပိုင္းေတြစုထားပါတယ္။ ဒီအေပၚရံအေရခြံဟာ ဘာလဲဆိုေတာ့ ကၽြန္ေတာ္သိသေလာက္ေျပာျပရရင္ ကၽြန္ေတာ့္မွာေတာ့ c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Windows.Forms.dll က စတာေပါ့ဗ်ာ။
http://msdn.microsoft.com/en-us/library/system.windows.forms.control_members%28v=VS.90%29.aspx မွာေတာ့
Photobucket


အဲလိုေဖၚျပထားတာေပါ့ဗ်ာ။ အင္တာနက္ မရွိလည္း စက္ထဲမွာ ၾကည့္ႏိုင္ဖို႔ဆို VisualStudio က လိုလာတယ္ဗ်။ VisualStudio2008 မွာေတာ့ ေအာက္ပါအတိုင္းၾကည့္ႏိုင္ပါတယ္။
Photobucket


ကၽြန္ေတာ္ေရးခဲ့တဲ့ class xxx : System.Windows.Forms.Form ဟာဆိုရင္ System.Window.Forms. ထဲက Form ဆိုတဲ့ code အစုအေ၀းကို xxx ဆိုတဲ့ နာမည္နဲ႔ ခဏ ငွားသံုးလိုက္တာခင္ဗ်။ xxx ဟာဆိုရင္ ကိုယ္တိုင္ေရးစရာမလိုဘဲ နဂိုက ေရးၿပီးသား class ကိုလည္းသံုးခြင့္ရတယ္။ class ထဲက member ေတြျဖစ္တဲ့ Constructer, method, properties, event ေတြကို လိုသလို သံုးခြင့္ရသြားပါတယ္။ အဲလိုသံုးခြင့္ရေအာင္ စုေပါင္းထည့္ေရးထားတဲ့ အစုအေ၀းၾကီးကို dll(Dynamic-link library) တနည္းအားျဖင့္ စြက္ကနဲ လင့္ယူသံုးလို႔ရတယ့္ အခ်က္အလက္စုေ၀းရာၾကီးေပါ့ဗ်ာ။ ေလာေလာဆယ္ေတာ့ ကၽြန္ေတာ္က System.Windows.Forms.dll ကိုသံုးလိုက္ၿပီဗ်ာ။



တစ္ဆင့္ျခင္းခြဲပစ္မယ္ဆိုရင္

class xxx : System.Windows.Forms.Form (xxx ဆိုတဲ့နာမည္နဲ႔ dll ထဲ Form ဆိုတဲ့ class ကို ခ်ိတ္သံုးလိုက္တယ္)
{
၁။ သတ္မွတ္ျခင္း
private System.Windows.Forms.TextBox input1; (input1 ဆိုတဲ့ နာမည္နဲ႔ စာရိုက္ထည့္ဖို႔ TextBox ေလးတစ္ခု
သတ္မွတ္လိုက္တယ္)
private System.Windows.Forms.TextBox input2; (input1 ဆိုတဲ့ နာမည္နဲ႔ စာရိုက္ထည့္ဖို႔ TextBox ေလးတစ္ခု
သတ္မွတ္လိုက္တယ္)
private System.Windows.Forms.Button sum; (sum ဆိုတဲ့ နာမည္နဲ႔ တြက္မယ္လို႔ သတိေပးရေအာင္ ႏွိပ္စရာ
Button ေလး တစ္ခု သတ္မွတ္လိုက္တယ္)
private System.Windows.Forms.Label ans; (ans ဆိုတဲ့ နာမည္နဲ႔ အေျဖထုတ္ဖို႔ label စာညႊန္းေလးတစ္ခု
သတ္မွတ္လိုက္တယ္။)

သတ္မွတ္ယံုနဲ႔ မရပါဘူး ဖြင့္ဆိုၿပီး ေမာင္းႏွင္ရပါဦးမယ္ခင္ဗ်။

private xxx() (ေမာင္းႏွင္မယ့္ Method အစေပါ့ဗ်ာ)
{
input1 = new System.Windows.Forms.TextBox(); (input1 ဟာ TextBox အျဖစ္ဖြင့္ဆို လိုက္တယ္ခင္ဗ်။
အေပၚမွာသတ္မွတ္ခဲ့ၿပီး ဘာလို႔ ေနာက္တစ္ၾကိမ္ထပ္ဖြင့္ဆိုရလဲဆိုရင္ အေပၚက အနီေရာင္နဲ သတ္မွတ္မႈဟာ
class xxx : System.Windows.Forms.Form {} အတြင္း အားလံုးအတြက္ အၾကံဳး၀င္ဖို႔ ျဖစ္ပါတယ္။
xxx(){} အတြင္းမွာတင္မက အျခား method ေတြမွာလည္း ယူသံုးခ်င္လို႔ျဖစ္ပါတယ္။
အကယ္၍ TextBox ေလးကို ျပယံုလိုခ်င္လို႔ကေတာ့ xxx(){} မွာတင္ ကိစၥၿပီးလို႔ရပါတယ္ခင္ဗ်။ )

input1.Location = new System.Drawing.Point(10, 10);
ဒီမွာေတာ့ System.Drawing.dll ကို သံုးထားရပါတယ္။ ဘာမွ သတ္မွတ္မထားရင္ textBox ေလးေတြဟာ
(0,0) မွတ္ WindowForm ရဲ႕ ၀ဲဘက္ အေပၚေထာင့္မွတ္က စေရပါတယ္။ ေနရာမေပးလိုက္ရင္ အကုန္
အဲဒီေနရာမွာ စုၿပံဳမွာ စိုးလို႔သာ ေနရာလႊဲေပးမွာျဖစ္ပါတယ္။ ေအာက္ကပံုကိုၾကည့္ပါ။

Photobucket

input.Location တို႔ input.Text လို႔ေရားလို႔ရတာကေတာ့ ဒီမွာေတာ့ မွတ္ထားမွ သိမွာပါ။ VS2008 မွာေတာ့ သံုးလို႔ရတာေတြကို “.” ေလး input ေနာက္မွာ ခ်လိုက္တာနဲ႔ ေအာက္ပါအတိုင္းျပေနပါေတာ့တယ္ခင္ဗ်။)

Photobucket




Controls.Add(input1); (သတ္မွတ္ခ်င္တာေတြ သတ္မွတ္ၿပီးရင္ ထိန္းလို႔ျပဳလို႔ ရေအာင္
Control Collection ထဲကို input1 ကိုထည့္လိုက္တာေပါ့ခင္ဗ်ာ။)

input2 = new System.Windows.Forms.TextBox();
input2.Location = new System.Drawing.Point(130, 10);
input2.Text = "20";
Controls.Add(this.input2);

sum = new System.Windows.Forms.Button();
sum.Location = new System.Drawing.Point(80, 80);
sum.Text = "Sum Again!";
Controls.Add(this.sum);

ans = new System.Windows.Forms.Label();
ans.Location = new System.Drawing.Point(100, 160);
ans.Text = "ans= 30";
Controls.Add(this.ans);

Photobucket

sum.Click += new System.EventHandler(this.sum_Click); (ဒီအေၾကာင္းကေတာ့ sum.Click sum ဆိုတဲ့
ႏွိပ္စရာ button ေလးကို ကလစ္တာနဲ႔ sum_Click ဆိုတဲ့ အျဖစ္အပ်က္ event ေလးလုပ္ေပးပါလို႔ ခိုင္းတာပဲခင္ဗ်။)

}


private void sum_Click(object sender, System.EventArgs OurEvent)
{
ဒီမွာကေတာ့ sum လို႔ နာမည္ေပးထားတဲ့ button ကို ကလစ္ရင္ လုပ္မယ့္ အလုပ္ေတြကို ေျပာျပထားပါတယ္။

ans.Text = "ans= " + (System.Convert.ToDouble(input1.Text)
+ System.Convert.ToDouble(input2.Text)).ToString();

ans.Text ဆိုတဲ့ ans ေနရာေပၚမယ့္စာမွာ ans= လို႔ ပံုေသအၿမဲ ေပၚေစဖို႔ “ans= “ လို႔ေရးလိုက္တယ္ခင္ဗ်။
ေနာက္ + . System.Convert.ToDouble(input1.Text) ဆိုတာ System.dll ထဲက Convert ဆိုတဲ့
အပိုင္းမွာမွ ToDouble() ဆိုတဲ့ () အတြင္းကဟာကို double type ေျပာင္းဖို႔ ခိုင္းထားတာ ျဖစ္ပါတယ္။
ဘာလို႔ေျပာင္းရလဲဆိုေတာ့ ကၽြန္ေတာ္တို႔ ရိုက္သြင္းမွာေတြဟာ စကားလံုးေတြအျဖစ္သာ ၀င္ေနလို႔ျဖစ္ပါတယ္ ။
ကိန္းဂဏန္းျဖစ္မွ ေပါင္းလို႔ရမွာျဖစ္ပါတယ္။ double မဟုတ္ဘဲ အျခားဟာေတြလည္းရပါတယ္။
အႏႈတ္ပါလာရင္ သိဖို႔အတြက္ေတာ့ ကိန္းျပည့္ int ကိုေတာ့ မသံုးသင့္ဘူးေပါ့ဗ်ာ။ input2 ကိုလည္း Double
ေျပာင္းၿပီး ေပါင္းခိုင္းလိုက္တာေပါ့ဗ်ာ။ ရတဲ့အေျဖဟာလည္း double ခ်င္းေပါင္းေတာ့ double ပဲခင္ဗ်။
ans ဆိုတဲ့ lable မွာကလည္း ျပန္ျပေတာ့ အကၡရာနဲ႔ျပမွာေလ။ ေပါင္းလဒ္ double ကို စာအျဖစ္ေျပာင္းဖို႔
.ToString() ဆိုၿပီး ေနာက္ပိတ္ေျပာင္း ျပန္ျပလိုက္တာပါပဲဗ်ာ။ double တို႔အုပ္စုေတြကိုေတာ့
ေနာင္ မသိမျဖစ္ နမူနာေတြမွာမွ ထည့္ေျပာၾကတာေပါ့ဗ်ာ။ }

၂။ စတင္အလုပ္လုပ္ျခင္း
static void Main() (ဘယ္လိုပဲျဖစ္ျဖစ္ ဒီကစႏိုင္ေအာင္ static အေနနဲ႔ ေယဘုယ် void အလုပ္ခိုင္းလိုက္တယ္)
{
System.Windows.Forms.Application.Run(new xxx()); (dll ထဲမွာ Application ပါတယ္
သူ႔မွာ Run ဆိုတဲ့ အပိုင္းေလး စတင္ေစလိုက္ၿပီး xxx() ကို စတင္လုပ္ေဆာင္ေစပါေတာ့တယ္။)

}
}

အႏွစ္ခ်ဳပ္အလုပ္လုပ္ပံုကို ျပန္ေျပာရမယ္ဆိုရင္ Main() က စတယ္ဆိုရမွာေပါ့ဗ်ာ။ Main() ကလည္း
xxx() ဆိုတဲ့ အပိုင္းေလးကို Run ေစခ်င္တာကိုးဗ်။ xxx() ေလးမွာကလည္း အ၀င္ ၂ ခု ခိုင္းတာတစ္ခု
အေျဖ ၁ ခု ဆိုတဲ့ ေနရာနဲ႔ တင္ၾကိဳတန္ဖိုးေလးေတြ သတ္မွတ္ထားၿပီး
Click Event ကို ထိုင္ေစာင့္ေနတာပါပဲ။ ကလစ္တစ္ခ်က္ အႏွိပ္မွာ ထထ ေပါင္းၿပီး အေျဖထုတ္တယ္ဆိုပါေတာ့ဗ်ာ။

အခုေျပာခဲ့သမွ်ဟာ Windowform မိတ္ဆက္မွ်သာ ျဖစ္ပါတယ္။ တကယ္ေရးမယ့္ VisualStudio ရဲ႕
ျပင္ပမွ ဖန္တီးထားတာေၾကာင့္ ဟာကြက္ေတြရွိေပမယ့္ အရွင္းဆံုးျဖစ္ေစဖို႔ေရးထားရတာျဖစ္ပါတယ္။ အကယ္၍
Controls.Add(this.input2); ရဲ႕အေပၚကပ္ရပ္မွာ
input2.ForeColor = System.Drawing.Color.Lime;
input2.BackColor = System.Drawing.Color.Black;
လိုထပ္ထည့္ရင္ စာလံုးနဲ႔ ေနာက္ခံအေရာင္ေလးေတြ ေျပာင္းသြားတာမ်ိဳးလည္း စိတ္ကူးရွိသလို ျပင္ႏိုင္ၾကမွာ
ျဖစ္ပါတယ္ခင္ဗ်။)

အခက္အခဲရွိက comment ႏွင့္ျဖစ္ေစ kopakhan@gmail.com ကို ျဖစ္ေစ ဆက္သြယ္ေမးျမန္းႏိုင္သလို
လြဲမွားေနတာရွိပါကလည္း အၾကံေပးကူညီၾကပါခင္ဗ်ာ။
ဒါေလးၾကည့္ရင္ေတာ့ ပိုအဆင္ေျပမယ္ထင္တယ္ခင္ဗ်။


ဆႏၵမြန္ျဖင့္
ကိုပခန္း
5 Jan 2012
ေဒါင္းရ/ဖတ္ရ အဆင္ေျပေစရန္ scribd မွာပါ ေဖၚျပလိုက္ရပါတယ္ခင္ဗ်ာ။
C#WF(1)

ဆက္လက္၍...

Friday, October 22, 2010

AutoCAD ျဖင့္ အိမ္ပံုဆြဲ ၍ rendering လုပ္ျခင္း

အခုတင္ျပမယ့္ post ကေတာ့ AutoCAD နဲ႕ rendering လုပ္တဲ့ သင္ခန္းစာေလးပါပဲ။ ဒီ သင္ခန္းစာ ဟာ AutoCAD ကို တီးမိေခါက္မိ ရွိသူမ်ား အတြက္ ရည္ရြယ္ထားတာ ျဖစ္ျပီး အခု မွ စသင္ေနသူမ်ားအတြက္ အခက္အခဲ ရွိႏိုင္ပါတယ္။ အရင္ဆံုး ပံုမဆြဲခင္ ေနာက္ဆံုး ရလဒ္ေလးကို အရင္ ၾကည့္ရေအာင္။ (ေဗဒင္ဆရာၾကီး က ေတာင္းဆိုလို႔ပါ။)




ပံုေလး ကေတာ့ ရိုးရိုးရွင္းရွင္း အိမ္ပံုေလး ပါပဲ။ အိမ္ပံုေလးကို အရင္ Modeling လုပ္ပါမယ္။ ျပီးေတာ့ နံရံေတြ ေခါင္မိုးေတြ ကို texture ေတြ ကပ္ပါမယ္။ တံခါးေတြ ျပတင္းေတြ ကို ပံုေတြ ကပ္ပါမယ္။ ေအာက္မွာ ေျမၾကီးထည့္ျပီး ေနာက္ခံ ေကာင္းကင္ ပံုထည့္ပါမယ္။ အခုလို ျမင္ရတဲ့ အေနအထား ရေအာင္ view ခ်ိန္မယ္။ ေနာက္ျပီး အရိပ္က်ေနတာေလး ကို ျမင္ရတယ္ မလား။ အဲလို အရိပ္က်ေအာင္ အလင္းေတြ ထည့္ေပးပါမယ္။ အခု ေလာေလာဆယ္ အိမ္ပံုေလး ကို အရင္ဆြဲရေအာင္။
ေဖာ္ျပထားတဲ့ ပံုေလးကေတာ့ floor plan ပါ။ ပံုမွာ ေဖာ္ျပထားတဲ့ အတိုင္းအတားမ်ား ဟာ ေပ လက္မ နဲ႕ ျဖစ္ပါတယ္။ ဒါေၾကာင့္ AutoCAD ကို ဖြင့္ျပီး New Drawing ေတာင္းပါ။ new drawing dialog မွာ Imperial (feet and inches) ကို ေရြးပါ။ ျပီးရင္ commandline မွာ units လို႕ ရိုက္ပါ။ ဒါမွ မဟုတ္ Format menu မွာ units ကို ေရြးခ်ယ္ပါ။ Units Dialog မွာ Type ကို Architectural လို႕ ေရြးပါ။ precision မ်ား လိုသလို သတ္မွတ္ပါ။ ခုပံုကေတာ့ precision အမ်ားၾကီးမလိုပါဘူး။ ဒါေၾကာင့္ default အတိုင္း ထားခဲ့လည္း ရပါတယ္။
ပံုကို သပ္သပ္ရပ္ရပ္ေလး ျဖစ္ေစခ်င္ရင္ေတာ့ layer ေတြ ခြဲဆြဲပါ။ အရင္ဆံုး Wall နာမည္နဲ႕ New Layer လုပ္လိုက္ပါတယ္။ Current layer မွာ wall ကို ထားလိုက္ပါတယ္။



ၿပီးရင္ ပံုမွာ ျပထားတဲ့ အတိုင္း ဆြဲလိုက္ပါ။ ကၽြန္ေတာ္က ေတာ့ ရိုးရိုး line ကိုပဲ သံုးျပီး offset ေတြ trim ေတြ နဲ႕ ဆြဲလိုက္ပါတယ္။ အခုဆြဲထားတဲ့ ပံုက ရိုးရိုး မ်ဥ္းေတြပဲ ျဖစ္တဲ့ အတြက္ 3d modeling tools မ်ားျဖစ္တဲ့ extrude တို႕ revolve တို႕ကို သံုးလို႕ မရပါေသးဘူး။ ဒါေၾကာင့္ modeling လုပ္ဖို႕ ျပဳျပင္ေပးရပါမယ္။ extrude က closed polyline နဲ႕ surface ေတြကို ထုတင္ေပးႏိုင္ပါတယ္။ AutoCAD မွာ pedit နဲ႕ မ်ဥ္းေတြကို join ႏိုင္ပါတယ္။ ခု ဒီေနရာမွာ ေနာက္ command တခု ျဖစ္တဲ့ region ကို သံုးျပီး surface ေတြ လုပ္ပါ့မယ္။ မသိေသးတဲ့ လူေတြ သိသြားတာေပါ့။
အရင္ဆံုး command မွာ reg သို႕ region လို႕ ရိုက္ပါ။ ျပီးရင္ အကုန္လံုးကို select လုပ္လိုက္ပါ။ ျပီးရင္ Enter ေခါက္ပါ။ ဒါဆို 3 loops extracted. 3 Regions created. ဆိုျပီး ေပၚလာပါမယ္။ ဒါဆို surface (region) ေတြ ျဖစ္သြားပါျပီ။ အထက္မွာ ျပသလို မျဖစ္ဘဲ error ျပရင္ေတာ့ line ေတြက end point ေတြမွာ မွန္မွန္ကန္ကန္ မထိဘဲ ဟတာေတြ ေက်ာ္တာေတြ ျဖစ္ေနလို႕ပါ။ တိတိက်က် ျပန္ဆြဲပါ။
Command: REG REGION
Select objects: "SELECT ALL THE LINES" Specify opposite corner: 14 found
Select objects: "ENTER"
3 loops extracted.
3 Regions created.



ျပီးရင္ view ကေန swisometric ကို ေရြးပါ။ ဒါဆို အေပၚ တေစာင္း ကေန ေစာင္းၾကည့္သလို ျဖစ္သြားပါ့မယ္။ ေနာက္ view ကေနပဲ Visual styles>Conceptual ကို ေရြးပါ။ ဒါဆို ခုလို အသားအျပည့္ ျဖစ္သြားတာ ေတြ႕ရပါမယ္။ ဒါဆို region လုပ္ထားတာ မွန္ပါတယ္။ အသားအျပည့္ မျဖစ္ဘဲ လိုင္းေတြ ၾကီးပဲ ေပၚေနရင္ region လုပ္တာ မမွန္ပါ ဘူး။



ၿပီးရင္ ထုတင္ပါမယ္။ command မွာ ext လို႕ရိုက္ပါ။ အျမင့္က ၉ ေပ ျဖစ္ပါတယ္။ ၿပီးရင္ region ၃ ခုလံုး ပါေအာင္ select လုပ္ပါ။ Enter ေခါက္ပါ။ Specify height မွာ 9’ လို႕ ရိုက္ပါ။

Command: EXT EXTRUDE
Current wire frame density: ISOLINES=4
Select objects: "SELECT THE 3 REGIONS" Specify opposite corner: 3 found
Select objects:
Specify height of extrusion or [Path]: 9'
Specify angle of taper for extrusion "0": "ENTER"
ေအာက္က ေဖာ္ျပပါ ပံုထဲက ဘယ္ဘက္က ပံု အတိုင္း ရပါမယ္။ အဲဒါကို နံရံေတြ ျဖစ္ေအာင္ အၾကီးဆံုးထဲက ေန အေသး ၂ ခုကို ႏႈတ္ပစ္ပါမယ္။ ရွင္းရွင္း လင္းလင္း ျမင္ခ်င္ရင္ေတာ့ view ကေန hide ကိုေရြးပါ။
Command မွာ subtract လို႕ ရိုက္ပါ။ အႏႈတ္ခံမဲ့ objects အတြက္ အႀကီးဆံုး အျပင္က solid ကို ေရြးပါ။ Enter ေခါက္ပါ။ ေနာက္ ေပ်ာက္သြားမဲ့ ေနရာအတြက္ အတြင္းက အေသး ႏွစ္ခု ကို ေရြးပါ။ ညာဘက္ကပံုအတိုင္း က်န္ခဲ့ပါမယ္။
Command: subtract
Select solids, surfaces, and regions to subtract from ..
Select objects: 1 found
Select objects: "SELECT THE LARGEST REGIONS" Enter
Select solids, surfaces, and regions to subtract ..
Select objects: 1 found "SELECT THE TWO OTHER REGIONS"
Select objects: 1 found, 2 total "Enter"



အခု နံရံ နဲ႔ေတာ့ တူလာပါျပီ။ တံခါးေပါက္နဲ႕ ျပတင္းေပါက္ေတြ အတြက္ အေပါက္ေဖာက္ပါမယ္။ အရင္ဆံုး တံခါး အတြက္ အျပင္ဖက္ဆံုး မ်က္ႏွာစာ နံရံ ေအာက္ေျခမွာ rectangle တစ္ခု ဆြဲပါမယ္။ အကြာအေဝး ကပံုမွာ ျပထားတဲ့ အတိုင္း အစြန္က ေန ၅ ေပ အကြာမွာ ရွိမွာပါ။ rectangle ကို ၃ေပ × ၆ လက္မ နဲ႕ ဆြဲထားတာပါ။ ၆ လက္မ ကေတာ့ နံရံ အထူ အတိုင္းပါပဲ။ rectangle ကို ဒီအတိုင္း ဆြဲပါ။ Command မွာ rec ဆိုျပီး ရိုက္ပါ။ first corner point ကုိ အျပင္ဖက္ နံရံ mid point မွာေကာက္ပါ။ ေနာက္ @6,3’ သို႕ @6,36 လို႕ ရိုက္ပါ။ ဒါဆို အဆင္ေျပပါတယ္။ x,y coordinate မ်ား သတိထားပါ။ x အတိုင္း အထူ လိုခ်င္ၿပီး y အတိုင္း အရွည္လိုခ်င္လို႕ ၆ လက္မ က x ေနရာ၊ ၃၆ လက္မ (၃ေပ) က y ေနရာထားတာပါ။



တံခါး အျမင့္က ၆ေပ ၈လက္မ ပါ။ command မွာ ext လို႕ ရိုက္ပါ။ rectangle ကို select လုပ္ပါ။ ေနာက္ အျမင့္အတြက္ 6’8 လို႕ ရိုက္ပါ။ enter ေခါက္ပါ။
Command: ext EXTRUDE
Current wire frame density: ISOLINES=8
Select objects to extrude: "Selecte rectangle"1 found
Select objects to extrude: "Enter"
Specify height of extrusion or [Direction/Path/Taper angle] "9'-0"": 6'8 "Enter"

တခါထဲ subtract တန္းမလုပ္ပါနဲ႕ဦး။ အတြင္းက အိပ္ခန္းေလးကို တံခါး ေဖာက္ေပးရပါဦးမယ္။ ထုတင္ထားတဲ့ solid ကို copy ပြားပါမယ္။ command မွာ co သို႕ cp သို႕ copy လို႕ ရိုက္ပါ။ solid ေလးကို select လုပ္ပါ။ Enter ေခါက္ပါ။ base point ကို ေအာက္ေျခ က ေရွ႕မ်က္ႏွာစာ မွာရွိတဲ့ midpoint ကေန ေကာက္ပါ။ ၿပီးေတာ့ အတြင္း က အိပ္ခန္း နံရံ ေအာက္ေျခ က ေရွ႕ မ်က္ႏွာစာ မွာရွိတဲ့ midpoint မွာ pick လုပ္ျပီး copy ပြားပါ။

ေနာက္ပိုစ့္မွာ ပံုႏွင့္တကြ ဆက္လက္ရွင္းၿပပါ့မယ္ခင္ဗ်။ Note(记)>>နည္းပညာလူငယ္ မအားေသာေၾကာင့္ ကၽြန္ေတာ္သူ႕ကိုယ္စား တင္ေပးၿခင္းၿဖစ္ပါသည္

ဆက္လက္၍...

Monday, October 11, 2010

Electronic Circuits for the Evil Genius: 57 Lessons with Projects


There is truly a lack of good, basic hardwire electronic "how-to" books. The market seems interested in this type of fun project compilation. This is another book in our extremely successful "Evil Genius" series. So far, each of the books has sold about $50,000 in less than 3 months. With this book and another (Scrap Electronics for the Evil Genius), we should have a nice "cluster" for our next catalog. The perfect addition to our "Evil Genius" series, this book details everything an electronics hobbyist would want to know about circuits and circuit design through 57 Lessons. Readers work through 5 distinct, useful projects to reinforce their learning.












12.2B



ဆက္လက္၍...

Sunday, October 10, 2010

Electronic Sensors Electronic Sensors for the Evil Genius

ကဲ..လာပါၿပီခင္ဗ်ာ ေနာက္၁အုပ္ ဘယ္ေလာက္ေကာင္းလဲဆိုရင္ စာဖတ္သူကိုတိုင္သာ ဖတ္ၾကည့္ေစခ်င္ပါတယ္ ခင္ဗ်ာ။

Reach beyond the limits of your own eyes, ears, nose, and sense of touch with these 54 exciting projects that enlist the uncanny talents of electronic sensors to probe dimensions beyond mere human powers of perception. With the help of popular electronics author Tom Petruzzellis, you can build your own fantastic projects that measure, touch, and explore the limits of the known natural world -- and the leading edges of the future of science and robotics! All 54 projects are fun, easy, and inexpensive to make at home and -- best of all -- seriously exciting and impressive!
Petruzzellis takes the stuff of science fiction and science future, and brings it down to size for the home hobbyist or science fair project creator. With easy-to-follow plans, clear diagrams and schematics, and respect for your wallet, his Electronic Sensors for the Evil Genius gives you:
Illustrated instructions and plans for amazing pretested projects advanced enough for sophisticated electronics enthusiasts but described in sufficient detail to be built even by newcomers.
Explanations of the science and math behind each project. For instance, you can explore the technologies of vibration detection from intrusion to earthquakes
Frustration -- factor removal -- needed parts are listed, along with sources -- and many of these projects can be built for $20 or less

AN IDEA BONANZA
With this book, you can build and explore sensing equipment that parallels devices used in today's most advanced robots, machine controls, and tools of scientific measurement. The mind-boggling possibilities for combining these sensors with other electronic and mechanical devices are literally endless! If these projects don't get your creative and inventive ideas cooking, nothing will!

EXPLORE ELECTRONIC PERCEPTION
This awesome book equips you with complete plans, instructions, parts lists, and sources for these wonderful projects:
Jupiter radio telescope
Research seismograph for monitoring tectonic plate movement
Geiger counter for detecting atomic radiation
Electronic stethoscope for hearing detailed heart and lung sounds
Cloud chamber
Combustible gas sniffer
Earth field magnetometer
Atmospheric charge (lightning potential) monitor
Cloud charge monitor
Low-cost ion chamber
Advanced ion chamber
Electromagnetic field detector
Vibration alarm
Infrared motion detector
Flame detector
Shortwave receiver
Static tube
pH meter
Fluid/water level indicator
Electronic temperature, humidity, and barometric pressure gauges
Analog data logger
Many, many more!









55.0MB



ဆက္လက္၍...

Saturday, October 9, 2010

Electronic Materials and Processes Handbook

ေဆာရီးဗ်ာ....ကၽြန္ေတာ္ အလုပ္ေလးနဲနဲမ်ားေနလို႔ ေနာက္ၿပီး ခ်စ္သူေလးနဲ႔ Chinese ေရာက္ေနလို႔(ဟဲဟဲ).ကၽြန္ေတာ္ ဒီေန႔ Electronic နဲ႔ပတ္သက္တဲ့ စာအုပ္ေလး တင္ေပးလိုက္ပါတယ္။ စာအုပ္က ေတာ္ေတာ္ေကာင္းတယ္ amazon.com မွာ ($-43) ရွိတယ္ စာဖတ္ပရိတ္သက္ၾကီးမ်ား။ ေကာင္းေကာင္းသာ ေလ့လာေပေတာ့ဗ်ာ ။ လိုခ်င္တဲ့ စာအုပ္မ်ားရွိရင္ေၿပာ ၾကိုက္တာေၿပာ မရရေအာင္ရွာေပးမယ္ဗ်ာ ကမာၻပတ္ေနေတာ့ ရတာနဲ႔ရွာၿပီးတင္ေပးပါမယ္ ခင္ဗ်ာ။

The rise of cellular phones, PDAs, and palmtops has brought with it a host of new challenges for those charged with creating materials to meet those devices' specifications. And now, thanks to McGraw-Hill's Electronic Materials Handbook, engineers have comprehensive coverage of the materials that cater to the microminiaturization trend in electronics.

Written by a team of experts from around the globe, this indispensable volume reflects the importance of engineering materials for thermal management system optimization and flexibility in microminiature sizes. It offers detailed discussions of a complete range of pertinent topics, including:

* Full material breakdowns for high-density packaging techniques
* Materials for communications wiring and cabling
* And much, much, more!












10.5MB



ဆက္လက္၍...