หน้าแรก
 การบ้าน
  C/C++ new
  Java new
 Sourcecode.TV
  Android
  Blackberry
  C/C++
  Java
  Linux
  Windows Phone
  แจ้งเรื่องที่ต้องการ
 บทความ
  .NET
  Android
  Blackberry
  C++Builder
  Delphi
  Java
  Mobile
  Open Source
  Pocket PC
  Visual Basic
  Web
  Windows Phone
  Others
 แบบเรียนฟรี
  ASP
  ASP.NET Webmatrix
  C++
  eVB
  J2ME
  Java
  PHP
 ซอร์สโค้ด
  Android
  ASP
  C++
  VC++
  CGI-Perl
  Delphi
  Java
  jQuery
  PHP
  Visual Basic
  .NET
 บริการจากเรา
  เปิดท้าย... ขายโค้ด
  DoodeeHosting
  รับออกแบบ พัฒนาเว็บไซต์
  Freeware
  อัตราค่าโฆษณา
  รายชื่อลูกค้า
  สถิติผู้เข้าเว็บ
 ดาว์นโหลด
 ค้นหาข้อมูล
 กระดานสนทนา
  .NET
  C/C++
  Delphi
  Java
  Palm/PocketPC
  Visual Basic
  Web
  อื่นๆ
 กระดานงาน
 ลิงค์เว็บ
 เกี่ยวกับผม
 อัตราค่าโฆษณา
Social Network

Facebook  Twitter  YouTube
 New Article
 Webboard
 Freelanceboard
Freeware
โปรแกรมเบอร์ดี (BerDee)
โปรแกรมเบอร์ดี (Android)
เกมส์เป่ายิ้งฉุบ
เกมส์เป่ายิ้งฉุบ(Android)
WebcamMonitor
WebcamMonitor(Windows)
scSendMail
scSendMail(Windows)
MSN Caption
MSN Caption(Windows)
  Freelance comment
  ติดต่อสอบถามมาได้ตลอดนะครับ...
2015-07-29 13:35:58
  ถ้าผมต้องการเว็บที่พัฒนาด้วย HTML5 ...
2015-01-18 15:33:54
  ถ้าผมต้องการเว็บที่พัฒนาด้วย HTML5 ...
2015-01-18 15:32:51
  ติดต่อสอบถามเข้ามาได้นะคับ
งานเล...

2014-01-06 12:47:38
  ถ้ายังหาคนสอนไม่ได้ ก็ลองศึกษาเองได...
2013-07-06 01:04:37
  สนใจส่งขอบเขตมาคุยราคาก่อนได้นะคับ...
2013-03-24 18:54:20
  ถ้ายังไม่มีคนรับงานติดต่อได้ครับ 08...
2012-12-16 19:18:14
  สนใจคะ ติดต่อ 0905076277...
2012-11-12 11:07:46
  รับทำโปรเจ็คนักศึกษาหรือบริษัท
ส...

2012-10-29 03:10:46
  sukit_te34@hotmail.com...
2012-10-29 03:09:36
  Webboard comment
  ถ้าเขียน php ก็ใช้ curl ส่...
2017-04-20 01:04:20
  เขียนโค้ดไม่เป็น เอาโค้ดไป ...
2017-03-27 12:50:54
  คือสงสัยว่าทำไม ต้องอัพเดทด...
2017-03-27 12:37:20
  ทดสอบการตอบ...
2017-02-22 13:10:24
  ลองอีกวิธีเขียน recursive f...
2017-02-14 13:11:03
  อยากได้ โค้ดระบบห้องสมุดมาก...
2017-01-30 11:45:28
  ทำ for-loop ซ้อนกัน
โดย...

2017-01-28 16:00:12
  เดาว่าใช้ Stack เข้ามาช่วย...
2017-01-28 15:57:09
  ยืมเสร็จแล้ว ก็เอามาคืนด้วย...
2016-10-27 14:56:42
  ยืมโค้ดหน่อยครับ...
2016-10-27 14:49:44
  Homework comment
  ทำเอง งง เอง กะลังทำใหม่ค่ะ ^^...
2017-04-18 18:40:46
  ทำเอง งง เอง กะลังทำใหม่ค่ะ ^^...
