Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.236.100.210] |
|
Сообщ.
#1
,
|
|
|
Цитата Mechanic @ Именно это и использовал. Только есть одна досадная вещь в таком вызове: когда папка уже открыта в окне, то позиционирования не происходит. Да в принципе путь то нам известен? Известен, посему делаем финт хвостом: uses ..., SHDocVw; function OpenExplorerAndSelectFile(Path: String): Boolean; function ParceURLName(const Value: String): String; const scFilePath: array [0..7] of Char = ('f', 'i', 'l', 'e', ':', '/', '/', '/'); begin if CompareMem(@scFilePath[0], @Value[1], 8) then begin Result := Copy(Value, 9, Length(Value)); Result := StringReplace(Result, '/', '\', [rfReplaceAll]); Result := StringReplace(Result, '%20', ' ', [rfReplaceAll]); Result := IncludeTrailingBackslash(Result); end else Result := Value; end; var iShellWindow: IShellWindows; iWB: IWebBrowserApp; spDisp: IDispatch; I: Integer; S, FilePath, FileName: String; begin Result := FileExists(Path); if not Result then Exit; FilePath := AnsiUpperCase(ExtractFilePath(Path)); FileName := ExtractFileName(Path); iShellWindow := CoShellWindows.Create; for I := 0 to iShellWindow.Count - 1 do begin spDisp := iShellWindow.Item(I); if spDisp = nil then Continue; spDisp.QueryInterface(IWebBrowserApp, iWB); if iWB <> nil then begin S := ParceURLName(iWB.LocationURL); if AnsiUpperCase(S) = FilePath then begin SendMessage(iWB.HWnd, WM_SYSCOMMAND, SC_CLOSE, 0); Break; end; end; end; ShellExecute(0, 'open', 'explorer.exe', PChar('/select, ' + FileName), PChar(FilePath), SW_SHOWNORMAL); end; procedure TForm18.Button4Click(Sender: TObject); begin if not OpenExplorerAndSelectFile('c:\windows\notepad.exe') then ShowMessage('Файл не найден.'); end; Это проще чем искать по заголовку. |
Сообщ.
#2
,
|
|
|
Для возможности выделения и папок предлогаю сделать следующее:
Вместо {...} Result := FileExists(Path); if not Result then Exit; {...} Использовать {...} Result := FileExists(Path) or DirectoryExists(Path); if not Result then Exit; path:=ExcludeTrailingPathDelimiter(path); {...} Пока не решил проблему с выделением "корня"(C:\,D:\...) Но я думаю это мало кому понадобится |