การทำเครื่องคิดเลขนั้นไม่ใช่การเขียนโปรแกรมที่หนักหนาอะไร เพียงแต่เป็นการฝึกการใช้แนวคิด ทดสอบความเข้าใจ ในเรื่อง Operator และ ตัวแปรเก็บค่า (Variable) ยังไม่ได้แตะหลักการใดๆ ในการทำงานโปรแกรมจริงๆกันเลย
จากนี้ผู้เขียนจะเขียนโปรแกรมเครื่องคิดเลขด้วยการทำงานง่ายๆ โดยผู้เขียนจะใช้ Delphi Version 2010 ในการสาธิต
แน่นอนว่าต้องสร้าง GUI ของเครื่องคิดเลขเสียก่อน ตามภาพครับ
Form1 และชื่อ Control ที่สำคัญ |
Control Edit ที่ใช้แสดง Operator |
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.
พี่ค่ะ มันขึ้นแบบนี้อ่ะค่ะ
ตอบลบcannot find implementation of method setOPR
ต้องทำยังไงค่ะ
ภาวนาให้ พี่เจ้าของบล็อกเข้ามาดูแล้วตอบให้ด้วยนะค่ะ สาธุ!!!
มันบอกว่าหาตัว method ไม่เจอครับ อย่าลืมใส่ method ให้ครบครับ
ลบ