2017-04-18 18:37:54
  ประเด็นแรก flowchart มันไม่มีภ...
2017-04-18 17:43:33
  อยากได้ flowchart ค่ะ เป็นภาษา...
2017-04-18 16:25:29
  kungking คำถามคืออะไรครับ ?...
2017-03-18 23:28:36
  จงเขียนโปรแกรมแสดงผลรวมของตัวเ...
2017-03-06 10:56:25
  ก็โค้ดทำงานคล้ายๆแบบนี้หละ แต่...
2016-09-06 01:00:12
  ผมอยากทราบว่าโค้ดนับถอยหลังเป็...
2016-09-05 09:31:27
  ได้โค้ดแล้ว ลองศึกษาแล้วเขียนผ...
2016-04-22 00:47:49
  ขอแผนผังของโปรแกรมนับตัวอักษรภ...
2016-04-21 19:24:55
  Article comment
  ครับ คุณ "ติด" แล้วลองนึกต่อว่...
2016-06-18 15:21:09
  vs2008 c# ครับ ขอบคุณครับ...
2016-06-17 14:39:30
  ผมใช้ vs c# ทำตามทุขั้นตอนแต่ต...
2016-06-17 14:37:44
  ต้องวิเคราะห์ครับ "ว่าจริงๆ ส่...
2016-03-12 23:36:05
  ผมส่งข้อความในวง LAN ได้เฉพาะค...
2016-03-12 18:25:42
  โปรแกรม Terminal บน Mac ก็เป็น...
2016-02-16 11:02:01
  โปรแกรม Terminal คืออะไรหรอคะ...
2016-02-16 05:58:21
  ไปตั้ง โครงการไว้เลยครับ ที่
2016-01-25 13:29:55
  ด่วน!!! ต้องการคนเขียน App โดย...
2016-01-25 10:56:34
  ผมได้ทำตามคำแนะนำจนสิ้นสุดแล้ว...
2016-01-20 23:30:25
  9Mcode comment
  อยากได้...
2014-02-21 08:52:19

Link Exchange

อัตราค่าโฆษณา
Statistics of Sourcecode in Thailand
 
Dynamic Cast ใน C++ Builder (อ่าน 15,645)
บทความโดย Artist / syootakarn@hotmail.com 

- - - - - - - - - - - - - - ผู้ให้การสนับสนุน- - - - - - - - - - - - - -

 
 
Freelanceรับพัฒนาโปรแกรม และเว็บ โดย 9'M 


จากประสบการณ์ที่เคยผมโปรแกรมโดยใช้ Develop Tools มาหลายตัว (ไม่ขอเอ่ยชื่อนะครับเดี๋ยวจะหาว่าขี้โม้ อิอิ ) การเขียน โปรแกรมให้สั้น และกระชับที่สุด เป็นสิ่งจำเป็นอย่างมาก ทั้งนี้เพื่อให้ผู้พัฒนา โปรแกรมสามารถ อ่านทำความเข้าใจ กับคำสั่ง ได้ง่ายขึ้น เนื่องจากคำสั่งที่ต้องแยกแยะ หรือตีความมีน้อย ในบทความนี้ ผมจะแนะนำ การเขียนโปรแกรม โดยนำหลักการ Dynamic Cast มาประยุกต์ใช้ ดูกันที่ละตัวเลยนะครับ


จากรูปจะเห็นว่ามี Component วางอยู่บน Form ทั้งหมด 5 ตัว สมมติว่าผมต้องการให้ทุกตัวตอบรับ OnClickEvent ผมสามารถทำได้หลายๆ วิธีดังนี้

  • กำหนดให้ทุกตัวเรียกใช้ OnClickEvent แยกคนละตัว
  • ให้ทุกเรียกใช้ OnClickEvent ของตัวใดตัวนึง ซึ่งหมายความว่าให้มีการเรียกใช้ฟังก์ชั่นเพียงตัวเดียวทำให้ประหยัดเนื้อที่หน่วยความไปได้เยอะ
  • ดักจับ Message โดยประยุกต์ใช้ static function มาตรฐาน เช่น WinMain, UMSpecialMessage, WindowProc ฯลฯ คอยดักจับ Message แล้ว Broadcast คำสั่งส่งไปให้ Component อีกทีนึง ฟังก์ชั่นที่กล่าวมาทั้งหมดนี้ ความจริงมีอยู่หลายตัวครับ แต่ส่วนใหญ่จะถูกซ่อนเอา ถ้าต้องการใช้ก็ต้องไป Declare เอง เอาไว้โอกาสหน้าผมจะเขียนเป็นบทความให้อ่านกันนะครับ
  • ประยุกต์ใช้วิธีการต่าง ๆ ที่กล่าวมาโดยใช้หลักการ Dynamic Cast ที่ต้องแยกเป็นอีกหัวข้อเพราะว่าบางทีคุณอาจจะอ้างถึงตัวแปรหรือ Component นั้นโดยตรงก็ได้
  • ฯลฯ

