Tuesday, October 20, 2009

Debugging in Dev-C++

Dev-c++ สนับสนุนการดีบักโปรแกรมภาษาซี ซีพลัสพลัส โดยมีขั้นตอนดังนี้

1. กำหนดค่าให้ linker สร้างข้อมูลการดีบัก โดยเลือกเมนู Tools/Compiler Options/Settings/Linker/Generate Debugging Information

ซึ่้งขั้นตอนนี้จะต้องทำเพียงครั้งแรกครั้งเดียวเท่านั้น

2. ทดลองสร้างโปรแกรมตัวอย่าง แล้วคลิกที่จุดที่ต้องการสร้าง Breakpoint โดยคลิกที่ขอบทางซ้ายมือ

3. คอมไพล์โปรแกรมใหม่อีกครั้ง
4. จากนั้นเลือกเมนู Debug/Run to cursor
5. ในขณะนี้จะอยู่ในกระบวนการดีบัก เราสามารถดูค่าของตัวแปรใดๆได้ หรือเปลี่ยนค่าของตัวแปร หรือกำหนดนิพจน์ใหม่ได้ ในที่นี้เราจะลองดูค่าของตัวแปรโดยการเลื่อนเมาส์ไปวางที่ตัวแปรที่สนใจในโปรแกรม ซึ่ง Dev-c++ จะ Add watch ชื่อตัวแปรนี้โดยอัตโนมัติ


6. จากนั้นเราสามารถเลือก Debug/Next step เพื่อดีบักแต่ละขั้นตอนของโปรแกรม พร้อมๆกันดูค่าของตัวแปรที่สนใจได้
7. สามารถหยุดการดีบัก โดยเลือกเมนู Debug/Stop execution

Saturday, June 21, 2008

Image Processing ด้วย C# 2

คราวนี้เราจะลองมาดูวิธีการเข้าถึง pixel ของรูปบ้าง ซึ่งโดยทั่วไปมีสามวิธีคือ
  1. ใช้ฟังก์ชัน Bitmap.GetPixel และ Bitmap.SetPixel วิธีนี้จะง่ายที่สุด แต่มีข้อจำกัดคือ ใช้ได้กับรูปที่เป็นแบบ RGB เท่านั้น และ การประมวลผลค่อนข้างช้า
  2. ใช้ pointer เข้าไปจัดการกับค่าของ pixel ในหน่่วยความจำโดยตรง ข้อดีคือเป็นวิธีที่เร็วที่สุด แต่ถือว่าเป็น unsafe code ก่อนคอมไพล์ต้องไปกำหนดรูปแบบให้ยอมรับ unsafe code ด้วย
  3. ทำการสำเนาค่าค่าของ pixel ในหน่่วยความจำ มาเก็บไว้ในตัวแปรชุด จากนั้นก็ประมวลผลค่าของ pixel ให้เสร็จเรียบร้อย จึงค่อยสำเนาค่าตัวแปรชุด กลับไปทับค่าของ pixel ในหน่่วยความจำ
วันนี้เราจะลองใช้วิธีแรกครับ
เป้าหมาย
สร้างฟังก์ชันในการกลับสี (Invert, Negative)


เมื่อ Invert เสร็จ


หลักการ
การ Invert ก็คือการนำค่าสูงสุดของสี มาหักลบด้วยค่าของ pixel นั้น เช่น
p = 255 - p

รหัสโปรแกรมก็จะเป็นประมาณนี้ครับ


เสร็จแล้วครับ หากจะเรียกใช้งานฟังก์ชันนี้จากฟอร์มหลัก อย่าลืมใช้คำสั่ง this.Invalidate() เพื่อให้ฟอร์มรีเฟรชด้วยนะครับ

Image Processing ด้วย C# 1

ในบทแรกนี้เราจะทำการเปิดไฟล์ภาพแล้วแสดงผล
เป้าหมาย



ขั้นตอน
สมมติว่าเราสร้างเมนูเรียบร้อยแล้ว

1. ประกาศตัวแปรสำหรับเก็บภาพ เป็นตัวแปรคลาส
private Bitmap bmp;

