หน้า: 1 [2]
 
ผู้เขียน หัวข้อ: ถ้าไม่ใช่เฟรมนี้ กระทำ...  (อ่าน 10756 ครั้ง)
0 สมาชิก และ 1 ขาจร กำลังดูหัวข้อนี้
สาเหตุว่า ทำไม
 
b2.onRollOver = McIn(service2);


ไม่ได้


ก็เพราะว่ามันจะมองเป็น

b2.onRollOver = การใช้งานฟังชั่น McIn โดยส่งค่าไปเป็น service2

แต่ถ้า

b2.onRollOver = McIn

มันจะมองว่า  onRollOver  ชี้ไปที่ McIn
ซึ่ง McIn มีความหมายเป็นฟังชั่น

เพิ่มเติมเรื่อง function ให้นะครับ การเขียน แบบ b2.onRollOver = McIn แบบนี้เค้าจะเรียกว่า pointer to function ครับ ซึ่งการเขียนแบบนี้มักจะใช้ตอนที่เราจะสั่งให้โปรแกรมเราทำงานใด ๆ เมื่อตอน runtime ครับ โดยที่เราไม่ยังไม่รู้ว่าตอนที่เราเขียน code (complie time) ว่าเราอยากให้มันทำอะไร

ตัวอย่างเพิ่มอีกนิดนะครับ ผมลองเอาของ คุณ heart ไปทำต่อ เลย เพิ่งรู้ว่า flash มันเขียนแบบนี้ได้ด้วยสบายจังแฮะ

s1 กับ s2 เป็น button ที่อยู่ใน main frame นะครับ code อันนี้ผมเขียนที่ frame

function doSomething() {
   return function() {
      s2._x = 0;
   }
}

s1.onRelease = doSomething();

อธิบาย คือ ว่านอกจาก flash จะใข้งานแบบ point to function แล้วยังสามารถเอาค่า return ที่ออกมาจาก function เป็น function ได้ด้วย  (แจ๋ว แจ๋ว) (แจ๋ว แจ๋ว)

ประมาณนี้แหละครับ

จบจ้า

บันทึกการเข้า
ดีครับ ทำให้โค้ดสั้นลงอีก
ไม่เคยใช้แบบนี้เลย
บันทึกการเข้า

s1 กับ s2 เป็น button ที่อยู่ใน main frame นะครับ code อันนี้ผมเขียนที่ frame

function doSomething() {
   return function() {
      s2._x = 0;
   }
}

s1.onRelease = doSomething();


ช่วยอธิบายตรงนี้ละเอียดนิดได้ไหมครับ ไหว้
หรือยกตัวอย่างก็ได้ อ่านแล้วไม่เข้าใจเลย ว่าจะเอาไปใช้ทำอะไรครับ (เหงื่อแตกพลั่ก)
บันทึกการเข้า

ทำมาหากินด้วยการเปิดร้านสกรีนเสื้อยืด จ้ะ
มารอ
บันทึกการเข้า

ในหมู่คนตาบอด คนตาบอดข้างเดียวได้เป็นราชา
โค้ด:
function doSomething() {
   return function() {
      s2._x = 0;
   }
}

s1.onRelease = doSomething();

คิดซะว่าฟังชั่น คือวัตถุ 1 วัตถุ

ชื่อฟังชั่น(); <---- มีวงเล็บ จะหมายถึง สั่งทำงานฟังชั่นนั้น ทันที โดยจะส่งค่าเข้าไปในฟังชั่น ในวงเล็บ หรือปล่อยว่างไว้ก้ได้
ชื่อฟังชั่น <-----ไม่มีวงเล็บ จะหมายถึง อ้างถึงวัตถุที่เป็นฟังชั่น นั้นๆุนั้น

เหมือนกับ
remote();  <--- เป็นการใช้งาน คือกดที่ปุ่มของรีโมท  โดยถายในวงเล้บอาจจะส่งค่าเป็นปุ่มที่กด เช่นปุ่มเลข 3 จากนั้นในฟังชั่นจึงทำการเปิดช่อง 3

remote;   <------ ไม่ได้เป็นการใช้งาน แต่เป็นการชี้ไปที่ ตัวรีโมท ว่า รีโมทตัวไหน
เช่น