ในบทความนี้เรามาพูดถึง Dynamic Cast กันนะครับ ใน Project ด้านบนที่ Main Form ของเรา สมมติคุณกำหนดให้ Component ทุกตัวยกเว้นคอมโพเน้นท์ Label1 มีการเรียกใช้ OnClickEvent ตัวเดียวกันในที่นี้คือ Button1Click โดยใน Button1Click เป็นคำสั่งให้แสดงชื่อ Component ที่ถูก Click ให้เขียนคำสั่งดังนี้

?

void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(dynamic_cast< TButton * >(Sender))
{
Label1->Caption =
"คุณเลือก" + dynamic_cast< TButton * >(Sender)->Name;
}
else if(dynamic_cast< TButton * >(Sender))
{
Label1->Caption = "คุณเลือก" + dynamic_cast< TEdit * >(Sender)->Name;
}
}

?


จากตัวอย่างข้างบนผมใช้คำสงวนหรือเรียกว่า C++-Specific Keywords อย่าเข้าใจว่าตัวนี้เป็น Function นะครับ (โดยเนื้อแท้มันก็คือฟังก์ชั่นนั่นแหละครับ) พวกนี้เป็นคำสงวนที่มีอยู่ใน C++ เวลาเราเขียนโปรแกรม ห้ามตั้งชื่อ โดยใช้ชื่อคำสงวน เหล่านี้ คำสงวนเหล่าได้แก่ if ? else, switch .. case, int , void , __fastcall ฯ ดังนั้น dynamic_cast จึงเป็น คำสงวน หรือ keyword นั่นเอง

ในตัวอย่างข้างบน เราใช้คำสงวน dynamic_cast เพื่อตรวจตรวจว่า Sender ในที่นี้คือ TObject * ว่าเป็น TButton * หรือไม่ ถ้าใช่ก็ให้เข้ามาค่าที่ส่งกลับมาจะไม่ใช่ค่า NULL ดูตามคำสั่งข้างล่างในคำสั่ง if(dynamic_cast< TButton * >(Sender)) นะครับ จากนั้นถ้าเป็นไปตามเงื่อนไขก็ให้ Label1 แสดงชื่อ Component ที่ถูกเลือกนั้น

if(dynamic_cast< TButton * >(Sender))
{
Label1->Caption =
"คุณเลือก" + dynamic_cast< TButton * >(Sender)->Name;
}

จากตัวอย่างที่ผ่านมาคุณอาจจะสงสัยว่าถ้า if(dynamic_cast< TButton * >(Sender)) ตรวจสอบค่าว่าถ้าไม่ใช่ค่า NULL แสดงว่ามีการเลือก TObject แล้วทำการ cast อัตโนมัติตามนี้เลยได้มั้ย

void __fastcall TForm1::Button1Click(TObject *Sender)
{
Label1->Caption =
"คุณเลือก" + dynamic_cast< TButton * >(Sender)->Name;
}


