04 สิงหาคม 2558

การสร้าง VFP COM Object

พอดีเพื่อนๆ ที่ได้เขียนโปรแกรม VFP มีการนำเสนอ โปรเจกต์ พิมพ์รายงานของ VFP ผ่านทาง ASP และ ASP.net เลยทำให้อยากทำบ้าง ดังนั้นก็เป็นที่มาของวิธีการสร้าง VFP COM Object ขึ้นมาเพื่อจะได้ทำให้ VFP โลดแล่นอยู่บนเว็บบ้าง

การสร้าง VFP COM Object
1. เปิดโปรแกรม VFP (ตอนเปิดให้คลิกเมาส์ปุ่มขวา แล้วเลือก Run as Administrator) จากนั้นพิมพ์คำสั่งที่ Command Window
      MODIFY COMMAND myclass.prg

2. ทำการป้อนคำสั่งดังนี้
** คำสั่งได้มาจากเว็บ -> http://www.tek-tips.com/faqs.cfm?fid=3381

DEFINE CLASS myclass AS session OLEPUBLIC

PROCEDURE MyDoCmd(cCmd as String) as Variant ;
helpstring "Execute a VFP cmd"
&cCmd && just execute parm as if it were a fox command

FUNCTION MyEval(cExpr as String) ;
helpstring "Evaluate a VFP expression"
RETURN &cExpr && evaluate parm as if it were a fox expr

FUNCTION Error(nError, cMethod, nLine)
COMreturnerror(cMethod+' err#='+str(nError,5)+;
' line='+str(nline,6)+' '+message(),_VFP.ServerName)
&& this line is never executed

ENDDEFINE


ทำการบันทึก โดยกดปุ่ม Ctrl + W

3. ทำการ build dll เพื่อสร้าง .dll โดยพิมพ์คำสั่งที่ Command Window

BUILD PROJECT myserver FROM myclass

BUILD DLL myserver from myserver recomp

หากไม่เกิดข้อผิดพลาดใดๆ เป็นอันเสร็จ ก็จะได้ไฟล์ชื่อ myserver.dll เรียบร้อย
ทำการทดสอบว่า ไฟล์ dll และคำสั่งที่สร้างขึ้น ใช้ได้หรือไม่ โดยพิมพ์คำสั่งที่ Command Window

ox = CREATEOBJECT("myserver.myclass")

?ox.myeval("DATE()")


หากขึ้นวันที่บนหน้าจอแสดงว่า สำเร็จเรียบร้อย
ก็สามารถนำเอา myserver.dll ไปใช้ได้

สำหรับการเรียกใช้ใน asp.net ก็ให้ไปที่เมนู PROJECT เลือกรายการ Add Reference
จะเข้าสู่หน้าต่าง Reference Manage ให้คลิกเลือกที่ COM -> Type Libraries แล้วหาไฟล์ myserver.dll ที่เราสร้างขึ้น แล้วคลิกเลือก

ส่วนการเขียนคำสั่ง ใน ASP.Net เช่น ที่ Form -> Load

Dim oVFP As New myserver.myclass
Dim nRecno As Integer
Response.Write(oVFP.MyEval("time()"))

oVFP.MyDoCmd("USE c:\customer")

While oVFP.MyEval("!EOF()")
    nRecno = nRecno + 1
    Response.Write(nRecno)
    Response.Write(oVFP.MyEval("code"))
    Response.Write(oVFP.MyEval("name"))

    oVFP.MyDoCmd("SKIP")

End While

oVFP.MyDoCmd("USE IN customer")


สำหรับคำสั่งต่างๆ ที่เหลือก็ทดสอบดู หรือนำไปประยุกต์ตามต้องการ

หากต้องการนำไฟล์ myserver.dll ไปใช้งานกับเครื่องที่ไม่ได้ติดตั้งโปรแกรม Visual FoxPro ต้องทำการติดตั้้ง Runtime ของ Visual FoxPro ไปแทน


สวัสดี   /:-{)

29 พฤษภาคม 2558

SQL Server - OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" returned message "Unspecified error".

การ Query ข้อมูลจากตาราง Excel ด้วย SQL Server ด้วยคำสั่ง

SELECT * FROM 
OPENROWSET('Microsoft.ACE.OLEDB.12.0',
                            'Excel 12.0;Database=D:\YourExcelFile.xlsx;
                             User=Admin;Password=;HDR=Yes;IMEX=1', 
                             'SELECT * FROM [Sheet1$]');

แล้วเกิด Error เช่น

OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)"
returned message "Unspecified error"

ก่อนอื่นก็ต้องไปดูที่ โปรแกรม  Microsoft SQL Server Manage Studio

เปิดหน้าต่าง New Query... แล้วพิมพ์คำสั่ง

exec sp_configure 'show advanced options', 1;
RECONFIGURE WITH OVERRIDE
exec sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE WITH OVERRIDE

กดปุ่ม F5
จากนั้น ที่หน้าต่าง Object Explorer ดูตรง Linked Servers ว่าเรามี Provider ชื่อ Microsoft.ACE.OLEDB.12.0 อยู่แล้ว ดังภาพ  



















จากนั้นคลิกเมาส์ปุ่มขวา เลือก Properties จากนั้นให้คลิกเลือกที่
Dynamic parameter และ Allow  inprocess แล้วคลิกปุ่ม OK














จากนั้นไปทำการสำรวจ folder ที่เป็นพื้นที่เก็บข้อมูลชั่วคราวหรือ Temp file ซึ่งก็จะอยู่ภายใต้ Folder ชื่อ C:\User\ชื่อผู้ใช้\AppData\Local (ไฟล์จะถูกซ่อนอยู่ แต่ละเครื่องอาจจะอยู่คนละที่กัน ลอง Search หาดู)

จากนั้นคลิกเมาส์ปุ่มขวาที่ folder ชื่อ Temp เลือก Properties 
แล้วเอา Attribute ตรง Read-Only ออก
 






















และทำเช่นเดียวกันกับ โฟลดเดอร์ Temp ที่อยู่ใน
C:\Windows\ServiceProfiles\LocalService\AppData\Local



เท่านี้ก็ทำให้เราสามารถแก้ไขปัญหา Error ที่เกิดขึ้นกับการเปิดไฟล์ Excel จากภายนอกได้แล้ว

สวัสดี มีความสุข 

28 มีนาคม 2558

ASP.NET connect to a DBF file

การเชื่อมต่อกับไฟล์ dbf ด้วย ASP.NET

ก่อนอื่นให้ทำการ Download File VFPOleDB จากนั้นทำการติดตั้ง โปรแกรม (VFPOLEDBSetup.msi)

1. เปิดโปรแกรม Visual Studo 20xx  เลือก New Project....
2. คลิกที่รายการ Web -> ASP.NET Empty Web Application แล้วตั้งชื่อที่ช่อง Name: WebForm1
3. ทำการ Add -> New Item... -> Web Form ขึ้นมา

4. ไปที่เมนู PROJECT หรือ WEBSITE เลือกรายการ Add Refrence...
5. ที่หน้าต่าง Reference Manager ให้เลือกที่รายการ COM -> Type Libraries
     ติ๊กเลือก Microsoft OLE DB Provider for Visual FoxPro 7.0 Type Library ตามภาพ แล้วคลิก OK














6. ทำการเขียนคำสั่ง ในส่วนของ Web Form เช่น
ต้องการเรียกดูข้อมูลจากตาราง D:\CSS\Data\GROUP.dbf
ส่วนคำสั่ง SQL ทำการ Select ข้อมูล เฉพาะที่กำหนด 
เขียนคำสั่ง ดังนี้ (ปรับเปลี่ยนตามข้อมูลของแต่ละท่าน)

Imports System.Data

