สร้าง Class Module ต้องทำอย่างไร
กระทู้เก่าบอร์ด อ.Yeadram

 3,551   6
URL.หัวข้อ / URL
สร้าง Class Module ต้องทำอย่างไร

พอดีผมอ่าน help แล้วยังไม่ค่อยเข้าใจ
รบกวนพี่ๆหน่อยได้ไหมครับ
1.ผมสร้าง Class Module แล้ว และ copy code เขียวๆไปดีแคลไว้แล้ว
2.จากนั้นผมก็ใส่ Event Precedure ลงไปตัวนึงแล้ว(ใน class module)
3. ...หน้าจะติดที่ขั้นนี้นะครับยังงงอยู่ ไม่รู้จะทำอย่างไรให้มันทำงาน

Using Events with the Application Object
See AlsoSpecificsTo create an event handler for an event of the Application object, you need to complete the following three steps:

1.Declare an object variable in a class module to respond to the events.
2.Write the specific event procedures.
3.Initialize the declared object from another module.
Declare the Object Variable
Before you can write procedures for the events of the Application object, you must create a new class module and declare an object of type Application with events. For example, assume that a new class module is created and called EventClassModule. The new class module contains the following code.

Public WithEvents App As Application
          
Write the Event Procedures
After the new object has been declared with events, it appears in the Object list in the class module, and you can write event procedures for the new object. (When you select the new object in the Object list, the valid events for that object are listed in the Procedure list.) Select an event from the Procedure list; an empty procedure is added to the class module.

Private Sub App_NewPresentation()

End Sub
          
Initializing the Declared Object
Before the procedure will run, you must connect the declared object in the class module (App in this example) with the Application object. You can do this with the following code from any module.

Dim X As New EventClassModule
Sub InitializeApp()
    Set X.App = Application
End Sub

          
Run the InitializeApp procedure. After the procedure is run, the App object in the class module points to the Microsoft PowerPoint Application object, and the event procedures in the class module will run when the events occur.

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

1 @R00920
คุณจะให้มันทำอะไรครับ ตย.โค้ดที่ให้มามันโล่งๆ มันไม่สมบูรณ์ บอกอะไรมากไม่ค่อยได้ มันไม่ได้ทำอะไรเลยนอกจากกำหนดให้ property App ของตัวแปรอ๊อปเจ็ค X ชี้ไปที่อ๊อปเจ็คที่ชื่อ Application เท่านั้น

ผมเข้าใจว่า ตย.นี้น่าจะพยายามสอนเรื่องเกี่ยวกับการใช้ WithEvents keyword มากกว่าจะสอนว่า Class Module นั้นเขียนอย่างไร
2 @R00921
พอดีผมอยากจะลองเขียน code ใน powerpoint หนะครับ
แต่หา event ต่างๆมันไม่เจอ ก็เลยลองเปิด help ดู
ก็ได้เจอตามหน้าข้างบนหนะครับ...

พอดีเห็นว่ามันน่าจะเป็นความรู้ใหม่สำหรับผม ก็เลยเอามา post ถามเพราะคิดว่าชาว webboard นี้น่าจะพอมีประสบการ์ณ การประกาศ Object ใหม่ใน class module
3 @R00922
อย่างแรกคือ คุณได้ install help ที่เกี่ยวกับ VBA แล้วหรือยัง ถ้า install แล้วมันก็จะอยู่ตามในรูป (ตย.นี้เป็นของ Office 2002)



จะทดลองเขียนโปรแกรม ถ้ายังไม่เชี่ยวชาญในระบบนั้นๆ (เช่น กรณีเขียนใน PowerPoint) ก็ไม่ต้องทำเป็น Class Module ก็ได้ครับ แต่ถ้าอยากจะลองเขียน Class Module ก็ควรเขียนใน Application ที่คุณถนัดอยู่แล้ว เช่น Access เป็นต้น แล้วก็ยังไม่ต้องใช้ WithEvents ครับ ต่อเมื่อเข้าใจว่า Class Module เราสร้าง Propert และ Method อย่างไร เรียกใช้อย่างไรแล้ว ก็ค่อยมาทดลอง WithEvents ทีหลัง เริ่มจากง่ายไปยากดีกว่านะครับ

ส่วนการประกาศ Object ใน Class Module ก็ไม่แตกต่างจากที่ทำใน Module ทั่วไปนะครับ ยกเว้นการใช้ WithEvents เท่านั้นที่ต้องทำใน Class Module เท่านั้น
4 @R00923
ผมทำได้แล้วครับ เปลี่ยนมันมั่วซั่วดู
ใส่ code นี้ลงไปใน module ตัวใดตัวหนึ่ง
Dim X As New Class1
Sub InitializeApp()
    Set X.App = Application
End Sub


