全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1408
推到 Plurk!
推到 Facebook!

关于Self.Handle做为函数参数的问题?

尚未結案
fangwy
中階會員


發表:99
回覆:139
積分:62
註冊:2003-09-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-09-10 10:17:07 IP:218.5.xxx.xxx 未訂閱
有个问题请大家帮忙解决,谢谢: セ为MessageBox需要一个HWND参数,在函数中调用MessageBox,因此窗体的Handle必须作为参数传递.但是我把Self.Handle为参数传递时出现下列错误: access violation at 0x0046b4cf:read of address 0x0000b180 ;并且出现CPU window的Disassembly pane窗 请问这是为什么,该如何解决? 我用的是DELPHI7.
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-09-10 12:43:20 IP:147.8.xxx.xxx 未訂閱
Post your code here? self is a function returning the current object. You may also pass a NULL (i.e. 0) as the handle for MessageBox.
fangwy
中階會員


發表:99
回覆:139
積分:62
註冊:2003-09-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-09-10 15:48:29 IP:218.5.xxx.xxx 未訂閱
谢谢版主的解答,但因我英文水平较差,所以不是很明白,只知可能是传入了空的Handle,现将源码COPY出来,请帮我查查问题所在,谢谢! 错误是:有时执行相应函数时出错,有时执行函数不出错但在Close时出错. procedure TLoginF.BtnOkClick(Sender: TObject); var daTmp:array[0..120]of char ; begin SvHandle:=Self.Handle; if not fGetMultiuser(Self.Handle) then begin raise Exception.Create('系统初始化错误!'); end; if not fGetTaxId(Self.Handle) then begin raise Exception.Create('系统初始化错误!'); end; if not fGetOwner(Self.Handle,daTmp) then begin raise Exception.Create('系统初始化错误!'); end; pGetState(Self.Handle); if not InsertLog('系统管理','用户登录','0','用户成功登录!') then begin raise Exception.Create('记录日志失败!'); end; pbRet:=True; Close; end;
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-09-10 17:37:14 IP:147.8.xxx.xxx 未訂閱
No info in the code becasure there are manu custom function like fGetMultiuser, fGetTaxId, etc. But then your problem has nothing to do with MessageBox API?
fangwy
中階會員


發表:99
回覆:139
積分:62
註冊:2003-09-10

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-09-11 08:49:35 IP:218.5.xxx.xxx 未訂閱
对不起,我可能没说清楚, MessageBox API在fGetMultiuser, fGetTaxId内调用,现列出fGetMultiuser源码: function fGetMultiuser(rHndl: hwnd): boolean; //获取分户编号 var dbRetu: Byte; //调用动态库的返回值变量 dbRet: boolean; diTmp, diNum, i: integer; daMult: array[0..500] of Char; begin dbRet := false; FillChar(daMult, 400, #0); dbRetu := TD_GetMultiuser(daMult); //获取分户编号(.DLLs函数) if dbRetu <> 0 then begin ShowErr(rHndl, dbRetu); //使用MessageBox API的函数 end else begin dbRet := true; diTmp := 0; diNum := Ord(daMult[diTmp]) * 256 Ord(daMult[diTmp 1]); SetLength(SYS_HOUS, diNum); for i := 0 to diNum - 1 do begin diTmp := diTmp 2; SYS_HOUS[i] := inttostr(Ord(daMult[diTmp]) * 256 Ord(daMult[diTmp 1])); end; end; fGetMultiuser := dbRet; end; MessageBox API是为了提示.DLLS函数返回的错误信息,在ShowErr中,源码如下: function ShowErr(rHndl: hwnd; riErr: Byte): string; var dsErr: string; begin if riErr = 1 then begin MessageBox(rHndl, '税控卡上电错误!', '提示', 0); dsErr := '税控卡上电错误'; end else if riErr = 2 then begin MessageBox(rHndl, '用户卡上电错误!', '提示', 0); dsErr := '用户卡上电错误'; end . . . end;
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-09-11 09:03:29 IP:147.8.xxx.xxx 未訂閱
If you think this is the MessageBox API causing the problem, pass an zero as handle parameter is ok, e.g. MessageBox(0,'TEST','TEST',MB_OK);
fangwy
中階會員


發表:99
回覆:139
積分:62
註冊:2003-09-10

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-09-11 12:23:31 IP:218.5.xxx.xxx 未訂閱
但是我是希望MessageBox上能显示出调用该函数的窗体标题信息,如果用0 好象无法达到这个目的. 再次感谢您的帮忙!
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-09-11 17:20:31 IP:147.8.xxx.xxx 未訂閱
Are you sure it is MessageBox causing problem? I think you could modify function ShowErr to pass 0 as handle to MessageBox. If it still cause error, you should check somewhere else...
fangwy
中階會員


發表:99
回覆:139
積分:62
註冊:2003-09-10

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-09-12 11:10:53 IP:218.5.xxx.xxx 未訂閱
谢谢william的解答,虽然问题尚未解决,但我想我有了方向.
系統時間:2024-05-20 7:41:42
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!