การทำงานกับ 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)
|