Most popular

วันอังคารที่ 24 พฤษภาคม พ.ศ. 2554

สอนน้องทำเครื่องคิดเลขด้วย Delphi

น้องๆที่หัดเขียนโปรแกรม หรือกำลังศึกษาอยู่ บางคนก็ยังไม่ผ่านกับแนวคิดการทำเครื่องคิดเลขเสมือนจริง
การทำเครื่องคิดเลขนั้นไม่ใช่การเขียนโปรแกรมที่หนักหนาอะไร เพียงแต่เป็นการฝึกการใช้แนวคิด ทดสอบความเข้าใจ ในเรื่อง Operator และ ตัวแปรเก็บค่า (Variable) ยังไม่ได้แตะหลักการใดๆ ในการทำงานโปรแกรมจริงๆกันเลย

จากนี้ผู้เขียนจะเขียนโปรแกรมเครื่องคิดเลขด้วยการทำงานง่ายๆ โดยผู้เขียนจะใช้ Delphi Version 2010 ในการสาธิต
แน่นอนว่าต้องสร้าง GUI ของเครื่องคิดเลขเสียก่อน ตามภาพครับ

Form1 และชื่อ Control ที่สำคัญ
 
Control Edit ที่ใช้แสดง Operator
โครงสร้างของ Class และ Interface

  TForm1 = class(TForm)
    ResultDisplay: TEdit; //จอแสดงผล
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    clearBtn: TButton; //ปุ่มเคลียร์ค่า
    Button11: TButton;
    amountBtn: TButton; //ปุ่ม =
    PLUSBTN: TButton; //ปุ่ม +
    MINUSBTN: TButton; //ปุ่ม -
    MULTIPLYBTN: TButton; //ปุ่ม * (คูณ)
    DIVBTN: TButton; //ปุ่ม % (หาร)
    oprDisplay: TEdit; //แสดงผล Operator
    Button13: TButton;
    //method ที่ใช้แทน event ทั้งหมดของปุ่ม Operator ต่างๆ
    procedure setOPR(Sender: TObject);
    //method ที่ใช้แทน event ของปุ่มตัวเลข และจุด
    procedure setNumber(Sender: TObject);
    
    procedure clearBtnClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure amountBtnClick(Sender: TObject);
  private
    { Private declarations }
    opr: char;  //เก็บค่า Operator
    tempRes: double; //เก็บผลการคำนวณ
  public
    { Public declarations }
  end;

method ที่สำคัญ 2 method คือ setOPR และ setNumber ในส่วนของ Implement Code ตามนี้


procedure TForm1.setOPR(Sender: TObject);
begin
     //ถ้าไม่ได้ระบุ Operator ให้ คำนวณผลลัพธ์ก่อน
     if Self.opr<>' ' then Self.amountBtn.Click;
     
     //ตรวจสอบว่ากดปุ่ม Operator ใด
     if TButton(Sender)=Self.PLUSBTN then Self.opr:='+' else
     if TButton(Sender)=Self.MINUSBTN then Self.opr:='-' else
     if TButton(Sender)=Self.MULTIPLYBTN then Self.opr:='x' else
     if TButton(Sender)=Self.DIVBTN then Self.opr:='%' ;


     //แสดง Operator ให้ผู้ใช้เห็น
     Self.oprDisplay.Text:=Self.opr;


     //เก็บค่าเก่าที่แสดงค้างอยู่
     Self.tempRes:=StrToFloat(Self.ResultDisplay.Text);
     //ล้างค่าที่แสดงอยู่
     Self.ResultDisplay.Text:='';
end;


จากนั้นกำหนดให้ Event OnClick ของปุ่ม Operator ทั้งหมด 4 ปุ่ม คือ บวก ลบ คูณ หาร ใช้ method setOPR



procedure TForm1.setNumber(Sender: TObject);
Var
     Value: String;
begin
     //เก็บค่า Caption ของปุ่มที่โดนกด
     Value:=TButton(Sender).Caption;


     //ตรวจสอบว่า Caption เป็น . (dot) หรือไม่
     if Value='.' then
     Begin
        //ถ้าเป็น . (dot) และมีอยู่ในการแสดงผลแล้ว ให้จบการทำงานทันที
        if  PosEx('.',Self.ResultDisplay.Text,1) > 0 then Abort;
     end;


     //เพิ่ม Caption เพื่อแสดงผล
     Self.ResultDisplay.Text:=Self.ResultDisplay.Text+Value;
end;

จากนั้นก็กำหนดให้ Event OnClick ทั้ง 11 ปุ่ม คือ 0 ถึง 9 และ . (dot) ใช้ method setNumber


สิ่งที่ไม่ควรลืมก็คือ การให้ค่าเริ่มต้น (Default) กับตัวแปร (Variable) ที่เป็น Member ของ Class ด้วย


procedure TForm1.FormCreate(Sender: TObject);
begin
     Self.tempRes:=0;
     Self.opr:=' ';
end;

Code ภายในปุ่มเคลียร์ค่าก็ไม่มีอะไรมาก แค่ให้ค่าทุกอย่างตั้งต้นใหม่่


procedure TForm1.clearBtnClick(Sender: TObject);
begin
     Self.ResultDisplay.Text:='0';
     Self.tempRes:=0;
     Self.opr:=' ';
end;

ส่วนของผลลัพธ์ หรือปุ่ม = ให้คำนวณค่าเป็นทศนิยมได้


procedure TForm1.amountBtnClick(Sender: TObject);
begin
     if Self.opr='+' then Self.tempRes:=Self.tempRes + StrToFloat(Self.ResultDisplay.Text) else
     if Self.opr='-' then Self.tempRes:=Self.tempRes - StrToFloat(Self.ResultDisplay.Text) else
     if Self.opr='x' then Self.tempRes:=Self.tempRes * StrToFloat(Self.ResultDisplay.Text) else
     if Self.opr='%' then Self.tempRes:=Self.tempRes / StrToFloat(Self.ResultDisplay.Text) ;


     Self.oprDisplay.Text:='';
     Self.opr:=' ';
     Self.ResultDisplay.Text:=FormatFloat('#,##0.00',Self.tempRes);
end;


ทดสอบรันโปรแกรมเป็นอันเสร็จสิ้นการเขียนโปรแกรมเครื่องคิดเลขแบบง่ายๆ รวบรัด

ทดสอบ 5 + 0.5= 5.50
ทดสอบ 23.88 + 14.30 + 8 = 46.18

Source Code ของ Unit1.pas(Form1)

unit Unit1;


interface


uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,StrUtils;


type
  TForm1 = class(TForm)
    ResultDisplay: TEdit;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    clearBtn: TButton;
    Button11: TButton;
    amountBtn: TButton;
    PLUSBTN: TButton;
    MINUSBTN: TButton;
    MULTIPLYBTN: TButton;
    DIVBTN: TButton;
    oprDisplay: TEdit;
    Button13: TButton;
    procedure setOPR(Sender: TObject);
    procedure setNumber(Sender: TObject);
    procedure clearBtnClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure amountBtnClick(Sender: TObject);
  private
    { Private declarations }
    opr: char;
    tempRes: double;
  public
    { Public declarations }
  end;


var
  Form1: TForm1;


implementation


{$R *.dfm}


{ TForm1 }


procedure TForm1.setNumber(Sender: TObject);
Var
     Value: String;
begin
     Value:=TButton(Sender).Caption;


     if Value='.' then
     Begin
        if  PosEx('.',Self.ResultDisplay.Text,1) > 0 then Abort;
     end;


     Self.ResultDisplay.Text:=Self.ResultDisplay.Text+Value;
end;


procedure TForm1.setOPR(Sender: TObject);
begin
     if Self.opr<>' ' then Self.amountBtn.Click;
     
     if TButton(Sender)=Self.PLUSBTN then Self.opr:='+' else
     if TButton(Sender)=Self.MINUSBTN then Self.opr:='-' else
     if TButton(Sender)=Self.MULTIPLYBTN then Self.opr:='x' else
     if TButton(Sender)=Self.DIVBTN then Self.opr:='%' ;


     Self.oprDisplay.Text:=Self.opr;
     Self.tempRes:=StrToFloat(Self.ResultDisplay.Text);
     Self.ResultDisplay.Text:='';
end;


procedure TForm1.clearBtnClick(Sender: TObject);
begin
     Self.ResultDisplay.Text:='0';
     Self.tempRes:=0;
     Self.opr:=' ';
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
     Self.tempRes:=0;
     Self.opr:=' ';
end;


procedure TForm1.amountBtnClick(Sender: TObject);
begin
     if Self.opr='+' then Self.tempRes:=Self.tempRes + StrToFloat(Self.ResultDisplay.Text) else
     if Self.opr='-' then Self.tempRes:=Self.tempRes - StrToFloat(Self.ResultDisplay.Text) else
     if Self.opr='x' then Self.tempRes:=Self.tempRes * StrToFloat(Self.ResultDisplay.Text) else
     if Self.opr='%' then Self.tempRes:=Self.tempRes / StrToFloat(Self.ResultDisplay.Text) ;


     Self.oprDisplay.Text:='';
     Self.opr:=' ';
     Self.ResultDisplay.Text:=FormatFloat('#,##0.00',Self.tempRes);
end;


end.

2 ความคิดเห็น:

  1. พี่ค่ะ มันขึ้นแบบนี้อ่ะค่ะ
    cannot find implementation of method setOPR
    ต้องทำยังไงค่ะ
    ภาวนาให้ พี่เจ้าของบล็อกเข้ามาดูแล้วตอบให้ด้วยนะค่ะ สาธุ!!!

    ตอบลบ
    คำตอบ
    1. ไม่ระบุชื่อ11 เมษายน 2556 เวลา 10:58

      มันบอกว่าหาตัว method ไม่เจอครับ อย่าลืมใส่ method ให้ครบครับ

      ลบ