วัตถุที่จัดเก็บไว้ในตัวแปร Variant
ออบเจ็กต์สามารถจัดเก็บไว้ในตัวแปร Variant ได้ สิ่งนี้มีประโยชน์เมื่อคุณต้องการจัดการข้อมูลประเภทต่างๆ รวมถึงออบเจ็กต์อย่างมีประสิทธิภาพ ตัวอย่างเช่น องค์ประกอบทั้งหมดในอาร์เรย์จะต้องมีประเภทข้อมูลเดียวกัน ตั้งค่าประเภทข้อมูลของอาร์เรย์เป็น Variant เพื่อจัดเก็บ Objects ร่วมกับข้อมูลประเภทอื่นๆ ในอาร์เรย์เดียวกัน
อาร์เรย์
หากคุณมีประสบการณ์การเขียนโปรแกรมในภาษาอื่น คุณจะต้องคุ้นเคยกับแนวคิดของอาร์เรย์ ขอบคุณอาร์เรย์ คุณสามารถอ้างถึงชุดของตัวแปรที่มีชื่อเดียวกันและระบุตัวแปรเหล่านั้นเป็นตัวเลข (จัดทำดัชนี) ในหลายสถานการณ์ การใช้อาร์เรย์สามารถย่อและลดความซับซ้อนของโปรแกรมได้ เนื่องจากคุณสามารถออกแบบลูปโดยใช้ค่าดัชนีเพื่อจัดการกับสถานการณ์ต่างๆ ได้อย่างมีประสิทธิภาพ อาร์เรย์มีขอบเขตบนและล่าง และองค์ประกอบของอาร์เรย์จะต่อเนื่องกันภายในขอบเขตบนและล่าง เนื่องจาก Visual Basic จัดสรรพื้นที่สำหรับแต่ละค่าดัชนี อย่าประกาศอาร์เรย์ที่มีขนาดใหญ่เกินจริง
โปรดทราบว่า อาร์เรย์ที่กล่าวถึงในส่วนนี้เป็นอาร์เรย์ของตัวแปรที่ประกาศในโปรแกรม แตกต่างจากอาร์เรย์ควบคุมซึ่งมีการระบุ ณ เวลาออกแบบโดยการตั้งค่าคุณสมบัติดัชนีของตัวควบคุม อาร์เรย์ของตัวแปรจะต่อเนื่องกันเสมอ ซึ่งแตกต่างจากอาร์เรย์ควบคุม องค์ประกอบอาร์เรย์ไม่สามารถโหลดหรือยกเลิกการโหลดจากตรงกลางของอาร์เรย์ได้
องค์ประกอบทั้งหมดในอาร์เรย์มีประเภทข้อมูลเดียวกัน แน่นอนว่า เมื่อประเภทข้อมูลเป็น Variant แต่ละองค์ประกอบสามารถมีข้อมูลประเภทต่างๆ ได้ (ออบเจ็กต์ สตริง ค่า ฯลฯ) อาร์เรย์ของประเภทข้อมูลพื้นฐานใดๆ สามารถประกาศได้ รวมถึงประเภทที่ผู้ใช้กำหนด (ดู "การสร้างประเภทข้อมูลของคุณเอง" ในบทที่ 8 "การเขียนโปรแกรมอีกครั้ง") และตัวแปรวัตถุ (ดูบทที่ 9 "การเขียนโปรแกรมด้วยวัตถุ")
อาร์เรย์ใน Visual Basic มีสองประเภท: อาร์เรย์ที่มีขนาดคงที่ซึ่งยังคงมีขนาดเท่ากันเสมอ และอาร์เรย์แบบไดนามิกที่ขนาดสามารถเปลี่ยนแปลงได้ในขณะรันไทม์ อาร์เรย์แบบไดนามิกจะกล่าวถึงรายละเอียดใน "อาร์เรย์แบบไดนามิก" ต่อไปในบทนี้
ประกาศอาร์เรย์ที่มีขนาดคงที่
มีสามวิธีในการประกาศอาร์เรย์ที่มีขนาดคงที่ และวิธีการที่คุณใช้ขึ้นอยู่กับช่วงที่ถูกต้องที่อาร์เรย์ควรมี:
หากต้องการสร้างอาร์เรย์สาธารณะ ให้ประกาศอาร์เรย์โดยใช้คำสั่งสาธารณะในส่วนการประกาศของโมดูล
หากต้องการสร้างอาร์เรย์ระดับโมดูล ให้ประกาศอาร์เรย์โดยใช้คำสั่ง PRivate ในส่วนการประกาศของโมดูล
สร้างอาร์เรย์ท้องถิ่นและประกาศอาร์เรย์ด้วยคำสั่งส่วนตัวในกระบวนการ
กำหนดขอบเขตบนและล่าง
เมื่อประกาศอาร์เรย์ ชื่ออาร์เรย์จะตามด้วยขอบเขตบนที่อยู่ในวงเล็บ ขอบเขตบนต้องไม่เกินช่วงของชนิดข้อมูลแบบยาว (-2,147,483,648 ถึง 2,147,483,647) ตัวอย่างเช่น การประกาศอาร์เรย์ต่อไปนี้อาจปรากฏในส่วนการประกาศของโมดูล:
DimCounters(14)AsInteger '15 องค์ประกอบ
DimSums(20)AsDouble '21 องค์ประกอบ
หากต้องการสร้างอาร์เรย์สาธารณะ ให้แทนที่ Dim ด้วย Public โดยตรง
PublicCounters(14)AsInteger
ผลรวมสาธารณะ(20)AsDouble
การประกาศเดียวกันนี้ใช้ Dim ในขั้นตอน: DimCounters(14)AsIntegerDimSums(20)AsDouble การประกาศครั้งแรกจะสร้างอาร์เรย์ที่มี 15 องค์ประกอบ ซึ่งจัดทำดัชนีตั้งแต่ 0 ถึง 14 การประกาศครั้งที่สองจะสร้างอาร์เรย์ที่มี 21 องค์ประกอบ ซึ่งจัดทำดัชนีตั้งแต่ 0 ถึง 20 ขอบเขตล่างเริ่มต้นคือ 0
หากต้องการระบุขอบเขตล่าง ให้ใช้คีย์เวิร์ด To เพื่อระบุขอบเขตล่างที่ชัดเจน (สำหรับชนิดข้อมูลแบบยาว):
DimCounters(1To15)เป็นจำนวนเต็ม
DimSums(100To120)AsString
ในข้อความก่อนหน้านี้ ตัวนับมีค่าดัชนีตั้งแต่ 1 ถึง 15 ในขณะที่ผลรวมมีค่าดัชนีตั้งแต่ 100 ถึง 120
อาร์เรย์ที่มีอาร์เรย์อื่นๆ
คุณสามารถสร้างอาร์เรย์ของประเภทข้อมูล Variant และจัดตำแหน่งร่วมกับอาร์เรย์ประเภทข้อมูลที่แตกต่างกันได้ รหัสต่อไปนี้สร้างอาร์เรย์สองตัว ตัวแรกประกอบด้วยจำนวนเต็มและอีกตัวประกอบด้วยสตริง จากนั้นประกาศอาร์เรย์ Variant ตัวที่สามและวางจำนวนเต็มและอาร์เรย์สตริงลงไป:
PrivateSubCommand1_คลิก()
DimintXAsInteger 'ประกาศตัวแปรตัวนับ
'ประกาศและวางอาร์เรย์ของจำนวนเต็ม
DimcountersA(5)เป็นจำนวนเต็ม
ฟอรินต์X=0To4
ตัวนับA(intX)=5
เน็กซ์อินเอ็กซ์
'ประกาศและวางอาร์เรย์ของสตริง
DimcountersB(5)AsString
ฟอรินต์X=0To4
countersB(intX)=สวัสดี
เน็กซ์อินเอ็กซ์
DimarrX(2)AsVariant 'ประกาศอาร์เรย์ใหม่ด้วยสมาชิกสองคน
arrX(1)=countersA() 'ย้ายอาร์เรย์อื่นไปยังอาร์เรย์
arrX(2)=เคาน์เตอร์B()
MsgBoxarrX(1)(2) 'แสดงสมาชิกอาร์เรย์แต่ละตัว
MsgBoxarrX(2)(3)
สิ้นสุดย่อย
อาร์เรย์หลายมิติ
บางครั้งจำเป็นต้องติดตามข้อมูลที่เกี่ยวข้องในอาร์เรย์ ตัวอย่างเช่น หากต้องการติดตามทุกพิกเซลบนหน้าจอคอมพิวเตอร์ คุณจะต้องอ้างอิงพิกัด X และ Y ของมัน ในเวลานี้ ควรใช้อาร์เรย์หลายมิติเพื่อเก็บค่า อาร์เรย์หลายมิติสามารถประกาศได้ด้วย Visual Basic ตัวอย่างเช่น ข้อความต่อไปนี้ประกาศอาร์เรย์สองมิติขนาด 10×10 ภายในขั้นตอนหนึ่ง
เมทริกซ์แบบคงที่A(9,9)เป็นสองเท่า
คุณสามารถประกาศมิติข้อมูลอย่างใดอย่างหนึ่งหรือทั้งสองอย่างโดยมีขอบเขตล่างที่ชัดเจน:
StaticMatrixA(1To10,1To10)เป็นสองเท่า
ทั้งหมดนี้สามารถทำให้เป็นอาร์เรย์ที่มีขนาดมากกว่าสองมิติได้ ตัวอย่างเช่น:
DimMultiD(3,1ถึง10,1ถึง15)
การประกาศนี้สร้างอาร์เรย์สามมิติขนาด 4×10×15 จำนวนองค์ประกอบทั้งหมดเป็นผลคูณของสามมิติ ซึ่งก็คือ 600
โปรดทราบว่า เมื่อเพิ่มขนาดของอาร์เรย์ พื้นที่เก็บข้อมูลที่อาร์เรย์ครอบครองจะเพิ่มขึ้นอย่างมาก ดังนั้นอาร์เรย์หลายมิติจึงควรใช้ด้วยความระมัดระวัง ควรระมัดระวังเป็นพิเศษเมื่อใช้อาร์เรย์ Variant เนื่องจากต้องใช้พื้นที่จัดเก็บข้อมูลขนาดใหญ่
การใช้ลูปเพื่อจัดการอาร์เรย์
คุณสามารถใช้ For loops ที่ซ้อนกันเพื่อประมวลผลอาร์เรย์หลายมิติได้อย่างมีประสิทธิภาพ ตัวอย่างเช่น ใน MatrixA แต่ละองค์ประกอบจะได้รับการกำหนดค่าตามตำแหน่งในอาร์เรย์:
DimIAsInteger,JAsInteger
StaticMatrixA(1To10,1To10)เป็นสองเท่า
สำหรับI=1ถึง10
สำหรับJ=1ถึง10
เมทริกซ์A(I,J)=I*10 เจ
ต่อไปเจ
ต่อไปผม
ข้อมูลเพิ่มเติม สำหรับข้อมูลเพิ่มเติมเกี่ยวกับลูป ดูส่วน "โครงสร้างลูป" ภายหลังในบทนี้
อาร์เรย์แบบไดนามิก
บางครั้งไม่ทราบว่าอาร์เรย์ควรมีขนาดใหญ่เพียงใด ดังนั้นฉันหวังว่าจะมีความสามารถในการเปลี่ยนขนาดของอาร์เรย์ขณะรันไทม์
อาร์เรย์แบบไดนามิกสามารถเปลี่ยนขนาดได้ตลอดเวลา ใน Visual Basic อาร์เรย์แบบไดนามิกมีความยืดหยุ่นและสะดวกที่สุด ช่วยจัดการหน่วยความจำได้อย่างมีประสิทธิภาพ ตัวอย่างเช่น คุณสามารถใช้อาร์เรย์ขนาดใหญ่ในช่วงเวลาสั้นๆ จากนั้นปล่อยพื้นที่หน่วยความจำให้กับระบบเมื่อไม่ได้ใช้งานอาร์เรย์
หากคุณไม่ได้ใช้อาร์เรย์แบบไดนามิก ให้ประกาศอาร์เรย์ให้มีขนาดใหญ่ที่สุดเท่าที่จะเป็นไปได้ จากนั้นจึงลบองค์ประกอบที่ไม่จำเป็นออก อย่างไรก็ตาม หากใช้วิธีนี้มากเกินไป จะทำให้สภาพแวดล้อมการทำงานของหน่วยความจำช้าลง
เมื่อต้องการสร้างอาร์เรย์แบบไดนามิก ให้ทำตามขั้นตอนเหล่านี้:
1. (ถ้าคุณต้องการให้อาร์เรย์เป็นอาร์เรย์สาธารณะ ให้ประกาศอาร์เรย์ด้วยคำสั่ง Public หรือ (ถ้าคุณต้องการให้อาร์เรย์เป็นระดับโมดูล ให้ประกาศอาร์เรย์ด้วยคำสั่ง Dim ที่ระดับโมดูล) หรือ (ถ้าคุณต้องการให้อาร์เรย์เป็นอาร์เรย์ภายในเครื่อง) ให้ใช้คำสั่ง Static หรือ Dim เพื่อประกาศอาร์เรย์ในระหว่างขั้นตอน ประกาศอาร์เรย์เป็นแบบไดนามิกโดยผนวกตารางมิติว่างลงไป
DimDynArray()
2. ใช้คำสั่ง ReDim เพื่อจัดสรรจำนวนองค์ประกอบตามจริง
ReDimDynArray(X 1)
คำสั่ง ReDim สามารถปรากฏภายในขั้นตอนเท่านั้น แตกต่างจากคำสั่ง Dim และคำสั่งแบบคงที่ คำสั่ง ReDim เป็นคำสั่งที่ปฏิบัติการได้ เนื่องจากคำสั่งนี้ แอปพลิเคชันจึงดำเนินการขณะรันไทม์ คำสั่ง ReDim รองรับไวยากรณ์ที่เหมือนกับที่ใช้กับอาร์เรย์คงที่ สำหรับแต่ละมิติ แต่ละคำสั่ง ReDim สามารถเปลี่ยนจำนวนองค์ประกอบและขอบเขตบนและล่างได้ อย่างไรก็ตาม ขนาดของอาร์เรย์ไม่สามารถเปลี่ยนแปลงได้
ReDimDynArray(4to12)
ตัวอย่างเช่น ใช้อาร์เรย์แบบไดนามิก Matrix1 ที่สร้างขึ้นในระดับโมดูลเป็นครั้งแรก:
DimMatrix1()AsInteger
จากนั้นจัดสรรพื้นที่สำหรับอาร์เรย์ตามขั้นตอน:
SubCalcValuesNow()
-
-
-
รีดิมแมทริกซ์1(19,29)
สิ้นสุดย่อย
คำสั่ง ReDim ที่นี่จัดสรรเมทริกซ์จำนวนเต็ม 20×30 ให้กับเมทริกซ์ (ขนาดองค์ประกอบทั้งหมดคือ 600) มีอีกวิธีหนึ่งในการใช้ตัวแปรเพื่อกำหนดขอบเขตของอาร์เรย์แบบไดนามิก:
รีดิมเมทริกซ์1(X,Y)
โปรดทราบว่า คุณสามารถกำหนดสตริงให้กับอาร์เรย์ไบต์ที่มีขนาดผันแปรได้ อาร์เรย์ไบต์สามารถกำหนดให้กับสตริงที่มีความยาวผันแปรได้ สิ่งสำคัญคือต้องทราบว่าจำนวนไบต์ในสตริงจะแตกต่างกันไปตามแพลตฟอร์ม สตริงเดียวกันมีจำนวนไบต์เป็นสองเท่าบนแพลตฟอร์ม Unicode มากกว่าบนแพลตฟอร์มที่ไม่ใช่ Unicode
รักษาเนื้อหาของอาร์เรย์แบบไดนามิก
แต่ละครั้งที่มีการดำเนินการคำสั่ง ReDim ค่าทั้งหมดที่จัดเก็บไว้ในอาร์เรย์ในปัจจุบันจะสูญหายไป Visual Basic รีเซ็ตค่าขององค์ประกอบอาร์เรย์เป็นว่างเปล่า (สำหรับอาร์เรย์ Variant) เป็น 0 (สำหรับอาร์เรย์ตัวเลข) เป็นสตริงที่มีความยาวเป็นศูนย์ (สำหรับอาร์เรย์สตริง) หรือไม่เป็นอะไรเลย (สำหรับอาร์เรย์ของวัตถุ) .
สิ่งนี้มีประโยชน์เมื่อเตรียมอาร์เรย์สำหรับข้อมูลใหม่ หรือเมื่อคุณต้องการลดขนาดอาร์เรย์เพื่อประหยัดหน่วยความจำ บางครั้งคุณต้องการเปลี่ยนขนาดของอาร์เรย์โดยไม่สูญเสียข้อมูลในอาร์เรย์ ซึ่งสามารถทำได้โดยใช้คำสั่ง ReDim พร้อมด้วยคีย์เวิร์ด Preserve ตัวอย่างเช่น การใช้ฟังก์ชัน UBound เพื่ออ้างอิงขอบเขตบนจะทำให้อาร์เรย์ขยายและเพิ่มองค์ประกอบโดยไม่สูญเสียค่าขององค์ประกอบที่มีอยู่:
ReDimPreserveDynArray (UBound (DynArray) 1)
เมื่อใช้คีย์เวิร์ด Preserve คุณสามารถเปลี่ยนขอบเขตบนของมิติสุดท้ายในอาร์เรย์หลายมิติเท่านั้น หากคุณเปลี่ยนขอบเขตล่างของมิติอื่นหรือมิติสุดท้าย ข้อผิดพลาดจะเกิดขึ้นที่รันไทม์ จึงสามารถโปรแกรมได้ดังนี้
ReDimPreserveMatrix(10,UBound(เมทริกซ์,2) 1)
แทนที่จะเขียนโปรแกรมแบบนี้:
ReDimPreserveMatrix(UBound(เมทริกซ์,1) 1,10)
สำหรับ ข้อมูลโดยละเอียดเพิ่มเติมเกี่ยวกับอาร์เรย์แบบไดนามิก โปรดดู "ฟังก์ชัน ReDim" ในการอ้างอิงภาษา สำหรับข้อมูลเกี่ยวกับอาร์เรย์วัตถุ โปรดดูบทที่ 9 "การเขียนโปรแกรมด้วยวัตถุ"
-