佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

楼主: maybird_2

Visual FoxPro 的疑难杂症

[复制链接]
发表于 8-12-2005 10:34 PM | 显示全部楼层
原帖由 weisely 于 8-12-2005 08:42 PM 发表



这个方法有用过, 可是就是嫌那个win1 的window框框太难看了.
如果wait window 的message是个variable, 就不知道 win1 应该有多长, 才能够和message 的长度配合

我很喜欢在Loading 报表的时候, 用wait  ...


可以考慮做一個 form, 放一個 label, auto size = true

並根據 label.width 來更改 form.width, label.top / left 等等

* 如果是 WordWrap = true, width 不會更改, 字會變成多行
回复

使用道具 举报


ADVERTISEMENT

发表于 8-12-2005 10:52 PM | 显示全部楼层
原帖由 weisely 于 8-12-2005 08:42 PM 发表
我很喜欢在Loading 报表的时候, 用wait window 来告诉用户系统正在处理那一条record.  


我曾經用 wait wind 來顯示 current record / max record, 可是, 當我的資料有 100'000 records 或以上時,
浪費了很多時間.

後來我用 x % 來顯示, 並且在 x 不變時不會 wait wind, 速度快了十倍以上...

原來, wait wind 多了也會很浪費時間的.

例如 :

local lPer, lDisp, lCurrent, lMax

lPer = -1
lDisp = 0
lCurrent = 0
select table
count to lMax

SCAN
    lCurrent = lCurrent + 1
    lPer = int(lCurrent / lMax * 100)
    if lPer <> lDisp
       lDisp = lPer
       wait wind str(lDisp, 3) + ' %' nowait
    endif

    ...
ENDSCAN

需要注意的是這裡是用 int, 應為 1%, 2%, 3%, ... 最多會做 100 次 wait wind,

如果是 1.01%, 1.02%, ... 會有可能做到 10000 次...
回复

使用道具 举报

发表于 8-12-2005 10:52 PM | 显示全部楼层

wait wind test, 可以把 max1 改為其他數字

CLEAR

MAX1 = 1000

TIME1 = SECONDS()
FOR I = 1 TO MAX1
        WAIT WINDOW STR(I) NOWAIT
ENDFOR
? 'Time for '+STR(MAX1) + ' wait wind '
?? SECONDS() - TIME1




TIME1 = SECONDS()
local lPer, lDisp, lMax, lCurrent

lPer = -1
lDisp = 0
lCurrent = 0
lMax = MAX1

FOR I = 1 TO MAX1
    lCurrent = lCurrent + 1
    lPer = int(lCurrent / lMax * 100)
    if lPer <> lDisp
       lDisp = lPer
       wait wind str(lDisp, 3) + ' %' NOWAIT
    ENDIF
ENDFOR
? 'Time for 100 wait wind '
?? SECONDS() - TIME1

[ 本帖最后由 flashang 于 8-12-2005 10:55 PM 编辑 ]
回复

使用道具 举报

发表于 9-12-2005 09:00 AM | 显示全部楼层
我用 sharp.width 来做 progress bar

nPercent = nRec / tRec
If nPercent = int(nPercent)
Thisform.shpProgress.Width  = nPercent * 300
Thisform.lblPercent.Caption = Str(nPercent*100,3,0)+'%'
EndIf
回复

使用道具 举报

发表于 7-1-2006 09:46 AM | 显示全部楼层
我想当我按Form里的Close时,整个Program就会关闭。请问因该怎样做?
回复

使用道具 举报

发表于 7-1-2006 11:20 AM | 显示全部楼层
原帖由 tstan135 于 7-1-2006 09:46 AM 发表
我想当我按Form里的Close时,整个Program就会关闭。请问因该怎样做?


你是指你的 form 是 modal form, 關掉後整個 exe 就會關閉, 連 menu 也不能用了 ?

試試 read events 在你的 main.prg (set 為 main)

例如

main.prg

READ EVENTS
DO FORM LOGIN
回复

使用道具 举报

Follow Us
发表于 7-1-2006 12:36 PM | 显示全部楼层
原帖由 flashang 于 7-1-2006 11:20 AM 发表


你是指你的 form 是 modal form, 關掉後整個 exe 就會關閉, 連 menu 也不能用了 ?

試試 read events 在你的 main.prg (set 為 main)

例如

main.prg

READ EVENTS
DO FORM LOGIN

对!我就是要当我关闭modal form 时,整个 _screen 也同时关闭。
我用 menu 来做 main 的,在 cleanup 里加了 read events 还是不可以。
回复

