本人在应用程序中想实现像windows下的打开文件对话框,请高手不吝赐教。

解决方案 »

  1.   

    Dialogs标签里的OpenDialog控件。
      

  2.   

    Dialog控件组---------有一个OpenDialog控件
      

  3.   

    兄弟们误会我的意思了,我就是想在应用程序中用代码实现类似OpenDialog控件的功能。
      

  4.   

    兄弟们误会我的意思了,我就是想在应用程序中用代码实现类似OpenDialog控件的功能。
    -------------------------------
    有现成的控件为什么不用?
    或者:我有误会你的意思了!
      

  5.   

    浏览图片的对话框?不就是Dialogs标签里数过去第三个的OpenPictureDialog?还是你有什么特别的要求?
      

  6.   

    你是想自己写打开文件对话框吧,用win3.1面板中的FileListBox哪些控件可以解决
      

  7.   

    unit  DialogBox;interface    // ---- 选择文件对话框 ---- //
    function OpenFile_Dialog(OpenFileName, OpenFilter, OpenDefExt: string; MultiSelect: Boolean): Boolean;
        // ---- 保存文件对话框 ---- //
    function SaveFile_Dialog(SaveFileName, SaveFilter, SaveDefExt: string; OverPrompt: Boolean): Boolean;implementationuses
      Windows, CommDlg, PublicUnit; 
      
        // FilesBuf 转入 FileList ..
    procedure FilesBuf2FileList(MultiSelect: Boolean);
    var
      TmpPChar: PChar;
      FilePath: string;
    begin
      TmpPChar := @FilesBuf[0];
      if (not MultiSelect) or (TmpPChar[StrLen(TmpPChar)+1] = #0) then
      begin
        SetLength(FileList, 1);
        FileList[0] := StrPas(TmpPChar);
      end else
      begin
        SetLength(FileList, 0);   FilePath := StrPas(TmpPChar);
        TmpPChar := TmpPChar + StrLen(TmpPChar) + 1 ;
        if (FilePath[Length(FilePath)]<>'\') then FilePath := FilePath+'\';
        while (TmpPChar[0] <> #0) do
        begin
          SetLength(FileList, Length(FileList)+1);
          FileList[High(FileList)] := FilePath + StrPas(TmpPChar);
          TmpPChar := TmpPChar + StrLen(TmpPChar) + 1 ;
        end;
      end;
    end;       // '打开文件'对话框   默认文件名..  过滤器串..  默认扩展名..        允许多选..             成功否..
    function OpenFile_Dialog(OpenFileName, OpenFilter, OpenDefExt: string; MultiSelect: Boolean): Boolean;
    var
      ofnStruct: TOpenFilename;
    begin
      StrCopy(@FilesBuf[0], PChar(OpenFileName));            // 置默认文件名..
      with ofnStruct do
      begin
        lStructSize := SizeOf(TOpenFilename)-SizeOf(DWORD)*3; // 兼容9x, 减12..
        hwndOwner := hMainForm;                               // 属主窗口句柄..
        hInstance := 0;
        lpstrFilter := PChar(OpenFilter);                     // 过滤器字符串..
        lpstrCustomFilter:= nil;
        nMaxCustFilter := 0;
        nFilterIndex := 1;                                    // 默认过滤器..
        lpstrFile := @FilesBuf[0];                            // 存所选文件列表..
        nMaxFile := MAX_LENGTH;                               // lpstrFile长度..
        lpstrFileTitle := nil;
        nMaxFileTitle := 0;
        lpstrInitialDir := nil;
        lpstrTitle := nil;
        Flags := OFN_EXPLORER or OFN_HIDEREADONLY or OFN_NODEREFERENCELINKS or
                 OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST;
        if MultiSelect then Flags := Flags or OFN_ALLOWMULTISELECT;
        nFileOffset := 0;
        nFileExtension := 0;
        lpstrDefExt := PChar(OpenDefExt);                     // 默认扩展名..
        lCustData := 0;
        lpfnHook := nil;
        lpTemplateName := nil;
        pvReserved:=nil;                                      // 3个新增成员..
        dwReserved:=0;
        FlagsEx:=0;
      end;       // ............ end with .............   ^^
      Result := GetOpenFileName(ofnStruct);
      if Result then FilesBuf2FileList(MultiSelect);
    end;          // '保存文件'对话框   默认文件名..  过滤器串..  默认扩展名..        覆盖提示..            成功否..
    function SaveFile_Dialog(SaveFileName, SaveFilter, SaveDefExt: string; OverPrompt: Boolean): Boolean;
    var
      ofnStruct: TOpenFilename;
    begin
      StrCopy(@FilesBuf[0], PChar(SaveFileName));            // 置默认文件名..
      with ofnStruct do
      begin
        lStructSize := SizeOf(TOpenFilename)-SizeOf(DWORD)*3; // 兼容9x, 减12..
        hwndOwner := hMainForm;                               // 属主窗口句柄..
        hInstance := 0;
        lpstrFilter := PChar(SaveFilter);                     // 过滤器字符串..
        lpstrCustomFilter:= nil;
        nMaxCustFilter := 0;
        nFilterIndex := 1;                                    // 默认过滤器..
        lpstrFile := @FilesBuf[0];                            // 存所填文件名 ..
        nMaxFile := MAX_LENGTH;                               // lpstrFile长度..
        lpstrFileTitle := nil;
        nMaxFileTitle := 0;
        lpstrInitialDir := nil;
        lpstrTitle := nil;
        Flags := OFN_EXPLORER or OFN_PATHMUSTEXIST or OFN_HIDEREADONLY or OFN_NODEREFERENCELINKS;
        if OverPrompt then Flags := Flags or OFN_OVERWRITEPROMPT;
        nFileOffset := 0;
        nFileExtension := 0;
        lpstrDefExt := PChar(SaveDefExt);                     // 默认扩展名..
        lCustData := 0;
        lpfnHook := nil;
        lpTemplateName := nil;
        pvReserved:=nil;                                      // 3个新增成员..
        dwReserved:=0;
        FlagsEx:=0;
      end;       // ............ end with .............   ^^
      Result := GetSaveFileName(ofnStruct);
      if Result then FilesBuf2FileList(FALSE);
    end;end.  
      

  8.   

    如果要实现预览功能,需要设置模板和钩子,写了一个预览文本文件的.
    程序代码 PreViewDlg.dpr 如下:program PreViewDlg;{$R Template.Res}uses Windows, CommDlg, Messages;  // 文件前500字节载入Memo
    procedure LoadHead(FileName: PChar; MemoHandle: HWND);
    var
      TextBuffer: array[0..500] of Char;
      FileHandle: THandle;
      ReadLength: DWORD;
    begin
      SetWindowText(MemoHandle, #13#10'  预览式文件选择对话框示例      By  麻子');  FileHandle := CreateFile(FileName, GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
      if (FileHandle = INVALID_HANDLE_VALUE) then Exit;  ReadFile(FileHandle, TextBuffer[0], 500, ReadLength, nil);
      CloseHandle(FileHandle);  if (ReadLength > 500) then Exit;
      TextBuffer[ReadLength] := #0;  SetWindowText(MemoHandle, @TextBuffer[0]);
    end;  // 子对话框消息钩子回调
    function OFNHookProc(hDlg: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): UINT; stdcall;
    const
    {$J+}
      MainHandle: HWND = 0; // 主对话框句柄
      MemoHandle: HWND = 0; // 子编辑框句柄
    {$J-}
    var
      WndRect, ScnRect: TRect;
      FileName: array[0..MAX_PATH] of Char;  
    begin
      if (Msg = WM_NOTIFY) then
      begin
        if (PNMHdr(lParam).code = CDN_INITDONE) then
        begin
         // 调整主对话框
          MainHandle := GetParent(hDlg);
          GetWindowRect(MainHandle, WndRect);
          WndRect.Right := WndRect.Right - WndRect.Left; // 宽度
          WndRect.Bottom := WndRect.Bottom - WndRect.Top + 100; // 高度
          WndRect.Left := (GetSystemMetrics(SM_CXSCREEN) - WndRect.Right) shr 1; // 居中
          SystemParametersInfo(SPI_GETWORKAREA, 0, @ScnRect, 0);
          WndRect.Top  := (ScnRect.Bottom - ScnRect.Top - WndRect.Bottom) shr 1; // 居中
          MoveWindow(MainHandle, WndRect.Left, WndRect.Top, WndRect.Right, WndRect.Bottom, TRUE);     // 调整子对话框
          GetClientRect(MainHandle, WndRect);
          MoveWindow(hDlg, 0, 0, WndRect.Right, WndRect.Bottom, TRUE);     // 调整Memo控件
          MemoHandle := GetDlgItem(hDlg, 66);
          MoveWindow(MemoHandle, 5, WndRect.Bottom - 100, WndRect.Right - 10, 95, TRUE);
        end else
        begin
          if (PNMHdr(lParam).code = CDN_SELCHANGE) then
          begin
            SendMessage(MainHandle, CDM_GETFILEPATH, MAX_PATH, Longint(@FileName[0]));
            LoadHead(@FileName[0], MemoHandle); // 显示选中文件内容
          end;
        end;  
      end else
      begin
        if (Msg = WM_SIZE) then
        begin
         // 调整Memo控件
          GetClientRect(MainHandle, WndRect);
          MoveWindow(MemoHandle, 5, WndRect.Bottom - 100, WndRect.Right - 10, 95, TRUE);
        end;
      end;  
      Result := 0; // 要求默认对话框过程处理
    end;  // 根据系统决定结构长度
    function OpenStructSize(): DWORD;
    var
      OSVersionInfo: TOSVersionInfo;
    begin
      OSVersionInfo.dwOSVersionInfoSize := SizeOf(OSVersionInfo);
      GetVersionEx(OSVersionInfo);  if (OSVersionInfo.dwMajorVersion >= 5) and // Windows 2000 以上版本
      (OSVersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT) then
        Result := SizeOf(TOpenFilename)
      else
        Result := SizeOf(TOpenFilename) - SizeOf(DWORD) * 3; // 没有尾部三个域
    end;  // 弹出'文件选择'对话框
    procedure OpenFileDlg();
    var
      FileName: array[0..MAX_PATH] of Char;
      OpenStruct: TOpenFilename;
    begin
      FileName[0] := #0;
      with OpenStruct do
      begin
        lStructSize := OpenStructSize();
        hWndOwner := 0;
        hInstance := SysInit.HInstance; // 模板资源所处模块
        lpstrFilter := 'Ansi文件'#0'*.TXT'#0'所有文件'#0'*.*'#0#0; // 过滤器
        lpstrCustomFilter := nil;
        nMaxCustFilter := 0;
        nFilterIndex := 0;
        lpstrFile := @FileName[0]; // 文件名缓冲区(初始&结果)
        nMaxFile := MAX_PATH;
        lpstrFileTitle := nil;
        nMaxFileTitle := 0;
        lpstrInitialDir := nil;
        lpstrTitle := '  预览式文件选择对话框示例      By  麻子'; // 标题
        Flags := OFN_EXPLORER or      // 新的Explorer风格
                 OFN_ENABLESIZING or  // 允许用户改变大小
                 OFN_FILEMUSTEXIST or // 指定文件必须存在
                 OFN_HIDEREADONLY or  // 隐藏只读复选框
                 OFN_ENABLEHOOK or    // 使用消息钩子函数
                 OFN_ENABLETEMPLATE;  // 使用子对话框模板
        nFileOffset := 0;
        nFileExtension := 0;
        lpstrDefExt := 'TXT'; // 默认扩展名
        lCustData := 0;
        lpfnHook := @OFNHookProc; // 消息钩子地址
        lpTemplateName := 'DlgTemplate'; // 模板资源名
        pvReserved := nil;
        dwReserved := 0;
        FlagsEx := 0;
      end;
      GetOpenFileName(OpenStruct); // 建立对话框窗体, 并且作消息循环
    end;begin
      OpenFileDlg();
    end.资源脚本文件 Template.txt 如下:DLGTEMPLATE DIALOG 0, 0, 0, 0
      STYLE WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | DS_CONTROL | DS_3DLOOK
      CAPTION ""
      FONT 8, "MS Sans Serif"
    BEGIN
      EDITTEXT 66, 0, 0, 0, 0, ES_AUTOHSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | WS_HSCROLL | WS_VSCROLL
    END
      

  9.   

    http://www.2ccc.com/article.asp?articleid=1941