a  = remote;

ให้ a ชี้ไปที่ตัว รีโมท ดังนั้น

remote();

a();

สองคำสั่งนี้จะมีค่าเท่ากัน เพราะสั่ง a ทำงาน  a ชี้ไปที่รีโมท รีโมทก็ทำงาน


==================================================


ถ้าปุ่มกดชื่อ  s1

s1.onRelease = remote();

จะ้เป็นการ สั่งให้ onRelease = ทำงานโดยกดรีโมททันที โดยเมื่อทำงานแล้ว รีโมทจะรีเทิร์นค่ากลับมาว่า "ช่อง 3 นะ"
แล้วจึงตีความได้ว่า

s1.onRelease = "ช่อง 3 นะ";

onRelease ของปุ่มนี้ทำงานใดๆไม่ได้เลย onRelease มันไม่ได้สั่งให้ทำงานเลยสักนิด แต่มันตรงกับค่าที่ฟังชั่นส่งมา

=================================

ถ้า

s1.onRelease = function() {
      remote();
}


ภายในบล็อกสีแดง คือวัตถุหนึ่ง ทำงานโดย เรียกใช้วัตถุ remote
แบบนี้ก็ถูกใช้บ่อย และใช้ได้ดี

===============================
function remote(){
    retuen "ช่อง 3 นะ";
}

s1.onRelease = remote;

แบบนี้ก็ถูกต้อง เพราะว่า onRelease ชี้ไปที่ วัตถุ รีโมท เมื่อ onRelease จึงสั่งงานรีโมท
========================

ย้อนกลับไปที่


โค้ด:
function doSomething() {   
   return function() {
      s2._x = 0;
   }
}

s1.onRelease = doSomething();

s1.onRelease = doSomething(); <--เป็นการใช้งานฟังชั่นทันที ไม่ได้ชี้ไปที่ฟังชั่นนั้น ก็จริง

แต่ว่า

function doSomething() {   
   return function() {  <-----ฟังชั่นนี้ เมื่อทำงานแล้วก็รีเทิร์นค่ากลับไปเป็นวัตถุนี้  เมื่อ onRelease จึงทำงานที่วัตถุนี้
      s2._x = 0;
   }
}

===============================

ถึงแม้แบบนี้ก็เขียนได้ แต่ถ้าจะให้ดี แบบนี้ สั้น และ ง่าย กว่าไหม

โค้ด:
 function  doSomething() {
      s2._x = 0;
   }


s1.onRelease = doSomething;
« แก้ไขครั้งสุดท้าย: 28 ส.ค. 2007, 15:44 น. โดย heart » บันทึกการเข้า

หูย  กรี๊ดดดดด กรี๊ดดดดด กรี๊ดดดดด





แข่งกันสั้น
บันทึกการเข้า

        AH_LuGDeK, AH_LuGDeK_R
จริงๆถ้าสั้นๆนะ

ปุ่มเดียว

โค้ด:
s1.onRelease = function(){
 //----------------
}
แต่ถ้าหลายปุ่มทำงานคล้ายๆกัน

โค้ด:
function dosomething(){
 //------------------
}

s1.onRelease = s2.onRelease s3.onRelease = dosomething;
บันทึกการเข้า

+ เลยครับ  กรี๊ดดดดด กรี๊ดดดดด
บันทึกการเข้า

นักเขียนการ์ตูนรายปี
+ ด้วย นึกภาพตามออกละ กรี๊ดดดดด


แต่ก็ยังไม่เข้าใจคำว่า return ครับ
มันเกิดมาเพื่ออะไรแล้วมีไว้ทำไม งง
บันทึกการเข้า

ทำมาหากินด้วยการเปิดร้านสกรีนเสื้อยืด จ้ะ
return คือ ส่งค่ากลับไปยังจุดที่เรียกใช้งานฟังชั่น นี้

ตัวอย่าง ฟังชั่นบวกเลข โดยส่งค่าไปเป็น a และ b


ไม่ใช้งาน return

โค้ด:
function addNum(a , b){
        ans = a+b;
        trace( ans );
}