คำตอบคือไม่ได้ครับเพราะว่า TObject ไม่ได้มีแต่ TButton เท่านั้น ในที่นี้เป็นได้ทั้ง TEdit ด้วย จากตัวอย่างเมื่อคุณทดลอง Run โปรแกรมโปรแกรมจะแสดง error ถ้าคุณ Click เม้าส์ที่ TEdit ที่ error ก็เพราะว่าคำสั่ง dynamic_cast< TButton * >(Sender) ได้ค่า retrun ค่า NULL กลับคืนมา นั่นหมายความว่าไม่มีการ Click ที่ Object ใด แต่จริง ๆ แล้วคุณ Click ที่ TEdit (ห้ามงงนะครับ) จากนั้นคำสั่ง สั่งให้แสดงชื่อหรือ Name ของ Object ซึ่งก็คือ dynamic_cast< TButton * >(Sender)->Name; ให้โปรแกรมแสดงข้อผิดพลาดออกมา

เมื่อกี้เราใช้คำสงวน dynamic_cast เพื่อทำการ Cast คำสั่งแล้วนะครับ ต่อไปเรามาดูอีกตัวอย่างนึงนะครับเป็นการ Dynamic Cast เหมือนกัน

void __fastcall TForm1::Button1Click(TObject *Sender)
{
if( Sender == Button1 || Sender == Button2 || Sender == Button3 )
{
Label1->Caption =
"คุณเลือก" + dynamic_cast< TButton * >(Sender)->Name;
}else if( Sender == Edit1)
{
Label1->Caption = "คุณเลือก " + dynamic_cast < TEdit * >(Sender)->Name;
}
}

จากตัวอย่างใช้การตรวจสอบ Handle ของ Sender ว่ามีค่าเท่ากับ Object ที่เราต้องการหรือไม่ในที่นี้คือ if( Sender == Button1 || Sender == Button2 || Sender == Button3 ) และ else if( Sender == Edit1) ถ้าใช่ให้ทำคำสั่งที่เราระบุ ในตัวอย่างนี้เรายังใช้คำสงวนอยู่นะครับ มาดูตัวอย่างอีกตัวนึงนะครับ

void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(((TButton *)(Sender)))
{
Label1->Caption = "คุณเลือก" + ((TButton *)(Sender))->Name;
}
}

จากตัวอย่างข้างบนจะเห็นว่าผมทำการตรวจสอบก่อนว่า Sender ไม่ใช่ค่า NULL จากนั้นถ้าใช่ ให้ Label1 แสดงชื่อ Name ของ Object ที่ถูก Click โดยการใช้ Cast โดยการระบุชื่อ Object โดยตรงในที่นี้ก็คือคำสั่ง ((TButton *)(Sender)) จากตัวอย่างผู้อ่านอาจจะสงสัยว่าทำไมผมไม่ตรวจสอบก่อนว่า Object ที่ถูก Click เป็น TButton หรือ TEdit ด้วยหละ คำตอบก็คือในที่นี้ Name Property หรือ ชื่อของ Object ที่เราใช้มันใช้หลักการของ Virtual Function ครับ
การใช้คำสั่ง ((TButton *)(Sender))->Name เป็นการอ้างถึง Property ชื่อ Name การเรียกใช้งานคำสั่ง นี้คุณต้องแน่ใจว่า Object ที่คุณเรียกใช้มี Property ชื่อว่า Name อยู่ด้วยนะครับ มิเช่นนั้นจะเกิดข้อผิดพลาดขึ้นได้ครับ จากตัวอย่างข้างบน ผมสามารถแก้ไขได้ดังนี้ครับ ออกจะยาวนิดนึง

if(((TButton *)(Sender)))
{
if( Sender->ClassNameIs("TButton"))
Label1->Caption = "คุณเลือก" + ((TButton *)(Sender))->Name;
else if( Sender->ClassNameIs("TEdit"))
Label1->Caption = "คุณเลือก" + ((TEdit *)(Sender))->Name;
}


หรือจะใช้คำสั่งดังนี้ก็ได้

if(((TButton *)(Sender)))
{
if(Sender->ClassNameIs(Button1->ClassName()))
Label1->Caption = "คุณเลือก" + ((TButton *)(Sender))->Name;
else if(Sender->ClassNameIs(Edit1->ClassName()))
Label1->Caption = "คุณเลือก" + ((TEdit *)(Sender))->Name;
}

 

- - - - - - - - - - - - - - ผู้ให้การสนับสนุน- - - - - - - - - - - - - -

