การใช้งาน button และ textbox

Object พื้นฐานที่สุดเลยในการสร้าง GUI ก็คงหนีไม่พื้น button กับ textbox นี่แหละครับ ดังนั้นเรามาเรียนรู้การสร้างทั้งสองอย่างนี้กันดีกว่าครับ

ก่อนอื่นมาดูกันก่อนครับว่า button กับ textbox อยู่ตรงไหน

หมายเลข 1 คือ push button หรือแปลแบบตรงตัวก็คือ "ปุ่มกด"
หมายเลข 2 คือ text box ซึ่งใน matlab จะแยก text box ออกเป็น 2 ประเภทคือ...
- Edit box (icon ด้านซ้าย) เป็นกล่องข้อความที่ user สามารถพิมพ์ข้อความใส่ได้
- Static text (icon ด้านขวา) เป็นกล่องข้อความที่เอาไว้แสดงข้อความเท่านั้น

การอ่านค่าและการกำหนดค่าให้ button และ text box

การอ่านค่าใช้คำสั่ง

A = get(handles.xxx, 'PropName');

การกำหนดค่าใช้คำสั่ง

set(handles.xxx, 'PropName', yyy);



โดยที่
xxx คือชื่อ tag ของ object (object หมายถึง button และ text box รวมทั้งเครื่องมืออื่นๆ ที่เราเอาใส่ไว้ในหน้า GUI)
PropName คือ ชื่อของ property ที่เราจะกำหนดค่า หรืออ่านค่า
A คือตัวแปรสำหรับเก็บค่าที่อ่านเข้ามาจาก PropName
yyy คือ ค่าที่เราจะกำหนดไปที่ PropName


ตัวอย่างการใช้งาน

ในตัวอย่างนี้ผมจะเอา button และ text box มาทำโจทย์ตัวอย่างง่ายๆ ให้ดูกันนะครับ นั่นก็คือการบวกเลข โดยจะสร้างหน้า GUI แบบนี้


เมื่อออกแบบหน้า GUI เสร็จแล้ว เราก็มาลงมือสร้างกันเลยครับ ก็จะได้หน้าตาประมาณนี้


ตัวหนังสือ tag: A, tag: B , tag: C , tag: X , tag: btCal ไม่ต้องเขียนนะครับ ผมแค่เขียนให้ดูว่า object แต่ละตัวมีชื่อ tag ว่าอะไรบ้าง เวลาเราเรียกใช้งาน เราจะได้ตัวว่าตัวแปรนี้อ่านมาจากช่องไหน


วิธีการตั้งค่า tag ให้ดับเบิ้ลคลิกที่ object ตัวนั้นแล้วจะปรากฎหน้า property ดังนี้


ส่วนที่ผมตั้งค่าก็จะมี
- Fontsize ปรับขนาดตัวอักษร
- String ผมใส่เป็นเลข 0 เอาไว้ user จะได้รู้ว่าจะต้องป้อนตัวเลขตรงช่องนี้
- Tag ตรงนี้แหละครับคือชื่อของ object ที่เราต้องกำหนด


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


เมื่อเรากดปุ่ม Save ในหน้า GUI โปรแกรม MATLAB ก็จะสร้างโค้ดของ object แต่ละตัวให้เราโดยอัตโนมัติ ตามชื่อ tag ที่เราตั้งเอาไว้ ซึ่งเราจะได้โค้ดหน้าตาประมาณนี้


ส่วนที่ไฮไลท์เอาไว้ (B, C, btCal) ก็คือชื่อ tag ที่เราตั้งนะครับ ซึ่งทำให้เรารู้ว่าฟังก์ชันนั้นๆ คือฟังก์ชันของ object ตัวไหน

ถ้าหากลองสังเกตุดู โปรแกรม MATLAB จะสร้างฟังก์ชันมาให้ 2 แบบนะครับ นั่นก็คือ CreateFcn และ Callback

CreateFcn เป็นฟังก์ชันสำหรับสร้างหน้าตาของ object เราไม่ต้องไปแก้ไขอะไรนะครับ ส่วน Callback คือฟังก์ชันที่เอาไว้ให้เขียนเขียนโปรแกรมควบคุมการทำงานของ object

ดังนั้นเวลาเราเขียนโค้ด เราจะเขียนในฟังก์ชัน Callback เท่านั้นนะครับ ไม่งั้นโปรแกรมจะรันไม่ออกนะครับ


ก่อนจะเริ่มเขียนโปรแกรม บางคนอาจจะสงสัยว่า object มีตั้งหลายตัว ฟังก์ชันก็มีตั้งหลายตัว แล้วเราจะเขียนโค้ดใส่ฟังก์ชันไหนละ?


คำตอบก็คือ..... เขียนใส่ object ที่เราต้องการให้มันเกิด event ครับ ยกตัวอย่างเช่น ถ้าเราอยากให้โปรแกรมเริ่มทำงานเมื่อ user กดปุ่ม "=" เราก็ต้องเขียนโค้ดในฟังก์ชัน btCal_Callback


ก่อนจะเริ่มเขียนโปรแกรม เราต้องวางอัลกอริทึมของโปรแกรมก่อนนะครับ เราจะได้รู้ว่าต้องเขียนอะไรก่อนหลัง

ซึงในตัวอย่างนี้ อัลกอริทึมของโปรแกรมมีดังนี้

1. รับค่าจาก tag: A

2. รับค่าจาก tag: B

3. เนื่องจากค่าที่รับจาก A และ B เป็น string ดังนั้นเราต้องเอามาแปลงให้เป็นตัวเลขก่อน ถ้าแปลงได้ก็ให้โปรแกรมทำงานต่อไป ถ้าแปลงไม่ได้ (อย่างเช่นผู้ใช้ป้อนตัวอักษรเข้ามา) ก็ให้โปรแกรมหยุดทำงาน
และ reset ค่า text box ทั้งหมดให้เป็น 0

4. นำค่าจาก A และ B มาบวกกัน

5. แสดงผลใน tag: C (ซึ่งก่อนแสดงผลเราก็ต้องแปลงค่าจากตัวเลขให้เป็น string ก่อน)



เมื่อวางอัลกอริทึมเรียบร้อยแล้วเราก็มาเริ่มเขียนกันได้เลยครับ (ลองสังเกตุดูนะครับว่าโค้ดที่ผมเขียนจะเรียงลำดับบรรทัดตามอัลกอริทึมที่วางเอาไว้เลย)

Va = get(handles.A,'string');
Vb = get(handles.B,'string');

Na = str2double(Va);
Nb = str2double(Vb);

if(isnan(Na) || isnan(Nb))
    set(handles.A,'string','0');
    set(handles.B,'string','0');
    set(handles.C,'string','0');
    return;
end

Nc = Na+Nb;
Vc = num2str(Nc);
set(handles.C,'string',Vc);

โดยโค้ดทั้งหมดนี้เขียนอยู่ในฟังก์ชัน btCal_Callback แบบนี้


เมื่อเราลองรันโปรแกรมดูก็จะได้ผลลัพธ์ประมาณนี้



ถ้าหาก user ป้อนตัวอักษร เช่น A, B, C เข้าไปโปรแกรมก็จะ reset ข้อความทั้งหมดให้เป็น 0


ถ้าหากเราไม่ต้องการให้ user แก้ไขคำตอบใน tag: C เราก็เปลี่ยนประเภทของ tag: C จาก edit box เป็น static text หรือไม่ก็ กำหนดไปที่ property "enable" ให้เป็น 'off' ดังนี้


set(handles.C,'enable','off')


โดยเพิ่มโค้ดนี้เข้าไปไว้ในบรรทัดล่างสุดต่อจาก set(handles.C,'string',Vc)

เมื่อ user กดปุ่ม "=" tag: C ก็จะกลายเป็นแบบนี้



เพียงเท่านี้ user ก็จะไม่สามารถแก้ไขคำตอบใน tag: C ได้






จบหัวข้อ

ความเห็น

โพสต์ยอดนิยมจากบล็อกนี้

การแก้สมการ Differential ด้วย MATLAB

การหาค่าเฉลี่ยโดยไม่ต้องเก็บค่า

ว่าด้วยเรื่องของ ERROR