ชุมชนคนรักภาษาเบสิค - Visual Basic Community

 ลืมรหัสผ่าน
 ลงทะเบียน
ค้นหา
ดู: 1847|ตอบกลับ: 0

[VB6] แจกฟรีโค้ดการพิมพ์ใบแจ้งค่าใช้จ่าย แบบกระดาษครึ่ง A4 ด้วย FarPoint Spread และ ActiveReports 2.0

[คัดลอกลิงก์]

213

กระทู้

301

โพสต์

2403

เครดิต

ผู้ดูแลระบบ

Rank: 9Rank: 9Rank: 9

เครดิต
2403



แจกไปแล้วสำหรับสาย Dot Net
ฟรีโค้ด VB.NET + ActiveReports.NET การพิมพ์ใบแจ้งค่าใช้จ่าย สำหรับหอพัก ห้องเช่า อพาร์ทเมนท์ แบบกระดาษครึ่ง A4 ... ประเดี๋ยวมิตรรักแฟนคลับ VB6 จะน้อยเนื้อต่ำใจหาว่าแอดมินทอดทิ้งเมียเก่าเมียแก่อย่าง VB6 ที่อยู่ด้วยกันมาอย่างยาวนาน สิ่งที่แอดมินอยากจะกล่าวถึงก็คือ เรื่องที่หลายต่อหลายคนมักชอบผูกข้อมูล (Bound Data) จากแหล่งจ่าย (Data Source) ยึดติดเข้าไว้กับบรรดา Control ต่างๆ เช่น TexBox หรือ DataGrid แน่นอนว่ามันเป็นวิธีการที่ค่อนข้างง่ายดายมากๆ แต่ในกรณีที่ไม่มี Data Source หรือไม่ใช่บรรดาพวก Relation DataBase ล่ะจะทำอย่างไร หรือมีแต่ต้องไปติดต่อผ่าน OLEDB (อ่านว่า โอเล่ดีบี) มาก่อน ก็จะทำให้เสียเวลาอีกนั่นแหละ ...

หากเรามีแหล่งข้อมูลอะไรก็ได้ เช่น XLS, CSV, XML หรืออื่นๆ ที่สามารถโหลดข้อมูลเข้าสู่ตารางกริด เพื่อต้องการจะพิมพ์งาน หรือต้องการนำข้อมูลไปใช้ในงานอื่นๆ เช่น ทำกราฟแสดงผล มันก็จะเกิดปัญหาขึ้น เพราะเราไม่สามารถผูกโยงฟิลด์ข้อมูลเข้าหา Control ได้ ดังนั้นเราจึงจำเป็นจะต้องใช้วิธีการ Unbound Data แทน นั่นก็คือการ Loop ข้อมูลจากตารางกริดมาใช้งานแทนซิครับทั่นผู้ชม นอกจากนี้แล้วแอดมินเลยรวบรัดแถมท้าย การจัดเก็บข้อมูลขนาดเล็กเอาไว้ใน Initialized File หรือ INI มาให้ศึกษากันด้วยนะขอรับกระผม ...


ข้อมูลตัวอย่างจาก Excel โดยแอดมินจะให้ทำการโหลดเข้าสู่ตารางกริดของ FarPoint Spread จากนั้นก็ทำการพิมพ์ข้อมูลออก ActiveReports เป็นการดึงข้อมูลจากแถว แต่มาพิมพ์เป็นหลักแทน ... เอ้า เริ่มงงกันล่ะซิ ก็ต้องตามไปดูครับผม

ดาวน์โหลดชุดติดตั้ง FarPoint Spread ActiveX และ Update 8.0.21 ล่าสุดจากผู้ผลิต (เฉพาะสมาชิกเท่านั้น)

ดาวน์โหลดชุดติดตั้ง ActiveReports 2.0 (เฉพาะสมาชิกเท่านั้น)

เริ่มต้นสร้างโปรเจค ...

VB6 Designer ...


Project --> References ...


Project --> Components ...


ActiveReports Designer ...


การประยุกต์ใช้ Initialized File (INI) เพื่อจัดเก็บข้อมูลขนาดเล็ก


ข้อมูลของ INI ... ซึ่งจะประกอบไปด้วย
[Section]
Key = Value

มาดูโค้ดกันเถอะ ... เป็นฟอร์มหลัก frmPaymentRoomMain.frm
  1. Option Explicit
  2. Dim XLSFile As String
  3. Dim fpHandle As Integer
  4. Dim fpFileName As String

  5. '//
  6. Dim rptPrint As Object

  7. Private Sub cmbWorkSheet_Click()
  8.     Dim lRet As Long
  9.     If Not cmbWorkSheet.ListIndex = 0 Then _
  10.         lRet = fp.ImportExcelSheet(fpHandle, cmbWorkSheet.ListIndex - 1)
  11.    
  12.     '/ ปกติเราควรไปตั้งค่าจากโปรแกรมย่อยแทน
  13.     '/ แสดงแถบแสงหรือไม่แสดง
  14.     fp.OperationMode = OperationModeSingle    ' แถบ Selection
  15.     'fp.OperationMode = OperationModeNormal   ' เอาไว้ป้อนข้อมูล
  16.     'fpSpread.OperationMode = OperationModeRead     ' ไม่มีแถบ
  17.     'fpSpread.OperationMode = OperationModeRow
  18.     '/ ไม่แสดงชื่อหลัก
  19.     fp.ColHeadersShow = False
  20. End Sub

  21. ' / --------------------------------------------------------------------------------
  22. ' / เริ่มต้นการเปิดไฟล์ Excel
  23. Private Sub cmdOpenXLS_Click()
  24.     '/ แบบไม่สนใจ Error สั่งให้ทำงานต่อ ... แบบนี้ไม่ค่อยดีเท่าไรนักหรอกครับ
  25.     'On Error Resume Next
  26.     '/ อันนี้คอยดัก Trap Error
  27.     On Error GoTo ErrorHandler   ' Enable error-handling routine.
  28.    
  29.     Dim List() As String
  30.     Dim ListCount As Integer
  31.     Dim blnXLS As Boolean
  32.    
  33.     ReDim List(1)
  34.    
  35.     With dlgOpenFile
  36.         .FileName = "*.xls"
  37.         .DialogTitle = "Select Excel file to open"
  38.         .Filter = "Excel 97-2003 files (*.xls)|*.xls"
  39.         .FilterIndex = 0
  40.         .InitDir = App.Path
  41.         .Flags = cdlOFNHideReadOnly
  42.         .ShowOpen
  43.         
  44.         If .FileName = "*.xls" Then Exit Sub
  45.         
  46.         txtFileXLS.Text = .FileName
  47.         '/ GetExcelSheetList is a method and return boolean value.
  48.         blnXLS = fp.GetExcelSheetList(.FileName, List, ListCount, "", fpHandle, True)
  49.     End With
  50.    
  51.     cmbWorkSheet.Clear
  52.     '/ Clear Rows
  53.     fp.MaxRows = 0
  54.     '/
  55.     If blnXLS Then
  56.         '/ Open XLS File
  57.         fp.OpenExcel2007File txtFileXLS.Text, "", -1, -1, ""
  58.         '/
  59.         Me.cmbWorkSheet.AddItem ("")
  60.         Dim i As Integer
  61.         For i = 0 To ListCount - 1
  62.             Me.cmbWorkSheet.AddItem (List(i))
  63.         Next
  64.     End If
  65.    
  66. ExitProc:
  67.     Exit Sub
  68.    
  69. ErrorHandler:   ' Error-handling routine.
  70.     MsgBox "Error: " & Err.Number & vbCrLf & Err.Description
  71.     Resume ExitProc
  72. End Sub

  73. ' / --------------------------------------------------------------------------------
  74. ' / เหตุการณ์ดับเบิ้ลคลิกเมาส์ มีการระบุตำแหน่งของหลักและแถว
  75. Private Sub fp_DblClick(ByVal Col As Long, ByVal Row As Long)
  76. ' / --------------------------------------------------------------------------------
  77.     ' รับค่าหลักและแถวที่ส่งมา เพื่อระบุตำแหน่งเซลล์
  78.     fp.Col = Col:    fp.Row = Row
  79.     If fp.Text = "" Or Len(fp.Text) = 0 Or fp.Row = 1 Then Exit Sub
  80.     'MsgBox "คุณเลือกรายการที่หลัก " & fp.Col & " แถว " & fp.Row & vbCrLf & "ข้อมูลในเซลล์ = " & fp.Text
  81.     '// ActiveReports Setup
  82.     Set rptPrint = New arSlipHalfA4
  83.     Set Me.ARViewerSlip.object = rptPrint
  84.     ARViewerSlip.Zoom = 90
  85. End Sub

  86. Private Sub fp_KeyPress(KeyAscii As Integer)
  87.     If KeyAscii = 13 Then Call fp_DblClick(fp.ActiveCol, fp.ActiveRow)
  88. End Sub

  89. ' / --------------------------------------------------------------------------------
  90. Private Sub Form_Load()
  91. ' / --------------------------------------------------------------------------------
  92.     Me.Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
  93.     txtFileXLS.Text = ""
  94.     cmbWorkSheet.Clear
  95.     fp.ColHeadersShow = False
  96. End Sub

  97. Private Sub Form_Resize()
  98.     On Error Resume Next
  99.     '//
  100.     fraOpenExcel.Width = Me.ScaleWidth - 30
  101.     cmdExit.Left = fraOpenExcel.Width - cmdExit.Width - 75
  102.     fraFP.Move 15, 1200
  103.     fraFP.Width = Me.ScaleWidth - 30
  104.     fraFP.Height = fp.Top - fraPrint.Top
  105.     fp.Width = fraFP.Width - 75
  106.     '//
  107.     fraPrint.Width = Me.ScaleWidth - 15
  108.     fraPrint.Height = Me.ScaleHeight - fraFP.Height - fraOpenExcel.Height
  109.     ARViewerSlip.Move 15, 120, fraPrint.Width - 60, fraPrint.Height - 180
  110. End Sub

  111. Private Sub Form_Unload(Cancel As Integer)
  112.     ' ลบไฟล์ Temporary ออกให้หมด
  113.     If Dir$(App.Path & "\*.tmp") <> "" Then Kill App.Path & "\*.tmp"
  114.     '//
  115.     Set frmPaymentRoomMain = Nothing
  116.     End
  117. End Sub

  118. Private Sub cmdExit_Click()
  119.     Unload Me
  120. End Sub

  121. Private Sub mnuFileExit_Click()
  122.     Unload Me
  123. End Sub

  124. Private Sub mnuFileSetup_Click()
  125.     frmSetup.Show vbModal
  126. End Sub