เสร็จแล้วใส่ code ข้างล่างนี้ลงไปใน class module(class1)

Public WithEvents App As Application

Private Sub App_SlideShowNextSlide(ByVal Wn As SlideShowWindow)
   Msgbox "ABC"
End Sub


ปรากฎว่าตอนเปลี่ยน slide มันทำงานแล้วครับ
แต่เนื่องจากเป็นการลองทำแบบมั่วๆก็เลยยังงงอยู่ว่าตัวแปลอันไหนมันคืออะไรรับส่งค่ากันอย่างไร

...ที่มาเริ่มใน PowerPoint เพราะว่ามันหา event ต่างๆไม่เจอนะครับ ก็เลยต้องมาหาวิธีเอา ตอนที่เขียน Access ไม่ค่อยได้ดิ้นรนเพราะว่ามันมีเครื่องมือให้ใช้อยู่พอสมควรแล้ว

ขอบคุณสันติสุขด้วยนะครับที่ได้พยายามชี้แนะ...
ยังรอคำแนะนำเพิ่มเติมอยู่นะครับ
5 @R00930
จะพยามลองอธิบายนะครับ ไม่แน่ใจว่าจะเขียนให้พออ่านได้รู้เรื่องแค่ไหนนะครับ

1) Public WithEvents App As Application
เป็นการกำหนดตัวแปรอ๊อปเจ็ค App ให้เป็นตัวแปรสำหรับคลาส Application การกำหนด WithEvents จะทำให้มี App มี event ของคลาส Application เพิ่มติดมาให้แก่ตัวแปร App อีกด้วย ... ลองสังเกตุไหมว่า ถ้าเราสั่ง Dim/Public/Private App As Application เฉยๆ มันจะมีแต่ property และ method เท่านั้น มันจะไม่สามารถรับ event อะไรที่เกิดขึ้นกับคลาส Application ได้เลย ... แต่แม้ว่าจะมี WithEvents ก็ไม่ได้หมายความว่าจู่ๆมันจะรับหรือเกิด event อะไรได้ มันจะเป็นไปได้ก็ต่อเมื่อมีการกำหนดที่เหมาะสมเท่านั้น ซึ่งเราจะดูต่อไป

นอกจากนี้แล้ว WithEvents ยังทำให้ App กลายเป็น Property หนึ่งใน Class Module ไปด้วยโดยปริยาย

2) Private Sub App_SlideShowNextSlide(ByVal Wn As SlideShowWindow)
   Msgbox "ABC"
End Sub

SlideShowNextSlide เป็น event หนึ่งของ PowerPoint ที่จะเกิดทุกครั้งก่อนการแสดงสไลด์อันต่อไป ... จากการที่เราสั่ง Public WithEvents App As Application เอาไว้ ทำให้เราสามารถเขียนโค้ดสำหรับ event (ที่คลาส Application มีอยู่แล้ว) ให้แก่ตัวแปร App ได้ด้วย ซึ่งเราก็ให้มันแสดง ABC ออกมา

3) Dim X As New Class1
Sub InitializeApp()
    Set X.App = Application
End Sub

ทีนี้มันจะทำงานได้อย่างไร ?

ใน Module อื่น เรากำหนดตัวแปรอ๊อปเจ็ค X สำหรับ Class1 ดังนั้นด้วยคุณสมบัติของ WithEvents ที่กล่าวไปข้างต้นที่บอกว่ามันจะกลายเป็น Property ของคลาสไป ทำให้เราสามารถเชียน X.App ได้ ... ต่อไปเรากำหนดให้ X.App = Application ซึ่งหมายความว่า ตอนนี้ App จะชี้ไปยังอ๊อปเจ็ค Application ของ PowerPoint ที่กำลังเปิดอยู่ ... event อะไรที่เกิดกับ Application ก็จะสืบทอดไปเกิดกับ App ด้วย ... ดังนั้นเมื่อเราเปลี่ยนสไลด์ ก็จะเกิด event SlideShowNextSlide กับอ๊อปเจ็ค Application ซึ่งจะสืบทอดมาเกิดกับ App ด้วย ทำให้แสดง message box ABC ออกมาแหล่ะครับ

แล้วทำไมต้องยุ่งยากอย่างนี้ ?

เพราะใน PowerPoint ไม่มี User Interface ให้เราใส่โค้ดเข้าไปผูกกับ event ของอ๊อปเจ็คต่างๆได้โดยตรงเหมือนอย่างใน Access ไงครับ เลยต้องใช้วิธีทางอ้อมอย่างนี้ครับ

เรื่องราวทั้งหมดก็เป็นอย่างนี้แหละครับ
6 @R00932
ขอบคุณมากครับ คิดว่าเบื้องต้นพอเข้าใจ
แต่อาจต้องกลับมาอ่านซ้ำอีก...

@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2936s