วันศุกร์ที่ 27 มีนาคม พ.ศ. 2558

การลง vb6 ใน win7
1.ดู http://www.tipsiam.com/%E0%B8%A5%E0%B8%87-vb-%E0%B9%84%E0%B8%A1%E0%B9%88%E0%B9%84%E0%B8%94%E0%B9%89

http://www.fortypoundhead.com/showcontent.asp?artid=20502

Install VB6 on Windows 7

Visual Basic 6
Posted On 2009-06-23 by dwirch
Keywords: 
Tags: Visual Basic 6 Tutorial Software Hack/Tweak  Windows 7 Vista Windows
Views: 425223
Rating: 4.67 / 5.00
  •  
  •  
  •  
  •  
  •  

After surfing around the net, I've found very little information regarding installation of VB6 on Windows 7. Most of the information out there is for Vista, and most of it is queries for assistance.
You may be wondering why someone would want to utilize VB6 on a shiny new operating system like Windows 7. Or even Vista for that matter.
There are about a bazillion legacy applications out there that have to be supported, and people like me who speak VB6 need to have the tools installed on our workstations in order to implement and test updates and such for these legacy applications. It also helps out when I need to squirt out a quick tool for use in my daily work. 
This process has been tested on Windows 7, both 32 bit and 64 bit, with no problems.
Note: I've updated this process with information from the comments (below the post). If I've left something out, don't hesitate to point it out. Also - Thanks to all of you! Your comments and suggestions are much appreciated.
Note 2: If you have a specific programming questions, might I please direct your attention to the VB6 forum? It's much easier to interact over there!
  1. Prerequisites:
    You need to do this stuff first:
    • Turn off UAC.
    • Create a zero-byte file in C:\Windows called MSJAVA.DLL. The setup process will look for this file, and if it doesn't find it, will force an installation of old, old Java, and require a reboot. By creating the zero-byte file, the installation of moldy Java is bypassed, and no reboot will be required.
    • Install DirectX 7. The process and files are available here.
    • Install VB6 Common Controls, available here.
  2. Main Installation:
    1. Insert Visual Studio 6 CD.
    2. Exit from the Autorun setup.
    3. Browse to the root folder of the VS6 CD.
    4. Right-click SETUP.EXE, select Run As Administrator.
    5. On this and other Program Compatibility Assistant warnings, click Run Program.
    6. Click Next.
    7. Click "I accept agreement", then Next.
    8. Enter name and company information, click Next.
    9. Select Custom Setup, click Next.
    10. Click Continue, then Ok.
    11. Setup will "think to itself" for about 2 minutes. Processing can be verified by starting Task Manager, and checking the CPU usage of ACMSETUP.EXE.
    12. On the options list, select the following:
      • Microsoft Visual Basic 6.0
      • ActiveX
      • Data Access
      • Graphics
      All other options should be unchecked. Click Continue, setup will continue.
    13. Finally, a successful completion dialog will appear, at which click Ok. At this point, Visual Basic 6 is installed.
    14. If you do not have the MSDN CD, clear the checkbox on the next dialog, and click next. You'll be warned of the lack of MSDN, but just click Yes to accept.
    15. Click Next to skip the installation of Installshield. This is a really old version you don't want anyway.
    16. Click Next again to skip the installation of BackOffice, VSS, and SNA Server. Not needed!
    17. On the next dialog, clear the checkbox for "Register Now", and click Finish.
  3. IDE Compatibility Setup
    In order to prevent weird behavior of the IDE, such as sluggishness and/or lack of control placement/resizing outlines, you'll want to change these items.
    1. Using Windows Explorer, browse the location where you installed VB6. By default, the path is C:\Program Files\Microsoft Visual Studio\VB98\
    2. Right click the VB6.exe program file, and select properties from the context menu.
    3. Click on the Compatibility tab.
    4. Place a check in each of these checkboxes:
      • Run this program in compatibility mode for Windows XP (Service Pack 3)
      • Disable Visual Themes
      • Disable Desktop Composition
      • Disable display scaling on high DPI settings
  4. Service Pack 6 Installation:


Read more: http://www.fortypoundhead.com/showcontent.asp?artid=20502#ixzz3VaNvIRyf

บางท่านอาจจะคิดว่าเป็นที่วินโดว์เพราะเห็นบางเครื่องลงได้ ก็จริงครับ ถ้าเป็นวินโดว์ที่ได้รับการปรับแต่งแล้ว เช่น แผ่น Quick PC พวกนี้จะตัดความสามารถบางตัวของวินโดว์ออกไปทำให้ลง VB6 ไม่ได้ ฉะนั้น เราต้องไปเปิดความสามารถตัวนี้ก่อนโดย
คลิกปุ่ม Start >> run ป้อน regedit แล้ว OK
แล้วเข้าไปแก้ Registry
HKEY_LOCAL_MACHINE >> SOFTWARE >> MICROSOFT >> WINDOWS NT >> CURRENT VERSION >> perlib
ถ้าหาก ลงทะเบียน  mscomctl.ocx ได้แล้ว ถ้าหากยังใช้ไม่ได้ ให้กด apply ใน component แล้วปิดลองเข้า vb ใหม่อีกครั้ง

***

เทคนิคการเขียน VB6 ให้รันได้ทุกวินโดวส์ (Portable)

การสร้าง Portable

http://thaivb6.blogspot.com/2013/11/vb6-portable.html
ผมเป็นคนหนึ่งที่ชอบการเขียนโปรแกรมด้วย VB6 บางคน...นั้นเน้นงานธุรกิจ จะติดมาโครของ MS-Office แต่ข้อเสียของ MS-Office คือ มันพกพาไปเล่นเครื่องอื่นๆ หรือเครื่องคนอื่นไม่ได้ ครั้งหนึ่งเคยเขียน Antivirus บน Macro แต่ท้ายที่สุด คัดลอกไปรันเครื่องอื่นไม่ได้เพราะต้องติดตั้ง MS-Office รุ่นที่เขียน อีกอย่างคือ ไฟล์ที่จะรันคำสั่งบนนั้นต้องทำงานผ่าน Word หรือ Excel อีกที...ซึ่งมันไม่เหมาะเลย...สำหรับวัยเก๋า...จะพกพาโปรแกรมส่วนตัวไปแบบ Hacker อนาคตมืดมน
ทางเลือกคือ


  1.  เขียนผ่าน VBScript และทำงานมันผ่านหน้าเวป เอ...เข้าท่า...(เรือจอด) แต่มันเขียนโครตยากถ้าไม่มี Tool เพราะ...ไวยกรณ์ภาษาอังกฤษไม่แม้น (เรือจม) เขียนมาติด Error และดีบักผ่านหน้า Browser โครตยาก...ไม่รู้ด้วยมัน Error ตรงไหน...ลืมประกาศตัวแปรอะไร
  2. ผ่าน VB6 หรือ โอ...พระเจ้ามาโปรด...โครตง่าย มี อิลิเมนต์ให้เลือกใช้ในคำสั่งแต่ละคำสั่ง...มี Debug ชั้นยอด มี GUI ของวินโดวส์ครบ...
ทุกวันนี้เลยติด VB6 และพกพา VB6 Portable ใส่ Sky Drive ไว้เล่นได้ในทุกที่ทุกวินโดวส์ แต่ืคุณต้องทำความเข้าใจก่อนว่า...มันก็ไม่หมูเลยที่จะเขียนโปรแกรมที่สร้างโดย VB6 ไปรันในทุกเครื่องหรือทุกแพลต์ฟอร์มวินโดวส์ ติดปัญหาแีรกคือ
  1. รีเฟอร์เรนต์ ที่ประกาศใช้ในเครื่องที่เราเีขียน ไม่มีในเครื่องอีกเครื่องที่นำไปใช้...เจอบ่อยมาก...เช่นเขียน Antivirus ที่สั่งฟังก์ชั่นหาไวรัสผ่าน File System Object หรือ FSO ของ Runtime API ซึ่งมันไม่ได้มีใน XP ทุกเครื่อง ต้องติดตั้ง...ในบางเครื่อง และผู้ใช้งานจะรู้ไหมว่า...ต้องติดตั้งหรือโดนไวรัสทำให้โปรแกรมเดี้ยง...กรรรม
  2. API บางตัวที่ใช้งานไม่มีในอีกเครื่อง หรือ ข้ามจาก XP ไป 7 มันได้ถูกยกเลิกไปแล้ว...เช่น Common Dialog ต่างๆ ของ VB6 บางตัวไม่สามารถรันบน 7 ได้เพราะถูกยกเลิก...ผมถึงต้องเขียนโปรแกรมที่เป็น Dialog ของตัวเองใช้งานแทน
  3. ถ้าคิดจะเขียนด้วย .NET เองก็มีปัญหาเช่นกัน เพราะ .NET มาหลัง XP SP1 SP2 ดังนั้นมันจึงไม่มีให้ใช้งานต้อง Download อีก
  4. ปัญหาใหม่...เครื่องมือรูปภาพของ VB6 นั้นแสดงใน Windows 7 แล้วไม่ได้ผลลัพธ์ที่ต้องการหรือไม่สามารถแสดงผลได้ตามต้องการ (เสียหายหลายแสน) ฉนั้นการเรียกใช้ Picture1 มีปัญหาแน่ในอนาคต Image1 เองก็เช่นกัน มีช่องไฟห่างกันเกิน จึงทำให้ VB6 ไม่เหมาะจะเขียนเกมส์หรือสร้างฟอร์มแบบอลังการเพื่อแสดงถึงความสวยงามของฟอร์มที่ออกแบบมาแบบไฮเปอร์ แต่เลอะเลือนมากใน Windows 7
  5. Windows 8 การแสดงผลของภาพ...ถูกแก้ไข...แต่เช่นเดิม API บางตัวถูกตัดออกไป...ต้องศึกษา    เิชิงลึกเพื่อดูว่า...อะไรที่ถูกตัดออก
การเขียนโปรแกรม VB6 ให้รันได้ทุกแพลตฟอร์ม
  1. ต้องตัดรีเฟอร์เรนต์ที่ไม่จำเป็นออกให้หมด...เอาแต่ Tool ที่มีอยู่ โดยไม่ต้อง Add In อะไรเข้ามาอะไรที่มีอยู่ตั้งแต่ต้น...มันรันได้ทุกวินโดวส์อยู่แล้ว...แม้แต่เครื่องมือฐานข้อมูล (เพียงแต่ต้องอาศัย Office 97 ผนวกฐานข้อมูลเข้าไป)
  2. อย่าใช้ API สิ้นเปลือง อะไรที่สามารถทำได้ใน VB6 ควรใช้ เช่น Sleep คำสั่งนี้...ปกติ Timer สามารถทำงานเทียบเคียงได้...ซ้ำยังดีกว่าด้วยซ้ำ...เดียวจะมาสอนเขียนกัน
  3. อย่าใช้งานกราฟฟิก ฟุ่มเฟื่อย...เพราะความสวย...เข้ากันไม่ได้กับ Window 7 แสดงผลไม่เป็นจริงใน Windows 8 (เหมือน "ลำยอง" สวย แต่ "เฟะ" ในที่สุด)
  4. อาศัยลูกบ้าพลังเช่น API BitBlt สามารถใช้คำสั่ง Picture แทนได้โดยไม่จำเป็นต้องประกาศการตัดแบ็คกาวด์ แบบ Source Code รุ่นโบราณ สมัย VB5 ฉนั้น ควรประยุกค์คำสั่งที่มีอยู่และใช้ให้เต็มที่
  5. ฟังก์ชั่นหา DIR หรือ Search DIR สามารถประยุกต์ Tool DIR และ Drive และ File ใช้แทนได้...จะมาสอน
การแก้ปัญหาเรื่อง Sleep หรือ การหน่วงเวลาคำสั่งใน VB6 ระดับ Millisecond ขึ้นไป




Private Sub Form_Click() ' คลิกฟอร์ม
    Dim N As Integer ' ประกาศตัวแปรใดๆ
    For N = 1 To 100 ' ทดสอบวนลูปคำสั่ง
        Me.Caption = N ' ส่งผลการทำงานใน Caption Form
        Timer1.Enabled = True ' เริ่มการทำงานของ Timer
        Do ' ทำ
            DoEvents ' อินเตอร์รัพต์เหตุการณ์
        Loop While Timer1.Enabled ' ถ้า Timer ยังทำงาน รอ...
    Next N ' ถัดไป
End Sub

Private Sub Timer1_Timer() ' Timer หน่วงเวลา ทดสอบ Interval = 1
    Timer1.Enabled = False ' รอ 1 มิลลิวินาที จึงปิด
End Sub

คำสั่งตัวอย่างนี้...จะเป็นการหน่วงเวลาในใดๆ ของ VB6 ก็ได้ โดยไม่จำเป็นต้องนำ Source ไปวางใน Timer อย่างใด...จากที่เคยใช้มา...จะมีปัญหากับบาง Loop การทำงานเช่น การ Drag วัตถุ หรือ Mouse_Move จะเกิด สแตกซ์โอเวอร์โฟรว...ได้

ส่วนฟังก์ชั่นการตัดแบกกาวด์ด ยังไม่นำเสนอเพราะยังหาวิธีแก้ไขกับ Windows 7 ไม่ได้...จึงเขียนตัวอย่างบนเครื่อง Windows 7 ไม่ได้

การสร้าง Common dialog ใช้เอง

Private Sub Drive1_Change()
    On Error GoTo NoDrive:
    Dir1.Path = Left(Drive1.Drive, 2) & "\"
    File1.Path = Dir1.Path
    List1.Clear
    For N = 0 To Dir1.ListCount - 1
        List1.AddItem Mid(Dir1.List(N), 3)
    Next N
    For N = 0 To File1.ListCount - 1
        List1.AddItem File1.List(N)
    Next N
    GoTo OkDrive:
NoDrive:
    Call MsgBox("ไม่พบดิสก์ไดร์ฟที่ระบุ", vbOKOnly, "ผิดพลาด")
OkDrive:
    Label1.Caption = Dir1.Path