คัดลอกไปที่คลิปบอร์ด

โค้ดในส่วนของการพิมพ์รายงาน (arSlipHalfA4.dsr)
  1. Option Explicit
  2. Dim ItemNo As Integer
  3. '// รับค่าแถวในการพิมพ์จากฟอร์มหลัก
  4. Dim sRow As Integer
  5. '//
  6. Dim GrandTotal As Double

  7. ' / --------------------------------------------------------------------------------
  8. Private Sub ActiveReport_FetchData(EOF As Boolean)
  9.     ItemNo = ItemNo + 1
  10.     ' ตรวจสอบจำนวนการพิมพ์ตามหลักแล้วให้ลบออก 2 เพราะหลักแรกคือชื่อผู้เช่า หลักที่ 2 คือหมายเลขห้อง
  11.     If ItemNo > frmPaymentRoomMain.fp.DataColCnt - 2 Then
  12.         EOF = True
  13.         Exit Sub
  14.     Else
  15.         EOF = False
  16.     End If
  17. End Sub

  18. ' / --------------------------------------------------------------------------------
  19. Private Sub ActiveReport_Initialize()
  20.     '/ พิมพ์ตามแนวตั้ง
  21.     PageSettings.Orientation = ddOPortrait
  22.     '/ ขนาดกระดาษแบบกำหนดเอง
  23.     PageSettings.PaperSize = 256
  24.     PageSettings.LeftMargin = 500
  25.     PageSettings.RightMargin = 60
  26.     PageSettings.BottomMargin = 100
  27.     PageSettings.TopMargin = 600
  28.    
  29.     '/ ขนาดปัจจุบันครึ่ง A4 (หรือ A5) มีหน่วยวัดเป็น Twip โดยที่ 1440 Twip = 1 นิ้ว หรือ 2.54 ซม.
  30.     '/ (14.5 * 1440 / 2.54) คือการเทียบบัญญัติไตรยางค์กับหน่วยวัดเซนติเมตร
  31.     PageSettings.PaperHeight = (14.5 * 1440 / 2.54)
  32.     PageSettings.PaperWidth = (21 * 1440 / 2.54)
  33.     '
  34.     txtCname.Text = ""
  35.     txtRoomNo.Text = ""
  36.     txtDate.Text = ""
  37.     txtDateMonth.Text = ""
  38.     txtItem.Text = ""
  39.     txtDesc.Text = ""
  40.     txtQTY.Text = ""
  41.     txtUnitPrice.Text = ""
  42.     txtAmount.Text = ""
  43.     txtGrandTotal.Text = 0
  44.     '// รับค่าจากฟอร์มหลัก
  45.     ' รับค่าหลักและแถวที่ส่งมา เพื่อระบุตำแหน่งเซลล์
  46.     With frmPaymentRoomMain.fp
  47.         .Col = .Col:    .Row = .Row
  48.         '// เก็บค่า Select Row
  49.         sRow = .Row
  50.     End With
  51.     '// อ่านค่า INI File
  52.     Dim strFileINI As String
  53.     strFileINI = App.Path & "\Config.ini"
  54.     '// เช็คว่ามีไฟล์ Config.ini อยู่หรือไม่???
  55.     '// หากไม่มีก็ตั้งค่าเริ่มต้นให้ก่อน
  56.     If Dir(strFileINI) = "" Then
  57.         sWriteINI strFileINI, "Config", "HeaderBill", "- ใบแจ้งค่าใช้จ่าย -"
  58.         sWriteINI strFileINI, "Config", "Owner", "ทองก้อน อพาร์ทเมนท์ แอนด์ โฮมเพลย์สเตชั่น"
  59.         sWriteINI strFileINI, "Config", "Address", "123/456 ถ.กลางเมือง ต.เมืองเก่า อ.เมือง จ.ขอนแก่น โทร.043-XXX-XXX"
  60.         sWriteINI strFileINI, "Config", "Remark1", "[1] กรุณาชำระเงินภายในวันที่ 5 ของทุกเดือน"
  61.         sWriteINI strFileINI, "Config", "Remark2", "[2] ชำระค่าปรับล่าช้าวันละ 50 บาท"
  62.     End If
  63.     '// อ่านค่า Config ต่างๆเข้ามา
  64.     lblHeaderBill.Caption = sReadINI(strFileINI, "Config", "HeaderBill", "")
  65.     txtOwner.Text = sReadINI(strFileINI, "Config", "Owner", "")
  66.     txtAddress.Text = sReadINI(strFileINI, "Config", "Address", "")
  67.     lblRemark1.Caption = sReadINI(strFileINI, "Config", "Remark1", "")
  68.     lblRemark2.Caption = sReadINI(strFileINI, "Config", "Remark2", "")
  69. End Sub

  70. ' / --------------------------------------------------------------------------------
  71. '// การวนรอบโดยนับตามจำนวนหลัก แต่แถวเป็นค่าเดิมตลอด (sRow)
  72. Private Sub Detail_Format()
  73.     txtItem.Text = ItemNo & "."
  74.     With frmPaymentRoomMain
  75.         '// อ่านแถวแรกสุด นั่นก็คือ Header เพื่อพิมพ์รายการหัวข้อ (Description)
  76.         .fp.Col = ItemNo + 2
  77.         .fp.Row = 1
  78.         txtDesc.Text = .fp.Text
  79.         '//
  80.         txtQTY.Text = "1"
  81.         '// ใช้หลักเดิมแต่เปลี่ยนแถว เพื่ออ่านค่าจำนวนเงินในการพิมพ์
  82.         .fp.Col = ItemNo + 2: .fp.Row = sRow
  83.         txtUnitPrice.Text = Format(.fp.Text, "#,##0.00")
  84.         txtAmount.Text = Format(txtUnitPrice.Text, "#,##0.00")
  85.     End With
  86.     ' หาจำนวนเงินรวม
  87.     GrandTotal = Format(GrandTotal + CDbl(txtAmount.Text), "#,##0.00")
  88.     '// กระโดดไปโปรแกรมย่อย FetchData เข้ามาใหม่
  89. End Sub

  90. ' / --------------------------------------------------------------------------------
  91. Private Sub GroupFooter1_Format()
  92.     txtGrandTotal.Text = "รวมจำนวนเงินทั้งสิ้น: " & Format(GrandTotal, "#,##0.00") & ""
  93. End Sub

  94. ' / --------------------------------------------------------------------------------
  95. ' / พิมพ์ส่วนหัว
  96. Private Sub PageHeader_Format()
  97.     With frmPaymentRoomMain
  98.         '// เลือกหลัก 1
  99.         .fp.Col = 1
  100.         '// แถวที่เลือก
  101.         .fp.Row = sRow
  102.         '// รับค่าจากหลัก 1 แถวที่เลือก เพื่อพิมพ์ชื่อผู้เช่า
  103.         txtCname.Text = "" & .fp.Text
  104.         .fp.Col = 2
  105.         '// รับค่าจากหลัก 2 แถวที่เลือก เพื่อพิมพ์หมายเลขห้อง
  106.         txtRoomNo.Text = "" & .fp.Text
  107.     End With
  108.     txtDate.Text = Format(Now(), "dd/mm/yyyy") & " เวลา: " & Format(Now(), "HH:MM")
  109.     Dim strDate As String
  110.     '// อ่านชื่อ WorkSheet และทำการตัดค่าบางตัวทิ้งไป คือ $ และ '
  111.     strDate = frmPaymentRoomMain.cmbWorkSheet.Text
  112.     strDate = Replace$(strDate, "[        DISCUZ_CODE_1        ]quot;, "")
  113.     strDate = Replace$(strDate, "'", "")
  114.     txtDateMonth.Text = strDate
  115. End Sub
คัดลอกไปที่คลิปบอร์ด

โค้ดในส่วนของ INI เพื่อทำการตั้งค่าหัวข้อและรายละเอียดการพิมพ์
  1. Option Explicit
  2. Dim strFileINI As String

  3. Private Sub cmdExit_Click()
  4.     Unload Me
  5. End Sub

  6. Private Sub cmdSave_Click()
  7.     strFileINI = App.Path & "\Config.ini"
  8.     '// เก็บค่า Config เอาไว้ใน INI ก่อนที่จะไปทำงานอื่นต่อ
  9.     sWriteINI strFileINI, "Config", "HeaderBill", txtHeaderBill.Text
  10.     sWriteINI strFileINI, "Config", "Owner", txtOwner.Text
  11.     sWriteINI strFileINI, "Config", "Address", txtAddress.Text
  12.     sWriteINI strFileINI, "Config", "Remark1", txtRemark1.Text
  13.     sWriteINI strFileINI, "Config", "Remark2", txtRemark2.Text
  14.     MsgBox "บันทึกข้อมูลเรียบร้อย.", vbOKOnly + vbInformation, "รายงานสถานะ"
  15.     Unload Me
  16. End Sub

  17. ' / --------------------------------------------------------------------------------
  18. Private Sub Form_Load()
  19.     '/
  20.     strFileINI = App.Path & "\Config.ini"
  21.     '// เช็คว่ามีไฟล์ Config.ini อยู่หรือไม่???
  22.     '// หากไม่มีก็ตั้งค่าเริ่มต้นให้ก่อน
  23.     If Dir(strFileINI) = "" Then
  24.         txtHeaderBill.Text = "- ใบแจ้งค่าใช้จ่าย -"
  25.         txtOwner.Text = "ทองก้อน อพาร์ทเมนท์ แอนด์ โฮมเพลย์สเตชั่น"
  26.         txtAddress.Text = "123/456 ถ.กลางเมือง ต.เมืองเก่า อ.เมือง จ.ขอนแก่น โทร.043-XXX-XXX"
  27.         txtRemark1.Text = "[1] กรุณาชำระเงินภายในวันที่ 5 ของทุกเดือน"
  28.         txtRemark2.Text = "[2] ชำระค่าปรับล่าช้าวันละ 50 บาท"
  29.         '// เก็บค่า Config เอาไว้ใน INI ก่อนที่จะไปทำงานอื่นต่อ
  30.         sWriteINI strFileINI, "Config", "HeaderBill", txtHeaderBill.Text
  31.         sWriteINI strFileINI, "Config", "Owner", txtOwner.Text
  32.         sWriteINI strFileINI, "Config", "Address", txtAddress.Text
  33.         sWriteINI strFileINI, "Config", "Remark1", txtRemark1.Text
  34.         sWriteINI strFileINI, "Config", "Remark2", txtRemark2.Text
  35.     Else
  36.         '// อ่านค่า Config ต่างๆเข้ามา
  37.         txtHeaderBill.Text = sReadINI(strFileINI, "Config", "HeaderBill", "")
  38.         txtOwner.Text = sReadINI(strFileINI, "Config", "Owner", "")
  39.         txtAddress.Text = sReadINI(strFileINI, "Config", "Address", "")
  40.         txtRemark1.Text = sReadINI(strFileINI, "Config", "Remark1", "")
  41.         txtRemark2.Text = sReadINI(strFileINI, "Config", "Remark2", "")
  42.     End If
  43. End Sub

  44. Private Sub Form_Unload(Cancel As Integer)
  45.     ' ลบไฟล์ Temporary ออกให้หมด
  46.     If Dir$(App.Path & "\*.tmp") <> "" Then Kill App.Path & "\*.tmp"
  47.     Set frmSetup = Nothing
  48.     Unload Me
  49. End Sub
คัดลอกไปที่คลิปบอร์ด

โมดูล (Module) ฟังค์ชั่นในการปฏิบัติการกับ Initialized File (modINI.bas) ...
  1. Option Explicit

  2. 'API DECLARATIONS
  3. Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" ( _
  4.     ByVal lpApplicationName As String, _
  5.     ByVal lpKeyName As Any, _
  6.     ByVal lpDefault As String, _
  7.     ByVal lpReturnedString As String, _
  8.     ByVal nSize As Long, _
  9.     ByVal lpFileName As String _
  10.     ) As Long

  11. Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" ( _
  12.     ByVal lpApplicationName As String, _
  13.     ByVal lpKeyName As Any, _
  14.     ByVal lpString As Any, _
  15.     ByVal lpFileName As String _
  16.     ) As Long

  17. Public Function sReadINI(sINIFile As String, sSection As String, sKey As String, sDefault As String) As String
  18.     Dim sTemp As String * 256
  19.     Dim nLength As Integer
  20.     sTemp = Space$(256)
  21.     nLength = GetPrivateProfileString(sSection, sKey, sDefault, sTemp, 255, sINIFile)
  22.     sReadINI = Left$(sTemp, nLength)
  23. End Function

  24. Public Sub sWriteINI(sINIFile As String, sSection As String, sKey As String, sValue As String)
  25.     Dim n As Integer
  26.     Dim sTemp As String
  27.     sTemp = sValue
  28.     '/ Replace any CR/LF characters with spaces
  29.     For n = 1 To Len(sValue)
  30.         If Mid$(sValue, n, 1) = vbCr Or Mid$(sValue, n, 1) = vbLf Then Mid$(sValue, n) = " "
  31.     Next n
  32.     n = WritePrivateProfileString(sSection, sKey, sTemp, sINIFile)
  33. End Sub
