TFileSaveDialog 자손 구성 요소를 구축 중입니다. 자손은 이벤트가 다음에 의해 처리되는 푸시 버튼을가집니다.TFileDialogEvent에서 IFileDialog에 대한 핸들을 가져 와서 파일 이름을 얻습니다.
function TFileDialogEvent.OnButtonClicked(const pfdc: IFileDialogCustomize;
dwIDCtl: DWORD): HResult; stdcall;
var
iImageEnIO: TImageEnIO;
iFilename: string;
iName: PChar;
pfd: IFileDialog;
begin
if dwIDCtl = dwVisualGroup8ID then
begin
iImageEnIO := TImageEnIO.Create(nil);
try
FileDialog.QueryInterface(
StringToGUID('{8016B7B3-3D49-4504-A0AA-2A37494E606F}'),
pfd);
// How to get correct valid handle to IFileDialog?
pfd.GetFileName(iName);
iFilename := string(iName);
if FileExists(iFilename) then
begin
구성 요소는 다양한 제어 레이블에 이미지 정보를 올바르게 표시합니다. 구성 요소가 성공적으로 선택한 파일 이름을 반환하고 폴더를 변경할 수 있지만 OnButtonClicked 이벤트의 pfd.GetFileName (iName)에서 파일 이름을 가져 오면 잘못된 파일 이름이 반환됩니다. 나는 문제가 pfd : IFileDialog에 대한 올바른 핸들을 얻지 못해 발생했다고 생각한다.
는 업데이트 : 의 FileDialog 정의하여이 문제를 해결 : 구성 요소 수준에서 var과 같은 IFileDialog이 그때라고
function TFileDialogEvent.OnButtonClicked(const pfdc: IFileDialogCustomize;
dwIDCtl: DWORD): HResult; stdcall;
var
iImageEnIO: TImageEnIO;
iFilename: string;
pFolder: PWideChar;
iFolder: string;
iName: PChar;
pfd: IFileDialog;
hr: HRESULT;
aShellItem: IShellItem;
begin
if dwIDCtl = dwVisualGroup8ID then
begin
iImageEnIO := TImageEnIO.Create(nil);
try
FileDialog.QueryInterface(IFileDialog, pfd);
pfd.GetFileName(iName);
// Get the ShellItem
hr := SHCreateItemFromParsingName(iName, nil,
StringToGUID(SID_IShellItem), aShellItem);
// Get the folder
pfd.GetFolder(aShellItem);
// Get the folder displayname
aShellItem.GetDisplayName(SIGDN_FILESYSPATH, pFolder);
iFolder := string(pFolder);
if DirectoryExists(iFolder) then
iFilename := IncludeTrailingPathDelimiter(iFolder) + string(iName);
if FileExists(iFilename) then
begin
감사의 모든 ... 롭 당신에게 감사합니다 ... 당신의 게시물이 도움이되었습니다.
을; with pfd : = FileDialog as IFileDialog; –
업데이트 된 질문의 코드는 무의미합니다. FileDialog는 이미 IFileDialog입니다. 그리고 Rob의 솔루션은 어쨌든 여분의 필드가 필요 없게 작동합니다. –