小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

VFP主程序

 悟靜 2009-04-25

第一遍 主程序
俗語說:萬事開頭難。

 一個應(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.

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多