สอบถาม
  • ห้ามการโฆษณา หากต้องการติดต่อหาลูกค้า ติดต่อโฆษณาโดยตรงได้ที่ webmaster@sourcecode.in.th
  • ห้ามใช้คำหยาบและคำพูดที่ไม่เหมาะสม
  • ขอสงวนสิทธิหากตรวจพบ ข้อความที่ไม่เหมาะสม ข้อความนั้นจะถูกลบทันที
ชื่อ
อีเมล์
รายละเอียด

 
 
สายต่อจอ สำหรับเครื่อง macbook pro 2016 (usb-c to HDMI)
สายต่อจอ สำหรับเครื่อง macbook pro 2016 (usb-c to HDMI) ความละเอียดระดับ 4K
หัวแปลง Mini DisplayPort to HDMI Adapter หัวแปลง Mini DisplayPort to HDMI Adapter สำหรับเครื่อง macbook air/pro, mac mini
หัวแปลง Mini DisplayPort to HDMI Adapter สำหรับเครื่อง macbook air/pro, mac mini
สายต่อหูฟัง และชาร์จไฟ สำหรับ iPhone 7 และ 7 Plus
สายต่อหูฟัง และชาร์จไฟ สำหรับ iPhone 7 และ 7 Plus
หัวแปลงจาก USB-C Type ไปเป็น USB 3.1 สำหรับ MacBook
หัวแปลงจาก USB-C Type ไปเป็น USB 3.1 สำหรับ MacBook
ไขควงสำหรับเครื่อง Macbook Air/Pro
ไขควง สำหรับแกะเครื่อง Macbook Air/Pro (300บาท)
HDMI เข้า 3 ออก  1 มีรีโมท
HDMI เข้า 3 ออก 1 มีรีโมท (350บาท)
คลิปสอนเขียนโปรแกรม
เรียนเขียนโปรแกรมดอทเน็ต
เรียนเขียนโปรแกรมแอนดรอยด์
เรียนเขียนโปรแกรมเบล็คเบอร์รี่
เรียนเขียนโปรแกรมซี ซีพลัสพลัส
เรียนเขียนโปรแกรมจาวา
เรียนการใช้งานลินุกส์
เรียนการเขียนโปรแกรมวินโดว์โฟน
เรียนการเขียนโปรแกรมพีเฮชพี มายเอสคิวเอล
9M Blog บอกเล่าเรื่องราว การเขียนโปรแกรมของ นายเอ็ม
บริการ ถ่ายภาพรับปริญญา
OrmSin.com: ขายหนังสืองานฝีมือไทย-ญี่ปุ่น-จีน (country crafts)
อัตราค่าโฆษณา
 
บทความที่เกี่ยวข้อง

การซ่อนโปรแกรมไม่ให้แสดง Icon บน Taskbar

จะรู้ได้อย่างไรว่าโปรแกรมที่เราสร้างเรียกใช้ DLL ตัวไหนบ้าง

การนำ MFC Project ของ Microsoft Visual C++ มาใช้งานใน Borland C++ Builder

Borland Delphi & C++ Builder History

แสดงรายชื่อ Parent Class ของ Component

การตั้งค่าให้ CPPWebBrowser ให้สามารถใช้งาน Hotkey Cut ,Copy, Paste ได้

โปรแกรมแสดงตัวอย่าง Font

เพิ่มความเร็วในการ Build โปรแกรมของ C++ Builder โดยใช้เทคนิค Pre-Compiled Headers
Tutorial
eVB Tutorial
ASP.NET Webmatrix Tutorial
J2ME Tutorial
C++  Tutorial
Java  Tutorial
PHP Tutorial
ASP Tutorial
 
แบบสำรวจ
Freelance รับพัฒนาโปรแกรม

Home - Article - Tutorial - Sourcecode - Dev Handbook - Search - WebBoard - Links - About Us

สงวนลิขสิทธิ์ ห้ามคัดลอก ทำซ้ำ แก้ไข ดัดแปลง ไม่ว่าในรูปแบบใด โดยไม่ได้รับอนุญาตเป็นลายลักษณ์อักษร
เลขทะเบียนพาณิชย์อิเล็กทรอนิกส์จากกระทรวงพาณิชย์: 7100503002000
Copyright 2001 SourceCode.in.th