使用道具 举报

发表于 7-1-2006 11:46 PM | 显示全部楼层
不就是在form的Unload那里加上
on shutdown
quit

行不通吗 ?

[ 本帖最后由 weisely 于 7-1-2006 11:48 PM 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

发表于 11-1-2006 09:14 AM | 显示全部楼层
补充 weisely 的,我的还有这行在 set main 的 prg 档里。
ON SHUTDOWN QUIT
ON KEY CTRL+F4 CANCEL
ON KEY ALT+F4 QUIT

或者把 QUIT 换成 ByeBye()
Procedure ByeBye
  If MessageBox('Confirm ?',36,'Exit Program')=6
    Quit
  Endif
Return
回复

使用道具 举报

发表于 11-1-2006 10:04 AM | 显示全部楼层
原帖由 flashang 于 7-1-2006 11:20 AM 发表

你是指你的 form 是 modal form, 關掉後整個 exe 就會關閉, 連 menu 也不能用了 ?

試試 read events 在你的 main.prg (set 為 main)

例如

main.prg

READ EVENTS
DO FORM LOGIN



根据 flashang 的做法 , 然后 在 modal form ->Quit button-> click ->

Clear events
Release THISFORM
回复

使用道具 举报

发表于 28-2-2006 05:03 PM | 显示全部楼层
请问各位狐友,在VFP里如何define及pass Structure Parameter(pioSendReques和pioRecvReques)去Winscard.DLL的ScardTransmit Function呢?

VB Code :
*** Structure Declaration ***
Public Type SCARD_IO_REQUEST
    dwProtocol As Long
    cbPciLength As Long
End Type

*** DLL declaration
Public Declare Function SCardTransmit Lib "Winscard.dll" (ByVal hCard As Long, pioSendRequest As SCARD_IO_REQUEST, ByRef SendBuff As Byte, ByVal SendBuffLen As Long, pioRecvRequest As SCARD_IO_REQUEST, ByRef RecvBuff As Byte, ByRef RecvBuffLen As Long) As Long

VFP Code :

Declare Long SCardTransmit in WinScard.dll Long hCard, SCARD_IO_REQUEST pioSendRequest, Long @ SendBuff, Long SendBuffLen, SCARD_IO_REQUEST pioRecvRequest, Long @ RecvBuff, Long @ RecvBuffLen

谢谢

[ 本帖最后由 xiaoye 于 28-2-2006 05:05 PM 编辑 ]
回复

使用道具 举报

发表于 2-3-2006 01:55 PM | 显示全部楼层
我没编过这么深奥的码,没法回答你的问题。
回复

使用道具 举报

发表于 3-3-2006 12:26 AM | 显示全部楼层
沒有 smartcard reader, 試不到...
回复

使用道具 举报

发表于 3-3-2006 04:55 PM | 显示全部楼层
请问 什么是 Sedna ?? 有相关资料吗 ?? 谢谢.........
回复

使用道具 举报

发表于 3-3-2006 09:49 PM | 显示全部楼层
原帖由 enry98 于 3-3-2006 04:55 PM 发表
请问 什么是 Sedna ?? 有相关资料吗 ?? 谢谢.........


Sedna是VFP的upgrade,Sedna将不会有很大的语言提升而着重于VFP的伸展性(Extensibility)和以下Microsoft新产品的兼容性(Interoperability)

.NET Framework 2.0 with Visual Studio 2005 (code named Whidbey)
SQL Server 2005 and SQL Server 2005 Express (code named Yukon)
Windows Vista (code named Longhorn)
Windows Communication Foundation (code named Indigo)
Windows Presentation Foundation (code named Avalon)
Office 12 (XML file formats)

下载Sedna Feature Overviewhttp://foxcentral.net/microsoft/SouthwestFox2005_Keynote.ppt以更了解Sedna
回复

使用道具 举报

发表于 3-3-2006 10:05 PM | 显示全部楼层
原帖由 flashang 于 3-3-2006 12:26 AM 发表
沒有 smartcard reader, 試不到...


谢谢您及白兄的回复。

希望其他狐友能帮到我。
回复

使用道具 举报


ADVERTISEMENT

发表于 4-3-2006 11:30 AM | 显示全部楼层
在VFP里如何define及pass Structure Parameter

你是说pointer to structure吧,必須将structure里的東西以string串起來。

譬如SCARD_IO_REQUEST的定義是:

  1. typedef struct {  
  2.   DWORD dwProtocol;
  3.   DWORD cbPciLength;
  4. } SCARD_IO_REQUEST;
复制代码

狐里就大概酱(大概而已):

  1. Declare Long SCardTransmit in WinScard.dll Long hCard, String @ pioSendRequest, Long @ SendBuff, Long SendBuffLen, String @ pioRecvRequest, Long @ RecvBuff, Long @ RecvBuffLen

  2. dwProtocol = 123
  3. cbPciLength = 456
  4. pioSendRequest = num2dword(dwProtocol) + num2dword(cbPciLength)
  5. pioRecvRequest = SPACE(20)
  6. SCardTransmit(hCard, @pioSendRequest, @SendBuff, SendBuffLen, @pioRecvRequest, @RecvBuff, @RecvBuffLen)


  7. FUNCTION num2dword (lnValue)
  8. #DEFINE m0 256
  9. #DEFINE m1 65536
  10. #DEFINE m2 16777216
  11.     LOCAL b0, b1, b2, b3
  12.     b3 = Int(lnValue/m2)
  13.     b2 = Int((lnValue - b3*m2)/m1)
  14.     b1 = Int((lnValue - b3*m2 - b2*m1)/m0)
  15.     b0 = Mod(lnValue, m0)
  16. RETURN Chr(b0)+Chr(b1)+Chr(b2)+Chr(b3)
复制代码


请先參考http://fox.wikis.com/wc.dll?Wiki~ApiStructures~WIN_COM_API
内中的Lightweight Api Structures是不错的例子。上面的num2dword就是从那抄来。


也參考 Passing Parameters to Dynamic-Link Libraries
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_foxhelp9/html/f3cc247e-24a4-4dcd-a30d-44c649d677b0.asp

裏面有一个GetSystemTime的例子。但不懂为何SYSTEMTIME只用16 byte但例子却準備了40 byte的空间,是例子错了,抑或裏邊有什麽奧妙之处?所以上面pioRecvRequest只用8 byte,我也跟着放大变成20

[ 本帖最后由 fxam 于 4-3-2006 07:45 PM 编辑 ]
回复

使用道具 举报

发表于 4-3-2006 05:20 PM | 显示全部楼层
原帖由 fxam 于 4-3-2006 11:30 AM 发表

你是说pointer to structure吧,必須将structure里的東西以string串起來。

譬如SCARD_IO_REQUEST的定義是:
[code]
typedef struct {  
  DWORD dwProtocol;
  DWORD cbPciLength;
} SCARD_IO_REQUEST; ...



* Test GetSystemTime

DECLARE INTEGER GetSystemTime IN win32api STRING @
cBuff=SPACE(16)

GetSystemTime(@cBuff)

? 'Year : '
?? ASC(SUBSTR(cBuff, 1, 1)) + ASC(SUBSTR(cBuff, 2, 1)) * 256

? 'Month : '
?? ASC(SUBSTR(cBuff, 3, 1)) + ASC(SUBSTR(cBuff, 4, 1)) * 256

? 'Sec : '
?? ASC(SUBSTR(cBuff, 13, 1)) + ASC(SUBSTR(cBuff, 14, 1)) * 256

? DATETIME()
?? ' '
?? SECONDS()

證實 16 個 bytes 就足夠了.
如果用 space(40), 之後的都是空格

[ 本帖最后由 flashang 于 4-3-2006 05:24 PM 编辑 ]
回复

使用道具 举报

发表于 8-3-2006 07:46 AM | 显示全部楼层
證實 16 個 bytes 就足夠了.
如果用 space(40), 之後的都是空格

謝謝測試。
我也已邮给微軟詢問。
回复

使用道具 举报

发表于 8-3-2006 12:16 PM | 显示全部楼层
原帖由 fxam 于 4-3-2006 11:30 AM 发表

你是说pointer to structure吧,必須将structure里的東西以string串起來。

譬如SCARD_IO_REQUEST的定義是:
[code]
typedef struct {  
  DWORD dwProtocol;
  DWORD cbPciLength;
} SCARD_IO_REQUEST; ...



谢谢您的回复。

现在我pass parameter去SCardTransmit得到SCARD_F_COMM_ERROR。

我也找到几个有关VFP WINAPI资源:
http://www.news2news.com/vfp/?article=1#p24
http://www.foxitaly.com/ecerlini/struttureapi_en.html
http://support.microsoft.com/kb/q181289/

另外,请问如果DLL return的String value="??"是什么原因呢?

谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 20-10-2024 03:07 AM , Processed in 0.143613 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表