第一遍 主程序
俗語說:萬事開頭難。
一個應(yīng)用軟件,如果沒有一個主程序(這像一棵樹,沒有樹干,充其量好象只能是灌木了吧),沒有一根主線,很難想象在編程時該怎么
寫代碼?怎樣控制程序的流程?(當然不是非得有主程序不可 ^_^ )
作為一個主程序,應(yīng)該包括哪些內(nèi)容或者說是哪些功能?鄙人以為:
1、初始化環(huán)境(我習慣在Config.Fpw中設(shè)置)
2、初始化系統(tǒng)變量
3、初始化界面(這要根據(jù)需要而定)
……
有些程序為了適應(yīng)客戶要求,需做些LOGO界面,問題有了(這問題可能也算是本論壇的精華問題之一吧):
如何去掉Visual FoxPro的主窗口?
首先:Modify Command Config.fpw(建立資源文件)
SCREEN = OFF (就這句,屏蔽默認界面)
ANSI = ON
AUTOSAVE = ON
CONSOLE = OFF
DEBUG = OFF
DELETED = ON
DOHISTORY = OFF
ESCAPE = OFF
EXACT = ON
EXCLUSIVE = OFF
HELP = OFF
NOTIFY = OFF
OPTIMIZE = ON
REFRESH = 0,0
SAFETY = OFF
STATUS = OFF
STATUS BAR = OFF
SYSMENU = OFF
SYSFORMATS = ON
TALK = OFF
TITLE = 藍色雪狐基地 (c) 2001
VIEW = OFF
以上各個設(shè)置并非必須,我把以前一個程序的設(shè)置拷貝過來的,由于時間關(guān)系(我寫文章的熱情一般最多保持半個小時 :( ),這里不作
一一說明。
其次,在你的主程序的第一語句寫上(必須是第一語句,這樣當程序運行時,不論機器速度如何,界面過渡會顯得最完美):
With _Screen
.Visible = .F. (默認界面不可見)
.WindowState = 2 (當再次需要顯示時最大化,當再次用_Screen.Visible = .T.恢復界面時,這樣的效果最理想 )
EndWith
這里要注意一個問題,就是Config.Fpw這個文件在項目中必須為包含。以前我指導他人時,有些人總說我這樣還是會有默認界面一閃的痕
跡。我覺得很奇怪?后來有一個網(wǎng)友把整個項目發(fā)給了我,我在分析后才知道的。這可能是寫程序的習慣問題:因為我有這么一個習慣,凡是
應(yīng)用程序中能包含的文件,我都包含進去,如客戶需作特殊設(shè)置,提供一個數(shù)據(jù)表及一個接口,讓客戶自行設(shè)置界面、標題等等。(注意,圖
片可盡量不要包含在項目中,除非是標記性的,如你公司的徽標等等,切記?。。?/p>
啟動時的效果跟其它軟件一樣,好了,那下面做什么呢?
如何防止客戶重復啟動?。?!
由于編程的要求及其他方面的問題,客戶無意中重復啟動應(yīng)用程序往往可能會造成不可預測的問題(當然,如果在編程時就考慮到數(shù)據(jù)共
享、重復運行等因素,則客戶完全可以多次打開一個應(yīng)用軟件,一邊刪、一邊改)。
經(jīng)常在論壇的人大都知道兩種以上的方法,我這兒呢一股腦兒全列出來,大家自己摸摸?。?/p>
如何防止應(yīng)用軟件重復啟動(1)
在應(yīng)用軟件啟動后,在硬盤上留下一個特定的文件。這種方法只要在啟動時檢測一下這個文件是否存在,作一個判斷即可。
存在缺陷:當應(yīng)用軟件由于不可預見的情況,非正常退出的情況下,該文件得不到及時刪除,怎么辦?
我KAO,想出來了,這個特定的文件為任一空的數(shù)據(jù)表,在應(yīng)用軟件中以獨占方式找開它,那么當?shù)诙卧傩璐蜷_會提示出錯。
如何防止應(yīng)用軟件重復啟動(2)
用FindWindow 及ShowWindowAsync API函數(shù):
Declare Long FindWindow In USER32.DLL String, String
Declare Long ShowWindowAsync In USER32.DLL Long, Long
nTitle = "安華鎮(zhèn)農(nóng)業(yè)稅征收系統(tǒng)"
hWnd = FINDWINDOW("", nTitle)
IF hWnd != 0
ShowWindowAsync(hWnd, 3) &&請注意看這個API函數(shù)的效果
Clear Dlls
Clear All
Quit
ENDIF
存在缺陷:無法判斷窗口標題動態(tài)變動的情況
如何防止應(yīng)用軟件重復啟動(3)
用程序特定的類及相關(guān)的特性綜合判斷,先用GetClassName取得應(yīng)用軟件的類名,再根據(jù)類名查找是否有同樣的窗體存在,以下是一個簡
單的相關(guān)示例:
nCaption = "藍色雪狐基地 (c) 2001"
Declare Long FindWindowEx In "user32" Long, Long, String, String &&該函數(shù)可根據(jù)類查找窗口
Declare Long GetClassName In "user32" Long, String, Long
Declare Long ShowWindowAsync IN "user32" Long, Long
hWnd = FindWindowEx(0, 0, 0, nCaption)
Buffer = Space(32)
nLen = GetClassName(hWnd, @Buffer, 32)
hClass = Left(Allt(Buffer), nLen)
hWnd = FindWindowEx(0, hWnd, hClass, nCaption)
IF hWnd > 0
ShowWindowAsync(hWnd, 3)
Clea DLLS
Quit
ENDIF
這是一個框框而已,你可以根據(jù)應(yīng)用程序的各種不同的特征,來檢測是否有窗體存在。
存在缺陷:如何“設(shè)置”應(yīng)用軟件的特定的類信息我自己搞糊涂了,如何能在應(yīng)用軟件中設(shè)置特定的類信息,那才能做到“完美無缺”
如何防止應(yīng)用軟件重復啟動(4)——好象是剛才論壇里搞出來的,是誰定的,說一聲 ^_^
內(nèi)存映謝文件防止應(yīng)用應(yīng)用程序運行
PUBLIC handle
DECLARE INTEGER CreateFileMapping IN kernel32.DLL INTEGER hFile, ;
INTEGER lpFileMappingAttributes,integer flProtect, ;
INTEGER dwMaximumSizeHigh, INTEGER dwMaximumSizeLow, ;
STRING lpName
DECLARE INTEGER GetLastError IN kernel32.DLL
DECLARE INTEGER CloseHandle IN kernel32.DLL INTEGER hObject
szname="myonly"
handle = createfilemapping(0xFFFFFFFF,0,4,0,128,szname)
IF handle = 0
WAIT WINDOW "CreateFileMapping 失敗 - LastError: " ;
+ LTRIM(STR(getlasterror()))
RETURN
ENDIF
if handle=0
messagebox("創(chuàng)建內(nèi)存映謝文件失??!",0,"錯誤")
return .f.
else
if GetLastError()=183
=messagebox("該軟件已經(jīng)正在運行啊!",32,"嘿嘿-不要做重復運動*(^_^)*")
CLOSE all
Clear dlls
Clear events
QUIT
endif
endif
注在程序結(jié)束處別望了一定要:
DECLARE INTEGER CloseHandle IN kernel32.DLL INTEGER hObject
=CloseHandle(handle)
clea event
clea
quit
以上經(jīng)測試效果也相當不錯,由于本人水平有限,對于用這種方式會不會造成多占用內(nèi)存(應(yīng)該說對于CreateFileMapping API函數(shù)的功能
不清楚吧?。?,心里沒底,反正大家再試試?。?/p>
…………
方法是多種多樣的,大家再討論討論。
如果有初始化的界面,那么接下去…………
主程序的最后應(yīng)該是設(shè)置應(yīng)用軟件的路徑、背景等設(shè)置,最后——顯示界面。
今個活特多,不寫了。對了,下面拷貝一個我剛寫完的主程序,大家看看。
_Screen.Visible = .F.
_Screen.WindowState = 2
NoAgein(_Screen.Caption) &&這里就是檢測是否已運行的模塊
Do Form "Logo.scx" &&歡迎界面
Public p
p = .T.
cTitle = _Screen.Caption
Do Form "Pass.scx" With cTitle &&登錄對話框,cTitle是登錄對話框中界面中的一個特效的文字(組件化)
If p = .F.
Clea Events
Quit
EndIf
Clea All
On Error MessageBox(Message(), 16, _Screen.Caption)
On ShutDown Do E_end
Set Default To Sys(5)+Sys(2003)+\'\\\'
Set Resource To "Sys\\FoxUser.DBF"
_Screen.Caption = "藍色雪狐基地 (c) 2001"
Use "Sys\\User.dbf"
Locate For AllTrim(Name) = "PICTURE"
IF !Empty(AllTrim(Path)) .AND. File(Path)
PIC = AllTrim(Path)
_Screen.Picture = PIC
Else
_Screen.BackColor = RGB(28, 118, 202)
EndIf
Use
_Screen.Visible = .T.