ตุลาคม 18, 2017, 11:35:14 pm *
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน
ส่งอีเมล์ยืนยันการใช้งาน?

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
   หน้าแรก   ช่วยเหลือ เข้าสู่ระบบ สมัครสมาชิก  
หน้า: [1]   ลงล่าง
  พิมพ์  
ผู้เขียน หัวข้อ: อยากรู้ไหม ปุ่มไหนถูกกด (C++ Builder)  (อ่าน 8781 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8267


ShadowWares


| |
« เมื่อ: มีนาคม 29, 2010, 07:36:10 am »




มีโปรแกรมบางโปรแกรมที่อาจจะต้องออกแบบให้มีปุ่มกด (Button) หรือ Component อื่นๆอยู่บน Form จำนวนมาก
และบ่อยครั้งจำเป็นต้องรู้ว่า Component ตัวไหนถูกคลิก แน่นอนว่า Component ออกแบบไว้ให้รองรับการถูกคลิก
มีอยู่หลายตัวเช่น Button, CheckBox, RadioBox เป็นต้น  Components เหล่านี้มี Event ของตัวเองรองรับอยู่แล้ว
อยากจะทำอะไรก็เข้าไปทำใน Function ที่ชื่อว่า OnClick ก็เสร็จเรียบร้อยแล้ว แต่.... ถ้าปุ่มกดมีเป็นร้อยๆปุ่มล่ะ อันนี้แน่นอน
ก็ต้องมี OnClick Function ถึง 100 Functions แบบนี้ไม่สนุกแล้ว โปรแกรมจะยาว และเริ่มยุ่งเหยิง มาดูกันดีกว่าว่าจะจัดการปัญหาทำนองนี้กันอย่างไร

เพื่อไม่ให้เสียเวลา ของสร้าง Button จำนวน 100 ตัวไว้บน Form ก่อน ด้วยวิธีการแบบ Dynamic (ใครชอบลากมาวางเองก็ไม่ว่ากัน แต่ผมไม่!!!)

Code:
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
  const int maxx = 10;
  const int maxy = 10;
  for (int i=0, y=0; y!=maxy; ++y)
  {
    for (int x=0; x!=maxx; ++x, ++i)
    {
      TButton * bt = new TButton(this);
      bt->Caption = IntToStr(i);
      bt->Left = x * 30;
      bt->Top  = y * 30;
      bt->Tag  = i;
      bt->Height = 30;
      bt->Width  = 30;
      bt->OnClick = DynamicButtonClick;
      this->InsertControl(bt);
    }
  }
}

ผลที่ได้คือรูปด้านล่าง



ต่อไปใช้ความสามารถของ TWinControl เพื่อดึง Tag ของ Button ตัวที่ถูกคลิกออกมาแสดงผล บน MessageBox
Code:
void __fastcall TForm1::DynamicButtonClick(TObject *Sender)
{
  TWinControl * control = dynamic_cast<TWinControl*>(Sender);
  ShowMessage((String)"Button #"+IntToStr(control->Tag)+" Clicked");
}


ตอนนี้ลองคลิก Button ตัวที่ 44 จะมี MessageBox แสแสดงขึ้นมาดังรูปด้านล่าง



ลองโหลดไปคลิกกันดูที่ www.shadowwares.com/Shared/SDW_ControlTag.rar

ใครใช้ C++ Builder, Delphi, Visual Basic, Visual C++, C# แบบ Dialog Based (GUI Application) ลองเอาเทคนิคนี้ไปใช้ดูครับ code ของคุณอาจจะดูน่ารักและสวยงามขึ้นเยอะ
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
natural
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 2


| |
« ตอบ #1 เมื่อ: สิงหาคม 22, 2013, 03:52:22 am »

ขออนุญาตนะครับ คือผมเรียน C# อะนะครับ แล้ว Code ตรงนี้คือภาษา C++ (รึป่าวอะครับ)

พอดีผมกำลังหาเรื่องการ Dynamic Button อยู่อะนะครับ แล้วมาเจอกระทู้นี้

รบกวนช่วยอธิบายโค้ดนี้

__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
  const int maxx = 10;
  const int maxy = 10;
  for (int i=0, y=0; y!=maxy; ++y)
  {
    for (int x=0; x!=maxx; ++x, ++i)
    {
      TButton * bt = new TButton(this);
      bt->Caption = IntToStr(i);
      bt->Left = x * 30;
      bt->Top  = y * 30;
      bt->Tag  = i;
      bt->Height = 30;
      bt->Width  = 30;
      bt->OnClick = DynamicButtonClick;
      this->InsertControl(bt);
    }
  }
}

หน่อยได้มั้ยอะครับ

ขอบคุณมากครับ
บันทึกการเข้า
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8267


ShadowWares


| |
« ตอบ #2 เมื่อ: สิงหาคม 22, 2013, 10:43:56 am »

อ้างถึง
ขออนุญาตนะครับ คือผมเรียน C# อะนะครับ แล้ว Code ตรงนี้คือภาษา C++ (รึป่าวอะครับ)
ใช่ครับ

อ้างถึง
พอดีผมกำลังหาเรื่องการ Dynamic Button อยู่อะนะครับ แล้วมาเจอกระทู้นี้

รบกวนช่วยอธิบายโค้ดนี้
กำลังมองหาการเขียนโปรแกรมแบบ Dynamic แล้วยังอ่าน Code นี้ไม่ออก คิดว่ายังเร็วเกินไปที่จะมาศึกษาเรื่องนี้ครับ

บรรทัดไหนที่คุณไม่เข้าใจ?

บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
natural
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 2


| |
« ตอบ #3 เมื่อ: สิงหาคม 23, 2013, 02:28:24 am »

คือผมก้อไม่ได้มีความรู้เกี่ยวกับภาษา c++ เนื่องจากได้เรียนแต่ภาษา c# ต้องขอโทษด้วยครับ
แล้วผมก้อดูแนวทางจาก c++ มาแปลงเป็น c# อีกทีนึงอะครับ

- อันนี้ผมไม่ทราบ
bt->Caption = IntToStr(i);

- หมายความว่า ให้ Button ห่างจากด้านซ้าย ค่า x * 30 มันก้อจะเป็นค่าที ที่ Button จะถูกสร้าง (รึป่าว)
bt->Left = x * 30;

- หมายความว่า ให้ Button ห่างจากด้านบน ค่า y * 30 มันก้อจะเป็นค่าที ที่ Button จะถูกสร้าง (รึป่าว)
bt->Top  = y * 30;

- อันนี้ผมไม่ทราบ
bt->Tag  = i;

- เหมือนกับ Event เมาส์คลิกป่าวอะครับ
bt->OnClick = DynamicButtonClick;

คือผม Dynamic Button ได้ตามที่ต้องการ
แต่ไม่สามารถจัดให้อยู่ในที่ ที่ผมต้องการได้อะครับ

ขอบคุณครับ
บันทึกการเข้า
หน้า: [1]   ขึ้นบน
  พิมพ์  
 
กระโดดไป: