⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 selfolderform.pas

📁 源代码
💻 PAS
字号:
unit SelFolderForm;

{
  Inno Setup
  Copyright (C) 1997-2004 Jordan Russell
  Portions by Martijn Laan
  For conditions of distribution and use, see LICENSE.TXT.

  "Select Folder" form

  $jrsoftware: issrc/Projects/SelFolderForm.pas,v 1.11 2004/07/02 23:04:44 jr Exp $
}

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  SetupForm, StdCtrls, FolderTreeView, NewStaticText;

type
  TSelectFolderForm = class(TSetupForm)
    BrowseLabel: TNewStaticText;
    PathEdit: TEdit;
    NewFolderButton: TButton;
    OKButton: TButton;
    CancelButton: TButton;
    procedure PathEditChange(Sender: TObject);
    procedure NewFolderButtonClick(Sender: TObject);
  private
    { Private declarations }
    FFolderTreeView: TCustomFolderTreeView;
    FNewFolderName: String;
    FStartMenu, FAppendDir: Boolean;
    procedure FolderTreeViewChange(Sender: TObject);
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
    constructor Create2(AOwner: TComponent; AStartMenu: Boolean);
  end;

function ShowSelectFolderDialog(const StartMenu, AppendDir: Boolean;
  var Path: String; const NewFolderName: String): Boolean;

implementation

uses
  PathFunc, Msgs, MsgIDs, Main, SetupTypes, Wizard;

{$R *.DFM}

function ShowSelectFolderDialog(const StartMenu, AppendDir: Boolean;
  var Path: String; const NewFolderName: String): Boolean;
var
  Form: TSelectFolderForm;
begin
  Form := TSelectFolderForm.Create2(nil, StartMenu);
  try
    Form.FAppendDir := AppendDir;
    Form.FNewFolderName := NewFolderName;
    Form.NewFolderButton.Visible := not AppendDir and (NewFolderName <> '');
    if StartMenu then begin
      with Form.FFolderTreeView as TStartMenuFolderTreeView do
        if IsNT then
          SetPaths(GetRealShellFolder(False, sfPrograms, False),
            GetRealShellFolder(True, sfPrograms, False),
            GetRealShellFolder(False, sfStartup, False),
            GetRealShellFolder(True, sfStartup, False))
        else
          SetPaths(GetRealShellFolder(False, sfPrograms, False),
            '', GetRealShellFolder(False, sfStartup, False), '');
    end;

    Path := TrimRight(RemoveBackslashUnlessRoot(PathRemoveExtraBackslashes(Trim(Path))));
    if AppendDir then begin
      if PathExtractDir(Path) <> Path then
        Form.FFolderTreeView.ChangeDirectory(PathExtractDir(Path), True);
    end
    else
      Form.FFolderTreeView.ChangeDirectory(Path, True);
    if StartMenu or (Form.FFolderTreeView.Directory <> '') then
      Form.ActiveControl := Form.FFolderTreeView;
    Form.PathEdit.Text := Path;

    Result := (Form.ShowModal = mrOK);
    if Result then
      Path := Trim(Form.PathEdit.Text);
  finally
    Form.Free;
  end;
end;

{ TSelectFolderForm }

constructor TSelectFolderForm.Create(AOwner: TComponent);
var
  W: Integer;
begin
  inherited;

  if not FStartMenu then begin
    FFolderTreeView := TFolderTreeView.Create(Self);
    TFolderTreeView(FFolderTreeView).OnChange := FolderTreeViewChange;
    TFolderTreeView(FFolderTreeView).OnRename := WizardForm.DirTreeRename;
  end
  else begin
    FFolderTreeView := TStartMenuFolderTreeView.Create(Self);
    TStartMenuFolderTreeView(FFolderTreeView).OnChange := FolderTreeViewChange;
    TStartMenuFolderTreeView(FFolderTreeView).OnRename := WizardForm.GroupTreeRename;
  end;
  FFolderTreeView.SetBounds(16, 64, 317, 229);
  FFolderTreeView.Visible := False;
  FFolderTreeView.Parent := Self;
  PathEdit.BringToFront;     { for MSAA }
  BrowseLabel.BringToFront;  { for MSAA }
  FFolderTreeView.TabOrder := 2;
  FFolderTreeView.Visible := True;

  InitializeFont;
  CenterInsideControl(WizardForm, False);

  Caption := SetupMessages[msgBrowseDialogTitle];
  BrowseLabel.Caption := SetupMessages[msgBrowseDialogLabel];
  NewFolderButton.Caption := SetupMessages[msgButtonNewFolder];
  NewFolderButton.Width := CalculateButtonWidth([msgButtonNewFolder]);
  W := CalculateButtonWidth([msgButtonOK, msgButtonCancel]);
  CancelButton.Caption := SetupMessages[msgButtonCancel];
  CancelButton.Left := CancelButton.Left + CancelButton.Width - W;
  CancelButton.Width := W;
  OKButton.Caption := SetupMessages[msgButtonOK];
  OKButton.Left := CancelButton.Left - ScalePixelsX(6) - W;
  OKButton.Width := W;
end;

constructor TSelectFolderForm.Create2(AOwner: TComponent; AStartMenu: Boolean);
begin
  FStartMenu := AStartMenu;
  Create(AOwner);
end;

procedure TSelectFolderForm.PathEditChange(Sender: TObject);
begin
  OKButton.Enabled := (Trim(PathEdit.Text) <> '');
end;

procedure TSelectFolderForm.FolderTreeViewChange(Sender: TObject);
begin
  if FAppendDir then
    PathEdit.Text := AddBackslash(FFolderTreeView.Directory) + FNewFolderName
  else
    PathEdit.Text := FFolderTreeView.Directory;
  NewFolderButton.Enabled := FStartMenu or (FFolderTreeView.Directory <> '');
end;

procedure TSelectFolderForm.NewFolderButtonClick(Sender: TObject);
begin
  FFolderTreeView.CreateNewDirectory(FNewFolderName);
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -