다음 작품 :
type
TMyFileDialogEvents = class(TInterfacedObject, IFileDialogEvents, IFileDialogControlEvents)
public
{ IFileDialogEvents }
function OnFileOk(const pfd: IFileDialog): HResult; stdcall;
function OnFolderChanging(const pfd: IFileDialog;
const psiFolder: IShellItem): HResult; stdcall;
function OnFolderChange(const pfd: IFileDialog): HResult; stdcall;
function OnSelectionChange(const pfd: IFileDialog): HResult; stdcall;
function OnShareViolation(const pfd: IFileDialog; const psi: IShellItem;
out pResponse: DWORD): HResult; stdcall;
function OnTypeChange(const pfd: IFileDialog): HResult; stdcall;
function OnOverwrite(const pfd: IFileDialog; const psi: IShellItem;
out pResponse: DWORD): HResult; stdcall;
{ IFileDialogControlEvents }
function OnItemSelected(const pfdc: IFileDialogCustomize; dwIDCtl: DWORD;
dwIDItem: DWORD): HResult; stdcall;
function OnButtonClicked(const pfdc: IFileDialogCustomize;
dwIDCtl: DWORD): HResult; stdcall;
function OnCheckButtonToggled(const pfdc: IFileDialogCustomize;
dwIDCtl: DWORD; bChecked: BOOL): HResult; stdcall;
function OnControlActivating(const pfdc: IFileDialogCustomize;
dwIDCtl: DWORD): HResult; stdcall;
end;
const
dwVisualGroup1ID: DWORD = 1900;
function TMyFileDialogEvents.OnFileOk(const pfd: IFileDialog): HResult;
begin
Result := E_NOTIMPL;
end;
function TMyFileDialogEvents.OnFolderChange(const pfd: IFileDialog): HResult;
begin
Result := E_NOTIMPL;
end;
function TMyFileDialogEvents.OnFolderChanging(const pfd: IFileDialog;
const psiFolder: IShellItem): HResult;
begin
Result := E_NOTIMPL;
end;
function TMyFileDialogEvents.OnOverwrite(const pfd: IFileDialog;
const psi: IShellItem; out pResponse: DWORD): HResult;
begin
Result := E_NOTIMPL;
end;
function TMyFileDialogEvents.OnSelectionChange(const pfd: IFileDialog): HResult;
begin
Result := E_NOTIMPL;
end;
function TMyFileDialogEvents.OnShareViolation(const pfd: IFileDialog;
const psi: IShellItem; out pResponse: DWORD): HResult;
begin
Result := E_NOTIMPL;
end;
function TMyFileDialogEvents.OnTypeChange(const pfd: IFileDialog): HResult;
begin
Result := E_NOTIMPL;
end;
function TMyFileDialogEvents.OnItemSelected(const pfdc: IFileDialogCustomize; dwIDCtl: DWORD; dwIDItem: DWORD): HResult;
begin
Result := E_NOTIMPL;
end;
function TMyFileDialogEvents.OnButtonClicked(const pfdc: IFileDialogCustomize; dwIDCtl: DWORD): HResult;
begin
if dwIDCtl = dwVisualGroup1ID then begin
// ...
Result := S_OK;
end else begin
Result := E_NOTIMPL;
end;
end;
function TMyFileDialogEvents.OnCheckButtonToggled(const pfdc: IFileDialogCustomize; dwIDCtl: DWORD; bChecked: BOOL): HResult;
begin
Result := E_NOTIMPL;
end;
function TMyFileDialogEvents.OnControlActivating(const pfdc: IFileDialogCustomize; dwIDCtl: DWORD): HResult;
begin
Result := E_NOTIMPL;
end;
.
var
FileDialog: IFileDialog = nil;
MyEvents: IFileDialogEvents = nil;
MyEventsCookie: DWORD = 0;
procedure TForm1.FileSaveDialog1Execute(Sender: TObject);
var
c: IFileDialogCustomize;
d: IFileDialogEvents;
cookie: DWORD;
begin
if Supports(FileSaveDialog1.Dialog, IFileDialogCustomize, c) then
begin
// Add a Advanced Button
c.AddPushButton(dwVisualGroup1ID, 'Advanced');
c.MakeProminent(dwVisualGroup1ID);
// Setup the PushButton Click event
d := TMyFileDialogEvents.Create;
if Succeeded(FileSaveDialog1.Dialog.Advise(d, cookie)) then
begin
FileDialog := FileSaveDialog1.Dialog
MyEvents := d;
MyEventsCookie := cookie;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Ok: Boolean;
begin
FileDialog := nil;
MyEvents := nil;
MyEventsCookie := 0;
try
Ok := FileSaveDialog1.Execute;
finally
if (FileDialog <> nil) and (MyEventsCookie <> 0) then
FileDialog.Unadvise(MyEventsCookie);
FileDialog := nil;
MyEvents := nil;
MyEventsCookie := 0;
end;
if Ok then ...
end;
감사합니다 .. 이벤트가 잘 실행되고 있습니다. FileSaveDialog1.Dialog.Unadvise()를 호출해야합니까? – Bill
Microsoft는 사용자가 Unadvise()를 호출한다고 가정합니다. 그러나'TFileSaveDialog'를 사용하려면'OnExecute' 이벤트에서'TFileSaveDialog.Dialog' 인터페이스에 대한 참조를 저장해야합니다. 그러면 Execute()가 종료 될 때 대화 상자가 해제되지 않습니다. 그런 다음 처리기를 Unadvise() 처리하고 참조를 해제하여 대화 상자를 종료합니다. 나는 그것을 보여주기 위해 나의 대답을 업데이트 할 것이다. –
@MasonWheeler 왜 내가 그것을 썼는지 상상할 수 없다. 설명서가 명확합니다. 나는 코멘트를 삭제했다. –