This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Last revision Both sides next revision | ||
tutorial:procedureandfunction [2019/01/04 21:11] admin |
tutorial:procedureandfunction [2019/01/06 16:53] admin |
||
---|---|---|---|
Line 84: | Line 84: | ||
\\ \\ | \\ \\ | ||
- | =====การประกาศ Procedure/Function===== | + | =====การประกาศและการเรียกใช้ Procedure/Function===== |
- | หลังจากการประกาศ uses แล้ว Procedure/Function ที่เป็น Global Scope สามารถประกาศไว้ ณ ส่วนไหนของโปรแกรมก็ได้ แต่โดยปกติแล้ว ผมขอแนะนำให้ประกาศทีหลังสุด (หลังจากประกาศ var) แต่ถ้าหากเป็น Function/Procedure ที่มาจาก Shared Library ผมขอแนะนำให้วางไว้แรกสุด (ต่อจากการประกาศ uses) | + | หลังจากการประกาศ uses แล้ว Procedure/Function ที่เป็น Global Scope สามารถประกาศไว้ ณ ส่วนไหนของโปรแกรมก็ได้ แต่โดยปกติแล้ว ผมขอแนะนำให้ประกาศทีหลังสุด (หลังจากประกาศ var) แต่ถ้าหากเป็น Function/Procedure ที่มาจาก Shared Library ผมขอแนะนำให้วางไว้แรกสุด (ต่อจากการประกาศ uses) \\ |
+ | |||
+ | การเรียกใช้ Procedure นั้นง่ายมาก เพียงแค่ใส่ชื่อ Procedure นั้นๆ (พร้อมกับ Input Parameters ถ้ามี) ได้เลย ยกตัวอย่างเช่น | ||
+ | |||
+ | <hidden Example-5: Calling Procedures> | ||
+ | <sxh delphi> | ||
+ | Program SayHellow; | ||
+ | |||
+ | procedure HelloWorld; | ||
+ | begin | ||
+ | writeln('HelloWorld'); | ||
+ | end; | ||
+ | |||
+ | procedure SayHello(sName:string); | ||
+ | begin | ||
+ | writeln('Hello'+ sName); | ||
+ | end; | ||
+ | |||
+ | Begin | ||
+ | HelloWorld; //Calling HelloWorld | ||
+ | SayHello('Mr. Smith'); //Calling Procedure | ||
+ | End. | ||
+ | </sxh> | ||
+ | </hidden> | ||
\\ | \\ | ||
+ | |||
+ | สำหรับการเรียกใช้ Function นั้นก็คล้ายกับการเรียกใช้ Procedure แต่มีข้อแตกต่างอีกอย่างหนึ่ง คือ Function ให้ค่า Output ด้วย | ||
+ | \\ \\ | ||
+ | |||
=====Nested Function/Procedure===== | =====Nested Function/Procedure===== | ||
คือ Function/Procedure ที่เป็น Local Scope ซ้อนอยู่ใน Function/Procedure อื่น\\ | คือ Function/Procedure ที่เป็น Local Scope ซ้อนอยู่ใน Function/Procedure อื่น\\ | ||
- | <hidden Example-5: Nested Function> | + | <hidden Example-6: Nested Function> |
<sxh delphi;highlight: [4-10]> | <sxh delphi;highlight: [4-10]> | ||
procedure SolvePolynomial(A,B,C:real); | procedure SolvePolynomial(A,B,C:real); | ||
Line 149: | Line 176: | ||
- | <hidden Example-6: Passing Parameters (By Value, By Reference)> | + | <hidden Example-7: Passing Parameters (By Value, By Reference)> |
<sxh delphi;> | <sxh delphi;> | ||
program Passing_Param; | program Passing_Param; | ||
Line 201: | Line 228: | ||
รูปแบบการประกาศสำหรับ Program จะมีคำว่า forward ต่อท้ายดังนี้ | รูปแบบการประกาศสำหรับ Program จะมีคำว่า forward ต่อท้ายดังนี้ | ||
- | Procedure ProcedureName; forward; | + | Procedure DoSomething; forward; |
- | + | สำหรับ Unit นั้น FPC บังคับให้ต้องมีการทำ forward declaration ทุกครั้งก่อนเสมอ เพราะ unit อื่นหรือ program ที่มีการ uses unit ดังกล่าวนั้น จะเข้าถึง Procedure/Function ได้เฉพาะส่วนที่เป็น interface เท่านั้น ไม่สามารถเข้าถึงส่วน implementation โดยตรงได้ ดังนั้นจึงต้องประกาศล่วงหน้าในตำแหน่งใต้คำว่า interface เสมอ โดยการประกาศจะไม่มีคำว่า forward ต่อท้ายเหมือนของ program อีก ดังตัวอย่างต่อไปนี้ | |
- | <hidden Example-7: Forward Declarations on Simple Program> | + | |
- | __**อธิบาย**__ - ตัวอย่างนี้ มีการประกาศโปรแกรมย่อย ชื่อ Second ล่วงหน้า เพื่อให้โปรแกรมย่อยที่ชื่อ First ได้รู้จัก Second ก่อน | + | |
<sxh delphi;> | <sxh delphi;> | ||
+ | unit Unit1; | ||
+ | |||
+ | interface | ||
+ | //Forward declaration | ||
+ | procedure First; | ||
+ | procedure Second; | ||
+ | |||
+ | implementation | ||
+ | |||
+ | procedure First; | ||
+ | begin | ||
+ | writeln('Hello First'); | ||
+ | Second; | ||
+ | end; | ||
+ | |||
+ | procedure Second; | ||
+ | begin | ||
+ | writeln('Hello Second'); | ||
+ | end; | ||
+ | end. | ||
+ | </sxh> \\ | ||
+ | |||
+ | |||
+ | <hidden Example-8: Forward Declarations on Simple Program> | ||
+ | __**อธิบาย**__ - ตัวอย่างนี้ มีการประกาศโปรแกรมย่อย ชื่อ Second ล่วงหน้าในบรรทัดที่ 4 เพื่อให้โปรแกรมย่อยที่ชื่อ First ได้รู้จัก Second ก่อน แน่นอนว่าหากตัด code ในบรรทัดที่ 4 ออกไปแล้ว สิ่งที่จะตามมาคือ เมื่อ compiler อ่านจนมาถึง First ก็จะฟ้องทันทีว่าไม่สามารถหา Second เจอ | ||
+ | |||
+ | <sxh delphi;highlight: [4]> | ||
program FWD_Declaration; | program FWD_Declaration; | ||