Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Можно ли на Delphi открыть папку, так как это делается в, (.bat) скрипте. (http://forum.oszone.net/showthread.php?t=300547)

ufooo 31-05-2015 17:02 2513453

Можно ли на Delphi открыть папку, так как это делается в, (.bat) скрипте.
 
Можно ли на Delphi открыть папку, так как это делается в, (.bat) скрипте.
Пример (Delphi) скрипта;
Код:

Uses ShellApi;
ShellExecute(Handle, 'explore', 'C:\WINDOWS\System32', nil, nil, SW_RESTORE);


lxa85 31-05-2015 17:43 2513473

ufooo, я думаю самое простое, это написать, да проверить взаимозаменяемость.
Я не силен в WinApi, но в слове 'explore' нет ошибки?
Код:

ShellExecute(Handle, 'explore', 'C:\WINDOWS\System32', nil, nil, SW_RESTORE);

ufooo 31-05-2015 18:09 2513480

Цитата:

Цитата lxa85
но в слове 'explore' нет ошибки? »

Вообще-то вместо (Open) лучше ставить (Explore).

K.A.V. 31-05-2015 19:23 2513510

Я пишу не на delphi, поэтому сделаете по аналогии, думаю смысл поймёте, сначала получите значение SystemRoot через GetEnvironmentVariable, затем склеите полученное значение с остальным путём и передадите в ShellExecute

Код:

        char path[MAX_PATH], buf[MAX_PATH];
       
        GetEnvironmentVariable("SystemRoot", buf, MAX_PATH);
        sprintf_s(path, "%s\\System32\\Drivers\\etc", buf);
        ShellExecute(NULL, "open", path, NULL, NULL, SW_SHOWNORMAL);

Цитата:

Цитата ufooo
Вообще-то вместо (Open) лучше ставить (Explore) »

Разница в этих параметрах в том, что не то чтобы "что-то лучше", а в том, что при указании open - откроется папка без списка дерева папок, а при указании explore - со списком дерева

Iska 31-05-2015 20:07 2513519

Цитата:

Цитата lxa85
но в слове 'explore' нет ошибки? »

«open», «explore», «print» — это канонические глаголы («Canonical Verbs»).

opel431 04-06-2015 18:38 2515010

Если не используете JCL библиотеку, то можно на ее примере, так

Код:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ShlObj, ShellAPI;

type
  TForm1 = class(TForm)
    btn1: TButton;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ ---------------------------------------------------------------------------------------------
  Функция: IsDirectory
  Входные параметры: const FileName: string
  Результат: Boolean - является ли указанный файл каталогом
  ------------------------------------------------------------------------------------------- }
function IsDirectory(const FileName: string): Boolean;
var
  R: DWORD;
begin
  R := GetFileAttributes(PChar(FileName));
  Result := (R <> DWORD(-1)) and ((R and FILE_ATTRIBUTE_DIRECTORY) <> 0);
end;

{ ---------------------------------------------------------------------------------------------
  Функция: OpenFolder  требует ShlObj, ShellAPI
  Входные параметры: const Path: string; Parent: THandle; Explore: Boolean
  Результат: Boolean - открыть проводник с указанной папкой в качестве корневой
  ------------------------------------------------------------------------------------------- }
function OpenFolder(const Path: string; Parent: THandle;
  Explore: Boolean): Boolean;
var
  Sei: TShellExecuteInfo;
begin
  Result := False;
  if IsDirectory(Path) then
  begin
    FillChar(Sei, SizeOf(Sei), #0);
    with Sei do
    begin
      cbSize := SizeOf(Sei);
      Wnd := Parent;
      if Explore then
        lpVerb := 'explore'
      else
        lpVerb := 'open';
      lpFile := PChar(Path);
      nShow := SW_SHOWNORMAL;
    end;
    // директива контролирует типы значений указателя @, а также совместимость типов указателя
    {$TYPEDADDRESS ON}
    Result := ShellExecuteEx(@Sei);
    {$IFNDEF TYPEDADDRESS_ON}
    {$TYPEDADDRESS OFF}
    {$ENDIF ~TYPEDADDRESS_ON}
  end;
end;

{Использование}
procedure TForm1.btn1Click(Sender: TObject);
begin
 OpenFolder('c:\Windows', 0, True);

// или с обработкой
{
if OpenFolder('c:\Windows', 0, True) then
    // обработка условия

 end;

end.


Iska 04-06-2015 19:14 2515023

opel431, тэг [code] забыли.

opel431 04-06-2015 20:32 2515044

Цитата:

Цитата Iska
opel431, тэг [code] забыли. »

С раскрывающимся текстом компактней но, ... исправил.

Iska 04-06-2015 22:55 2515096

Цитата:

Цитата opel431
С раскрывающимся текстом компактней »

Верно. Значит, потом обрамить тэг «code» тэгом «spoiler». Я тоже так часто делаю.

ufooo 20-06-2015 08:19 2520401

...

Iska 20-06-2015 10:00 2520413

Цитата:

Цитата ufooo
сделал сразу в тот же день по своему. »

Не стоит черпать бульон вилкой.

ufooo 20-06-2015 17:59 2520508

...

opel431 20-06-2015 19:25 2520524

Цитата:

Цитата ufooo
Those who live in glass houses should not throw stones at others »

1. С такой позицией (не в плане хореографии), Вам вряд ли захотят помогать еще раз.
2. И "хрустальные замки" рушатся - http://www.gunsmoker.ru/2015/01/neve...llExecute.html
3. В Вашем варианте решения, наверное нет смысла выносить все в глобальные переменные.

Iska 20-06-2015 20:11 2520537

Цитата:

Цитата opel431
2. И "хрустальные замки" рушатся - http://www.gunsmoker.ru/2015/01/neve...llExecute.html »

opel431, занятненько ;).

ufooo 21-06-2015 00:24 2520602

...


Время: 09:51.

Время: 09:51.
© OSzone.net 2001-