我想對我的 Delphi 7 應用程式的 GUI 進行現代化改造,我已經有了 .manifest 檔案,它看起來相當不錯,但是 Fileopen 對話框很糟糕。如何讓它們變得現代?
我目前正在使用此代碼。使用例如 IFileOpenDialog 需要什么,如何為此編譯標頭,或對 dialogs.pas 進行任何調整?
FileOpenDialog := TOpenDialog.create(parent);
FileOpenDialog.DefaultExt := '*.x';
FileOpenDialog.Filter := 'my|*.x|Text File (CSV)|*.csv';
FileOpenDialog.options := [ofHideReadOnly,ofFileMustExist ,ofNoChangeDir,ofPathMustExist ];
if FileOpenDialog.Execute then begin
// do my tricks with FileOpenDialog.filename
FormUpdate;
end;
下面的 IFileDialog 示例代碼不能用 D7 編譯:
var
FolderDialog : IFileDialog;
hr: HRESULT;
IResult: IShellItem;
FileName: PChar;
Settings: DWORD;
begin
if Win32MajorVersion >= 6 then
begin
hr := CoCreateInstance(CLSID_FileOpenDialog,
nil,
CLSCTX_INPROC_SERVER,
IFileDialog,
FolderDialog);
if hr = S_OK then
begin
FolderDialog.SetOkButtonLabel(PChar('Select'));
FolderDialog.SetTitle(PChar('Select a Directory'));
hr := FolderDialog.Show(Handle);
if hr = S_OK then
begin
hr := FolderDialog.GetResult(IResult);
if hr = S_OK then
begin
IResult.GetDisplayName(SIGDN_FILESYSPATH,FileName);
ConfigPathEdit.Text := FileName;
end;
end;
end;
end;
uj5u.com熱心網友回復:
我用過這個,我用D7測驗過。
// uses commdlg
function OpenSaveFileDialog( Parent: TWinControl;
const DefExt,Filter,InitialDir,Title: string;
var FileName: string;
MustExist,OverwritePrompt,NoChangeDir,DoOpen: Boolean): Boolean;
var ofn: TOpenFileName;
szFile: array[0..MAX_PATH] of Char;
begin
Result := False;
FillChar(ofn, SizeOf(TOpenFileName), 0);
with ofn do
begin
lStructSize := SizeOf(TOpenFileName);
hwndOwner := Parent.Handle;
lpstrFile := szFile;
nMaxFile := SizeOf(szFile);
if (Title <> '') then
lpstrTitle := PChar(Title);
if (InitialDir <> '') then
lpstrInitialDir := PChar(InitialDir);
StrPCopy(lpstrFile, FileName);
lpstrFilter := PChar(StringReplace(Filter, '|', #0,[rfReplaceAll, rfIgnoreCase]) #0#0);
if DefExt <> '' then
lpstrDefExt := PChar(DefExt);
end;
if MustExist then
ofn.Flags := ofn.Flags or OFN_FILEMUSTEXIST;
if OverwritePrompt then
ofn.Flags := ofn.Flags or OFN_OVERWRITEPROMPT;
if NoChangeDir then
ofn.Flags := ofn.Flags or OFN_NOCHANGEDIR;
if DoOpen
then begin
if GetOpenFileName(ofn) then
begin
Result := True;
FileName := StrPas(szFile);
end;
end
else begin
if GetSaveFileName(ofn) then
begin
Result := True;
FileName := StrPas(szFile);
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
VAR FilSelez : String;
begin
If OpenSaveFileDialog(Form1,'','*.*','c:\windows','',FilSelez,False,False,True,True) Then
Edit1.Text := FilSelez;
end;
uj5u.com熱心網友回復:
除了使用IFileDialog界面,您還可以只修改 Delphi 的 7Dialogs.pas檔案以顯示“現代”對話框。首先對Delphi安裝目錄下的Dialogs.pas檔案夾中的檔案進行備份。Source\VCL然后在檔案中搜索 term OFN_ENABLEHOOK。完整的行應該是Flags := OFN_ENABLEHOOK;. 注釋掉該行。在下面直接添加一個新行Flags := 0;。現在搜索這個詞OFN_ENABLETEMPLATE。上面兩行應該是一個if Template <> nil then宣告。注釋掉這個陳述句和所有后續陳述句,包括hWndOwner := Application.Handle;添加行hWndOwner := Screen.ActiveForm.Handle;。
現在確保將Delphi 安裝目錄下Dialogs.dcu的Liband目錄中的預編譯單元替換為新編譯的包含更改的單元。在目錄中存盤一個沒有除錯資訊的版本,而該目錄包含一個帶有除錯資訊的版本。在替換檔案之前制作檔案的備份副本。SLibDialogs.dcuLibSLib
請注意,上面給出的說明僅適用于 Delphi 7。此外,代碼禁用了常見對話框組件的事件處理。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/424521.html
下一篇:記錄型別的讀寫屬性
