Visual Basic

Home

Visual Basic Tutorial
Knowledge Developer Database Internet Resource
ตัวแปรและ Procedure
1. ตัวแปรและ Procedure
2. การทำงานกับ Window
 
Visual Basic Tutorial
1. Visual Basic 6
2. ฟอร์ม
3. Intrinsic Control
4. ตัวแปรและ Procedure
5. Class
6. Common Control1
7. Common Control2
8. ActiveX Control
9. Interface
10. ฐานข้อมูล
11. Database Control
 
Developer
Visual Basic
Microsoft Access
Microsoft Excel
 

การทำงานกับ Windows

การทำงานของโปรแกรมนอกจากใช้ในการประมวลแล้ว โปรแกรมประยุกต์ที่สร้างขึ้นต้องสามารถติดต่อกับสภาพแวดล้อม รวมถึงโปรแกรมประยุกต์ที่ต้องทำงานขนานกับโปรแกรมประยุกต์อื่น ๆ

อ๊อบเจค App

อ๊อบเจค App มีให้โดยไลบรารีของ Visual Basic และแสดงโปรแกรมประยุกต์ที่กำลังประมวลผล อ๊อบเจค App มีเมธอดและคุณสมบัติจำนวนมากที่สามารถนำไปได้อย่างกว้างขวาง

คุณสมบัติ EXEName และ Path ส่งคืนชื่อและพาร์ทของไฟล์ EXE (executable file) หรือชื่อ project (ถ้ากำลังเรียกใช้) คุณสมบัติที่มักจะใช้ด้วยกัน เช่น การหาไฟล์ INI

IniFile = App.Path & IIf(Right$(App.Path, 1) <> "\", "") & App.EXEName & ".INI"
Open IniFile For Input As #1

App.Path เป็นคุณสมบัติใช้ในการตั้งค่าโฟลเดอร์ปัจจุบันให้ตรงกับโปรแกรมประยุกต์

ChDrive App.Path: ChDir App.Path

ข้อควรระวัง ถ้าโปรแกรมประยุกต์ เริ่มจากเครือข่ายของเครื่องแม่ข่ายแบบระยะไกล (remote) คุณสมบัติ App.Path จะส่งออกค่าเป็นชื่อแบบ UNC (เช่น \ชื่อเครื่อง\แม่ข่าย\ชื่อโฟลเดอร์\…)

คุณสมบัติ PrevInstance ให้ผู้เขียนโปรแกรมหา instance อื่นของตัวโปรแกรมประยุกต์ในระบบ ซึ่งมีประโยชน์ในการป้องกันการใช้ 2 instance

Private Sub Form_Load()
    If App.PrevInstance Then
        Dim KeepCaption As String
        KeepCaption = Caption
        Caption = Caption & Space$(5)
        On Error Resume Next
        AppActivate KeepCaption
        Caption = KeepCaption
        If Err = 0 Then Unload Me
    End If
End Sub

คุณสมบัติ TaskVisible และ File สามารถอ่านและปรับปรุงในขณะเรียกใช้ โดย TaskVisible เป็นคุณสมบัติแบบ Boolean เพื่อหาโปรแกรมประยุกต์ที่มองเห็นในรายการ Task ส่วน Title เป็นคุณสมบัติที่ใช้ระบุโปรแกรมประยุกต์ในรายการ Task ของ Windows

คุณสมบัติอื่น ๆ ของอ๊อบเจค App ที่สามารถกำหนดได้ในเวลาออกแบบ ที่อยู่ในไดอะล๊อกบ๊อกซ์ของ Project properties

อ๊อบเจค Clipboard

Clipboard สามารถประยุกต์การแลกเปลี่ยนสารสนเทศระหว่างโปรแกรมประยุกต์ ภายในระบบปฏิบัติการ Windows และ Windows ซึ่งเป็นวิธีการที่เร่งในคัดลอกข้อมูลระหว่างโปรแกรมประยุกต์

การคัดลอกและวางข้อความ

การวางข้อความบน Clipboard ใช้ เมธอด SetText

Clipboard.SetText Text, [Fornat]

Format สามารถเป็น 1-vbcftext,(plain text เป็นค่าเริ่มต้น), &HBF01-vbCFRTF (ข้อความในรูปแบบ RTF) หรือ &HBF00-vbCFLink (DDE Conversation information) อากิวเมนต์ Format มีความจำเป็นเพื่อให้ Clipboard ทราบถึงรูปแบบ เช่น ตัว Control แบบ Rich Text Box ซึ่งสามารถเก็บได้ถึง vbCFText และ vbCFRTF

Clipboard.Clear
Clipboard.SetText RichTextBox1.SelText
Clipboard.SetText RichTextBox0.SelRTF, vbCFRTF

การดึงข้อความจาก Clipboard ปัจจุบันใช้เมธอด GetText ซึ่งต้องระบุรูปแบบที่ต้องการดึง

' Text Box
Text1.SelText = Clipboard.GetText ( )
' Rich Text Box
RichTextBox1.SelRTF = Clipboard.GetText (vbCFRTF)

ตามปกติ อาจจะไม่ทราบว่ารูปแบบของข้อความอยู่ในรูปแบบใด การตรวจสอบรูปแบบทำได้โดยใช้เมธอด GetFormat ซึ่งเมธอดจะตรวจอากิวเมนต์ แล้วส่งค่าเป็น Boolean โดยสามารถค่าตั้ง Format เป็น 1-vbCFText (ข้อความธรรมดา), 2-vbCFBitmap (ไฟล์บิตแม็บ), 3-vbCFMetaFile (ไฟล์ meta), 8-vbCFDIB (Device Independent Bitmap), 9-vbCFPalette (ตารางสี), &HBF01-vbCFRTF (ข้อความในรูปแบบ Rich Text) หรือ &HBF00-vbCFLink (DDE conversation information)

If Clipboard.GetFormat(vbCFRTF) Then
    RichTextBox1.SelRTF = Clipboard.GetText(vbCFRTF)
ElseIf Clipboard.GetFormat(vbCFText) Then
    RichTextBox1.SelRTF = Clipboard.GetText()
End If

คัดลอกและวางภาพ

เมื่อทำงานกับ Picture box และ Image การดึงภาพเก็บไว้ใน Clipboard ใช้เมธอด GetData ซึ่งต้องการรูปแบบ (vbCFBitmap, vbCFMetaFile, vbCFDIB หรือ vbCFPalette สำหรับ Image ใช้ได้เฉพาะ vbCFBitmap)

Dim fmt As Variant
For Each fmt In Array(vbCFBitmap, vbCFMetaFile, vbCFDIB, vbCFPalette)
    If Clipboard.GetFormat(fmt) Then
        Set Picture1.Picture = Clipboard.GetData(fmt)
        Exit For
    End If
Next

การคัดลอกภาพหรือรายละเอียดปัจจุบันของ Picture box หรือ Image ไปที่ Clipboard สามารถใช้เมธอด SetData

Clipboard.SetData Picture1.Picture

โหลดภาพจากดิสก์มาที่ Clipboard

Clipboard.SetData LoadPicture ("C:\myimage.bmp")

ดาวน์โหลดตัวอย่าง (Clipbord.vbp)

อ๊อบเจค Printer

โปรแกรมประยุกต์ทั่วไปต้องมีการส่งผลลัพธ์ออกทางเครื่องพิมพ์ Visual Basic ให้อ๊อบเจค Printer ในการควบคุมการสิ่งพิมพ์เอกสาร

ไลบรารีของ Visual Basic มี Collection ของ Printers ซึ่งรวบรวมสารสนเทศเกี่ยวกับเครื่องพิมพ์ทั้งหมด ที่ติดตั้งในระบบ แต่ละข้อมูลของ Collection คืออ๊อบเจค Printer ที่มีคุณสมบัติแบบอ่านอย่างเดียว

การดึงสารสนเทศ การติดตั้งเครื่องพิมพ์

อ๊อบเจค Printer มีคุณสมบัติหลายอย่างที่ให้ข้อมูลของเครื่องพิมพ์และไดร์ฟเวอร์ คุณสมบัติ DeviceName ส่งออกชื่อเครื่องพิมพ์ตามที่ปรากฏบน Control Panel และคุณสมบัติ DriverName ส่งออกชื่อของไดร์ฟเวอร์ที่ใช้ ซึ่งสามารถแสดงรายการใน List box หรือ Combo box

For i = 0 To Printers.Count - 1
Cbo.Printers.AddItem Printer (i).DeviceName _
&" [" & Printer(i).DriverName & " ] "
Next

คุณสมบัติ Port ส่งออกพอร์ตของเครื่องพิมพ์ที่ติดต่อ (เช่น LPT1) คุณสมบัติ ColorMove หาการพิมพ์สีของเครื่องพิมพ์ (1-vb PRCMMonochrome หรือ 2-vbPRCMColor) คุณสมบัติ Orientation แสดงการวางกระดาษปัจจุบัน (1-vbPRORPortrait, 2-vbPRORLandScape) คุณสมบัติ PrinterQuality แสดงความละเอียดปัจจุบัน (1-vbPRPQDraft, 2-vbPRPQLow, 3-vbPRPQMedium, 4-vbPRPQHigh)
คุณสมบัติอื่น ๆ ได้แก่ PaperSize (ขนาดกระดาษ), PaperBin (ที่ป้อนกระดาษ) Duplex (การพิมพ์ 2 หน้า) Copies (จำนวนชุด) และ Zoom

การทำงานกับเครื่องพิมพ์ปัจจุบัน

การเลือกเครื่องพิมพ์ เป็นการเลือกจาก Collection ของ Printers ไปยังอ๊อบเจค Printers เช่น การเลือกเครื่องพิมพ์ จาก List Box โดยการคลิกที่ปุ่ม Make Current

Private Sub cmdMakeCurrent_Click ( )
    Set Printer = Printers (cboPrinters.ListIndex)
End Sub

ถ้าการเลือกเครื่องพิมพ์เป็นการเลือกชั่วคราว และให้พื้นเครื่องพิมพ์เริ่มต้น สามารถทำได้โดยการเปรียบเทียบคุณสมบัติ DeviceName กับอ๊อบเจค Printer

For i = 0 To Printers.Count - 1
    If Printer.DeviceName = Printers(i).DeviceName Then
        PrinterIndex = i
        Exit Sub
    End If
Next
' เตรียมส่งงานพิมพ์ไปที่เครื่องพิมพ์
Set Printer = Printers (cboPrinters.ListIndex)
…
' ฟื้นฟูเครื่องพิมพ์เริ่มต้น
Set Printer = Printers (PrinterIndex)

การส่งผลลัพธ์ไปยังที่อ๊อบเจค Printer

การส่งผลลัพธ์ไปที่อ๊อบเจค Printer สามารถสนับสนุนเมธอดกราฟฟิกทั้งหมดที่มีในฟอร์มและ Picture box รวมถึง Print, PSet, Line, Circle และ PaintPicture การควบคุมความสวยงามของผลลัพธ์ ใช้คุณสมบัติมาตรฐาน เช่น Font และคุณสมบัติ FontXXXX, คุณสมบัติ CurrentX และคุณสมบัติ CurrentY, และ คุณสมบัติ ForeColor

เมธอดพิเศษของอ๊อบเจค Printer ได้แก่ เมธอด EndDoc ทำหน้าที่แจ้งอ๊อบเจค Printer ให้ทราบว่าข้อมูลได้ส่งไปหมดและเครื่องพิมพ์จะเริ่มพิมพ์ เมธอด KillDoc ยกเลิกการพิมพ์ส่งไปยังเครื่องพิมพ์ เมธอด NewPage ส่งหน้าปัจจุบันไปที่เครื่องพิมพ์ และต่อด้วยหน้าต่อไป ส่วนหมายเลขหน้าแสดงด้วยคุณสมบัติ Page

Printer.Print "Page One"
Printer.NewPage
Printer.Print "Page Two"
Prniter.EndDoc

ฟังก์ชัน Shell

Visual Basic ให้ผู้เขียนโปรแกรมสามารถเรียกใช้โปรแกรมประยุกต์ด้วยคำสั่ง Shell ซึ่งมีไวยากรณ์

Taskid = Shell(PathName, [Window Style])

PathName สามารถใช้กับ Command line ส่วน Window Style เป็นค่าคงที่ คือ 0-vbHide (Window จะซ่อนและปรากฏเมื่อได้รับโฟกัส), 1-vbNormalFocus (Window แสดงด้วยตำแหน่งและขนาดปกติ), 2-vb Minimize (Window แสดงเป็นไอคอนและเป็นค่าเริ่มต้น), 3-vbMaximize (Window มีขนาดใหญ่ที่สุด) 4-vb NormalNoFocus (Window ได้รับการฟื้นฟู แต่ไม่ได้รับโฟกัส) หรือ 6-vbMinimizedNoFocus (Window มีขนาดเล็กที่สุด และโฟกัสไม่ได้ออกจาก Window ที่แอ็คทีฟ)

Shell "notepad C:/bootlog.txt", vbNormalFocus

ฟังก์ชัน Shell เรียกโปรแกรมอื่นแบบ asynchronously ซึ่งเป็นการทำงานที่ได้รับประโยชน์จาก multitasking ในบางกรณีนี้อาจจะจำเป็นต้องขอโปรแกรม shell ทำงานเสร็จสิ้น Visual Basic มีฟังก์ชันพื้นฐานที่จะรับสารสนเทศที่แต่สามารถใช้ Windows API ทำงานได้

' การประกาศ API
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwAccess As Long, _
ByVal fInherit As Integer, ByVal hObject As Long) As Long

Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

' รอจนเวลา ส่งออกสถานะ การเรียกใช้ ของกระบวนการ ถ้า ละอากิวเมนต์ รอจนกระทั่งกระบวนการสิ่นสุด

Function WaitForProcess(taskId As Long, Optional milliseconds As Long = -1) As Boolean
Dim procHandle As Long
' ดึงการควบคุมกระบวนการ
procHandle = OpenProcess(&H100000, True, taskId)
' ตรวจสถานะ ของสัญญาณ ส่งออกไปที่ caller
WaitForProcess = WaitForSingleObject(procHandle, milliseconds) <> -1
' ปิดตัวควบคุม
CloseHandle procHandle
End Function

อากิวเมนต์ที่ส่งไปยังฟังก์ชันนี้จะส่งออกค่าของฟังก์ชัน Shell

WaitForProcess Shell("notepad C:/bootlog.txt", vbNormalFocus)

ถ้าการทำงานไม่ซับซ้อน สามารถใช้วิธีการที่ง่ายกว่าด้วยการใช้คำสั่ง AppActivate และ SendKeys โดยคำสั่ง AppActivate ย้ายโฟกัส ไปที่โปรแกรมประยุกต์ตามอากิวเมนต์

AppActivate WindowTitle [,wait]

WindowTitle สามารถเป็นข้อความหรือส่งค่าของฟังก์ชัน Shell การทำงานของ Visual Basic จะทำการเปรียบเทียบระหว่างชื่อตาม WindowTitle กับ Window ที่เปิดอยู่ ถ้าไม่ตรง Visual Basic ค้นหาซ้ำอีกครั้งหนึ่ง ถ้าส่งค่าเป็น Taskid โดยฟังก์ชัน Shell จะไม่มีการส่งผ่านเป็นครั้งที่ 2 เพราะ Taskid เป็นรหัสที่ไม่ซ้ำในการระบุการประมวลผล ถ้า Visual Basic หาไม่พบ จะแสดงความผิดพลาด ส่วน wait เป็นตัวเลือกที่ให้ Visual Basic รอจนโปรแกรมประยุกต์ ได้รับโฟกัส ก่อนส่งไปยังโปรแกรมประยุกต์อื่น (ตั้งค่า wait = True)

ประโยคคำสั่ง SendKeys ส่งคีย์ 1 คีย์ หรือมากกว่าไปยังโปรแกรมประยุกต์ที่ได้รับโฟกัส

Taskid = Shell ("notepad", vbMaximizedFocus)
AppActivate Taskid
' "^V" = ctrl - V
SendKeys "^V"

ดาวน์โหลดตัวอย่าง (Shell.vbp)

 

  

สงวนลิขสิทธิ (C) widebase