请教用delphi如何实现像windows下的打开文件对话框?? 本人在应用程序中想实现像windows下的打开文件对话框,请高手不吝赐教。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Dialogs标签里的OpenDialog控件。 Dialog控件组---------有一个OpenDialog控件 兄弟们误会我的意思了,我就是想在应用程序中用代码实现类似OpenDialog控件的功能。 兄弟们误会我的意思了,我就是想在应用程序中用代码实现类似OpenDialog控件的功能。-------------------------------有现成的控件为什么不用?或者:我有误会你的意思了! 浏览图片的对话框?不就是Dialogs标签里数过去第三个的OpenPictureDialog?还是你有什么特别的要求? 你是想自己写打开文件对话框吧,用win3.1面板中的FileListBox哪些控件可以解决 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. 如果要实现预览功能,需要设置模板和钩子,写了一个预览文本文件的.程序代码 PreViewDlg.dpr 如下:program PreViewDlg;{$R Template.Res}uses Windows, CommDlg, Messages; // 文件前500字节载入Memoprocedure 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_VSCROLLEND http://www.2ccc.com/article.asp?articleid=1941 delphi edit1取值 问题 加分了!!!多线程问题.高手们进,谢谢. 一个TIdTCPServer用法的问题,请指教! 调用Dll创建的新窗体如何嵌入显示在当前窗体的Panel里? 用什么工具做报表能自动换行打印的?谢谢 如何将MDB中数据快速给DBchart的曲线显示 急,如何判断网络上一台计算机是否关机 控制window系统服务(打开程序页面) 怎样用table的filter属性过滤某个范围内的数据?? 高手接招,菜鸟进来看看,有个好函数给你。关于文件版本信息! 请问用什么算法可以列出给出任意数字的所有排列? FastReport3.07的打印问题!
-------------------------------
有现成的控件为什么不用?
或者:我有误会你的意思了!
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.
程序代码 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