End Sub

Private Sub Form_Load()
    Call Drive1_Change
End Sub

Private Sub List1_Click()
    For N = 0 To List1.ListCount - 1
        If List1.Selected(N) Then
            If Left(List1.List(N), 1) <> "\" Then
            End If
        End If
    Next N
End Sub

Private Sub List1_DblClick()
    Dim OK As Boolean
    OK = False
    For N = 0 To List1.ListCount - 1
        If List1.Selected(N) Then
            If Left(List1.List(N), 1) = "\" Then
                Dir1.Path = IIf(Len(Dir1.Path) = 3, Left(Dir1.Path, 2), Dir1.Path) & List1.List(N)
                File1.Path = Dir1.Path
                OK = True
            End If
        End If
    Next N
    If OK Then
        List1.Clear
        If Len(Dir1.Path) > 3 Then List1.AddItem "\.."
        For N = 0 To Dir1.ListCount - 1
            List1.AddItem Mid(Dir1.List(N), Len(Dir1.Path) + IIf(Len(Dir1.Path) = 3, 0, 1))
        Next N
        For N = 0 To File1.ListCount - 1
            List1.AddItem File1.List(N)
        Next N
        Label2.Caption = Dir1.Path
        While Label2.Width > 5145
            Label2.Caption = Right(Label2.Caption, Len(Label2.Caption) - InStr(1, Label2.Caption, "\"))
        Wend
    End If
    Label1.Caption = Label2.Caption
End Sub

Private Sub List1_KeyDown(KeyCode As Integer, Shift As Integer)
    If KeyCode = 32 Or KeyCode = 13 Then
        Call List1_DblClick
    End If
End Sub

Private Sub Text1_LostFocus()
    If Left(Text1.Text, 2) <> "*." Then Text1.Text = "*.*"
    File1.Pattern = Text1.Text
    File1.Refresh
    Dir1.Refresh
    List1.Clear
    If Len(Dir1.Path) > 3 Then List1.AddItem "\.."
    For N = 0 To Dir1.ListCount - 1
        List1.AddItem Mid(Dir1.List(N), Len(Dir1.Path) + IIf(Len(Dir1.Path) = 3, 0, 1))
    Next N
    For N = 0 To File1.ListCount - 1
        List1.AddItem File1.List(N)
    Next N
    Label2.Caption = Dir1.Path
    While Label2.Width > 5640
        Label2.Caption = Right(Label2.Caption, Len(Label2.Caption) - InStr(1, Label2.Caption, "\"))
    Wend
End Sub

ตัวอย่างการใช้งาน

กด esc ไม่ได้ เนื่องจาก เปิดใช้ photoshop

กด esc ไม่ได้ เนื่องจาก เปิดใช้ photoshop

วันจันทร์ที่ 2 มีนาคม พ.ศ. 2558

โค็ดแก้ไข กรณีสั่งพิมพ์ออก pdf หรือ printer ภาษาไทย ของ control label อ่านไม่ออก แต่ ของ ctrl text อ่านออก ใน windows 7- 8

โค็ดแก้ไข กรณีสั่งพิมพ์ออก pdf หรือ printer  ภาษาไทย ของ control label อ่านไม่ออก แต่ ของ ctrl text อ่านออก ใน windows 7- 8

* paste   CaptionToText() in form load
Public Sub CaptionToText()
Dim strComputer
Dim objWMIService, colOperatingSystems, objOperatingSystem
Dim ctrl, i
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colOperatingSystems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
For Each objOperatingSystem In colOperatingSystems
   If InStr(1, objOperatingSystem.Caption, "windows xp", vbTextCompare) Then
        
   Else
       'win 7, 8
       For Each ctrl In Me.Controls
            If TypeOf ctrl Is Label Then
            i = i + 1
                     Load Me.txtMove(i)
                     If ctrl.Name = "lblCode" Then
                            Me.txtMove(i).Move ctrl.Left, ctrl.Top - 100, ctrl.Width, ctrl.Height
                     ElseIf ctrl.Name = "lbltelHome" Then
                            Me.txtMove(i).Move ctrl.Left, ctrl.Top - 150, ctrl.Width, ctrl.Height
                     Else
                            Me.txtMove(i).Move ctrl.Left, ctrl.Top, ctrl.Width, ctrl.Height
                     End If
                     
                  
                     Me.txtMove(i).Visible = True
                     Me.txtMove(i).Text = ctrl.Caption
                     Me.txtMove(i).ForeColor = ctrl.ForeColor
                     Me.txtMove(i).Font = ctrl.Font
                     Me.txtMove(i).FontBold = ctrl.FontBold
                     Me.txtMove(i).FontSize = ctrl.FontSize
                     ctrl.Visible = False
            End If
            
       Next ctrl
        
   End If
Next
End Sub