📄 mydialogs.pas
字号:
FNSTCW FPUControlWord
end;
try
CreationControl := Self;
Result := TDialogFunc(DialogFunc)(DialogData);
finally
asm
FNCLEX
FLDCW FPUControlWord
end;
Application.UnhookMainWindow(MessageHook);
end;
finally
EnableTaskWindows(WindowList);
SetActiveWindow(ActiveWindow);
RestoreFocusState(FocusState);
end;
end;
procedure TCommonDialog.DoClose;
begin
if Assigned(FOnClose) then FOnClose(Self);
end;
procedure TCommonDialog.DoShow;
begin
if Assigned(FOnShow) then FOnShow(Self);
end;
{ Open and Save dialog routines }
function ExplorerHook(Wnd: HWnd; Msg: UINT; WParam: WPARAM; LParam: LPARAM): UINT; stdcall;
begin
Result := 0;
if Msg = WM_INITDIALOG then
begin
CreationControl.FHandle := Wnd;
CreationControl.FDefWndProc := Pointer(SetWindowLong(Wnd, GWL_WNDPROC,
Longint(CreationControl.FObjectInstance)));
CallWindowProc(CreationControl.FObjectInstance, Wnd, Msg, WParam, LParam);
CreationControl := nil;
end
else if (Msg = WM_NOTIFY) and (POFNotify(LParam)^.hdr.code = CDN_INITDONE) then
CenterWindow(GetWindowLong(Wnd, GWL_HWNDPARENT));
end;
{ TOpenDialog }
constructor TOpenDialog.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FHistoryList := TStringList.Create;
FOptions := [ofHideReadOnly, ofEnableSizing];
FOptionsEx := [];
FFiles := TStringList.Create;
FFilterIndex := 1;
FFileEditStyle := fsEdit;
end;
destructor TOpenDialog.Destroy;
begin
FFiles.Free;
FHistoryList.Free;
inherited Destroy;
end;
function TOpenDialog.CanClose(var OpenFileName: TOpenFileName): Boolean;
begin
GetFileNames(OpenFileName);
Result := DoCanClose;
FFiles.Clear;
end;
procedure TOpenDialog.WndProc(var Message: TMessage);
var
Index: Integer;
Include: Boolean;
begin
Message.Result := 0;
{ If not ofOldStyleDialog then DoShow on CDN_INITDONE, not WM_INITDIALOG }
if (Message.Msg = WM_INITDIALOG) and not (ofOldStyleDialog in Options) then Exit
else if (Message.Msg = WM_NOTIFY) then
case (POFNotify(Message.LParam)^.hdr.code) of
CDN_FILEOK:
if not CanClose(POFNotify(Message.LParam)^.lpOFN^) then
begin
Message.Result := 1;
SetWindowLong(Handle, DWL_MSGRESULT, Message.Result);
Exit;
end;
CDN_INITDONE: DoShow;
CDN_SELCHANGE: DoSelectionChange;
CDN_FOLDERCHANGE: DoFolderChange;
CDN_TYPECHANGE:
begin
Index := POFNotify(Message.LParam)^.lpOFN^.nFilterIndex;
if Index <> FCurrentFilterIndex then
begin
FCurrentFilterIndex := Index;
DoTypeChange;
end;
end;
CDN_INCLUDEITEM:
if Message.LParam <> 0 then
begin
Include := True;
DoIncludeItem(TOFNotifyEx(POFNotifyEx(Message.LParam)^), Include);
Message.Result := Byte(Include);
end;
end;
inherited WndProc(Message);
end;
function TOpenDialog.DoCanClose: Boolean;
begin
Result := True;
if Assigned(FOnCanClose) then FOnCanClose(Self, Result);
end;
procedure TOpenDialog.DoSelectionChange;
begin
if Assigned(FOnSelectionChange) then FOnSelectionChange(Self);
end;
procedure TOpenDialog.DoFolderChange;
begin
if Assigned(FOnFolderChange) then FOnFolderChange(Self);
end;
procedure TOpenDialog.DoTypeChange;
begin
if Assigned(FOnTypeChange) then FOnTypeChange(Self);
end;
procedure TOpenDialog.ReadFileEditStyle(Reader: TReader);
begin
{ Ignore FileEditStyle }
Reader.ReadIdent;
end;
procedure TOpenDialog.DefineProperties(Filer: TFiler);
begin
inherited DefineProperties(Filer);
Filer.DefineProperty('FileEditStyle', ReadFileEditStyle, nil, False);
end;
function TOpenDialog.DoExecute(Func: Pointer): Bool;
const
MultiSelectBufferSize = High(Word) - 16;
OpenOptions: array [TOpenOption] of DWORD = (
OFN_READONLY, OFN_OVERWRITEPROMPT, OFN_HIDEREADONLY,
OFN_NOCHANGEDIR, OFN_SHOWHELP, OFN_NOVALIDATE, OFN_ALLOWMULTISELECT,
OFN_EXTENSIONDIFFERENT, OFN_PATHMUSTEXIST, OFN_FILEMUSTEXIST,
OFN_CREATEPROMPT, OFN_SHAREAWARE, OFN_NOREADONLYRETURN,
OFN_NOTESTFILECREATE, OFN_NONETWORKBUTTON, OFN_NOLONGNAMES,
OFN_EXPLORER, OFN_NODEREFERENCELINKS, OFN_ENABLEINCLUDENOTIFY,
OFN_ENABLESIZING, OFN_DONTADDTORECENT, OFN_FORCESHOWHIDDEN);
OpenOptionsEx: array [TOpenOptionEx] of DWORD = (OFN_EX_NOPLACESBAR);
var
Option: TOpenOption;
OptionEx: TOpenOptionEx;
OpenFilename: TOpenFilename;
function AllocFilterStr(const S: string): string;
var
P: PChar;
begin
Result := '';
if S <> '' then
begin
Result := S + #0; // double null terminators
P := AnsiStrScan(PChar(Result), '|');
while P <> nil do
begin
P^ := #0;
Inc(P);
P := AnsiStrScan(P, '|');
end;
end;
end;
var
TempFilter, TempFilename, TempExt: string;
begin
FFiles.Clear;
FillChar(OpenFileName, SizeOf(OpenFileName), 0);
with OpenFilename do
begin
if (Win32MajorVersion >= 5) and (Win32Platform = VER_PLATFORM_WIN32_NT) or { Win2k }
((Win32Platform = VER_PLATFORM_WIN32_WINDOWS) and (Win32MajorVersion >= 4) and (Win32MinorVersion >= 90)) then { WinME }
lStructSize := SizeOf(TOpenFilename)
else
lStructSize := SizeOf(TOpenFilename) - (SizeOf(DWORD) shl 1) - SizeOf(Pointer); { subtract size of added fields }
hInstance := SysInit.HInstance;
TempFilter := AllocFilterStr(FFilter);
lpstrFilter := PChar(TempFilter);
nFilterIndex := FFilterIndex;
FCurrentFilterIndex := FFilterIndex;
if ofAllowMultiSelect in FOptions then
nMaxFile := MultiSelectBufferSize else
nMaxFile := MAX_PATH;
SetLength(TempFilename, nMaxFile + 2);
lpstrFile := PChar(TempFilename);
FillChar(lpstrFile^, nMaxFile + 2, 0);
StrLCopy(lpstrFile, PChar(FFileName), nMaxFile);
if (FInitialDir = '') and ForceCurrentDirectory then
lpstrInitialDir := '.'
else
lpstrInitialDir := PChar(FInitialDir);
lpstrTitle := PChar(FTitle);
Flags := OFN_ENABLEHOOK;
FlagsEx := 0;
for Option := Low(Option) to High(Option) do
if Option in FOptions then
Flags := Flags or OpenOptions[Option];
if NewStyleControls then
begin
Flags := Flags xor OFN_EXPLORER;
if (Win32MajorVersion >= 5) and (Win32Platform = VER_PLATFORM_WIN32_NT) or { Win2k }
((Win32Platform = VER_PLATFORM_WIN32_WINDOWS) and (Win32MajorVersion >= 4) and (Win32MinorVersion >= 90)) then { WinME }
for OptionEx := Low(OptionEx) to High(OptionEx) do
if OptionEx in FOptionsEx then
FlagsEx := FlagsEx or OpenOptionsEx[OptionEx];
end
else
Flags := Flags and not OFN_EXPLORER;
TempExt := FDefaultExt;
if (TempExt = '') and (Flags and OFN_EXPLORER = 0) then
begin
TempExt := ExtractFileExt(FFilename);
Delete(TempExt, 1, 1);
end;
if TempExt <> '' then lpstrDefExt := PChar(TempExt);
if (ofOldStyleDialog in Options) or not NewStyleControls then
lpfnHook := DialogHook
else
lpfnHook := ExplorerHook;
if Template <> nil then
begin
Flags := Flags or OFN_ENABLETEMPLATE;
lpTemplateName := Template;
end;
hWndOwner := Application.Handle;
Result := TaskModalDialog(Func, OpenFileName);
if Result then
begin
GetFileNames(OpenFilename);
if (Flags and OFN_EXTENSIONDIFFERENT) <> 0 then
Include(FOptions, ofExtensionDifferent) else
Exclude(FOptions, ofExtensionDifferent);
if (Flags and OFN_READONLY) <> 0 then
Include(FOptions, ofReadOnly) else
Exclude(FOptions, ofReadOnly);
FFilterIndex := nFilterIndex;
end;
end;
end;
procedure TOpenDialog.GetFileNames(var OpenFileName: TOpenFileName);
var
Separator: Char;
function ExtractFileName(P: PChar; var S: TFilename): PChar;
begin
Result := AnsiStrScan(P, Separator);
if Result = nil then
begin
S := P;
Result := StrEnd(P);
end
else
begin
SetString(S, P, Result - P);
Inc(Result);
end;
end;
procedure ExtractFileNames(P: PChar);
var
DirName, FileName: TFilename;
begin
P := ExtractFileName(P, DirName);
P := ExtractFileName(P, FileName);
if FileName = '' then
FFiles.Add(DirName)
else
begin
if AnsiLastChar(DirName)^ <> '\' then
DirName := DirName + '\';
repeat
if (FileName[1] <> '\') and ((Length(FileName) <= 3) or
(FileName[2] <> ':') or (FileName[3] <> '\')) then
FileName := DirName + FileName;
FFiles.Add(FileName);
P := ExtractFileName(P, FileName);
until FileName = '';
end;
end;
begin
Separator := #0;
if (ofAllowMultiSelect in FOptions) and
((ofOldStyleDialog in FOptions) or not NewStyleControls) then
Separator := ' ';
with OpenFileName do
begin
if ofAllowMultiSelect in FOptions then
begin
ExtractFileNames(lpstrFile);
FFileName := FFiles[0];
end else
begin
ExtractFileName(lpstrFile, FFileName);
FFiles.Add(FFileName);
end;
end;
end;
function TOpenDialog.GetStaticRect: TRect;
begin
if FHandle <> 0 then
begin
if not (ofOldStyleDialog in Options) then
begin
GetWindowRect(GetDlgItem(FHandle, stc32), Result);
MapWindowPoints(0, FHandle, Result, 2);
end
else GetClientRect(FHandle, Result)
end
else Result := Rect(0,0,0,0);
end;
function TOpenDialog.GetFileName: TFileName;
var
Path: array[0..MAX_PATH] of Char;
begin
if NewStyleControls and (FHandle <> 0) then
begin
SendMessage(GetParent(FHandle), CDM_GETFILEPATH, SizeOf(Path), Integer(@Path));
Result := StrPas(Path);
end
else Result := FFileName;
end;
function TOpenDialog.GetFilterIndex: Integer;
begin
if FHandle <> 0 then
Result := FCurrentFilterIndex
else
Result := FFilterIndex;
end;
procedure TOpenDialog.SetHistoryList(Value: TStrings);
begin
FHistoryList.Assign(Value);
end;
procedure TOpenDialog.SetInitialDir(const Value: string);
var
L: Integer;
begin
L := Length(Value);
if (L > 1) and IsPathDelimiter(Value, L)
and not IsDelimiter(':', Value, L - 1) then Dec(L);
FInitialDir := Copy(Value, 1, L);
end;
function TOpenDialog.Execute: Boolean;
begin
Result := DoExecute(@GetOpenFileName);
end;
procedure TOpenDialog.DoIncludeItem(const OFN: TOFNotifyEx; var Include: Boolean);
begin
if Assigned(FOnIncludeItem) then FOnIncludeItem(OFN, Include);
end;
{ TSaveDialog }
function TSaveDialog.Execute: Boolean;
begin
Result := DoExecute(@GetSaveFileName);
end;
{ TColorDialog }
constructor TColorDialog.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FCustomColors := TStringList.Create;
end;
destructor TColorDialog.Destroy;
begin
FCustomColors.Free;
inherited Destroy;
end;
function TColorDialog.Execute: Boolean;
const
DialogOptions: array[TColorDialogOption] of DWORD = (
CC_FULLOPEN, CC_PREVENTFULLOPEN, CC_SHOWHELP, CC_SOLIDCOLOR,
CC_ANYCOLOR);
var
ChooseColorRec: TChooseColor;
Option: TColorDialogOption;
CustomColorsArray: TCustomColors;
const
ColorPrefix = 'Color';
procedure GetCustomColorsArray;
var
I: Integer;
begin
for I := 0 to MaxCustomColors - 1 do
FCustomColors.Values[ColorPrefix + Char(Ord('A') + I)] :=
Format('%.6x', [CustomColorsArray[I]]);
end;
procedure SetCustomColorsArray;
var
Value: string;
I: Integer;
begin
for I := 0 to MaxCustomColors - 1 do
begin
Value := FCustomColors.Values[ColorPrefix + Char(Ord('A') + I)];
if Value <> '' then
CustomColorsArray[I] := StrToInt('$' + Value) else
CustomColorsArray[I] := -1;
end;
end;
begin
with ChooseColorRec do
begin
SetCustomColorsArray;
lStructSize := SizeOf(ChooseColorRec);
hInstance := SysInit.HInstance;
rgbResult := ColorToRGB(FColor);
lpCustColors := @CustomColorsArray;
Flags := CC_RGBINIT or CC_ENABLEHOOK;
for Option := Low(Option) to High(Option) do
if Option in FOptions then
Flags := Flags or DialogOptions[Option];
if Template <> nil then
begin
Flags := Flags or CC_ENABLETEMPLATE;
lpTemplateName := Template;
end;
lpfnHook := DialogHook;
hWndOwner := Application.Handle;
Result := TaskModalDialog(@ChooseColor, ChooseColorRec);
if Result then
begin
FColor := rgbResult;
GetCustomColorsArray;
end;
end;
end;
procedure TColorDialog.SetCustomColors(Value: TStrings);
begin
FCustomColors.Assign(Value);
end;
{ TFontDialog }
const
IDAPPLYBTN = $402;
var
FontDialog: TFontDialog;
function FontDialogHook(Wnd: HWnd; Msg: UINT; WParam: WPARAM; LParam: LPARAM): UINT; stdcall;
begin
if (Msg = WM_COMMAND) and (LongRec(WParam).Lo = IDAPPLYBTN) and
(LongRec(WParam).Hi = BN_CLICKED) then
begin
FontDialog.DoApply(Wnd);
Result := 1;
end else
Result := DialogHook(Wnd, Msg, wParam, lParam);
end;
constructor TFontDialog.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FFont := TFont.Create;
FOptions := [fdEffects];
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -