問:我在學習VB過程中遇到一個問題,如源代碼:
SndPlaySound(″c:MyWorkeep.wav″)
在制成安裝盤後,安裝到其它機器中不同目錄下就不能執行,必須安裝到C:MyWork下才能執行。怎樣在源代碼中識別,或有更好的辦法。
答:這是初學者經常忽略的一個小問題。在打開文件、調用程序時喜歡使用絕對文件路徑。其實,只要使用相對路徑,就完全可以避免這個問題。在Windows下,某個程序一旦運行,除非特別指定了工作目錄,一般該程序文件所在的目錄就是工作目錄,其他目錄可以用工作目錄為參照系。例如,上述問題中,程序被安裝到了MyWork目錄下,那麼在MyWork目錄下的所有文件就不必用路徑全稱了,可以直接SndPlaySound(″Beep.wav″)。以此類推,如果要播放C:MyWorkSoundABC.Wav文件,就可以SndPlaySound(″SoundABC.wav″)。以後無論應用程序安裝在何處,都可以避免這一問題。
問:VB5.0生成的Exe文件能不能在一台從沒裝過VB5.0的機器上運行,如不能應如何做?
答:當然可以。你只要運行VB5帶的“應用程序安裝向導”就可以了。向導自動把應用程序及其依賴的DLL、OCX、DAO驅動程序等打包,形成一個安裝程序。分發這個安裝包就一切搞定了。
問:假設表A有一字段B(文本型,8個字符),當我在表中進行輸入時超過8個字符,系統就會禁止我輸入,這沒有什麼問題。但當我在VBA中使用DAO編輯這個字段時,我遇到了麻煩。
答:可以通過DAO提供的Recordset或TablDef對象來得到字段B的長度,然後,根據情況把你的值直接賦予它或截斷後賦值。例如:
DimdbasDatabase,rsasRecordset
DimiSizeasInteger,SasString
setdb=DBEngine.OpenDatabase(″XXX.mdb″)
setrs=db.OpenRecordset(″TableA″)
iSize=td(″FieldB″).Size′字段長度
……
′下面准備賦值
S=″ABC中DE國FGEGHG″
setrs=db.OpenRecordset(″TableA″)
rs.Edit
IfiSize>=LenB(strconv(S,vbFromUnicode))Then
rs(″FieldB″)=S′直接賦值
Else
rs(″FieldB″)=LeftB(strconv(S,vbFromUnicode),iSize)'截斷賦值
EndIf
rs.Update
……
請注意,VB或VBA中字符串默認以vbUnicode格式保存,所以要轉換後再比較運算。請參閱函數StrConv(),參數:vbFromUnicode,vbUnicode,及Byte數組,和以‘B'結尾的函數。
問:我寫了個應用程序,第一次進入時想要求用戶輸入密碼,並將密碼保存(有什麼方法別人看不到)。下次進入時提示輸入密碼。應如何完成呢?
答:可以把密碼保存到INI文件或注冊數據庫。一般應用級的用戶是不會去看這些密碼的。為了防止像你我這樣的人觀看,比較好的是使用如DES、RC5等加密算法或自行設計一個加密算法,這樣才能夠達到一個較高的密級。本人設計有一個以DES和自制加密算法混合工作的DLL,如果有興趣,請與我聯系。
問:如何生成一個透明窗體?使得可以看到窗體後面的內容?
答:用如下代碼可生成透明窗體,若要顯示其他信息,可做一個背景透明的圖案為窗體背景。
Me.AutoRedraw=True
hBitmap=CreateCompatibleBitmap(Me.hdc,0,0)
SelectObjectMe.hdc,hBitmap
Me.Refresh
感謝ZhuangYong提供解答
問:在Access97中如何實現代碼輸入?
答:在Access97中的代碼輸入解決方案是我見過中的比較好的一種。Accesss97至少提供了兩種場合使用的代碼輸入方式。
其一、在表結構設計窗口,選中指定字段,單擊“查閱”標簽,改顯示控件為組合框或列表框,根據情況選擇“行來源”類型為“表/查詢”或“值列表”,然後選擇代碼表或輸入候選值即可。這樣的設置在“數據表”狀態體現最完美:顯示代碼Name,挑選代碼ID列表;其二、在設計Form時對指定控件做上述設定,其效果稍遜。運行時,輸入框中僅可顯示代碼ID,卻無法顯示代碼Name。
其實,關鍵是三個要素:1、控件顯示的內容;2、和控件相關的數據源的字段;3、代碼表。把握好這三者的關系就真正抓住了問題的關鍵。建議讀者看看Delphi或C++Builder的DBLookup控件,它的解決方法非常好,我希望能看到提供給VB、Access使用的短小精悍的代碼輸入控件也能做到這一點。->