Delphi 2005 มีการเพิ่มความสามารถใหม่ๆ เข้ามามากมายทั้งในตัว IDE เองและในส่วนของโปรแกรมอัตถประโยชน์ (add-in) แต่ละความสามารถนั้นช่วยให้นักพัฒนาๆ โปรแกรมได้สะดวกและรวดเร็วยิ่งขึ้น ผมจะทยอยนำมาเขียนให้ผู้อ่านได้อ่านกันนะครับ
วันนี้เรามาดูคำสั่ง(keyword) ที่ได้เพิ่มเข้ามาใน Delphi 8 ชื่อคำสั่ง for ?in loop ครับเป็นการประยุกต์ใช้คำสงวน for และ in มาใช้งาน แต่ก่อนนั้นการเขียนโปรแกรมใน Delphi ถ้าเราต้องการใช้ for loop เพื่อใช้งานค่าที่เก็บอยู่ใน Array , List หรือ Array Pointer เราจะต้องเพิ่มตัวแปรเข้าไปอย่างน้อยหนึ่งเพื่อใช้เป็นอินเด็กใช้อ้างอิงถึงตำแหน่งที่เราต้องการเข้าถึง ถึงแม้เราจะใช้ Iterator (วัตถุหรือโปรแกรมย่อยที่ใช้เข้าตัวแปรแบบ Array) ก็ตามแต่ใน Iterator นั้นก็ยังจำเป็นต้องมีตัวแปรที่ใช้เป็นอินเด็กอยู่ดี ตัวอย่างข้างล่างเป็นการเข้าถึงตัวแปร Array
var
i: Integer;
begin
Memo1.Clear;
for i:=0 to ListBox1.Items.Count-1 do
Memo1.Lines.Add(ListBox1.Items[i]); |
โปรแกรมด้านบนเป็นโปรแกรมคัดลอกข้อมูลที่เก็บอยู่ใน Listbox1 มาเก็บไว้ใน Memo1 จากโปรแกรมจะเห็นว่าเราต้องเพิ่มตัวแปรเข้ามาในโค๊ดของเราหนึ่งตัว ในที่นี้เราเพิ่มเข้ามาหนึ่งตัว ถ้าหากโปรแกรมมีขนาดใหญ่และซับซ้อนมากกว่านี้และเราจะต้องใช้ตัวแปรมากขึ้นกว่านี้ อาจจะทำให้คุณใช้งานตัวผิดพลาดได้ เนื่องจากเราต้องทราบตำแหน่งเริ่มต้นและสิ้นสุดของตำแหน่งใน Array เช่นตำแหน่งเริ่มอาจจะเริ่มที่ ?0? หรือ ?1? หรือตำแหน่งใดๆ ก็ได้ ทีนี้เรามาดูโปรแกรมข้างล่างกัน
procedure TForm3.Button2Click(Sender: TObject);
var
S: String;
begin
Memo1.Clear;
for S in ListBox1.Items do
Memo1.Lines.Add(S);
end;
|
โปรแกรมข้างบนคำสั่ง for S in ListBox1.Items do เป็นการให้ Delphi Compiler ทำการใส่คำสั่งพิเศษเข้าไปในโปรแกรมของเราเพื่อให้เพิ่มค่า Index ให้เราโดยอัตโนมัติโดยให้เริ่มจากตำแหน่งเริ่มต้นจุดถึงตำแหน่งสิ้นสุด(ค่า index จะไม่แสดงให้เราเห็นตอนเขียนโปรแกรม) ในโปรแกรมนี้เราต้องสร้างตัวขึ้นมาใหม่เป็นชนิดเดียวกับตัวแปรที่เราต้องการให้เลื่อนตำแหน่ง index จากโปรแกรมเราสร้างตัวแปรชื่อ S ซึ่งเป็นแบบ String ขึ้นมาใหม่ จากนั้นนำมาใส่ใน for ?in loop เมื่อเรารันโปรแกรมค่า Index ที่ชี้ไปที่ ListBox.Item จะเพิ่มขึ้นทีละหนึ่งโดยอัตโนมัติ (ค่าดังกล่าวได้มาจากการเรียกใช้ฟังก์ชั่น GetEnumerator) และค่าที่เก็บใน S จะเป็นค่าที่ข้อมูลใน Array ตำแหน่ง index การใช้งาน S ใน for ?in loop นั้นต้องจำไว้เสมอว่าเมื่อใช้งานค่าของ S จะเป็นค่าที่อ่านได้อย่างเดียว (read only) เสมอ จากโปรแกรมข้างบนถ้าเราเขียนโปรแกรมโดยไม่ใช้ for-in loop โปรแกรมจะเป็นดังนี้
procedure TForm3.Button4Click(Sender: TObject);
var
i: Integer;
begin
Memo1.Clear;
for i:=0 to ListBox1.Items.Count-1 do
Memo1.Lines.Add(ListBox1.Items[i]);
end;
|
มาดูตัวอย่างต่อไปครับ
procedure TForm3.Button2Click(Sender: TObject);
var
S: String;
C: Char;
Spaces: Integer;
begin
Spaces := 0;
Memo1.Clear;
for S in ListBox1.Items do
begin
Memo1.Lines.Add(S);
for C in S do
if C = ' ' then Inc(Spaces);
end;
end;
|
โปรแกรมข้างบนเป็นการใช้งาน for-in loop ให้เพิ่มค่า index ที่เป็นตำแหน่งตัวอักขระในข้อความครับ มาดูอีกตัวอย่างนะครับ
procedure TForm1.Button1Click(Sender: TObject);
var
Comp: TComponent;
begin
ListBox1.Clear;
for Comp in Self do
ListBox1.Items.Add(Comp.Name + ': ' + Comp.ClassName);
end;
|
โปรแกรมข้างบนเป็นการใช้งาน for-in loop เพื่ออ้างอิงถึงตำแหน่ง Comp ใน Self ครับ โดย Comp เป็นตัวแปรวัตถุ TComponent ที่อ้างอึงมาจากตัวแปร self ซึ่งเป็น TForm1 หรือตัวแปรวัตถุ TForm ที่เป็นคลาสฐาน คล้ายตัวแปร this ใน C++ หรือตัวแปร ME ใน Visual Basic นะครับ มาดูอีกตัวอย่างนึงครับ
procedure TForm3.Button3Click(Sender: TObject);
var
Comp: TComponent;
begin
ListBox1.Clear;
for Comp in Self do
begin
Comp.Tag := 42;
if (Comp is TButton) then
(Comp as TButton).Caption :=
'<'+(Comp as TButton).Name+'>';
ListBox1.Items.Add(Comp.Name + ': ' + Comp.ClassName);
end;
end;
|
โปรแกรมข้างบนต่อยอดจากโปรแกรมก่อนหน้านี้เป็นการตรวจสอบค่าของ Comp ที่อยู่ใน for-in loop ครับ พึงระวังเสมอนะครับว่าค่าของ Comp ที่อยู่ใน for-in loop นั้นเป็นค่าที่อ่านได้อย่างเดียว ไม่สามารถใช้คำสั่ง create() สร้างมันขึ้นมาได้เมื่อใช้งานกับคำสั่ง for-in loop |