首页
社区
课程
招聘
为什么不显示打开文件的对话框
发表于: 2005-9-28 17:07 5834

为什么不显示打开文件的对话框

2005-9-28 17:07
5834
......
  Case Msg of
    WM_COMMAND:
    begin
      aa := wParam;
      if aa = DLG_BUTTON_ABOUT then
        MessageBox(0, '版权所有:linlin[SJTU]', '关于...', MB_OK)
      else if aa = DLG_BUTTON_OK then
      begin
        GetOpenFileName(ofn);  
        ~~~~~~~~~~~~~~~~~~~~~
为什么我在这里调用的getOpenFileName,却无法显示
打开文件的对话框,难道是因为ofn结构没有初始化的原因吗?
语句是一定执行到的,哪里错了?

        GetDlgItemText(Wnd, DLG_EDIT1, Code, 512);
        Serial := 'All right.';
        SetDlgItemText(Wnd, DLG_EDIT2, PChar(Serial));
可以看到All right的显示

      end
      else if aa = DLG_BUTTON_EXIT then
        SendMessage(Wnd, WM_CLOSE, 0, 0);
    end;
  end;
  Result := 0;
end;

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 61782
活跃值: (21986)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
ofn结构必须初始化为0,然后再对相关字段赋值。
2005-9-28 17:51
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
3
在调用GetOpenFileName函数前,必须对ofn结构初始化。
.data
ofn OPENFILENAME <>
lpszFileNameBuff db 200 dup(0)
lpStrFilter db 'dll Files(*.dll)',0,'*.dll',0,'exe files(*.exe)',0,'*.exe',0,'dll&exe Files(*.dll;*.exe)',0,'*.dll;*.exe',0,'all Files(*.*)',0,'*.*',0,0
lpStrDefExt db 'dll',0
;------------------------------------------------
        .elseif        eax==WM_COMMAND
                invoke RtlZeroMemory,addr ofn,sizeof ofn
                invoke RtlZeroMemory,addr lpStrFile,sizeof lpStrFile
                invoke RtlZeroMemory,addr lpStrFileTitle,sizeof lpStrFileTitle
                mov eax,wParam
                .if ax==DLG_BUTTON_BROWSE1
                   mov eax,sizeof lpStrFile
                        invoke _MyGetOpenFileName,hWnd,addr lpStrFile,addr lpStrFileTitle,eax
                        .if eax
                                mov eax,ofn.lpstrFile
                                invoke SetDlgItemText,hWnd,DLG_EDIT1,eax
                        .endif

;---------------------------------------------
;对ofn结构初始化函数
_MyGetOpenFileName proc hWnd:HWND,strFile:DWORD,strFileTitle:DWORD,lpStrFileSzie:DWORD
        push hWnd
        pop ofn.hwndOwner
        push strFile
        pop ofn.lpstrFile
        push strFileTitle
        pop ofn.lpstrFileTitle
        mov ofn.Flags,2004h
        mov ofn.lStructSize,sizeof OPENFILENAME
        push lpStrFileSzie
        pop ofn.nMaxFile
        mov ofn.lpstrFilter,offset lpStrFilter
        mov ofn.lpstrDefExt,offset lpStrDefExt
        invoke GetOpenFileName,addr ofn
        ret
_MyGetOpenFileName endp
2005-9-28 18:06
0
雪    币: 1540
活跃值: (2807)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
又遇到了新的问题,当GetOpenFileName(ofn);返回的时候,
ofn.lpstrFile得到的字符串是空的,看了刚才给的汇编
好象是没有对ofn.lpstrFile初始化。
看了Delphi的ofn定义,如下:
但我却不知道Delphi对应的地方
lpszFileNameBuff db 200 dup(0)该怎么写?
~~~~~~~~~~~~~~~~~~~
这句话用delphi该如何写呢?

tagOFNA = packed record
   lStructSize: DWORD;
   hWndOwner: HWND;
   hInstance: HINST;
   lpstrFilter: PAnsiChar;
   lpstrCustomFilter: PAnsiChar;
   nMaxCustFilter: DWORD;
   nFilterIndex: DWORD;
   lpstrFile: PAnsiChar;
   nMaxFile: DWORD;
   lpstrFileTitle: PAnsiChar;
   nMaxFileTitle: DWORD;
   lpstrInitialDir: PAnsiChar;
   lpstrTitle: PAnsiChar;
   Flags: DWORD;
   nFileOffset: Word;
   nFileExtension: Word;
   lpstrDefExt: PAnsiChar;
   lCustData: LPARAM;
   lpfnHook: function(Wnd: HWND;
                      Msg: UINT;
                      wParam: WPARAM;
                      lParam: LPARAM):UINT stdcall;
   lpTemplateName: PAnsiChar;
end;
2005-9-28 19:18
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
5
lpszFileNameBuff:Array[0.200] of Char;

下面三句是对变量ofn、lpStrFile、lpStrFileTitle初始为0。
invoke RtlZeroMemory,addr ofn,sizeof ofn
invoke RtlZeroMemory,addr lpStrFile,sizeof lpStrFile
invoke RtlZeroMemory,addr lpStrFileTitle,sizeof lpStrFileTitle
2005-9-28 19:34
0
雪    币: 1540
活跃值: (2807)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
var
   ofn : tagOFN;
   szFileName : Array[0..255] of Char;
......
   ZeroMemory(@szFileName,sizeof(szFileName));
   ofn.lpstrFile := szFileName;  
   GetOpenFileName(ofn);
   // SetDlgItemText(Wnd, DLG_EDIT5, 'Hello');
   SetDlgItemText(Wnd,DLG_EDIT5,szFileName);

我这样写有什么问题吗?DLG_EDIT5可以显示Hello,
却无法显示出文件路径名。
我哪里错了?
2005-9-28 21:48
0
雪    币: 1540
活跃值: (2807)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我对GetOpenFileName函数做了以下的测试,点确定按扭后,
在控件上面始终显示的是World.也就是说GetOpenFileName(ofn)
始终返回的是false
扩张lpstrFile的长度也不行,可能传的ofn参数中还有什么参数有错误

if (GetOpenFileName(ofn)) then
    SetDlgItemText(Wnd, DLG_EDIT5, 'Hello')
else   
    SetDlgItemText(Wnd, DLG_EDIT5, 'World');

通过这个线索,终于找到出错的地方,原来ofn结构没放对
2005-9-28 22:47
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
8
Procedure OpenFileName();
var lpszBuff:Array[0..255] of Char;
    ofn:TOPENFILENAMEA ;
    lpstrFilter:PChar;
begin
lpstrFilter := 'all File(*.*)'+Char(0)+'*.*'+Char(0);
ZeroMemory(@lpszBuff,sizeof(lpszBuff));
ZeroMemory(@ofn,sizeof(TOPENFILENAMEA));
ofn.lStructSize := sizeof(TOPENFILENAMEA)-12;
ofn.lpstrFilter := lpstrFilter;
ofn.lpstrFile := lpszBuff;
ofn.nMaxFile := sizeof(lpszBuff);
ofn.Flags := OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST;
GetOpenFileName(ofn);
end;
2005-9-28 23:41
0
游客
登录 | 注册 方可回帖
返回