สร้าง instance ฟอร์ม
กระทู้เก่าบอร์ด อ.Yeadram

 1,298   6
URL.หัวข้อ / URL
สร้าง instance ฟอร์ม

ขอเรียนถาม อาจารย์ และท่านผู้รู้ ดังนี้ครับ
ต้องการสร้าง instance ฟอร์ม (Form4)

Dim tmpFrm as Form                                          ...1
Dim frmName as String                                       ...2

frmName = "Form4"                                             ...3

Set tmpFrm = New Form_frmName                      ...4

หากต้องการสร้าง instance ของฟอร์ม ด้วยชื่อที่กำหนดด้วยตัวแปร frmName
ในบรรทัดที่ 4 จะต้องทำอย่างไรครับ

*** สาเหตุที่ต้องกำหนดชื่อฟอร์มด้วยตัวแปรเนื่องจากชื่อ instance อาจมีการ
เปลี่ยนแปลงตามเหตุการณ์

ขอขอบคุณสำหรับทุกคำตอบ ครับ

6 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R14497
เคยทำแต่แบบเจาะจงฟอร์มไปเลย ไม่แน่ใจ ถ้าเราสั่งแบบนี้หล่ะ จะได้ไหม Set tmpFrm = New Forms(frmName)
2 @R14499
อ,สันติสุข ครับ instance คืออะไร
อ่านโจทย์แล้ว ไม่รรู้เรื่องเลยครับ ว่าคือ อะไร
3 @R14500
อื่ม! ไม่รู้เหมือนกันครับ ใครทราบเฉลยหน่อย อยากรู้เหมือนกัน แต่เท่าที่เห็นเค้าทำกันมักใช้ Select Case แทนครับ เช่น สมมุติรับชื่อฟอร์มจากฟิลด์ Text1 บนฟอร์ม

Dim frm As Form
Select Case Me.Text1
    Case Is = "Form12"
        Set frm = New Form_Form12
    Case Is = "Form1"
        Set frm = New Form_Form1
End Select
frm.Visible = True
...

ประมาณนี้ครับ
4 @R14503
พูดถึงตัวโจทย์ก่อน โดยปกติเวลาเปิดฟอร์ม A ขึ้นมาแล้ว และฟอร์มยังไม่ปิด ถ้าเราสั่ง DoCmd.OpenForm "A" มันก็เรียกฟอร์มที่เปิดนั่นแหล่ะ ไม่ได้สั่งให้เปิดฟอร์ม A ขึ้นมา 2 ฟอร์มพร้อมๆกัน และถ้าดูคำสั่งก็เหมือนจะไม่มีอะไรทำอย่างนี้ได้ แต่จริงๆทำได้ครับ โจทย์นี้ต้องการเปิดฟอร์มใดๆมากกว่า 1 ฟอร์มให้มาแสดงพร้อมๆกันได้ภายใน Access ตัวเดียวกัน

ทีนี้พูดถึงเรื่อง instance    ผมไม่ได้เรียนมาทางด้าน Object Oriented (OO) มา ก็ขออธิบายตามความเข้าใจแล้วกันนะครับ อาจไม่ถูกต้องตามทฤษฏี/หลักการบ้างก็ขออภัยด้วย    ถ้าสั้นๆ ... instance ก็คืออ็อปเจ็คแต่ละตัวที่มาจาก class เดียวกัน    แต่ละองค์ประกอบของ Access (เช่น ฟอร์ม รายงาน คิวรี่ แมโคร เมนู) ถูกสร้างขึ้นมาบนพื้นฐานแนวคิดแบบ OO ทุกอย่างที่ทำงานอยู่ ก็คืออ็อปเจ็ค 1 ตัว ก่อนที่อ็อปเจ็คเหล่านี้จะมีตัวตนขึ้นมาทำงานในระบบได้ มันจะมาจากต้นแบบที่ได้ทำเอาไว้แล้วก่อนหน้า เราเรียกต้นแบบนี้ว่า คลาส (class)   ในหลักการการเขียน Object Oriented Programming (OOP) เราจะเขียนโปรแกรมของตัวคลาสก่อน แล้วเมื่อสั่งคลาสให้ทำงาน เราก็จะเรียกมันว่าเป็น object อย่างเช่นเราเขียนว่า

Dim RS    AS DAO.Recordset

คำว่า Recordset ก็คือชื่อของคลาสนึงในไลบรารี่ DAO ที่ได้ทำไว้ก่อนหน้านี้แล้ว   Dim RS ก็บอกว่า RS เป็นตัวแปรที่มีคุณสมบัติเป็นไปตามคลาส Recordset ทุกประการ   RS นี่แหล่ะเป็นตัวอ็อปเจ็คที่จะทำงาน ไม่ใช่ Recordset ที่จะเป็นตัวทำงาน   Recordset เป็นแค่คลาสเท่านั้น

ทีนี้กลับมาที่เรื่องของฟอร์ม ทุกฟอร์มที่เราสร้างขึ้น จะถูก Access สร้างให้เป็น class นึงไปโดยปริยายเพื่อให้เป็นเนื้อเดียวกันกับ Access    ถ้าฟอร์มชื่อ A ชื่อคลาสของฟอร์มนี้ก็คือ Form_A    เมื่อเราเปิดให้ฟอร์ม A ทำงาน นั่นก็คือเราทำให้มันเกิดอ็อปเจ็คของฟอร์มนี้ขึ้นมาในระบบ อ็อปเจ็ค 1 ตัวก็เรียกว่าเป็น 1 instance ของคลาสนี้ ถ้าสามารถเปิดฟอร์ม A ขึ้นมาได้ 2 ตัวพร้อมๆกัน ก็จะเรียกว่าเรามี 2 instance ครับ

หวังว่าพอจะเข้าใจบ้าง ถ้าใครเก่งเรื่อง OOP ก็ช่วยเพิ่มเติมด้วยแล้วกัน

5 @R14504
ขอบคุณครับอาจารย์
นึกไม่ออกว่า ทำไมเปิดฟอร์มเดียวกัน พร้อมกัน เพื่อทำอะไร
แต่อาจจะเป็นฟอร์มเดียวกัน แต่ Souce คนละ Souce กันก็น่าจะใช่
6 @R14505
ใช่ครับ ฟอร์มเดียวกัน   แต่อาจมีอะไรแตกต่างกันบ้าง เช่น RecordSource property แตกต่างกันเพื่อให้แสดงผลคนละชุดได้พร้อมๆกัน 2 ฟอร์ม
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2892s