日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

vfp 全面總結(jié)(精華)(下)

 悟靜 2009-06-22
設(shè)置該控件dragmode自動模式
 
***************************
應(yīng)用程序環(huán)境配置文件config.fpw

應(yīng)用程序環(huán)境配置文件config.fpw在程序連編時是可選的,也就是可要可不要,它保存的是一些vfp系統(tǒng)設(shè)置.如果存在,VFP啟動時會去讀取;如果沒有,系統(tǒng)會設(shè)定默認值.   
代碼中建-----默認存入格式.prg ------文件夾中修改后綴為:config.fpw
********************************
*                表單設(shè)置背景圖片
pictrue屬性
stretch屬性值=2
********************************
* 一種加密和解密算法 JM.PRG (C)Copyright 2006-2006
* 加密: ?JM("文件名.DBF",88) &&返回.T.為成功
* 解密: ?JM("文件名.DBF",-88) &&返回.T.為成功
* 作者: Tiger5392
* 時間: 2006.06.11
PARAMETERS cFileName,nNumber
PRIVATE cFileName,nNumber,A,B,D
nHandle=FOPEN(cFileName,2)
IF nHandle<>-1
DIMENSION D(1)
ADIR(D,cFileName)
FOR I=1 TO D(1,2)
A=FREAD(nHandle,1)
B=CHR(MOD(ASC(a)+nNumber,256))
FSEEK(nHandle,I)
FWRITE(nHandle,B)
ENDFOR
FCLOSE(nHandle)
RETURN .T.
ELSE
RETURN .F.
ENDIF
**************************************************
*                           查找問題
seek         for   
locatefor          
*用found() 測試結(jié)果 聯(lián)合使用
if found()=.t.
...........
*****************************************************
*             測試文件值類型
Case Vartype(ThisForm.Text1.Value)='' &&     c、n。。。
****************************************************
*    分級設(shè)置權(quán)限方法
*主菜單都是執(zhí)行一些具體功能的子表單,不想讓普通用戶組使用的命令,就用skip for屏蔽 就是我上面說的那種
*有些子表單,普通用戶也可以用,但上面有些按鈕,只能管理員才能用的,就在子表單的init中判斷
*將不能讓普通用戶點的,enabled=.f.或直接visible=.f.
*就這些。。。。
set exact on
thisform.i=thisform.i+1   &&這句是今天新學(xué)到的,用于標(biāo)識試圖登錄的次數(shù)
select user               &&當(dāng)然是打開數(shù)據(jù)環(huán)境對應(yīng)的賬號信息表
locate for alltrim(賬號)=alltrim(thisform.txt賬號.value)
if found() and alltrim(密碼)=alltrim(thisform.txt密碼.value)       &&說明找到了用戶名,并且密碼與名對應(yīng)
  if 級別="管理員"
      bsadmin="sysadmin"
  else
      bsadmin=""      &&仍然等到空,可以根據(jù)此擴充為二級權(quán)限管理員,三級權(quán)限。。
  endif
  do form 主表單
  thisform.release
else
  if thisform.i<3   &&試圖登錄三次以內(nèi)
    重輸賬號、密碼
  else
    三次都錯,clear events,quit
  endif
endif
set exact off
************************************************
  設(shè)置該控件dragmode自動模式   
***************************
 應(yīng)用程序環(huán)境配置文件config.fpw 
應(yīng)用程序環(huán)境配置文件config.fpw在程序連編時是可選的,也就是可要可不要,它保存的是一些vfp系統(tǒng)設(shè)置.如果存在,VFP啟動時會去讀取;如果沒有,系統(tǒng)會設(shè)定默認值.    
代碼中建-----默認存入格式.prg ------文件夾中修改后綴為:config.fpw 
******************************** * 
               表單設(shè)置背景圖片 pictrue屬性 stretch屬性值=2 
******************************** *
 一種加密和解密算法 JM.PRG (C)Copyright 2006-2006 
* 加密: ?JM("文件名.DBF",88) &&返回.T.為成功 * 解密: ?JM("文件名.DBF",-88) &&返回.T.為成功 * 作者: Tiger5392 
* 時間: 2006.06.11 PARAMETERS cFileName,nNumber PRIVATE cFileName,nNumber,A,B,D nHandle=FOPEN(cFileName,2) IF nHandle<>-1 DIMENSION D(1) ADIR(D,cFileName) FOR I=1 TO D(1,2) A=FREAD(nHandle,1) B=CHR(MOD(ASC(a)+nNumber,256)) FSEEK(nHandle,I) FWRITE(nHandle,B) ENDFOR FCLOSE(nHandle) RETURN .T. ELSE RETURN .F. ENDIF ************************************************** * 
                          查找問題
 seek         for    locatefor           
*用found() 測試結(jié)果 聯(lián)合使用 if found()=.t. ........... 
***************************************************** * 
            測試文件值類型 Case Vartype(ThisForm.Text1.Value)='' &&     c、n。。。 
**************************************************** *
    分級設(shè)置權(quán)限方法 
*主菜單都是執(zhí)行一些具體功能的子表單,不想讓普通用戶組使用的命令,就用skip for屏蔽 就是我上面說的那種 
*有些子表單,普通用戶也可以用,但上面有些按鈕,只能管理員才能用的,就在子表單的init中判斷 
*將不能讓普通用戶點的,enabled=.f.或直接visible=.f. 
*就這些。。。。 set exact on thisform.i=thisform.i+1   
&&這句是今天新學(xué)到的,用于標(biāo)識試圖登錄的次數(shù) select user              
 &&當(dāng)然是打開數(shù)據(jù)環(huán)境對應(yīng)的賬號信息表 locate for alltrim(賬號)=alltrim(thisform.txt賬號.value) if found() and alltrim(密碼)=alltrim(thisform.txt密碼.value)      
 &&說明找到了用戶名,并且密碼與名對應(yīng)   if 級別="管理員"       bsadmin="sysadmin"   else       bsadmin=""      
&&仍然等到空,可以根據(jù)此擴充為二級權(quán)限管理員,三級權(quán)限。。   endif   do form 主表單   thisform.release else   if thisform.i<3   
&&試圖登錄三次以內(nèi)     重輸賬號、密碼   else     三次都錯,clear events,quit   endif endif set exact off 
************************************************
 *檢驗斷斷續(xù)續(xù)出現(xiàn)的錯誤的原因. 用以下代碼創(chuàng)建一個叫做
*Errutil.prg 和程序. ON ERROR DO errhand IN errutil ; WITH SYS(0), ERROR(), MESSAGE(), MESSAGE(1), ; PROGRAM(), LINENO(1), DBF(), DATE(), TIME() * 錯誤捕捉設(shè)置結(jié)束. PROCEDURE errhand PARAMETER m.machine, m.messgnum, m.messg, m.linecode, ; m.callprog, m.inline, m.OPENTABL, m.errdate, ; m.errtime m.errspace=SELECT() && 保存當(dāng)前工作區(qū).
m.errorder=ORDER() && 保存當(dāng)前排序.
 IF LEN(ALLTRIM(m.callprog))=0 m.callprog="Command Line" STORE SPACE(0) TO m.linecode ENDIF outmsgline="錯誤 ; "+m.messg+CHR(13)+"行號 "+STR(m.inline)+ ; CHR(13)+ ; "程序名 = "+m.callprog+CHR(13)+"語法 :"+m.linecode
* Visual FoxPro 用戶使用 =MESSAGEBOX(outmsgline,32+0)
* FoxPro For Windows 用戶使用 Foxtools.fll 中的 MsgBox() 函數(shù) WAIT WINDOW outmsgline TIMEOUT 5 && 所有版本均可使用該語法. IF !USED("ERRORLOG") IF FILE("ERRORLOG.DBF") SELECT 0 USE errorlog ELSE SELECT 0 thisversion=VERSION() IF LEFT(ALLTRIM(thisversion),6)="Visual"
* 為 Visual FoxPro 版本創(chuàng)建一個自由表 CREATE TABLE errorlog FREE (machine c(20), messgnum N(4,0), ; messg c(70), linecode c(70), callprog c(40), ; inline N(6,0), OPENTABL c(25), errdate d, errtime c(8)) ELSE CREATE TABLE errorlog (machine c(20), messgnum N(4,0), ; messg c(70), linecode c(70), callprog c(40), ; inline N(6,0), OPENTABL c(25), errdate d, errtime c(8)) ENDIF ENDIF ENDIF INSERT INTO errorlog FROM MEMVAR SELECT errorlog && 選擇
errorlog 表.
USE && 關(guān)閉 errorlog 表.
 SELECT (m.errspace) && 返回到保存的工作區(qū).
 IF !EMPTY(ALIAS()) SET ORDER TO (m.errorder)
ENDIF RELEASE ALL LIKE m.messgnum, m.messg, m.linecode, m.callprog, ;
m.inline
 RETURN
 用以下代碼創(chuàng)建一個名為 Ztest.prg 的程序:
 DO errutil && 激活 Errutil.prg 中的 ON ERROR 例程.
USE c:\noexist.dbf && 因為該文件尚不存在因此會發(fā)生錯誤 DO C:\noexist.prg ON ERROR && 關(guān)閉活動的 ON ERROR 例程.
在 Visual FoxPro 命令窗口中打入以下命令: Do ZTest.prg. 兩個 Wait 窗口顯示出不愉快的錯誤代碼行. 這些信息被放入
 Errorlog.dbf 文件中. 5 秒鐘后窗口消失. 激活命令窗口, 然后打開并瀏覽 Errorlog 表.

 ************************************************   
*             set path to  和 set default to 區(qū)別
1. set default to 是設(shè)置系統(tǒng)默認路徑的命令,如:當(dāng)前程序執(zhí)行時所在的路徑是c:\\temp,但是系統(tǒng)運行后向把系統(tǒng)的默認路徑改為d:\\temp時,就執(zhí)行set defautl to d:\\temp.
2. set path to 是設(shè)置系統(tǒng)的文件搜索路徑,如:當(dāng)前程序執(zhí)行時所在的路徑是c:\\temp,但是系統(tǒng)運行后需要某些操作文件(已知這些文件所在的路徑,如:d:\\temp.d:\\temp1...),而又不能改變系統(tǒng)運行的默認路徑時,就執(zhí)行set path to d:\\temp,set path to d:\\temp1  ....
*******************************************
**         Modal窗口和Modeless窗口有什么區(qū)別?

      答: Modeless 窗口可以在窗口運行后,但是并沒有退出窗口時,仍然運行DO Form 后的代碼。

         Modal 窗口必須在退出窗口后,才能繼續(xù)運行DO Form 后的代碼。
**********************************************
*                        如何把表單的標(biāo)題欄移掉

      答:其實,這很容易制作。只要您把表單的下面幾個屬性

              Closable ,ControlBox , Minbutton , Maxbutton , Movable

             設(shè)為 False,再把Caption設(shè)為空(caption=""),就可以達到要求。
**************************************************
*              表單啟動后的事件執(zhí)行順序
DataEnvironment.BeforeOpenTables()
Form.Load()
DataEnvironment.Init()
Form.Container1.Contol1.Init()
Form.Container1.Control2.Init()
Form.Container1.Init()
******************************************************
*                              程序自動設(shè)定路徑?

      答:一般運行程序的目錄并非固定不變,因此一般在程序啟動時

都要查詢當(dāng)前運行程序的目錄。下面這段程序給出當(dāng)前路徑的查詢