//เรียกใช้ฟังชั่นด้านบนทำงาน
addNum( 1 , 2);
ก็จะส่งค่าไปเป็น 1 และ 2
พอฟังชั่นทำงานเสร็จก็จะแสดงผลว่า 3



========================================

ตัวอย่างโปรแกรมเดียวกัน แต่ใช้ return

โค้ด:
function addNum(a , b){
        ans = a+b;
        return  ans;
}

a = addNum( 1 , 2 )

trace( a );


ได้ผลเช่นเดียวกับข้อแรก

เมื่อคำนวนเสร็จ จะ return ค่ากลับมาให้ a
แล้วแสดงผล a อีกที

*** นึกซะว่า จุดที่เรียกฟังชั่นนั้น คือ ค่าที่คำนวนออกมาแล้ว
เช่น

a = addNum( 1 , 2);

ุถ้าเรามองซะว่าจุดที่เรียกใช้เป็นผลลัพธ์ ก็จะมองได้ว่า

a = 3;


หรือ

trace( addNum( 1 , 2) );

ก็เป็น

trace( 3 );
บันทึกการเข้า

โค้ด:
function doSomething() {
   return function() {
      s2._x = 0;
   }
}

s1.onRelease = doSomething();


ถึงแม้แบบนี้ก็เขียนได้ แต่ถ้าจะให้ดี แบบนี้ สั้น และ ง่าย กว่าไหม

โค้ด:
 function  doSomething() {
      s2._x = 0;
   }


s1.onRelease = doSomething;


ประโยชน์ของการเขียนแบบ เอา return ไว้ใน function ให้ มัน return เป็น function ออกมา ข้อดีของมันคือสามาร pass pameter ให้ function นั้นได้ด้วย เช่น

มี ปุ่ม 5 ปุ่ม
4 ปุ่มแรก จะมีหน้าที่ set คำพูดให้ ปุ่มที่ 5 เมื่อกดปุ่มที่ 5 จะให้มัน trace คำตามที่ set ไว้
โค้ด:
function doSomething(msg) {
   return function() {
      trace(msg);
   }
}

b1.onRelease = function() {
    b5.onRelease = doSomething("Hello from B1");
}
b2.onRelease = function() {
    b5.onRelease = doSomething("Hello from B2");
}
b3.onRelease = function() {
    b5.onRelease = doSomething("Hello from B3");
}
b4.onRelease = function() {
    b5.onRelease = doSomething("Hello from B4");
}


จะเห็นว่าเราไม่ต้องพิมพ์ code trace ใน b5 หลาย ๆ ครั้ง ใน b1-b4 .OnRelease ยิ่งถ้า code ตรง trace ยาว ๆ เช่นมีการคำนวณอะไรที่ยุ่งยาก code ตรั้งนั้นก็จะซ้ำ ๆ กันยาวไปอีก เวลาแก้ก็ต้องแก้หลายจุด

การเขียน แบบนี้เรียนกว่า pointer to funtion ซึ่งภาษาที่เป็น script ในตระกูล javascript / action script มันจะ implement ไว้

ปล. code ตรง b1-b4.OnRelease ก็ใช้วิธีเดียวกัน สามารถลด code ได้อีก
บันทึกการเข้า
ขอบคุณทั้งคู่ครับ ไหว้
อ่านค่อนข้างเข้าใจ แต่ก็ยังนึกออกมาเป็นภาพไม่ออก ฮือๆ~
สงสัยผมจะหัวทึบด้านโปรแกรมมิ่งจริงๆ
เดี๋ยวยังไงจะลองเขียนอะไรขึ้นมาสักตัวโดยใช้ความรู้จากข้างบนดูครับ
บันทึกการเข้า

ทำมาหากินด้วยการเปิดร้านสกรีนเสื้อยืด จ้ะ
http://www.f0nt.com/forum/index.php/topic,6169.0.html

เหมือนกับแบบนี้ไหมครับผม
บันทึกการเข้า

ในหมู่คนตาบอด คนตาบอดข้างเดียวได้เป็นราชา
หน้า: 1 [2]
 
 
Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2007, Simple Machines | Thai language by ThaiSMF Valid XHTML 1.0! Valid CSS!