Partial Class WebForm1
    Inherits System.Web.UI.Page
    Dim DataDBF As String = "D:\CSS\Data\"
    Dim ConnectionString As String = String.Empty, sCommand As String = String.Empty
    Dim dBaseConnection As OleDb.OleDbConnection = Nothing, dBaseCommand As OleDb.OleDbCommand = Nothing
    Dim retVal As Integer = 0
    Dim reader As OleDb.OleDbDataReader
    Dim cSearch As String
    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
        Try

            'if use visual fox pro Connect to a single DBF-file
            ConnectionString = "Provider=vfpoledb;Data Source=" & IO.Path.GetDirectoryName(DataDBF) & ";Collating Sequence=machine;"
            dBaseConnection = New OleDb.OleDbConnection(ConnectionString)
            dBaseConnection.Open()
            cSearch = "อ"      ' ค้นหาตัวอักษร อ
            sCommand = "Select gr_code,gr_desc from group.dbf where gr_desc like '%" & cSearch & "%' "
            dBaseCommand = New OleDb.OleDbCommand(sCommand, dBaseConnection)
            'myDA = New OleDbDataAdapter(comm)
            'dBaseCommand = New OleDb.OleDbCommand(sCommand, dBaseConnection)
            retVal = dBaseCommand.ExecuteNonQuery()
            reader = dBaseCommand.ExecuteReader()
            While reader.Read()
                Response.Write(reader("gr_code").ToString & " ")
                ' second column
                Response.Write(reader("gr_desc").ToString & " ")
                'intCount = intCount + 1
            End While
            dBaseConnection.Close()
        Catch ex As OleDb.OleDbException
            Response.Write(ex.Message)
        End Try
    End Sub
End Class

ทำการบันทึกแล้วเรียกดู จะปรากฏข้อมูล ดังภาพ

















จากตัวอย่างข้างต้นเป็นตัวอย่างการใช้ออปเจ็กต์ Reader เพื่ออ่านเรคคอร์ดทีละรายการเพื่อทำการแสดงโดยผ่านคำสั่ง HTML ภายใต้ Response.Write

สำหรับตัวอย่างต่อไปนี้ จะเป็นการแสดงข้อมูลผ่านทาง GridView
ให้ทำการลาก GridView มาไว้ที่เว็บฟอร์ม ดังภาพ


ตั้งชื่อ GridView -> GridView1









จากนั้น ก็ดัดแปลงคำสั่งใหม่ดังนี้

Imports System.Data

Partial Class WebForm1
    Inherits System.Web.UI.Page

    Dim DataDBF As String = "D:\CSS\Data\"
    Dim ConnectionString As String = String.Empty, sCommand As String = String.Empty
    Dim dBaseConnection As OleDb.OleDbConnection = Nothing, dBaseCommand As OleDb.OleDbCommand = Nothing

    Dim cSearch As String

    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load

        Try
            'if use visual fox pro Connect to a single DBF-file
            ConnectionString = "Provider=vfpoledb;Data Source=" & IO.Path.GetDirectoryName(DataDBF) & ";Collating Sequence=machine;"
            dBaseConnection = New OleDb.OleDbConnection(ConnectionString)
            dBaseConnection.Open()
            cSearch = "อ"      ' ค้นหาตัวอักษร อ
            sCommand = "Select gr_code,gr_desc from group.dbf where gr_desc like '%" & cSearch & "%' "
            dBaseCommand = New OleDb.OleDbCommand(sCommand, dBaseConnection)

            '
            Dim dt As DataTable = GetData(dBaseCommand)
            GridView1.DataSource = dt
            GridView1.DataBind()
            '
            dBaseConnection.Close()
        Catch ex As OleDb.OleDbException
            Response.Write(ex.Message)
        End Try
    End Sub


    Private Function GetData(ByVal cmd As OleDb.OleDbCommand) As DataTable
        Dim dt As New DataTable()
        Dim sda As New OleDb.OleDbDataAdapter()
        cmd.CommandType = CommandType.Text
        cmd.Connection = dBaseConnection
        sda.SelectCommand = cmd
        sda.Fill(dt)
        sda.Dispose()
        Return dt
    End Function
End Class

หลังจากนั้น ก็ทำการบันทึก แล้วเรียกโปรแกรมดู

จะปรากฎข้อมูลดังตัวอย่าง




















สวัสดี มีสุข



06 มีนาคม 2558

SQL Server - การสร้าง Login , User และกำหนดสิทธิ แบบง่ายๆ

ตัวอย่างนี้นำเสนอ การสร้าง Login ชื่อ Kasem เพื่อเข้าใช้งาน SQL Server จากนั้นทำการเรียกฐานข้อมูลชื่อ myData แล้วทำการสร้าง User ภายใต้ฐานข้อมูล myData จากนั้นทำการกำหนดสิทธิในระดับ Database และ ระดับ Object

---ต้อง Login เป็น sa ก่อน