2. ในส่วนของเมนู Open ให้เพิ่มรหัสโปรแกรมดังนี้
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
 //Call open dialog
 OpenFileDialog openFileDialog = new OpenFileDialog();
 // Default Initial directory
 openFileDialog.InitialDirectory = "c:\\";
 // File type filter
 openFileDialog.Filter = "Bitmap files (*.bmp)|*.bmp|Jpeg files (*.jpg)|*.jpg|PNG files (*.png)|*.png|All valid files (*.bmp/*.jpg/*.png)|*.bmp/*.jpg/*.png";
 // Set png to be a default format
 openFileDialog.FilterIndex = 3;
 openFileDialog.RestoreDirectory = true;
  
 // if click OK to open image
 if (DialogResult.OK == openFileDialog.ShowDialog())
 {
  // Load bitmap from file
  bmp = (Bitmap)Bitmap.FromFile(openFileDialog.FileName, false);
  // set width and height of form, compensate for menubar
  this.Width = bmp.Width + 5;
  this.Height = bmp.Height + 55;
  // invoke paint method
  this.Invalidate();
 }
}

3. เพิ่ม Event ชื่อ Paint ให้กับฟอร์ม
แล้วเพิ่มรหัสโปรแกรมดังนี้
private void Form1_Paint(object sender, PaintEventArgs e)
{
 // if image file does not exist
 if (bmp == null)
 return;
  
 // else draw image to form
 Graphics g = e.Graphics;
 Rectangle r = new Rectangle(0, 25, bmp.Width, bmp.Height);
 g.DrawImage(bmp, r);
}

เรียบร้อยแล้วครับ

Friday, June 13, 2008

จัดการกับ radioButton หลายๆอัน

ถ้าใช้ radioButton หลายๆอันในฟอร์ม

เบื่อไหมครับที่จะต้องเขียนโค้ด เช่น
if(radioButton1.Checked)
.....
else if(radioButton2.Checked)

.....

ลองใช้วิธีนี้ไหมครับ
ให้คลิกที่ radioButton อันแรก จากนั้นกดแป้น Ctrl ค้างไว้แล้วคลิก radioButton ที่เหลือ
จากนั้นก็เลือก Event ชื่อ CheckedChanged แล้วพิมพ์ชื่อ radioChange แล้วกดแป้น Enter

ที่เหลือก็แก้ไขรหัสโปรแกรมดังนี้ครับ
string sradio;

public Form1()
{
 InitializeComponent();
}

private void radioChange(object sender, EventArgs e)
{
 //cast sender object to radiobutton
 RadioButton radioFood = (RadioButton)sender;
 if (radioFood.Checked)
 sradio = radioFood.Text;
}

private void bttOK_Click(object sender, EventArgs e)
{
 MessageBox.Show("คุณเลือก "+sradio,"รายการที่คุณเลือก",MessageBoxButtons.OK, MessageBoxIcon.Information);
}

ตรวจสอบการป้อนข้อมูลด้วย Validation (2)

ในตัวอย่างที่แล้ว http://surapongu.blogspot.com/2008/06/validation.html
เราได้ตรวจสอบการป้อนข้อมูล แล้วแสดงผลเตือนด้วย MessageBox

ยังมีคอนโทรลอีกตัวหนึ่งที่สามารถใช้ได้ในกรณีนี้ คือ


ทดลองเปิดโปรเจคเดิม แล้วดับเบิลคลิกที่คอนโทรลตัวนี้ มันจะไม่แสดงผลออกมาบนฟอร์มโดยตรง แต่ปรากฎอยู่ข้างใต้แทน

จากนั้นให้แก้โค้ดในบรรทัดที่แสดงผลข้อผิดพลาด จาก
MessageBox.Show("กรุณาป้อนตัวเลขเท่านั้น");

เป็น
errorProvider1.SetError(txtInput, "กรุณาป้อนตัวเลขเท่านั้น");

โดยที่ errorProvider1 เป็นชื่อของคอนโทรล errorProvider

ผลลัพธ์ที่ได้ เมื่อป้อนข้อมูลผิดพลาด จะเกิดปุ่มสีแดงกะพริบเตือนข้างๆ textBox

เลือกใช้ตามใจชอบครับ