Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2005年12月10日] [更新 2011年11月02日] Delphi サンプルプログラム集
472_システム関係ダイアログの表示 ( Shell オブジェクト )
動作確認等 Windows XP(SP3) + Delphi 2010(UP5) Pro
Windows 7 U64(SP1) + Delphi XE2(UP1) Pro VCL-32, VCL-64
472_SomeDialogs_Shell.zip [7,019 KB] 2011年11月02日版 (EXE 同梱)



  • 2011年11月02日
  • 動作確認環境変更と,それに伴う修正・編集




Shell オブジェクトを使用したシステム関係ダイアログ表示


Sehll オブジェクトを使用して,システム関係のダイアログを表示するサンプルコードです.
Shell オブジェクトをコンポーネントにして利用しています.コンポーネントにする手順については [タイプライブラリの取り込み] を参考にして下さい.





01_.cpl ファイルを実行  -  ControlPanelItem


Windows のシステムフォルダに保存されているコントロールパネル・アイテム関係の .cpl ファイルを実行する例です.[マウスのプロパティ] ダイアログを表示します.
Windows 7 では,ControlPanelItem で .cpl を実行する時,引数の値で,アクティブにするタブを指定できないようです.指定するとダイアログの表示に失敗します.


図1
設計時画面
  • Shell オブジェクトのコンポを配置
  • 他のサンプルプログラムも同じ
図2
[Buton1]クリック
  • [Button2] クリックも同じ
  • Button2 クリックでは,実行時に Shell オブジェクトを生成している
図3
[Button3]クリック
  • ShellExecute 関数では .cpl を表示する際にアクティブなタブを指定できる

リスト1
ControlPanelItem 関数を使用して,.cpl ファイルを実行
unit Shell_ControlPanelItemUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleServer, Shell32_TLB, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Shell1: TShell;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

uses ShellAPI;

{$R *.dfm}

//=============================================================================
//  ShellオブジェクトのControlPanelItemメソッドの使用例
//  指定したコンソール関係のダイアログを表示する
//  既に開いている時はアクティブにする
//
//  Windows 7では.cplの引数指定は無効(指定すると動作しない)
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
  Shell1.ControlPanelItem('main.cpl');
end;

//=============================================================================
//  Shellオブジェクトを実行時に生成する場合
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
  AShell : TShell;
begin
  AShell := TShell.Create(Self);
  try
    Shell1.ControlPanelItem('main.cpl');
  finally
    FreeAndNil(AShell);
  end;
end;

//=============================================================================
//  Shellオブジェクトを使わずに,ShellExecute, ShellExecuteEx, CreateProcess
//  関数を使用すれば,.cplの最後の引数で,ダイアログ表示の際のタブを指定できる
//=============================================================================
procedure TForm1.Button3Click(Sender: TObject);
var
  StrText : String;
begin
  StrText := 'main.cpl,,2';
  ShellExecute(Handle, 'open', 'control.exe', PChar(StrText), nil, SW_SHOW);
end;

end.




02_コントロールパネル関係ダイアログ  -  FolderItems


コントロールルパネルのアイテムをリスト表示し,ダブルクリックしたアイテムに相当するダイアログを表示します.
このサンプルプログラムは,64 ビットの Windows 7 では,Win64 (VCL-64) で作成した EXE でないと正常に機能しません.


図4
設計時画面
図5
CSIDL_CONTROLS の場合
  • 項目をダブルクリックするとダイアログを表示
図6
CSIDL_PRINTERS にすると
  • プリンタがリストされる
  • これをダブルクリックすると...
図7
プリンタのダイアログを表示

リスト2
FolderItems オブジェクトでコントロールパネル関係のダイアログを表示
unit Shell_ControlsUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, OleServer, Shell32_TLB, ComCtrls;

type
  TForm1 = class(TForm)
    Shell1: TShell;
    Panel1: TPanel;
    Panel2: TPanel;
    Button1: TButton;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
    procedure ListBox1DblClick(Sender: TObject);
  private
    { Private 宣言 }
    SHFolderItem  : Shell32_TLB.FolderItem;
    SHFolderItems : Shell32_TLB.FolderItems;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

uses ShlObj;

{$R *.dfm}

//=============================================================================
//  Shellオブジェクトによるコントロールパネル関係の項目を取り出す
//
//  64bitのWindows 7で動作させるためには,win64(VCL-64)でEXEを作成する
//  32bitのWindows 7で動作させるためには,win32(VCL-32)でEXEを作成する
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
   i : Integer;
begin
  ListBox1.Items.Clear;
  ListBox1.Update;
  ListBox1.Items.BeginUpdate;

  //CSIDL_CONTROLSのFolderItemsオブジェクトを取得
  SHFolderItems := Shell1.NameSpace(CSIDL_CONTROLS).Items;

  //そのオブジェクトの数だけNameプロパティ値を取り出して表示
  for i := 0 to SHFolderItems.Count - 1 do begin
    SHFolderItem:= SHFolderItems.Item(i);
    ListBox1.Items.Add(SHFolderItem.Name);
  end;

  ListBox1.Items.EndUpdate;
end;

//=============================================================================
//  リストボックスダブルクリックでコントロールパネルの該当ダイアログを表示
//  引数がnullだとデフォルト動作実行.Openだと開かないダイアログあり
//=============================================================================
procedure TForm1.ListBox1DblClick(Sender: TObject);
begin
  SHFolderItems.Item(ListBox1.ItemIndex).InvokeVerb(Null);
end;

end.




03_フォルダの参照ダイアログ  -  BrowseForFolder


フォルダの参照ダイアログを表示します.BrowseForFolder 関数を使用しています.


図8
実行画面
  • [マイドキュメント] を選択
  • [OK] をクリック
図9
実行画面
  • [マイドキュメント] 内をリスト
  • フォルダかファイルかは IsFolder プロパティで判定可能
  • パス名の取得は Path プロパティ

リスト3
BrowseForFolder 関数で,フォルダの参照ダイアログを表示
unit Shell_BrowseForFolderUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleServer, Shell32_TLB, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Shell1: TShell;
    ListBox1: TListBox;
    Panel2: TPanel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses ShlObj;

//=============================================================================
//  ShellオブジェクトのBrowsFolder関数の使用例
//  この関数は操作対象となるFolderオブジェクトをダイアログで選択して取得する目
//  的で使用する
//  引数のOptionsとRootFolderについては以下を参照
//  これらの引数を値ではなく定数宣言で利用するにはusesにShlObjが必要
//  http://homepage2.nifty.com/Mr_XRAY/Delphi/plFileDialog/B_BrowseFolder.htm
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  AFolder : Shell32_TLB.Folder;
  i       : Integer;
  Cnt     : Integer;
begin
  ListBox1.Items.Clear;

  AFolder := Shell1.BrowseForFolder(Handle,
                                    'フォルダの選択',
                                    BIF_RETURNONLYFSDIRS,
                                    CSIDL_DESKTOP);
  if AFolder <> nil then begin
    Cnt := AFolder.Items.Count;
    ListBox1.Items.BeginUpdate;
    for i := 0 to Cnt - 1 do begin
      ListBox1.Items.Add(AFolder.Items.Item(i).Name);
      Application.ProcessMessages;
    end;
    ListBox1.Items.EndUpdate;
    Panel1.Caption := AFolder.Title;
  end;
end;

end.




04_フォルダを指定してエクスプローラを開く  -  Explore


指定したフォルダを選択状態にしてエクスプローラを新たに起動します.


図10
実行画面

リスト4
エクスプローラで指定フォルダを開く
unit Shell_ExplorerUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleServer, Shell32_TLB, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Shell1: TShell;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses ShlObj;

//=============================================================================
//  ShellオブジェクトのExploreメソッドの使用例
//  指定したフォルダをエクスプローラで表示
//  既に開いていても何重にも表示する
//
//  引数には定数値またはCSIDLの値が使用できる
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
//  Shell1.Explore(CSIDL_DESKTOP);  //デスクトップの場合
  Shell1.Explore('C:\');
end;

end.




05_指定フォルダをエクスプローラで開く -  Open


指定したフォルダをエクスプローラで表示します.
Windows XP までは Explore 関数との違いがありましたが,Vista 降はほとんど動作仕様の違いがないようです.Open 関数では,指定したフォルダのツリーを展開しないようです.


図11
実行画面

リスト5
エクスプローラで指定フォルダを開く
unit Shell_OpenUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleServer, Shell32_TLB, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Shell1: TShell;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses ShlObj;

//=============================================================================
//  ShellオブジェクトのOpenメソッドの使用例
//  指定したフォルダをエクスプローラで表示
//  既に開いている時はアクティブにする
//
//  引数には定数値またはCSIDLの値が使用できる.以下を参照
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
//  Shell1.Open(CSIDL_DESKTOP);  //デスクトップ
  Shell1.Open('C:\');
end;

end.




06_[ ファイル名を指定して実行 ] ダイアログ  -  FileRun


[ファイル名を指定して実行]ダイアログを表示します.


図12
実行画面

リスト6
[ファイル名を指定して実行]のダイアログを表示
unit Shell_FileRunUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleServer, Shell32_TLB, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Shell1: TShell;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//=============================================================================
//  ShellオブジェクトのFileRunメソッドの使用例
//  [ファイル名を指定して実行]ダイアログを表示
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
  Shell1.FileRun;
end;

end.




07_[ ファイル検索 - 検索結果 ] ダイアログ  -  FindFiles


ファイルを検索するためのダイアログを表示します.


図13
実行画面
  • 検索場所を[コンピュータ]にしようとしているところ

リスト7
[ファイル検索 - 検索結果]のダイアログを表示
unit Shell_FindFilesUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleServer, Shell32_TLB, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Shell1: TShell;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//=============================================================================
//  ShellオブジェクトのFindFilesメソッドの使用例
// [検索結果]を表示
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
  Shell1.FindFiles;
end;

end.




08_[ タスクバーとスタートメニューのプロパティ ] - TrayProperties


TrayProperties 関数を使用して,[タスクバーとスタートメニュー]ダイアログを表示します.タスクバー上でマウス右ボタンの[プロパティ]を選択した時に現れる設定ダイアログです.


図14
実行画面

リスト8
[タスクバーとスタートメニューのプロパティ] ダイアログを表示
unit Shell_TrayPropertiesUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleServer, Shell32_TLB, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Shell1: TShell;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//=============================================================================
//  ShellオブジェクトのTrayPropertiesメソッドの使用例
//  [タスクバーと[スタート]メニューのプロパティ]ダイアログを表示
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
  Shell1.TrayProperties;
end;

end.




09_[ シャットダウン ] ダイアログ  -  ShutdownWindows


[シャットダウン] ダイアログを表示します.


図15
実行画面

リスト9
[シャットダウン] ダイアログを表示
unit Shell_ShutdownWindowsUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleServer, Shell32_TLB, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Shell1: TShell;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//=============================================================================
//  ShellオブジェクトのShutdownWindowsメソッドの使用例
//  [Windowsのシャットダウン]ダイアログを表示
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
  Shell1.ShutdownWindows;
end;

end.




10_全てのウィンドウを最小化・元に戻す関数


デスクトップ上のウィンドウを全て最小化または,最小化したウィンドウを元に戻します.


[備考]
全てのウインドウの最小化と最小化したウィンドウを元に戻すのは,[Win] + [D] のキー操作でできます.このキー操作はトグルとなっています.[Win] は Windows キーのことです.


図16
設計時画面

リスト10
全てのウィンドウを最小化または元に戻す
unit Shell_MinimizeAllUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleServer, Shell32_TLB, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Shell1: TShell;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//=============================================================================
//  ShellオブジェクトのMinimizeAllメソッドの使用例
//  デスクトップ上の全てのウィンドウを最小化する
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
  Shell1.MinimizeAll;
end;

//=============================================================================
//  ShellオブジェクトのUndoMinimizeAllメソッドの使用例
//  MinimizeAllメソッドで最小化したウィンドウを元の状態に戻す
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
begin
  Shell1.UndoMinimizeALL;
end;

end.




11_[ ヘルプとサポートセンター ] ダイアログ  -  Help


[ヘルプとサポートセンター] ダイアログを表示します.


図17
実行画面
  • 何故か英文
図18
日本語にするには...
  • [オフラインヘルプの表示] にする

リスト11
[ヘルプとサポートセンター] ダイアログを表示
unit Shell_HelpUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleServer, Shell32_TLB, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Shell1: TShell;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//=============================================================================
//  ShellオブジェクトのHelpの使用例
//  [Windowsヘルプとサポート]ダイアログを表示
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
  Shell1.Help;
end;

end.




12_CreateOLEObject 関数


上のリストでは,Sehll オブジェクトを [タイプライブラリの取り込み] でコンポーネントにして使用していますが,[タイプライブラリの取り込み] を行わなくても,CreateOLEObject で Shell オブジェクトを生成することができます.変数類は全て OleVariant 型で扱うことになります.コード補完機能は利用できません.


リスト12
CreateOLEObject の使用には uses に ComObj が必要
Unassigned は実行しておいた方がよい
//=============================================================================
//  ShellオブジェクトのMinimizeAllメソッドの使用例
//  デスクトップ上の全てのウィンドウを最小化する
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  ObjShell : OleVariant;
begin
  //COMオブジェクトを生成
  ObjShell := CreateOleObject('Shell.Application');
  //MinimizeAll関数(メソッド)を実行
  ObjShell.MinimizeAll;
  //COMオブジェクトの割当を解除
  ObjShell := Unassigned;
end;

//=============================================================================
//  ShellオブジェクトのUndoMinimizeAllメソッドの使用例
//  MinimizeAllメソッドで最小化したウィンドウを元の状態に戻す
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
  ObjShell : OleVariant;
begin
  //COMオブジェクトを生成
  ObjShell := CreateOleObject('Shell.Application');
  //UndoMinimizeALL関数(メソッド)を実行
  ObjShell.UndoMinimizeALL;
  //COMオブジェクトの割当を解除
  ObjShell := Unassigned;
end;