USE master
GO
-- สร้าง Login เพื่อเข้าใช้งาน SQL Server
CREATE LOGIN kasem
WITH PASSWORD ='P@ssw0d'
GO
-- เปิด Database ที่ต้องการสร้าง User
USE myData
GO
-- สร้าง User ให้เข้าใช้งาน Database ได้ แต่ทำอะไรไม่ได้
CREATE USER Kasem
GO

------- ระดับ DataBase จะมีผลกับทุกๆ ตาราง วิว etc....
-- Grant ระดับ database ว่าให้ user Kasem ทำอะไรได้บ้าง
-- การ grant User เพื่อให้สิทธิใช้ เรียกดูข้อมูลได้ อย่างเดียว
GRANT SELECT TO [Kasem] WITH GRANT OPTION
-- การ grant User เพื่อให้สิทธิเพิ่มข้อมูลได้
GRANT INSERT TO [Kasem] WITH GRANT OPTION
-- ส่วน UPDATE, DELETE หรือ อื่นๆ ก็กำหนดตามต้องการ

------- ระดับ Object จะมีผลกับตัวที่ระบุ
-- การ Grant ระดับ Object เลือกเฉพาะตารางหรือ object ที่ต้องการ
GRANT UPDATE ON vwStudent TO Kasem
GRANT DELETE ON vwStudent TO Kasem

31 ธันวาคม 2557

ตัวอย่าง Windows API

ตัวอย่าง Windows API จาก เว็บ http://www.news2news.com

1. เปิดเครื่องคิดเลขของวินโดว์ในโปรแกรมที่เราสร้างขึ้นเอง
http://www.news2news.com/vfp/?example=245&ver=vfp

2. หา Mac Address
http://www.news2news.com/vfp/?example=585&ver=vfp

3. Convert to Unicode
http://www.news2news.com/vfp/?example=212&ver=vfp

4. Play MIDI note
http://www.news2news.com/vfp/?example=537&ver=vfp

5. Create desktop shotcut
http://www.news2news.com/vfp/?example=583

6. Display On-screen Keyboard
http://www.news2news.com/vfp/?example=582&ver=vfp

7. Set Default Printer
http://www.news2news.com/vfp/?example=589&ver=vfp


เรียนรู้การเขียนเว็บเพจ ในแบบ Responsive web


04 มิถุนายน 2557

Excel VBA - 1. เริ่มต้นเขียน VBA กัน

หรับผู้ที่ใช้ Excel 2007, 2010 หรือ รุ่นที่ใหม่กว่า ก่อนอื่นเราต้องกำหนดค่าเพื่อให้สามารถใช้ VBA และ Macro ก่อน โดยทำตามขั้นตอน ดังนี้

เปิดโปรแกรม Excel 2007, 2010 หรือ รุ่นที่ใหม่กว่า จากนั้น

1. เลือก เมนู File -> Options
2. ที่หน้าต่าง Excel Options ให้คลิกที่รายการ Customize Ribbon
3. ในส่วนของ กล่อง Main Tabs ให้ติ๊กเครื่องหมายถูกหน้ารายการ Develop จากนั้นคลิกปุ่ม OK 


















จากนั้นเมนูของ Excel ก็จะปรากฎรายการเมนู Developer เพิ่มขึ้นมา 

4. ให้คลิกที่เมนู Developer เลือก Macro Security
5. ที่หน้าต่าง Trust Center ให้เลือกรายการ Macro Setting
6. ในส่วนของ Macro Settings ให้เลือกรายการ 

       Enable all macros (not recommended; potentially dangerous code can run) 
 และ Trust access to the VBA project object model จากนั้น คลิกปุ่ม OK



เท่านี้โปรแกรม Excel ของเราก็สามารถใช้งาน VBA ได้แล้ว


เริ่มเขียนคำสั่ง VBA กัน

1. ที่ Excel ให้เลือกเมนู Developer 
2. จากนั้นคลิกเลือก ไอคอน Visual Basic จะปรากฎหน้าต่าง Microsoft Visual Basic for Application ขึ้นมา
3. ไปที่เมนู Insert เลือก รายการ Module 
4. ที่หน้าต่าง Module1(Code) ให้ทำการป้อนคำสั่ง ดังนี้

Sub mySub()
MsgBox ("Hello World")
End Sub

จากนั้นทำการบันทึก Excel Workbook 

เมื่อต้องการเรียกใช้งานให้คลิกปุ่ม F5 หรือไปที่เมนู Run เลือกรายการ Run Sub/UserForm

ก็จะปรากฎ Messagebox ขึ้นมาดังภาพ

*** เมื่อต้องการบันทึก workbook ของ Excel เวลาบันทึกให้กำหนดประเภทของไฟล์ เป็น Excel Macro-Enabled Workbook (*.xlsm)




















การเรียกใช้งาน subroutine อัตโนมัติ

สำหรับ subroutine ที่จะถูกเรียกใช้งานแบบอัตโนมัติ จะใช้ชื่อว่า Workbook_open ซึ่งจะถูกเรียกใช้งานโดยอัตโนมัติเมื่อเราทำการเปิดไฟล์ Workbook ของ Excel

วิธีการกำหนดสามารถทำได้ดังนี้

1. ทำการเพิ่ม Subroutine ใหม่ โดยใช้ชื่อว่า Workbook_Open ทำได้โดย ไปที่หน้าต่าง
Project - VBAProject แล้ว ดับเบิ้ลคลิกที่รายการ ThisWorkbook 


















จะเข้าสู่หน้าต่างเขียนคำสั่ง ให้เขียนคำสั่ง ดังนี้

Private Sub Workbook_Open()
mySub 'mySub คือชื่อ subroutine ที่เราสร้างขึ้นเอง
End Sub

ทำการ บันทึก (save) workbook แล้วปิด (close)

*** อย่าลืม --- การบันทึก workbook ให้กำหนดประเภทของไฟล์ เป็น Excel Macro-Enabled Workbook (*.xlsm)

จากนั้นเปิด workbook ใหม่อีกรอบ ก็จะมีการเรียกใช้งาน mySub ผ่านทาง subroutine Workbook_Open โดยอัตโนมัติ

สำหรับ Excel VBA ตอนแรก ก็ขอจบไว้เพียงเท่านี้ 

ช่วงนี้มี เป็นช่วง เคอร์ฟิว (curfew) คือ การห้ามออกจากเคหสถานเวลาค่ำคืน ตามที่รัฐกำหนด
ขอให้ทุกคนหลับฝันดี รวยๆ เจริญๆ

26 เมษายน 2557

การสร้างผู้ใช้ใหม่ สำหรับ SQL Server

การสร้างผู้ใช้ใหม่ (user) สำหรับเข้าถึงทรัพยากรต่างๆ ของ SQL Server มีวิธีการอยู่หลายวิธี
สำหรับบทความนี้จะนำเสนอ วิธีง่ายๆ 3 ขั้นตอน สามารถทำได้ไม่ยากโดยอาศัยคำสั่ง T-SQL ซึ่งมีขั้นตอนวิธีทำดังนี้

สำหรับคำสั่งในขั้นตอนต่างๆ จะใช้สิทธิ์ของผู้ใช้ ชื่อ sa
ทำการสร้างฐานข้อมูลเตรียมไว้โดยกำหนดชื่อ เป็น kasem_db

ขั้นตอนที่ 1
ให้ทำการสร้าง ชื่อล็อกอิน (Login Name) เช่น kasem (อยู่ภายใต้เซิร์ฟเวอร์ชื่อ SUPERMAN-TWIST)
โดยกำหนดรหัสผ่านเป็น P@ssw0d และกำหนดดีฟอล์ตฐานข้อมูลชื่อ kasem_db

USE master
GO
CREATE LOGIN [SUPERMAN-TWIST\kasem] WITH PASSWORD = 'P@ssw0d'
       DEFAULT_DATABASE = [kasem_db]
GO

ขั้นตอนที่ 2
ต่อมาทำการสร้าง ชื่อผู้ใช้งานฐานข้อมูล (User Name) ปกติจะใช้ชื่อเดียวกันกับชื่อ ล็อกอินที่สร้างขึ้นก่อนหน้า เช่น kasem ให้กับฐานข้อมูล kasem_db

USE [kasem_db]
GO
CREATE USER kasem FOR LOGIN kasem

GO


ขั้นตอนที่ 3
ทำการกำหนดบทบาทของผู้ใช้งานฐานข้อมูล (database role) สำหรับตัวอย่างนี้จะใช้บทบาทของ SQL Server ได้จัดเตรียมไว้ให้ ดังแสดงในตาราง

ตารางแสดงรายละเอียดของ Fixed database role
Database Role
รายละเอียด
db_owner
กำหนดให้มีสิทธิ์ในการทำงานทุกอย่างในฐานข้อมูล
db_accessadmin
กำหนดให้มีสิทธิ์ในการ เพิ่ม ลบ ผู้ใช้งานฐานข้อมูล รวมถึงบทบาทของผู้ใช้
db_securityadmin
กำหนดให้มีสิทธิ์ในการจัดการสิทธิ์ต่างๆ ของผู้ใช้งานฐานข้อมูล
db_ddladmin
กำหนดให้มีสิทธิ์ในการใช้งานคำสั่งในกลุ่ม Data Definition Language (DDL)
db_backupoperator
กำหนดให้มีสิทธิ์ในสำรองข้อมูล (backup)
db_datareader
กำหนดให้มีสิทธิ์ในการอ่านข้อมูลของตารางในฐานข้อมูล
db_datawriter
กำหนดให้มีสิทธิ์ในการ เพิ่ม แก้ไข ลบ ข้อมูลในตารางของฐานข้อมูล
db_denydatareader
กำหนดให้ไม่สามารถอ่านข้อมูลของตารางในฐานข้อมูล
db_denydatawriter
กำหนดให้ไม่สามารถ เพิ่ม แก้ไข ลบ ข้อมูลในตารางของฐานข้อมูล

ในที่นี้กำหนดบทบาทให้กับผู้ใช้ kasem เป็น db_owner โดยเขียนคำสั่งดังนี้

USE TestDB
GO
EXECUTE sp_addrolemember 'db_owner' , 'Kasem'
GO

หรือถ้าหากต้องการกำหนดเป็นอย่างอื่น เช่น ต้องการให้ทำได้เฉพาะ การเพิ่ม แก้ไข ลบข้อมูลในตาราง และสิทธิ์ในการสำรองข้อมูล ซึ่งต้องใช้บทบาทหลายๆ อย่าง ก็สามารถเขียนคำสั่งได้ดังนี้

USE TestDB
GO
EXECUTE sp_addrolemember 'db_datareader' , 'Kasem'
EXECUTE sp_addrolemember 'db_datawriter' , 'Kasem'
EXECUTE sp_addrolemember 'db_backupoperator' , 'Kasem'
GO

เพียงขั้นตอนง่ายๆ 3 ขั้นตอน คุณก็สามารถสร้างชื่อผู้ใช้งานฐานข้อมูลได้เอง

สวัสดีมีเงินใช้ ถึงอากาศจะร้อน แต่ใจเราอย่าใจร้อน

11 ตุลาคม 2556

FLASH สอนการเขียนเกมตีตัวตุ่น

ตอนนี้นำเสนอ วีดีโอ สอนการเขียนเกมด้วย Flash ตอน เกม ตีตัวตุ่น



Source Code

import flash.ui.Mouse;
import flash.events.MouseEvent;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.text.engine.TypographicCase;

var nR:uint = 0;
var nMin:uint = 1;
var nMax:uint = 15;
var nScore:uint = 0;

stage.addChild(myMouse);
myMouse.mouseEnabled = false;
myMouse.addEventListener(Event.ENTER_FRAME, fnMyMouse);

function fnMyMouse(event:Event):void {
 myMouse.x = stage.mouseX;
 myMouse.y = stage.mouseY;
}
Mouse.hide();

var gTimer:Timer;
gTimer = new Timer(500, 0);
gTimer.addEventListener(TimerEvent.TIMER, fnRandom);
gTimer.start();

for (var i:int = nMin; i <= nMax; i++) {
 this["m"+i].gotoAndPlay(i);
 this["m"+i].addEventListener(MouseEvent.CLICK, onClick(i));
 this["m"+i].visible = false;
}
  
function onClick(j:int):Function {
 return function(event:MouseEvent):void {
  fnScore(j);
 }
}
  
function fnScore(k:int) {
 nScore++ ;
 this["m"+k].visible = false;
 txtScore.text = nScore.toString();
}
  
function fnRandom(event:TimerEvent):void {
 nR = Math.floor(Math.random() * (1 + nMax - nMin) + nMin);
 this["m"+nR].visible = true;
}

สวัสดี มีความสุข
"I Believe in You"

Copyright(c) 2007 - 2022 by Kasem Kamolchaipisit.