分類 |
標題 |
大意 |
作者 |
日期 |
| 使用說明 | VB5 初級生範例使用說明 | 老怪 | 1998/7/19 | |
| 程式交換 | 在 VB �堸鶡� Dos 內建命令 | 小鄔 | 1998/6/29 | |
| 檔案I/O | 二進位檔複製 | For Binary | ||
| 檔案I/O | 兩檔合併成一檔 | 老怪 | 1998/7/8 | |
| 檔案I/O | 記錄電腦開機時間 | 老怪 | 1998/8/11 | |
| 物件用法 | StdPicture 的 Scale 換算 | vbHimetric 與 Twip | 小翰 | 1998/7/4 |
| 物件用法 | 列印向右對齊 | Printer 物件的使用 | 老怪 | |
| 物件用法 | VB 的彩色文字列印 | Printer.ColorMode 的使用 | 老怪 | 1998/8/1 |
| 物件用法 | 驅動印表機的基本指令 | Printer 物件的使用 | 老怪 | 1998/8/9 |
| 流程控制 | 比 Timer 更精確的計時 | 把 Time 還原成 Double 型態 | 老怪 | 1998/7/14 |
| 流程控制 | 一個簡單的進度表 | 老怪 | 1998/8/10 | |
| 元件用法 | 在 TextBox �堛煽咻� | 換行字元的使用 | 老怪 | 1998/8/1 |
| 界面外觀 | 隨心所欲的橫列與縱列 | 陣列元件的 Align | 老怪 | 1998/7/16 |
| 界面外觀 | 平順的鍵盤移動 | 擺脫鍵盤回應速率的辦法 | 老怪 | 1998/8/10 |
| 界面外觀 | 連發的滑鼠按鍵 | 讓滑鼠引發連續的事件 | 老怪 | 1998/8/11 |
| 中文處理 | 如何把中文內碼轉成中文 | 不要把 VB 當倚天 | 老怪 | 1998/7/17 |
| 變數處理 | 用 Array() 宣告多維變數 | Collection 型態的變數 | 老怪 | 1998/8/3 |
| 變數處理 | 變數宣告的安全問題 | 多人程式開發的注意事項 | 老怪 | 1998/8/8 |
| 變數處理 | 變數值消失了 | 不同的變數,相同的名稱。 | 老怪 | 1998/8/9 |
| 古怪處理 | 不該溢位的溢位 | 老怪 | 1998/8/9 | |
| 古怪處理 | 無法在 With 區塊中執行的動作 | 老怪 | 1998/8/11 |
寄件者: 小鄔
我會用 shell 執行 dos 指令了,如果要 dir or cls ....shell("command.com /c dir")就可以了.... 甚至於 copy 也可以.....試了好久...真累
老怪答:
Dim Buff() As Byte '設定一個 Byte型別的陣列
Open "C:\temp\TestA.exe"
For Binary As #1 ' 開啟原始檔案
ReDim TEMP(LOF(1) - 1) '重新設定陣列大小
Get #1, , TEMP()
Close #1 '關閉檔案
Open "c:\temp\TestB.EXE" For Binary
As #1
Put #1, , TEMP() '將 TEMP()中的資料寫到檔案編號1的檔
Close #1
※這是從一位 tw.bbs.comp.language 的 sonora 版友的程式改寫的 ※
老怪 在 programming 版提到:
請問有那位高手知道,StdPicture 的 Width 和 Height 要怎樣跟 twip 換算。
小翰答:
愛德華 撰寫於文章
請問各位,有什麼方法可以如 COPY A+B=C的方式用VB將兩個檔案相加 ?
老怪答:
Dim GetHandle As Integer, PutHandle
Dim Buff() As Byte
'開合併檔 C.txt
PutHandle = FreeFile
Open "c:\test\c.txt" For Binary
Access Write As #PutHandle
'開來源檔 A.txt
GetHandle = FreeFile
Open "c:\test\a.txt" For Binary
Access Read As #GetHandle
ReDim Buff(LOF(GetHandle) + 1)
'用 Buff 取得資料
Get #GetHandle, , Buff
Close #GetHandle
'加上換行及歸位字元
Buff(UBound(Buff) - 1) = 13
Buff(UBound(Buff)) = 10
'放到 C.txt ��
Put #PutHandle, , Buff
'開來源檔 B.txt
GetHandle = FreeFile
Open "c:\test\b.txt" For Binary
Access Read As #GetHandle
ReDim Buff(LOF(GetHandle) - 1)
'用 Buff 取得資料
Get #GetHandle, , Buff
Close #GetHandle
'放到 C.txt ��
Put #PutHandle, , Buff
'關掉合併檔
Close #PutHandle
End Sub
Bonjour 撰寫於文章
如果要計算到比千分之一秒小的時間,要怎樣做呢??
老怪答:
Dim varDelay As Double
varDelay=Now
'..............你的有的沒的 Code
varDelay=Now-varDelay
Debug.Print varDelay
simonsays 撰寫於文章
vb列印報表請問如何靠右對齊
老怪答:
'宣告列印字串
Dim PrintString As String
'宣告列印字串寬度
Dim StrWidth As Single
'你要輸出的字串
PrintString = "You can say
something"
'計算字串寬度
StrWidth = Printer.TextWidth(PrintString)
'設定印字頭橫向位置
Printer.CurrentX = Printer.ScaleWidth -
StrWidth
'印表機印出該字串
Printer.Print PrintString
小輝 撰寫於文章
現在我有 10 個物件 ex: button,想用程式讓它有時直的排一列,有時橫的一列想請問一下這有可能嗎???????
老怪答:
當然可以,底下是 Command Button 縱橫大閱兵試作:
'把這一段貼到記事本,副檔名存成 .frm ,
'就是 VB 的 Form 檔,省去自己畫 form。
'--------------- Cut Here ---------------------
VERSION 5.00
Begin VB.Form Form1
Caption
= "Form1"
ClientHeight = 4800
ClientLeft =
60
ClientTop =
345
ClientWidth =
4815
LinkTopic =
"Form1"
ScaleHeight =
4800
ScaleWidth =
4815
StartUpPosition = 3 '系統預設值
Begin VB.CommandButton cmdAlign
Caption
= "右"
BeginProperty Font
Name
= "新細明體"
Size
= 12
Charset
= 136
Weight
= 700
Underline
= 0 'False
Italic
= 0 'False
Strikethrough
= 0 'False
EndProperty
Height
= 495
Index
= 3
Left
= 2760
TabIndex
= 4
Top
= 2160
Width
= 495
End
Begin VB.CommandButton cmdAlign
Caption
= "左"
BeginProperty Font
Name
= "新細明體"
Size
= 12
Charset
= 136
Weight
= 700
Underline
= 0 'False
Italic
= 0 'False
Strikethrough
= 0 'False
EndProperty
Height
= 495
Index
= 2
Left
= 1800
TabIndex
= 3
Top
= 2160
Width
= 495
End
Begin VB.CommandButton cmdAlign
Caption
= "下"
BeginProperty Font
Name
= "新細明體"
Size
= 12
Charset
= 136
Weight
= 700
Underline
= 0 'False
Italic
= 0 'False
Strikethrough
= 0 'False
EndProperty
Height
= 495
Index
= 1
Left
= 2280
TabIndex
= 2
Top
= 2640
Width
= 495
End
Begin VB.CommandButton cmdAlign
Caption
= "上"
BeginProperty Font
Name
= "新細明體"
Size
= 12
Charset
= 136
Weight
= 700
Underline
= 0 'False
Italic
= 0 'False
Strikethrough
= 0 'False
EndProperty
Height
= 495
Index
= 0
Left
= 2280
TabIndex
= 1
Top
= 1680
Width
= 495
End
Begin VB.CommandButton cmdButton
Caption
= "1"
BeginProperty Font
Name
= "新細明體"
Size
= 9.75
Charset
= 136
Weight
= 700
Underline
= 0 'False
Italic
= 0 'False
Strikethrough
= 0 'False
EndProperty
Height
= 495
Index
= 0
Left
= 720
TabIndex
= 0
Top
= 480
Width
= 495
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
'button 陣列開始排列位置
Dim XPos As Single, YPos As Single
'設定 button 大小的變數
Dim cmdWide As Single
'設定對齊邊界的方式
Dim ButtonAlign As Integer
Private Sub cmdAlign_Click(Index As Integer)
'依 index 值改變 ButtonAlign 的方式
ButtonAlign = Index + 1
'觸發 Resize 程序
Form_Resize
End Sub
Private Sub cmdButton_Click(Index As Integer)
'沒啥太大意思,好玩而已。
MsgBox "我是 [" + Trim(CStr(Index
+ 1)) + _
"] 號按紐", vbOKOnly, "Button 功能"
End Sub
Private Sub Form_Load()
Dim I As Integer
'Load 9 個 Button 進來
For I = 1 To 9
Load cmdButton(I)
'依次給定顯示值
cmdButton(I).Caption =
Trim(CStr(I + 1))
'load 進來的物件
visible=false
'要 visible=true
才能看見
cmdButton(I).Visible =
True
Next
'先設定對齊方式為向上對齊
ButtonAlign = 1
End Sub
Private Sub Form_Resize()
'重新設定 button 大小,使填滿整個邊界
If ButtonAlign = 1 Or ButtonAlign = 2 Then
cmdWide =
Me.ScaleWidth / 10
Else
cmdWide =
Me.ScaleHeight / 10
End If
'呼叫改變 button 大小 Sub
cmdResize
End Sub
'改變 button 大小 Sub
Private Sub cmdResize()
Dim I As Integer
For I = 0 To 9
cmdButton(I).Width =
cmdWide
cmdButton(I).Height =
cmdWide
Next
'呼叫設定排列原點 Sub
OrignXY
End Sub
'設定排列原點 Sub
Private Sub OrignXY()
Select Case ButtonAlign
'向上對齊
Case 1
XPos = Me.ScaleLeft
YPos = Me.ScaleTop
'呼叫橫排 Sub
WPutButton
'向下對齊
Case 2
XPos = Me.ScaleLeft
YPos = Me.ScaleHeight - cmdWide
'呼叫橫排 Sub
WPutButton
'向左對齊
Case 3
XPos = Me.ScaleLeft
YPos = Me.ScaleTop
'呼叫直排 Sub
HPutButton
'向右對齊
Case 4
XPos = Me.ScaleWidth - cmdWide
YPos = Me.ScaleTop
'呼叫直排 Sub
HPutButton
End Select
End Sub
'橫排函數
Private Sub WPutButton()
Dim I As Integer
For I = 0 To 9
'上下位置不變,向右遞增
cmdButton(I).Move I *
cmdWide, YPos
Next
End Sub
'直排函數
Private Sub HPutButton()
Dim I As Integer
For I = 0 To 9
'左右位置不變,向下遞增
cmdButton(I).Move
XPos, I * cmdWide
Next
End Sub
'----------- End Here
--------------------------------
連連 撰寫於文章
我想利用Chr()把中文內碼轉成中文字顯示出來:
老怪答:
請不要忘了 VB 的標準字碼是 Unicode ,是 Two Byte 的字碼,不需要像 Ansi(One Byte) 一樣拆開來再合一起,而且 VB 不支援 Chr(128)~Chr(255) 的字碼,所以是空白。請直接 Chr(&HB3CC) 即可,下面的式子則在內碼轉換中很有用。
Dim PutCode As String
PutCode = "B3CC"
Print Chr("&H" + PutCode)
angel tear 撰寫於文章
在 Visual BASIC 中如何用印表機印出彩色文字?我設了 Printer.ForeColor 屬性,但是印出來都是黑色文字。
老怪答:
韋恩 撰寫於文章
在一個 Multi-line `的 Textbox 中顯示成兩行?
老怪答:
民哥 撰寫於文章
在VB5 中可用ARRAY()來給陣列初始值,但它好像只能用於一維, 不知多維陣列如何給定初始值?
老怪答:
'你可考慮使用集合變數宣告如下:
Dim Collect As Collection
'給定初值
Private Sub Form_Load()
Dim itmVar As Variant
Set Collect = New Collection
itmVar = Array(1, 2, 3)
Collect.Add itmVar
itmVar = Array("My", "Your")
Collect.Add itmVar
itmVar = Array(#8/1/98#)
Collect.Add itmVar
End Sub
'取出集合變數�堛漱漁e值
Private Sub Command1_Click()
Dim Check As Variant
Dim I As Long
For Each Check In Collect
For I = 0 To UBound(Check)
List1.AddItem Check(I)
Next
Next
End Sub
Collection 型態變數是 VB �堮e受力最高的變數型態,請多學習如何加入內容及取出內容,對將來 Class 及 ActiveX 的撰寫,也是不可或缺的重要功能。
走過一季燦爛 撰寫於文章
我在一個 MDI Parent Form 中的 General 部份宣告了一個 字串變數 :
Public MyStr as String
Private Sub Form_Load()
MyStr = "ABCDE"
End Sub
但在另一個 MDI Child Form 中使用 MyStr 時出了問題 , MyStr 的值失掉了 ,應怎樣寫才對 ?
老怪答:
MyStr 加上 MDIForm 的名稱即可呼叫到,如 Debug.Print MDIParentForm.Mystr。
Origin:椰林風情
公用變數應該宣告在 .BAS Module中吧!
老怪答:
未必,BAS Module 的公共變數宣告,雖然有其共通性及使用方便,但如果一個專案用了許多模組,或是多人開發的合力專案,則往往是系統錯誤的來源,因為不同的模組如果宣告了同名的變數,會造成執行錯誤,而且這種錯誤在編譯階段是無法由編譯器發現的,也是 Bug 的來源。
但在 Form 的公共變數宣告,則因有 Form 模組的區隔,因此不會有衝突的情況發生,這在多人開發環境及模組整合上保障了個別 Form 的正確執行及彼此呼叫的便利。所以,在最大的可能範圍,我們應少用 BAS 的 Public 變數宣告,而代以 Form 的 Public 宣告。
對錯都是為了愛 撰寫於文章
Private Sub FindName_Click()
strInput = InputBox(........省)
dtaCrtve.Recordset.FindFirst "Name Like
'*" & RTrim(strInput) & "*'"
Private Sub NameOneMore_Click()
dtaCrtve.Recordset.FindNext "Name Like
'*" & RTrim(strInput) & "*'"
由於二個是不同的程序,所以變數 strInput 在由 InputBox 輸入決定後,到了 NameOneMore 這個程序就變為空字串了。我想問的是,要如何把 strInput 變數內容由 FindName 這個程序給傳遞到 NameOneMore?
老怪答:
(Xavier21) 的大作中提到
dim i as double
i=1000*1000
結果竟然出現溢位的訊息,而且我分別在別人的電腦上也做測,試,結果還是一樣
老怪答:
老怪曾回答是 Bug ,但經版上高手指點,之所以會有此種現象,是因為 VB 運算法則使然,因為 VB 會把兩數運算的結果放到與後一個運算元相同型態的變數中,由於 1000 屬於 Integer 範圍,所以 1000000 超過 Integer 長度,因此產生溢位錯誤。
但我覺得這麼說是不通的,因為如果我們執行 i=0.111111111111111 * 1000 明顯的運算結果超過了 Integer 範圍,但卻沒有錯誤,運算結果是 i=111.111111111111。
所以明顯的 VB 計算法則不統一而有些紛亂,做為一個使用者,除了期待 VB 能改善此點混亂外,或許只能用某版友提供的辦法, i=1000 * CDbl(1000) 強迫後一運算元轉成 Double來保證程式不出錯,所以 i 被宣告是什麼型態,後運算元就要轉成什麼型態,是保障程式不出錯的辦法。
老怪:
疑惑的人
欲以Keyboard控制圖形移動,如何才能使圖形移動的更流利,而不會有先移動一格 ==> Delay ==> 再連續不停的移動的現象呢?
老怪答:
- 請你在表單上放一個 timer ,timer.enabled=false
- 當 KeyDown 時 timer.enabled=true
- 當 KeyUp 時 timer.enabled=false
- 在 timer 事件�媦g圖形移動敘述
- 如此影響你執行速度的就只有 KeyUp 和 KeyDown ,其他就是 Timer.Interval 的設定速度問題,而不再受到 KeyPress 回應速率的控制。
- 下面是我寫的一段,請自行比較是否比完全由 KeyPress 較順暢。
Option Explicit
Dim 橫向 As Integer
Dim 縱向 As Integer
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Dim 非方向鈕 As Boolean
Select Case KeyCode
Case vbKeyLeft
橫向 = -60
縱向 = 0
Case vbKeyRight
橫向 = 60
縱向 = 0
Case vbKeyUp
橫向 = 0
縱向 = -60
Case vbKeyDown
橫向 = 0
縱向 = 60
Case Else
非方向鈕 = True
End Select
If Not 非方向鈕 Then
Timer1.Enabled = True
End If
End Sub
Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
Timer1.Enabled = False
End Sub
Private Sub Form_Load()
Timer1.Enabled = False
Timer1.Interval = 30
Me.WindowState = 2
Me.Show
Image1.Move (Me.ScaleWidth - Image1.Width) / 2, (Me.ScaleHeight -
Image1.Height) / 2
End Sub
Private Sub Timer1_Timer()
Image1.Left = Image1.Left + 橫向
Image1.Top = Image1.Top + 縱向
End Sub
老怪:
滑鼠按鍵的按鍵組合,與前述鍵盤按鍵組合有很大的不同。
Option Explicit
Dim Working As Boolean
Private Sub ContinueClick()
Dim I As Long
Do While Working
I = I + 1
Label1.Caption = I
DoEvents
Loop
End Sub
Private Sub Command1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Label1.Caption = ""
Working = True
ContinueClick
End Sub
Private Sub Command1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Working = False
End Sub
ellen 撰寫於文章
當我按下一個按鈕,這個按鈕會去執行for的迴圈,而此迴圈需執行一段時間...我想要在等待的時間中,寫一個出現百分比的東西.....當程式跑完,此百分比也結束...不知vb該如何寫......
老怪答:
Private Sub Command1_Click()
Dim I As Long
For I = 1 To 100000
'你的程式動作.........................
Label1.Caption = Format(I / 100000, "0%")
DoEvents
Next
End Sub
卡布其諾) 的文章中提到
如何寫一個程式....在開機時或進win95以後.....螢幕顯示出上次開機時間.....
奇異果 撰寫於文章
你可以寫一個程式,他的功能是:
- 讀取Database裡最後一筆紀錄,並用MessageBox顯示出來
- 紀錄該程式執行時的時間,存成自訂的Database格式
- 然後把程式放到"啟動"裡就可以了.
sonic 撰寫於文章
請問可否用其他方法呢?因為用Database又會用到DAO的DLL啊!
老怪答:
Option Explicit
Private Sub Command1_Click()
Dim TimeCalc As Date
TimeCalc = Timer
Label1.Caption = "希望本電腦讓您使用愉快"
Do While Timer - TimeCalc < 1
DoEvents
Loop
Unload Me
End Sub
Private Sub Form_Load()
Dim Today As Date
Dim DayString As String
Dim PathString As String
Dim DateRec As Integer
Today = Now
PathString = App.Path
If Right(PathString, 1) <> "\" Then
PathString = PathString + "\"
End If
If Dir(PathString + "StartPc.log") <> "" Then
DateRec = FreeFile
Open PathString + "StartPc.log" For Input As #DateRec
Line Input #DateRec, DayString
Close #DateRec
Label1.Caption = "你上次開機是[" & DayString & "]"
Else
Label1.Caption = "你第一次使用本電腦"
End If
DateRec = FreeFile
Open PathString + "StartPc.log" For Output As #DateRec
DayString = Today
Print #DateRec, DayString
Close #DateRec
End Sub