📄 shellctrls.pas
字号:
{*********************************************************}
{ }
{ Borland Delphi Visual Component Library }
{ }
{ Copyright (c) 1995, 2001-2002 Borland Corporation }
{ }
{*********************************************************}
unit ShellCtrls platform;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, CommCtrl, ShlObj, ActiveX, StdCtrls, ImgList;
type
TRoot = type string;
TRootFolder = (rfDesktop, rfMyComputer, rfNetwork, rfRecycleBin, rfAppData,
rfCommonDesktopDirectory, rfCommonPrograms, rfCommonStartMenu, rfCommonStartup,
rfControlPanel, rfDesktopDirectory, rfFavorites, rfFonts, rfInternet, rfPersonal,
rfPrinters, rfPrintHood, rfPrograms, rfRecent, rfSendTo, rfStartMenu, rfStartup,
rfTemplates);
TShellFolderCapability = (fcCanCopy, fcCanDelete, fcCanLink, fcCanMove, fcCanRename,
fcDropTarget, fcHasPropSheet);
TShellFolderCapabilities = set of TShellFolderCapability;
TShellFolderProperty = (fpCut, fpIsLink, fpReadOnly, fpShared, fpFileSystem,
fpFileSystemAncestor, fpRemovable, fpValidate);
TShellFolderProperties = set of TShellFolderProperty;
TShellObjectType = (otFolders, otNonFolders, otHidden);
TShellObjectTypes = set of TShellObjectType;
EInvalidPath = class(Exception);
IShellCommandVerb = interface
['{7D2A7245-2376-4D33-8008-A130935A2E8B}']
procedure ExecuteCommand(Verb: string; var Handled: boolean);
procedure CommandCompleted(Verb: string; Succeeded: boolean);
end;
TShellFolder = class
private
FPIDL,
FFullPIDL: PItemIDList;
FParent: TShellFolder;
FIShellFolder: IShellFolder;
FIShellFolder2: IShellFolder2;
FIShellDetails: IShellDetails;
FDetailInterface: IInterface;
FLevel: Integer;
FViewHandle: THandle;
FDetails: TStrings;
function GetDetailInterface: IInterface;
function GetShellDetails: IShellDetails;
function GetShellFolder2: IShellFolder2;
function GetDetails(Index: integer): string;
procedure SetDetails(Index: integer; const Value: string);
procedure LoadColumnDetails(RootFolder: TShellFolder; Handle: THandle; ColumnCount: integer);
public
constructor Create(AParent: TShellFolder; ID: PItemIDList;
SF: IShellFolder); virtual;
destructor Destroy; override;
function Capabilities: TShellFolderCapabilities;
function DisplayName: string;
function ExecuteDefault: Integer;
function ImageIndex(LargeIcon: Boolean): Integer;
function IsFolder: Boolean;
function ParentShellFolder: IShellFolder;
function PathName: string;
function Properties: TShellFolderProperties;
function Rename(const NewName: WideString): boolean;
function SubFolders: Boolean;
property AbsoluteID: PItemIDLIst read FFullPIDL;
property Details[Index: integer] : string read GetDetails write SetDetails;
property Level: Integer read FLevel;
property Parent: TShellFolder read FParent;
property RelativeID: PItemIDList read FPIDL;
property ShellFolder: IShellFolder read FIShellFolder;
property ShellFolder2: IShellFolder2 read GetShellFolder2;
property ShellDetails: IShellDetails read GetShellDetails;
property ViewHandle: THandle read FViewHandle write FViewHandle;
end;
TNotifyFilter = (nfFileNameChange, nfDirNameChange, nfAttributeChange,
nfSizeChange, nfWriteChange, nfSecurityChange);
TNotifyFilters = set of TNotifyFilter;
TShellChangeThread = class(TThread)
private
FMutex,
FWaitHandle: Integer;
FChangeEvent: TThreadMethod;
FDirectory: string;
FWatchSubTree: Boolean;
FWaitChanged : Boolean;
FNotifyOptionFlags: DWORD;
protected
procedure Execute; override;
public
constructor Create(ChangeEvent: TThreadMethod); virtual;
destructor Destroy; override;
procedure SetDirectoryOptions( Directory : String; WatchSubTree : Boolean;
NotifyOptionFlags : DWORD);
property ChangeEvent : TThreadMethod read FChangeEvent write FChangeEvent;
end;
TCustomShellChangeNotifier = class(TComponent)
private
FFilters: TNotifyFilters;
FWatchSubTree: Boolean;
FRoot : TRoot;
FThread: TShellChangeThread;
FOnChange: TThreadMethod;
procedure SetRoot(const Value: TRoot);
procedure SetWatchSubTree(const Value: Boolean);
procedure SetFilters(const Value: TNotifyFilters);
procedure SetOnChange(const Value: TThreadMethod);
protected
procedure Change;
procedure Start;
public
constructor Create(AOwner : TComponent); override;
destructor Destroy; override;
property NotifyFilters: TNotifyFilters read FFilters write SetFilters;
property Root: TRoot read FRoot write SetRoot;
property WatchSubTree: Boolean read FWatchSubTree write SetWatchSubTree;
property OnChange: TThreadMethod read FOnChange write SetOnChange;
end;
TShellChangeNotifier = class(TCustomShellChangeNotifier)
published
property NotifyFilters;
property Root;
property WatchSubTree;
property OnChange;
end;
TCustomShellComboBox = class;
TCustomShellListView = class;
TAddFolderEvent = procedure(Sender: TObject; AFolder: TShellFolder;
var CanAdd: Boolean) of object;
TGetImageIndexEvent = procedure(Sender: TObject; Index: Integer;
var ImageIndex: Integer) of object;
{ TCustomShellTreeView }
TCustomShellTreeView = class(TCustomTreeView, IShellCommandVerb)
private
FRoot,
FOldRoot : TRoot;
FRootFolder: TShellFolder;
FObjectTypes: TShellObjectTypes;
FImages: Integer;
FLoadingRoot,
FAutoContext,
FUpdating: Boolean;
FComboBox: TCustomShellComboBox;
FListView: TCustomShellListView;
FAutoRefresh,
FImageListChanging,
FUseShellImages: Boolean;
FNotifier: TShellChangeNotifier;
FOnAddFolder: TAddFolderEvent;
FSavePath: string;
FNodeToMonitor: TTreeNode;
function FolderExists(FindID: PItemIDList; InNode: TTreeNode): TTreeNode;
function GetFolder(Index: Integer): TShellFolder;
function GetPath: string;
procedure SetComboBox(Value: TCustomShellComboBox);
procedure SetListView(const Value: TCustomShellListView);
procedure SetPath(const Value: string);
procedure SetPathFromID(ID: PItemIDList);
procedure SetRoot(const Value: TRoot);
procedure SetUseShellImages(const Value: Boolean);
procedure SetAutoRefresh(const Value: boolean);
protected
function CanChange(Node: TTreeNode): Boolean; override;
function CanExpand(Node: TTreeNode): Boolean; override;
procedure CreateRoot;
procedure CreateWnd; override;
procedure DestroyWnd; override;
procedure DoContextPopup(MousePos: TPoint; var Handled: Boolean); override;
procedure Edit(const Item: TTVItem); override;
procedure GetImageIndex(Node: TTreeNode); override;
procedure GetSelectedIndex(Node: TTreeNode); override;
procedure InitNode(NewNode: TTreeNode; ID: PItemIDList; ParentNode: TTreeNode);
procedure Loaded; override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
procedure Delete(Node: TTreeNode); override;
//! procedure NodeDeleted(Sender: TObject; Node: TTreeNode);
function NodeFromAbsoluteID(StartNode: TTreeNode; ID: PItemIDList): TTreeNode;
function NodeFromRelativeID(ParentNode: TTreeNode; ID: PItemIDList): TTreeNode;
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
procedure PopulateNode(Node: TTreeNode);
procedure RootChanged;
procedure SetObjectTypes(Value: TShellObjectTypes); virtual;
procedure WMDestroy(var Message: TWMDestroy); virtual;
procedure WndProc(var Message: TMessage); override;
procedure ClearItems;
procedure RefreshEvent;
public
constructor Create(AOwner: TComponent); override;
procedure Refresh(Node: TTreeNode);
function SelectedFolder: TShellFolder;
property AutoRefresh: boolean read FAutoRefresh write SetAutoRefresh;
property Folders[Index: Integer]: TShellFolder read GetFolder; default;
property Items;
property Path: string read GetPath write SetPath;
property AutoContextMenus: Boolean read FAutoContext write FAutoContext default True;
property ObjectTypes: TShellObjectTypes read FObjectTypes write SetObjectTypes;
property Root: TRoot read FRoot write SetRoot;
property ShellComboBox: TCustomShellComboBox read FComboBox write SetComboBox;
property ShellListView: TCustomShellListView read FListView write SetListView;
property UseShellImages: Boolean read FUseShellImages write SetUseShellImages;
property OnAddFolder: TAddFolderEvent read FOnAddFolder write FOnAddFolder;
procedure CommandCompleted(Verb: String; Succeeded: Boolean);
procedure ExecuteCommand(Verb: String; var Handled: Boolean);
end;
{ TShellTreeView }
TShellTreeView = class(TCustomShellTreeView)
published
property AutoContextMenus;
property ObjectTypes;
property Root;
property ShellComboBox;
property ShellListView;
property UseShellImages;
property OnAddFolder;
property Align;
property Anchors;
property AutoRefresh;
property BorderStyle;
property ChangeDelay;
property Color;
property Ctl3D;
property Cursor;
property DragCursor;
property DragMode;
property Enabled;
property Font;
property HideSelection;
property Images;
property Indent;
property ParentColor;
property ParentCtl3D;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property RightClickSelect;
property ShowButtons;
property ShowHint;
property ShowLines;
property ShowRoot;
property StateImages;
property TabOrder;
property TabStop default True;
property Visible;
property OnClick;
property OnEnter;
property OnExit;
property OnDragDrop;
property OnDragOver;
property OnStartDrag;
property OnEndDrag;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnDblClick;
property OnKeyDown;
property OnKeyPress;
property OnKeyUp;
property OnChanging;
property OnChange;
property OnExpanding;
property OnCollapsing;
property OnCollapsed;
property OnExpanded;
property OnEditing;
property OnEdited;
property OnGetImageIndex;
property OnGetSelectedIndex;
end;
{ TCustomShellComboBox }
TCustomShellComboBox = class(TCustomComboBoxEx)
private
FImages,
FImageHeight,
FImageWidth: Integer;
FImageList: TCustomImageList;
FOldRoot : TRoot;
FRoot: TRoot;
FRootFolder: TShellFolder;
FTreeView: TCustomShellTreeView;
FListView: TCustomShellListView;
FObjectTypes: TShellObjectTypes;
FUseShellImages,
FUpdating: Boolean;
FOnGetImageIndex: TGetImageIndexEvent;
procedure ClearItems;
function GetFolder(Index: Integer): TShellFolder;
function GetPath: string;
procedure SetPath(const Value: string);
procedure SetPathFromID(ID: PItemIDList);
procedure SetRoot(const Value: TRoot);
procedure SetTreeView(Value: TCustomShellTreeView);
procedure SetListView(Value: TCustomShellListView);
procedure SetUseShellImages(const Value: Boolean);
function GetShellImageIndex(AFolder: TShellFolder): integer;
protected
procedure AddItems(Index: Integer; ParentFolder: TShellFolder);
procedure Change; override;
procedure Click; override;
procedure CreateRoot;
procedure CreateWnd; override;
procedure DestroyWnd; override;
function IndexFromID(AbsoluteID: PItemIDList): Integer;
procedure Init; virtual;
function InitItem(ParentFolder: TShellFolder; ID: PItemIDList): TShellFolder;
procedure Loaded; override;
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
procedure RootChanged;
procedure TreeUpdate(NewPath: PItemIDList);
procedure SetObjectTypes(Value: TShellObjectTypes); virtual;
//!procedure WMDestroy(var Message: TWMDestroy); message WM_DESTROY;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
property Items;
property Path: string read GetPath write SetPath;
property Folders[Index: Integer]: TShellFolder read GetFolder;
property Root: TRoot read FRoot write SetRoot;
property ObjectTypes: TShellObjectTypes read FObjectTypes write SetObjectTypes;
property ShellTreeView: TCustomShellTreeView read FTreeView write SetTreeView;
property ShellListView: TCustomShellListView read FListView write SetListView;
property UseShellImages: Boolean read FUseShellImages write SetUseShellImages;
property OnGetImageIndex: TGetImageIndexEvent read FOnGetImageIndex write FOnGetImageIndex;
end;
{ TShellComboBox }
TShellComboBox = class(TCustomShellComboBox)
published
property Images;
property Root;
property ShellTreeView;
property ShellListView;
property UseShellImages;
property OnGetImageIndex;
property Anchors;
property BiDiMode;
property Color;
property Constraints;
property Ctl3D;
property DragCursor;
property DragKind;
property DragMode;
property DropDownCount;
property Enabled;
property Font;
property ImeMode;
property ImeName;
property MaxLength;
property ParentBiDiMode;
property ParentColor;
property ParentCtl3D;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property ShowHint;
property TabOrder;
property TabStop;
property Visible;
property OnChange;
property OnClick;
property OnDblClick;
property OnDragDrop;
property OnDragOver;
property OnDropDown;
property OnEndDock;
property OnEndDrag;
property OnEnter;
property OnExit;
property OnKeyDown;
property OnKeyPress;
property OnKeyUp;
property OnStartDock;
property OnStartDrag;
end;
{ TCustomShellListView }
TCustomShellListView = class(TCustomListView, IShellCommandVerb)
private
FOldRoot: TRoot;
FRoot: TRoot;
FRootFolder: TShellFolder;
FAutoContext,
FAutoRefresh,
FAutoNavigate,
FSorted,
FUpdating: Boolean;
FObjectTypes: TShellObjectTypes;
FLargeImages,
FSmallImages: Integer;
FOnAddFolder: TAddFolderEvent;
FFolders: TList;
FTreeView: TCustomShellTreeView;
FComboBox: TCustomShelLComboBox;
FNotifier: TShellChangeNotifier;
FOnEditing: TLVEditingEvent;
FSettingRoot: boolean;
FSavePath: string;
procedure EnumColumns;
function GetFolder(Index: Integer): TShellFolder;
procedure SetAutoRefresh(const Value: Boolean);
procedure SetSorted(const Value: Boolean);
procedure SetTreeView(Value: TCustomShellTreeView);
procedure SetComboBox(Value: TCustomShellComboBox);
procedure TreeUpdate(NewRoot: PItemIDList);
procedure SetPathFromID(ID: PItemIDList);
procedure SynchPaths;
protected
procedure ClearItems;
procedure CreateRoot;
procedure CreateWnd; override;
procedure DestroyWnd; override;
procedure DblClick; override;
procedure DoContextPopup(MousePos: TPoint; var Handled: Boolean); override;
procedure EditText;
procedure Edit(const Item: TLVItem); override;
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
procedure Loaded; override;
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -