На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Rouse_, jack128, Krid
  
    > Как выделить файлы в Проводнике , Просто открыть окно, и выделить в нём файлы|папки
      Цитата Mechanic @
      Именно это и использовал. Только есть одна досадная вещь в таком вызове: когда папка уже открыта в окне, то позиционирования не происходит.

      Да в принципе путь то нам известен? Известен, посему делаем финт хвостом:

      ExpandedWrap disabled
        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;


      Это проще чем искать по заголовку.
        Для возможности выделения и папок предлогаю сделать следующее:

        Вместо

        ExpandedWrap disabled
          {...}
            Result := FileExists(Path);
            if not Result then Exit;
          {...}


        Использовать

        ExpandedWrap disabled
          {...}
            Result := FileExists(Path) or DirectoryExists(Path);
            if not Result then Exit;
            path:=ExcludeTrailingPathDelimiter(path);
          {...}


        Пока не решил проблему с выделением "корня"(C:\,D:\...)
        Но я думаю это мало кому понадобится :D
        Сообщение отредактировано: joohny -
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,1931 ]   [ 16 queries used ]   [ Generated: 28.03.24, 20:27 GMT ]