方法:

    Function SetPath()
       LOCAL lcSys16, lcProgram
       lcSys16 = SYS(16) &&查詢當(dāng)前運行程序名
       lcProgram = SUBSTR(lcSys16, AT(":", lcSys16) - 1)

       CD LEFT(lcProgram, RAT("\", lcProgram))
       *-- If we are running MAIN.PRG directly, then
       *-- CD up to the parent directory
       IF RIGHT(lcProgram, 3) = "FXP"
            CD ..
       ENDIF
       SET PATH TO PROGS, FORMS, LIBS, ;
           MENU, DATA, ;
           REPORTS, INCLUDE, HELP, ;
           BITMAPS
       SET CLASSLIB TO MAIN ,vfptool
    ENDFUNC
*****************************************************
*--鎖定數(shù)據(jù)庫
do while !rlock()   && 鎖定數(shù)據(jù)庫
wait window '正在鎖定數(shù)據(jù)庫請稍候!' Timeout 0.05
enddo
repl kcl with kcl-sp.sl && 更新數(shù)據(jù)
unlock in mjsm_temp  &&  解鎖數(shù)據(jù)庫 
*****************************************************
* -- 取得卷(磁盤)信息
DECLARE INTEGER GetVolumeInformation IN WIN32API STRING @cRooDirectory ,STRING @cVolume, INTEGER nVolumeSize, ;
        INTEGER @nSerialNo, INTEGER @nMaxFileNameLen, INTEGER  @nFileSystemFlags, STRING @cFileSystemName, ;
        INTEGER nFileSystemNameSize
******************************************************
* --- 設(shè)置卷標(biāo)
DECLARE INTEGER SetVolumeLabel IN WIN32API STRING cRootPathName, STRING cVolumeName
cRooDirectory = "C:\"
cVolume = SPACE(255)
nVolumeSize = 255
nSerialNo = 0
nMaxFileNameLen = 0
nFileSystemFlags = 0
cFileSystemName = SPACE(255)
nFileSystemNameSize = 255
nOk = GetVolumeInformation(@cRooDirectory , @cVolume, nVolumeSize,@nSerialNo, @nMaxFileNameLen, @nFileSystemFlags, ;
                           @cFileSystemName,nFileSystemNameSize)
*IF nOk > 0
   "cVolume =", cVolume
   "nSerialNo =", LEFT(SUBSTR(TRANSFORM(nSerialNo, "@0X"), 3), 4) + "-" +RIGHT(SUBSTR(TRANSFORM(nSerialNo, "@0X"), 3), 4)
   "nMaxFileNameLen = ", nMaxFileNameLen
   "nFileSystemFlags = ", nFileSystemFlags
   "cFileSystemName =",cFileSystemName
*ELSE
   "Read Error=", nOk
*ENDIF
*? SetVolumeLabel("C:\", "WINDOWS_98")
*? SetVolumeLabel("A:\", "WINDOWS_98")

or
(1).dir>xxx.txt
(2)
   handle = fopen("xxx.txt",2)
   s = fget(handle,10)
 ******************************************************
 
**---  如何在一個表單上戳一個(或幾個平行)的透明窟窿?--
* Program Name : MakeTransparentHole.Prg
* Article No.  : [Win API] - 001
* Illustrate   : 如何在一個表單上戳一個(或幾個平行)的透明窟窿?
* Date / Time  : 2001.09.09 / 16:00
* Writer       :
* 1st Post     :
********************************************************
PUBLIC frm
frm = CreateObject ("Tform")
frm.Visible = .T.
* end of main
DEFINE CLASS Tform As Form
  Width = 500
  Height = 300
  AutoCenter = .T.
  BackColor = Rgb(192,224,192)
  Caption = "如何在一個表單上戳一個(或幾個平行)的透明窟窿"
  ADD OBJECT lbl1 As Tlabel WITH Caption="她初看是一個 Form 上的 Shapes,...", Left=10, Top=10
  ADD OBJECT lbl2 As Tlabel WITH Caption="...但它們確實是一個洞,在背后可以放置東西。", Left=20, Top=150
   PROCEDURE  Load
    THIS.decl
   ENDPROC
   PROCEDURE  Resize
      *THIS.RemoveRegions   && does not make any difference
    ThisForm.ApplyRegions
   ENDPROC
   PROCEDURE  Activate
    ThisForm.ApplyRegions
   ENDPROC
   PROCEDURE  RemoveRegions
    = SetWindowRgn (GetFocus(), 0, 1)
   ENDPROC
   PROCEDURE  ApplyRegions
       #DEFINE RGN_AND  1
       #DEFINE RGN_OR   2
       #DEFINE RGN_XOR  3
       #DEFINE RGN_DIFF 4
       #DEFINE RGN_COPY 5
       #DEFINE radius  84
       #DEFINE interspace 12
    LOCAL hRgnBase, hRgn, hwnd, x0,y0,x1,y1
    DIMEN hRgnExclude [5]  && an array to store elliptical regions
    * create a rectangle region
    * and set it by the rectangle of the form
    hRgn = CreateRectRgn (0,0,1,1)
    hwnd = GetFocus()  && get window handle for the form
    THIS.GetRect (hwnd, @x0,@y0,@x1,@y1)
    hRgnBase = CreateRectRgn (0,0,x1-x0,y1-y0)
    x0 = 20
    y0 = 70
    y1 = y0 + radius
    * create several elliptical regions
    FOR ii=1 TO 5
        hRgnExclude[ii] = CreateEllipticRgn (x0,y0, x0+radius,y1)
        x0 = x0 + radius + interspace
    ENDFOR
    * combine elliptical regions into one region
    = CombineRgn (hRgn, hRgnExclude[1], hRgnExclude [2], RGN_OR)
    = CombineRgn (hRgn, hRgn, hRgnExclude [3], RGN_OR)
    = CombineRgn (hRgn, hRgn, hRgnExclude [4], RGN_OR)
    = CombineRgn (hRgn, hRgn, hRgnExclude [5], RGN_OR)
    * subtract the resulting region
    * from the region defined by the rectangle of the form
    = CombineRgn (hRgn, hRgnBase, hRgn, RGN_XOR)
    * apply final region to the form
    = SetWindowRgn (hwnd, hRgn, 1)
    * free system resources
    = DeleteObject (hRgn)
    FOR ii=1 TO 5
        = DeleteObject (hRgnExclude[ii])
    ENDFOR
    = DeleteObject (hRgnBase)
   ENDPROC
   PROCEDURE  GetRect (hwnd, x0,y0,x1,y1)
    LOCAL lpRect
    lpRect = SPACE (16)
    = GetWindowRect (hwnd, @lpRect)
    x0 = THIS.buf2dword (SUBSTR(lpRect,  1,4))
    y0 = THIS.buf2dword (SUBSTR(lpRect,  5,4))
    x1 = THIS.buf2dword (SUBSTR(lpRect,  9,4))
    y1 = THIS.buf2dword (SUBSTR(lpRect, 13,4))
   ENDPROC
   FUNCTION  buf2dword (lcBuffer)
       RETURN Asc(SUBSTR(lcBuffer, 1,1)) + Asc(SUBSTR(lcBuffer, 2,1)) * 256 + Asc(SUBSTR(lcBuffer, 3,1)) * 65536 + Asc(SUBSTR(lcBuffer, 4,1)) * 16777216
   ENDFUNC
   PROCEDURE  decl
    DECLARE INTEGER CreateEllipticRgn IN gdi32 INTEGER nLeftRect, INTEGER nTopRect, INTEGER nRightRect, INTEGER nBottomRect
    DECLARE INTEGER CreateRectRgn IN gdi32 INTEGER nLeftRect, INTEGER nTopRect, INTEGER nRightRect, INTEGER nBottomRect
    DECLARE INTEGER CombineRgn IN gdi32 INTEGER hrgnDest, INTEGER hrgnSrc1, INTEGER hrgnSrc2, INTEGER fnCombineMode
    DECLARE SetWindowRgn IN user32 INTEGER hWnd, INTEGER hRgn, SHORT bRedraw
    DECLARE SHORT GetWindowRect IN user32 INTEGER hwnd, STRING @ lpRect
    DECLARE INTEGER DeleteObject IN gdi32 INTEGER hObject
    DECLARE INTEGER GetFocus IN user32
   ENDPROC
ENDDEFINE
DEFINE CLASS Tlabel As Label
    FontName="System"
    FontSize=18
    AutoSize=.T.
    BackStyle=0
ENDDEFINE
 **********************************************************************
**----  如何生成世界上唯一的 64 位 ID?--
* Program Name : OnlyID.Prg
* Article No.  : [Win API] - 003
* Illustrate   : 如何生成世界上唯一的 64 位 ID?
* Date / Time  : 2001.09.09 / 18:00
* Writer       :
* 1st Post     :
***********************************************************************
LOCAL lcRetval, lcStruc_GUID, lcGUID, lnSize
DECLARE INTEGER CoCreateGuid IN "ole32.dll" STRING @lcGUIDStruc
DECLARE INTEGER StringFromGUID2 IN "ole32.dll" STRING cGUIDStruc, STRING   @cGUID, LONG nSize
* Create a GUID-structure
lcStruc_GUID = REPLICATE(" ", 16)
lcGUID = REPLICATE(" ", 80)
lnSize = LEN(lcGUID) / 2
* Pass the structure to the API function so that it creates a new ID
IF CoCreateGuid(@lcStruc_GUID) <> 0
    RETURN ""
ENDIF
* Convert the structure to a string that we can use in VFP
IF StringFromGUID2(lcStruc_GUID, @lcGuid, lnSize) = 0
    RETURN ""
ENDIF
STRCONV(LEFT(lcGUID, 76), 6)
RETURN STRCONV(LEFT(lcGUID, 76), 6)

**---- 如何使用和調(diào)用 Win32 的 GetUserName API?--
* Program Name : GetUserID.Prg
* Article No.  : [Win API] - 002
* Illustrate   : 如何使用和調(diào)用 Win32 的 GetUserName API?
* Date / Time  : 2001.09.09 / 17:00
* Writer       :
* 1st Post     :
*
Public  lpUserIDBuffer, nBufferSize,  RetVal
RetVal         = 0
lpUserIDBuffer = SPACE(25) && Return buffer for user ID string
nBufferSize    = 25        && Size of user ID return buffer
Declare INTEGER GetUserName IN Win32API AS GetName STRING  @lpUserIDBuffer, INTEGER @nBufferSize
RetVal=GetName(@lpUserIDBuffer, @nBufferSize)
Define WINDOW ShowInfo FROM 0,0 TO 5,70 FLOAT CLOSE TITLES "User ID Information" FONT "System",12
Activate WINDOW ShowInfo
Move WINDOW ShowInfo CENTER
@ 0,1 SAY "User ID  : " +  LEFT(lpUserIDBuffer,nBufferSize-1)
*******************************************************************
** --     Parameters: lcWindCaption - 應(yīng)用程序窗口標(biāo)題--
*******************************************************************
Function TestAppRun
LPARAMETER lcWindCaption
IF TYPE('lcWindCaption') # 'C' OR EMPTY(lcWindCaption)
 RETURN .F.
ENDIF
LOCAL GetWind, wclass, apphand
SET LIBRARY TO foxtools.fll ADDITIVE
GetWind = RegFn("FindWindow", "CC", "I")
wclass=0
apphand=CallFn(GetWind,wclass ,lcWindCaption)
IF apphand # 0
 RETURN .F.
ENDIF
RETURN .T.
*******************************************************************
**--數(shù)值轉(zhuǎn)換成人民幣大寫格式--
*Programmer:Craftsman
*2001.10.18
cUnit="仟佰拾萬仟佰拾圓角分"
cChar=""
If Vartype(This.Input)<>"N"
   Messagebox("請確認數(shù)據(jù)類型",48,"警告")
Else
   cInput=Chrtran((Ltrim(Str(This.Input,20,2))),".","")
   If This.Input<=0 or Len(cInput)>10
      Messagebox("您輸入的數(shù)值可能存在以下問題:"+Chr(13);
                  +"1、輸入的數(shù)值太大(最大處理值:99999999.99)"+Chr(13);
                  +"2、輸入的數(shù)值小于或等于零",48,"警告")
   Else
      For N=1 to Len(cInput)
          If Val(Substr(Right(cInput,N),1,1))>0
                cChar=Stuffc(cUnit,11-N,0,Substr("0零1壹2貳3叁4肆5伍6陸7柒8
捌9玖",At(Substr(Right(cInput,N),1,1),"0零1壹2貳3叁4肆5伍6陸7柒8捌9玖
")+1,2))
          Else
             Do Case
                Case N=1
                     cChar=Stuffc(cUnit,11-N,1,"整")
                Case N=2
cChar=Iif(Val(Substr(Right(cInput,N-1),1,1))>0,Stuffc(cUnit,11-N,1,"零
"),Stuffc(cUnit,11-N,1,""))
                Case N=3 or N=7
                     Loop
                Otherwise
cChar=Iif(Val(Substr(Right(cInput,N+1),1,1))=0,Stuffc(cUnit,11-N,1,""),Stuff
c(cUnit,11-N,1,"零"))
             Endcase
          Endif
      cUnit=cChar
      Endfor
      cChar=Substrc(cChar,11-Len(cInput))
      cChar=Iif("零萬"$cChar,Stuffc(cChar,At_c("零萬",cChar),2,"萬"),cChar)
      cChar=Iif(Substr(Right(cInput,6),1,1)="0" And
Substr(Right(cInput,7),1,1)="0",Stuffc(cChar,At_c("萬",cChar)+1,0,"零
"),cChar)
      cChar=Iif("零圓"$cChar,Stuffc(cChar,At_c("零圓",cChar),2,"圓"),cChar)
      This.Output=cChar
    Endif
Endif
or
procedure Camount
parameter Mamount
MyAmount=alltrim(str(abs(Mamount)*100,11,0))
temp=len(alltrim(MyAmount))
chr_amount=''
For i = 1 TO temp
  MYmemo=val(subs(MyAmount, temp-i+1, 1))
  chr_amount =subs("零壹貳叁肆伍陸柒捌玖", MYmemo*2+1, 2)+subs("分角圓拾佰仟
萬拾佰仟億", i*2-1, 2)+ chr_amount
EndFor
chr_amount=iif(Mamount<0,'負'+chr_amount,chr_amount)
  chr_amount
return chr_amount
*****************************************************************
**--這個Prncode.zap程序全部使用Visual Foxpro編寫,用于VFP表單文件(SCX)或類庫文件(VCX)過程源碼查看及打印。運行于VFP環(huán)境或安裝了VFP6運行時刻系統(tǒng)中。
    說明:
    1.在"打開"窗口中,選擇打開表單(SCX)或類庫(VCX)類型,打開文件。
    2.選擇"按對象"查看方式時,可把同一對象的過程顯示在文本框中;選擇"按過程"查看方式時,僅顯示一個指定過程。
    3.選擇組合框內(nèi)容,隨查看方式不同,列表出打開文件的中包含的對象集或所有過程。
    4.通過"保存"或"另存為"功能按鈕,可以將文本框內(nèi)容保存為文本文件。
    5.通過"預(yù)覽"或"打印"功能按鈕,可以將文本框內(nèi)容打印到屏幕或打印機中。
    6.已打開源文件名稱顯示窗口標(biāo)題中,底部標(biāo)簽中顯示是保存文本文件名稱。
    7.運行于VFP環(huán)境時,執(zhí)行"startapp.app"可把本程序加入工具菜單中,如果在選項窗口中,把"startapp.app"設(shè)置為啟動程序,那它真的就是一個系統(tǒng)工具了。
    8.這個小程序意在為初學(xué)者,提供一編程示例,也是VFP愛好者的一個實用小工具。您可以根據(jù)需要進行修改完善。
* Program Name : VolumeInformation.Prg
* Article No.  : [Win API] - 029
* Illustrate   : 常用卷標(biāo)信息
* Date / Time  : 2001.09.27
* Writer       :
* 1st Post     :
* My Comment   : 需要 Win32VFP.Dll 庫支持,見附件。
*****************************************************************
#Define FILE_CASE_SENSITIVE_SEARCH     1
#Define FILE_CASE_PRESERVED_NAMES      2
#Define FILE_UNICODE_ON_DISK           4
#Define FILE_PERSISTENT_ACLS           8
#Define FILE_FILE_COMPRESSION         16
#Define FILE_VOLUME_IS_COMPRESSED  32768  && &H8000
Declare INTEGER GetLastError IN kernel32
Declare INTEGER intAnd IN win32vfp INTEGER nInt0, INTEGER nInt1
Declare SHORT GetVolumeInformation IN kernel32;
    STRING    lpRootPathName,;
    STRING  @ lpVolumeNameBuffer,;
    INTEGER   nVolumeNameSize,;
    INTEGER @ lpVolumeSerialNumber,;
    INTEGER @ lpMaximumComponentLength,;
    INTEGER @ lpFlags,;
    STRING  @ lpFileSystemNameBuffer,;
    INTEGER   nFileSystemNameSize
lpRootPathName = "C:\"    && check the slash, or "D:\", "E:\"....
nVolumeNameSize          = 250
lpVolumeNameBuffer       = SPACE (nVolumeNameSize)
lpVolumeSerialNumber     = 0
lpMaximumComponentLength = 0
lpFlags        = 0
nFileSystemNameSize      = 250
lpFileSystemNameBuffer   = SPACE(nFileSystemNameSize)
lnResult = GetVolumeInformation (lpRootPathName, @lpVolumeNameBuffer,;
    nVolumeNameSize, @lpVolumeSerialNumber,;
    @lpMaximumComponentLength, @lpFlags,;
    @lpFileSystemNameBuffer,nFileSystemNameSize )
If lnResult = 1
* display parameters returned
    lpVolumeNameBuffer = LEFT(lpVolumeNameBuffer,;
        AT(Chr(0),lpVolumeNameBuffer)-1)
    "Volume Name: [", lpVolumeNameBuffer, "]"
    "Volume Serial Number: ", lpVolumeSerialNumber
    "Max Filename Length: ", lpMaximumComponentLength
    "File System Flags: ", lpFlags
    = displayFlag (lpFlags, FILE_CASE_SENSITIVE_SEARCH,;
        "Case-sensitive file names support: ")
    = displayFlag (lpFlags, FILE_CASE_PRESERVED_NAMES,;
        "The file system preserves the case of file names: ")
    = displayFlag (lpFlags, FILE_UNICODE_ON_DISK,;
        "Unicode in file names support: ")
    = displayFlag (lpFlags, FILE_PERSISTENT_ACLS,;
        "ACLs support: ")
    = displayFlag (lpFlags, FILE_FILE_COMPRESSION,;
        "File-based compression support: ")
    = displayFlag (lpFlags, FILE_VOLUME_IS_COMPRESSED,;
        "The specified volume is a compressed volume: ")
    lpFileSystemNameBuffer = LEFT(lpFileSystemNameBuffer,;
        AT(Chr(0),lpFileSystemNameBuffer)-1)
    "File System Name: [", lpFileSystemNameBuffer, "]"
Else
*  3 - The system cannot find the path specified = ERROR_PATH_NOT_FOUND
* 21 - The device is not ready = ERROR_NOT_READY
    "Error code: ", GetLastError()
Endif
Procedure  displayFlag (lnFlags, lnMask, lcCaption)
    lcResult = IIF (intAnd(lnFlags, lnMask) = lnMask, "Yes", "No")
    "   - ", lcCaption, lcResult
    Return
* Program Name : EllipticalForm.Prg
* Article No.  : [Win API] - 028
* Illustrate   : 橢圓型表單
* Date / Time  : 2001.09.27
* Writer       : Tuberose zyg8108@21cn.com
* 1st Post     : News://news.newsfan.net/計算機.軟件.數(shù)據(jù)庫.Vfp
Public frm
frm = CreateObject ("Tform")
frm.Visible = .T.
Return
Define CLASS Tform As Form
    #Define horizDiameter  400
    #Define vertDiameter   260
    Caption = "橢圓型表單"
    Width = 600
    Height = 350
    AutoCenter = .T.
    MaxButton = .F.
    MinButton = .F.
    hRgn = 0
    hwind = 0
    Add OBJECT cmd As CommandButton WITH;
        Width=80, Height=25, FontName='System', Caption="執(zhí)行"
    Procedure  Load
        This.decl
    Endproc
    Procedure  Init
        With THIS.cmd
            .Top = THIS.Height - .Height - 15
            .Left = (THIS.Width - .Width)/2
        Endwith
    Endproc
    Procedure  cmd.Click
        Thisform.TimeConsumingProc
    Endproc
    Procedure  TimeConsumingProc
* this is an emulation of a time consuming process
* while it is running the form is limited to an ellipse
        Clear
* limit the form to an ellipse
* defined by a region
        This.regionOn
       
        Local ii, jj
        For ii=1 TO 10
            Create CURSOR cs (id N(6), dt decl)
            "Inserting records to cursor... "
            For jj=1 TO 100
                Insert INTO cs VALUES (jj, DATE()-jj)
                DATE()-jj, ", "
            Endfor
*        DOEVENTS
            "Indexing cursor... "
            Index ON id TAG id
            Index ON dt TAG dt
*        DOEVENTS
            Use IN cs
            "Ok | "
        Endfor
        This.regionOff   && restore the form to its original state
        This.cmd.Visible = .T.
    Endproc
    Procedure  regionOn
* create an elliptical region and apply it to the form
        Local x0,y0,x1,y1
        x0 = (THIS.Width - horizDiameter)/2
        y0 = (THIS.Height - vertDiameter)/2
        x1 = x0 + horizDiameter
        y1 = y0 + vertDiameter
        This.hwind = GetFocus()
        This.hRgn = CreateEllipticRgn (x0,y0,x1,y1)
        = SetWindowRgn (THIS.hwind, THIS.hRgn, 1)
    Endproc
    Procedure  regionOff
* release a region for this form
        = SetWindowRgn (THIS.hwind, 0, 1)
    Endproc
    Procedure  decl
        Declare INTEGER CreateEllipticRgn IN gdi32;
            INTEGER nLeftRect,;
            INTEGER nTopRect,;
            INTEGER nRightRect,;
            INTEGER nBottomRect
        Declare SetWindowRgn IN user32;
            INTEGER hWnd,;
            INTEGER hRgn,;
            SHORT   bRedraw
        Declare INTEGER GetFocus IN user32
    Endproc
Enddefine
 ***************************************************************
* Program Name : WinCalc.Prg
* Article No.  : [Win API] - 027
* Illustrate   : 計算器
* Date / Time  : 2001.09.27
* Writer       :
* 1st Post     :
***************************************************************
Private frm
frm = CreateObject ("Tform")
frm.Show (1)
Define CLASS Tform As Form
    Width = 400
    Height = 200
    AutoCenter = .T.
    Caption = "Accessing WinCalc Window"
    Add OBJECT cmdShow As Tbutton
    Add OBJECT cmdHide As Tbutton
    Procedure  Init
        This.cmdShow.caption = "Show Calc"
        This.cmdHide.caption = "Hide Calc"
        This._resize
        This.decl
    Endproc
    Procedure  cmdShow.click
        Thisform._show
    Endproc
    Procedure  cmdHide.click
        Thisform._hide
    Endproc
    Procedure  _resize
        With THIS.cmdHide
            .top = THIS.height - .height - 10
            .left = THIS.width - .width - 10
        Endwith
        With THIS.cmdShow
            .top = THIS.cmdHide.top
            .left = THIS.cmdHide.left - .width - .3
        Endwith
    Endproc
    Protected PROCEDURE  decl
        Declare INTEGER SetForegroundWindow IN "user32" INTEGER hwnd
        Declare INTEGER FindWindow IN user32;
            STRING lpClassName,;
            STRING lpWindowName
        Declare INTEGER WinExec IN kernel32;
            STRING lpCmdLine, INTEGER nCmdShow
        Declare SHORT PostMessage IN user32;
            INTEGER   hWnd,;
            INTEGER   Msg,;
            STRING  @ wParam,;
            INTEGER   lParam
    Endproc
    Procedure _show
        #Define SW_SHOWNORMAL  1
        Local hwnd
        HWnd = FindWindow (.NULL., "Calculator")
        If hwnd = 0
            = WinExec ("calc.exe", SW_SHOWNORMAL)
        Else
            = SetForegroundWindow (hwnd)
        Endif
    Endproc
    Procedure  _hide
        #Define WM_QUIT      18
        Local hwnd
        HWnd = FindWindow (.NULL., "Calculator")
        If hwnd <> 0
            = PostMessage (hwnd, WM_QUIT, 0,0)
        Endif
    Endproc
Enddefine
Define CLASS Tbutton As CommandButton
    FontName = 'System'
    Height = 24
    Width = 100
Enddefine
****************************************************************
* Program Name : LocaleRecord.Prg
* Article No.  : [Win API] - 026
* Illustrate   : 獲得系統(tǒng)中的所有國家/地區(qū)信息
* Date / Time  : 2001.09.25
* Writer       :
* 1st Post     :
* My Comment   :
* some LCTYPE constants
#DEFINE LOCALE_ILANGUAGE                1   && language id
#DEFINE LOCALE_SLANGUAGE                2   && localized name of language
#DEFINE LOCALE_SENGLANGUAGE          4097   && English name of language
#DEFINE LOCALE_SABBREVLANGNAME          3   && abbreviated language name
#DEFINE LOCALE_SNATIVELANGNAME          4   && native name of language
#DEFINE LOCALE_ICOUNTRY                 5   && country code
#DEFINE LOCALE_SCOUNTRY                 6   && localized name of country
#DEFINE LOCALE_SENGCOUNTRY           4098   && English name of country
#DEFINE LOCALE_SABBREVCTRYNAME          7   && abbreviated country name
#DEFINE LOCALE_SNATIVECTRYNAME          8   && native name of country
#DEFINE LOCALE_IDEFAULTLANGUAGE         9   && default language id
#DEFINE LOCALE_IDEFAULTCOUNTRY         10   && default country code
#DEFINE LOCALE_IDEFAULTCODEPAGE        11   && default oem code page
#DEFINE LOCALE_IDEFAULTANSICODEPAGE  4100   && default ansi code page
#DEFINE LOCALE_IDEFAULTMACCODEPAGE   4113   && default mac code page
#DEFINE LOCALE_ILDATE                  34   && long date format ordering
#DEFINE LOCALE_ILZERO                  18   && leading zeros for decimal
#DEFINE LOCALE_IMEASURE                13   && 0 = metric, 1 = US
#DEFINE LOCALE_IMONLZERO               39   && leading zeros in month field
#DEFINE LOCALE_INEGCURR                28   && negative currency mode
#DEFINE LOCALE_INEGSEPBYSPACE          87   && mon sym sep by space from neg
amt
#DEFINE LOCALE_INEGSIGNPOSN            83   && negative sign position
* more constants exist...
    DECLARE INTEGER GetLocaleInfo IN kernel32;
        INTEGER  Locale,;
        INTEGER  LCType,;
        STRING @ lpLCData,;
        INTEGER  cchData
    CREATE CURSOR cs (;
        locale    N(6),;
        langid    C( 4),;
        llnagname C(30),;
        elangname C(30),;
        alangname C( 3),;
        nlangname C(30),;
        ccode     C( 3),;
        lcname    C(30),;
        ecname    C(30),;
        acname    C( 3),;
        ncname    C(30),;
        dlangid   C( 4),;
        dccode    C( 3),;
        doemcp    C( 5),;
        dansicp   C( 5),;
        dmaccp    C( 5),;
        ldtfmt    C( 2),;
        ldzeros   C( 2),;
        metrics   C( 2),;
        monzero   C( 2),;
        necurr    C( 2),;
        negsep    C( 2),;
        negsign   C( 2);
    )
    * scan top &H10000 codes
    * under WinNT 4.0 it returns 138 records
    * WinMe -- 164 records
    FOR ii=0 TO 65535
        = saveLInfo (ii)
    ENDFOR
    SELECT cs
    GO TOP
    BROW NORMAL NOWAIT
RETURN        && main
PROCEDURE  saveLInfo (lnLocale)
* saves one local record for the locale
    IF Len (getLInfo (lnLocale, LOCALE_ILANGUAGE)) = 0
    * exit if no information exists for this locale id
        RETURN
    ENDIF
    INSERT INTO cs VALUES (;
        lnLocale,;
        getLInfo (lnLocale, LOCALE_ILANGUAGE),;
        getLInfo (lnLocale, LOCALE_SLANGUAGE),;
        getLInfo (lnLocale, LOCALE_SENGLANGUAGE),;
        getLInfo (lnLocale, LOCALE_SABBREVLANGNAME),;
        getLInfo (lnLocale, LOCALE_SNATIVELANGNAME),;
        getLInfo (lnLocale, LOCALE_ICOUNTRY),;
        getLInfo (lnLocale, LOCALE_SCOUNTRY),;
        getLInfo (lnLocale, LOCALE_SENGCOUNTRY),;
        getLInfo (lnLocale, LOCALE_SABBREVCTRYNAME),;
        getLInfo (lnLocale, LOCALE_SNATIVECTRYNAME),;
        getLInfo (lnLocale, LOCALE_IDEFAULTLANGUAGE),;
        getLInfo (lnLocale, LOCALE_IDEFAULTCOUNTRY),;
        getLInfo (lnLocale, LOCALE_IDEFAULTCODEPAGE),;
        getLInfo (lnLocale, LOCALE_IDEFAULTANSICODEPAGE),;
        getLInfo (lnLocale, LOCALE_IDEFAULTMACCODEPAGE),;
        getLInfo (lnLocale, LOCALE_ILDATE),;
        getLInfo (lnLocale, LOCALE_ILZERO),;
        getLInfo (lnLocale, LOCALE_IMEASURE),;
        getLInfo (lnLocale, LOCALE_IMONLZERO),;
        getLInfo (lnLocale, LOCALE_INEGCURR),;
        getLInfo (lnLocale, LOCALE_INEGSEPBYSPACE),;
        getLInfo (lnLocale, LOCALE_INEGSIGNPOSN);
    )
RETURN
PROCEDURE  getLInfo (lnLocale, lnType)
****************************************************************
* retrieves a value for the parameter of lnType for the locale lnLocale
    lcBuffer = SPACE(250)
    lnLength = GetLocaleInfo (lnLocale, lnType, @lcBuffer, Len(lcBuffer))
RETURN Iif (lnLength > 0, STRTRAN(LEFT(lcBuffer, lnLength-1), Chr(0)), "")
 ****************************************************************
* Program Name : RemoveHistory.Prg
* Article No.  : [Win API] - 025
* Illustrate   : 清理[開始] -> [文檔] 中的 [歷史記錄]
* Date / Time  : 2001.09.25
* Writer       :
* 1st Post     :
* My Comment   : 在 Windows 中運行或打開某些文件時,在[開始] -> [文
*              : 檔]中會留下[歷史記錄],比如你打開了 Readme.Txt or
*              : mumu.bmp,因此用該函數(shù)可以清楚歷史記錄。提高安全性。
***************************************************************
#Define SHARD_PATHA  2
#Define SHARD_PATHW  3
#Define SHARD_PIDL   1
Declare SHAddToRecentDocs IN shell32;
    INTEGER uFlags,;
    STRING @ lpName
Do _clear
= _add ("c:Readme.Txt")
= _add ("c:mumu.bmp")
Procedure  _clear
* clears Documents list in the Windows Start menu
    = SHAddToRecentDocs (SHARD_PATHA, .null.)
    Return
Procedure  _add (lpName)
*****************************************************************
* adds new item to the Documents list
* it does not check whether this file really exists
    = SHAddToRecentDocs (SHARD_PATHA, @lpName)
    Return
******************************************************************
* Program Name : ElapsedTime.Prg
* Article No.  : [Win API] - 024
* Illustrate   : 計算開機時間
* Date / Time  : 2001.09.25
* Writer       :
* 1st Post     :
* My Comment   : 用 Win API 的函數(shù)比用 VFP 的計時器控件計算時間
*              : 要少開銷資源。
******************************************************************
Declare LONG GetTickCount IN WIN32API
Local lnAPIRetVal, lnHour, lnMin
lnAPIRetVal = GetTickCount()
lnHour = ((lnAPIRetVal / 1000) / 60) / 60
lnMin = MOD(((lnAPIRetVal / 1000) / 60), 60)
Messagebox("你的電腦已運行了: " + ALLTRIM(STR(lnHour)) + " 小時, " + ;
    ALLTRIM(STR(lnMin)) + " 分.")
******************************************************************
* Program Name : TaskBar.Prg
* Article No.  : [Win API] - 023
* Illustrate   : 隱藏或顯示任務(wù)條 [TaskBar] 和 [開始] 按鈕
* Date / Time  : 2001.09.25
* Writer       :
* 1st Post     :
* My Comment   :
******************************************************************
Messagebox("點擊 [確認] 隱藏任務(wù)條 [TaskBar]")
HideTaskBar()
Messagebox("點擊 [確認] 顯示任務(wù)條 [TaskBar]")
ShowTaskBar()
If MESSAGEBOX("是否隱藏 '開始' [Start] 按鈕? 如果要恢復(fù) '開始' ;
[Start] 按鈕,必須重新熱啟動 [Reboot] !", 36) = 6
    RemoveStartButton()
Endif
Function HideTaskBar
    Declare LONG FindWindow IN "user32" STRING lpClassName, STRING
lpWindowName
    Declare LONG SetWindowPos IN "user32" LONG hWnd, LONG hWndInsertAfter, ;
        LONG x, LONG Y, LONG cx, LONG cy, LONG wFlags
    #Define WINDOWHIDE 0x80
    #Define WINDOWSHOW 0x40
    Local lnHandle
    lnHandle = FindWindow("Shell_TrayWnd", "")
    SetWindowPos(lnHandle, 0, 0, 0, 0, 0, WINDOWHIDE)
Endfunc
Function ShowTaskBar
    Declare LONG FindWindow IN "user32" STRING lpClassName, STRING
lpWindowName
    Declare LONG SetWindowPos IN "user32" LONG hWnd, LONG hWndInsertAfter, ;
        LONG x, LONG Y, LONG cx, LONG cy, LONG wFlags
    #Define WINDOWHIDE 0x80
    #Define WINDOWSHOW 0x40
    Local lnHandle
    lnHandle = FindWindow("Shell_TrayWnd", "")
    SetWindowPos(lnHandle, 0, 0, 0, 0, 0, WINDOWSHOW)
Endfunc
Function RemoveStartButton
    Declare LONG FindWindow IN "user32" STRING lpClassName, STRING
lpWindowName
    Declare LONG SendMessage IN "user32" LONG hWnd, LONG wMsg, ;
        LONG wParam, LONG lParam
    Declare LONG FindWindowEx IN "user32" LONG hWnd1, LONG hWnd2, ;
        STRING lpsz1, STRING lpsz2
    #Define WM_CLOSE 0x10
    SendMessage(FindWindowEx(FindWindow("Shell_TrayWnd", ""), 0x0, ;
        "Button", .NULL.), WM_CLOSE, 0, 0)
Endfunc
 ***************************************************************
 
[轉(zhuǎn)帖]獲取windows版本
* Program....: GETWINVER.PRG
* Author.....: ** Richard G Bean **
* Date.......: April 3, 2000
* Changed on 01/31/02 -  Extended for XP+
****************************************************************

&& Don't currently use all these DEFINEs, but could if want to explore Server Versions

#DEFINE VER_PLATFORM_WIN32S 0
#DEFINE VER_PLATFORM_WIN32_WINDOWS 1
#DEFINE VER_PLATFORM_WIN32_NT 2

#DEFINE VER_SERVER_NT                       0x80000000
#DEFINE VER_WORKSTATION_NT                  0x40000000

#DEFINE VER_NT_WORKSTATION                  0x00000001
#DEFINE VER_NT_DOMAIN_CONTROLLER            0x00000002
#DEFINE VER_NT_SERVER                       0x00000003

#DEFINE VER_SUITE_SMALLBUSINESS             0x00000001
#DEFINE VER_SUITE_ENTERPRISE                0x00000002
#DEFINE VER_SUITE_BACKOFFICE                0x00000004
#DEFINE VER_SUITE_COMMUNICATIONS            0x00000008
#DEFINE VER_SUITE_TERMINAL                  0x00000010
#DEFINE VER_SUITE_SMALLBUSINESS_RESTRICTED  0x00000020
#DEFINE VER_SUITE_EMBEDDEDNT                0x00000040
#DEFINE VER_SUITE_DATACENTER                0x00000080
#DEFINE VER_SUITE_SINGLEUSERTS              0x00000100
#DEFINE VER_SUITE_PERSONAL                  0x00000200
#DEFINE VER_SUITE_BLADE                     0x00000400

#DEFINE FFFF                                0x0000FFFF && 65535

Declare LONG GetVersionEx in WIN32API STRING

STORE 0 to;
    dwOSVersionInfoSize,;
    dwMajorVersion,;
    dwMinorVersion,;
    dwBuildNumber,;
    dwPlatformId,;
    wServicePackMajor,;
    wServicePackMinor,;
    wSuiteMask,;
    wProductType,;
    wReserved
    
szCSDVersion = ""
PId = "(Unknown)"

lczStructure = chr(5*4+127+1+3*2+2*1)+replicate(chr(0), 5*4-1)+space(127)+chr(0);
               +replicate(chr(0), 3*2+2*1)

lcReturn = ""
lnResult = GetVersionEx( @lczStructure )
IF lnResult <> 0   && No Error
   dwOSVersionInfoSize = asc2BEint(lczStructure, 1, 4)
   dwMajorVersion = asc2BEint(lczStructure, 5, 4)
   dwMinorVersion = asc2BEint(lczStructure, 9, 4)
   dwBuildNumber = BITAND(asc2BEint(lczStructure, 13, 4), FFFF)
   dwPlatformId = asc2BEint(lczStructure, 17, 4)
   szCSDVersion = ALLTRIM(CHRTRAN(SUBSTR(lczStructure, 21, 128),CHR(0)+CHR(1),""))
   IF dwOSVersionInfoSize > 148
      wServicePackMajor = asc2BEint(lczStructure, 149, 2)
      wServicePackMinor = asc2BEint(lczStructure, 151, 2)
      wSuiteMask = asc2BEint(lczStructure, 153, 2)
      wProductType = ASC(SUBSTR(lczStructure, 155, 1))
      wReserved = ASC(SUBSTR(lczStructure, 156, 1))
   ENDIF

   DO Case
   Case dwPlatformId = VER_PLATFORM_WIN32S
      PId = "32s "    && "Windows 32s "
      
   Case dwPlatformId = VER_PLATFORM_WIN32_WINDOWS
      PId = "95/98 " && "Windows 95/98 "
      DO CASE
      CASE dwMajorVersion = 4  and dwMinorVersion = 0
         PId = "95 " && "Windows 95 "
         lcSubVer = SUBSTR(szCSDVersion, 1, 1)
         IF INLIST(lcSubVer, "B", "C")
            PId = PId + "OSR2 "
         ENDIF
      CASE dwMajorVersion = 4  and dwMinorVersion = 10
         PId = "98 " && "Windows 98 "
         lcSubVer = SUBSTR(szCSDVersion, 1, 1)
         IF lcSubVer = "A"
            PId = PId + "SE "
         ENDIF
      CASE dwMajorVersion = 4  and dwMinorVersion = 90
         PId = "ME " && "Windows ME "
      ENDCASE
      
   Case dwPlatformId = VER_PLATFORM_WIN32_NT
      PId = "NT "         && "Windows NT "
      DO CASE
      CASE dwMajorVersion <=  4
         PId = "NT "         && "Windows NT "
        
      CASE dwMajorVersion = 5 and dwMinorVersion = 0
         PId = "2000 "      && "Windows 2000 "
        
      CASE dwMajorVersion = 5 and dwMinorVersion = 1
         PId = "XP "      && "Windows XP "
         IF BITAND(wSuiteMask, VER_SUITE_PERSONAL) <> 0
            PId = PId + "Home "
         ELSE
            PId = PId + "Pro "
         ENDIF
      ENDCASE
   ENDCASE
  
   lcReturn = PId ;
      + ALLTRIM(transform(dwMajorVersion,"99999"));
      + "." + ALLTRIM(transform(dwMinorVersion,"99999"));
      + " (Build "+ ALLTRIM(transform(dwBuildNumber,"99999"));
      + ":"+ IIF(EMPTY(szCSDVersion),"No SP", szCSDVersion);
      + ")"

ENDIF

RETURN lcReturn
******************************************************************
**!* EOP: GETWINVER.PRG
* Program....: ASC2BEINT.PRG
* Author.....: ** Richard G Bean **
* Date.......: April 3, 2000
* Abstract...: Ascii String to BigEndian Integer (i.e. Most significant byte on right)
*              (use asc2int() for LittleEndian)
*              Doesn't return negative numbers
*              RETURN -1 if any error
* Changes....:
*******************************************************************
*FUNCTION asc2BEint

LPARAMETERS p_cString, p_nStart, p_nLength
IF PCOUNT() < 1 OR VARTYPE(p_cString) <> "C"
   RETURN -1
ENDIF

IF PCOUNT() < 2 OR VARTYPE(p_nStart) <> "N"
   p_nStart = 1
ENDIF
IF PCOUNT() < 3 OR VARTYPE(p_nLength) <> "N"
   p_nLength = LEN(p_cString)
ENDIF

LOCAL lnRet_val

DO CASE
CASE p_nLength = 1
   lnRet_val = asc(SUBSTR(p_cString, p_nStart, 1))

CASE p_nLength = 2
   lnRet_val = asc(SUBSTR(p_cString, p_nStart, 1));
             + asc(SUBSTR(p_cString, p_nStart+1, 1))*256

CASE p_nLength = 3
   lnRet_val = asc(SUBSTR(p_cString, p_nStart, 1));
             + asc(SUBSTR(p_cString, p_nStart+1, 1))*256;
             + asc(SUBSTR(p_cString, p_nStart+2, 1))*256^2

CASE p_nLength = 4
   lnRet_val = asc(SUBSTR(p_cString, p_nStart, 1));
             + asc(SUBSTR(p_cString, p_nStart+1, 1))*256;
             + asc(SUBSTR(p_cString, p_nStart+2, 1))*256^2;
             + asc(SUBSTR(p_cString, p_nStart+3, 1))*256^3
            
OTHERWISE
   lnRet_val = -1
ENDCASE

RETURN INT(lnRet_val)

*!* EOP: ASC2BEINT.PRG
*************************************************************
**              解決grid空格問題
*************************************************************
grid 中一個令人煩惱的問題是,當(dāng)不能找到它的 RecordSource 時發(fā)生混亂. 例如, 你用一個 sql-SELECT 結(jié)果游標(biāo)關(guān)聯(lián)到一個 grid 時, 某一次運行相同的 SELECT 時, 你可能看到的是一個空的 grid. VFP 在準備創(chuàng)建一個新的記錄集時刪除舊的記錄集, 并在那一瞬間 grid 丟失了與它的 RecordSource 的聯(lián)接及所有有關(guān)設(shè)置. 在重運行 SELECT 后, 有一個相同別名的新的游標(biāo), 但是它所基于的臨時表有一個新的名字, 而且 grid 沒有自動的聰明辦法來使用它的新的 RecordSource.


一個方案是在重新運行 sql-SELECT前設(shè)置 Grid.RecordSource 為一個空的串 (""), 并在運行 SQL-SELECT后重新設(shè)置它到游標(biāo)的別名. 這種處理方法在許多情況下,grid 列是按它們在游標(biāo)中的順序顯示的. 在任何 ControlSources 偏離默認的游標(biāo)時會發(fā)生問題. 在那種情況下, 需要重置各列的 ControlSource .


勝于令人討厭地硬編碼各 ControlSource 和危險的潛在的同步問題, 我使用更間接和方法. 在 Grid.Init() 中, 我用各列的細節(jié)填充一個自定義數(shù)組屬性, 然后在稍后用該數(shù)組來重建 grid.


首先設(shè)置一個自定義數(shù)組屬性. 它可以是一個表單屬性或最好是在 grid 類自身中. 在 Grid.Init() 中, DIMENSION 數(shù)組,因此它擁有與 grid 列相同的行, 并且有著你想保存的屬性個數(shù)的列數(shù). 至少, 你可能要保存 ControlSource, CurrentControl, 控件的類, 列頭的標(biāo)題, 列寬及列順序. 然后用 grid 信息填充該數(shù)組, 如下所示:


FOR lnColumnCounter = 1 TO This.ColumnCount

This.aRestore[lnColumnCounter, ] = <要保存的第一個屬性>

This.aRestore[lnColumnCounter,2] = <要保存的第二個屬性>

This.aRestore[lnColumnCounter,3] = <要保存的第三個屬性>

等...

ENDFOR


任何時候你為 grid重建 RecordSource 時, 你可以遍歷數(shù)組, 從數(shù)組中恢復(fù)各列. 你也可能想用一個自定義方法來處理, 這樣當(dāng)你需要時調(diào)用該方法即可.


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

    0條評論

    發(fā)表

    請遵守用戶 評論公約