คัดลอกไปที่คลิปบอร์ด

Conclusion: แอดมินไม่ได้ข้ามขั้นตอนสอนวิธีการใช้งาน FarPoint และ ActiveReports แบบเบื้องต้นมาก่อนหรอกครับ แต่มันอยู่ในเว็บบอร์ดตัวเดิมก่อนที่จะย้ายโอสติ้งใหม่ หาก FC VB6 ที่ติดตามแอดมินมาโดยตลอดก็คงจะทราบดีกันอยู่แล้ว แต่สำหรับสมาชิกใหม่หรือท่านที่พึ่งรู้จักกับเว็บบอร์ดของแอดมิน หากมีข้อสงสัยประการใด ก็ขอเรียนเชิญถามมาได้ที่เว็บบอร์ด หรือที่เฟซบุ๊คของแอดมินแทนไปก่อนล่ะกันครับ ...

ดาวน์โหลดโค้ดต้นฉบับแบบเต็ม VB6 ได้ที่นี่ ...

ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง

คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน

x
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด

0

กระทู้

41

โพสต์

193

เครดิต

Member

Rank: 2

เครดิต
193
โพสต์ 2018-5-3 09:43:36 | ดูโพสต์ทั้งหมด

สุดยอดครับ แอดมิน
ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

รายละเอียดเครดิต

ข้อความล้วน|อุปกรณ์พกพา|ประวัติการแบน|G2GNet.com  

GMT+7, 2020-1-19 23:51 , Processed in 0.266643 second(s), 5 queries , File On.

Powered by Discuz! X3.3 R20170401, Rev.54

© 2001-2017 Comsenz Inc.

ตอบกระทู้ ขึ้นไปด้านบน ไปที่หน้ารายการกระทู้