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

Аватара пользователя
ufooo

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

Сообщение ufooo »

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

Пример (Delphi) скрипта;



Код:

Код: Выделить всё

Uses ShellApi;
ShellExecute(Handle, 'explore', 'C:\WINDOWS\System32', nil, nil, SW_RESTORE);
Аватара пользователя
lxa85

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

Сообщение lxa85 »

ufooo, я думаю самое простое, это написать, да проверить взаимозаменяемость.

Я не силен в WinApi, но в слове 'explore' нет ошибки?



Код:

Код: Выделить всё

ShellExecute(Handle, 'explore', 'C:\WINDOWS\System32', nil, nil, SW_RESTORE);
Аватара пользователя
ufooo

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

Сообщение ufooo »

Я пишу не на 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)
Delphi - Можно ли на Delphi открыть папку, так как это делается в, (.bat) скрипте.




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

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

Сообщение Iska »

Если не используете 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

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

Сообщение Iska »

Цитата Iska:



opel431, тэг

Код: Выделить всё

 забыли. [url=viewtopic.php?p=555158#p555158]»[/url]
		
	
	
С раскрывающимся текстом компактней но, ... исправил.
Аватара пользователя
opel431

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

Сообщение opel431 »

Цитата opel431:



С раскрывающимся текстом компактней
Delphi - Можно ли на Delphi открыть папку, так как это делается в, (.bat) скрипте.




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

Вернуться в «Программирование и базы данных»