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
実行画面 |
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
実行画面 |
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
実行画面 |
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.
| デスクトップ上のウィンドウを全て最小化または、最小化したウィンドウを元に戻します。 |
[備考]
全てのウインドウの最小化と最小化したウィンドウを元に戻すのは、[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.
| 上のリストでは、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;
|