Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Ветеран


Сообщения: 517
Благодарности: 314

Профиль | Отправить PM | Цитировать


ZVSRus,
Скрытый текст
Имена папок к логике скрипта не имеют никакого отношения. Инсталятору указано автоматически подставлять имя последней папки в пути установки. Данный скрипт вполне самодостаточен, однако имена каталогов в нем указаны, лишь для примера того, как все это будет работать. Как оперировать с именами каталогов в скрипте - это уже ваше дело.
===================================================================================

Код: Выделить весь код
#define Name "Test"

[Setup]
SourceDir=.
OutputDir=Setup
AppName=Test
AppVerName=Test
DefaultDirName={pf}\Test
DefaultGroupName=Test
OutputBaseFilename=Setup
AllowNoIcons=true

[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl

[Files]
Source: {win}\help\*; DestDir: {app}\Files; Flags: external recursesubdirs createallsubdirs;

[Icons]
Name: {group}\MyProg; Filename: {app}; WorkingDir: {app}

[CustomMessages]
russian.RestoreButton=Сброс

[Code]
var
  ISCustomPage1: TWizardPage;
  Installer: TNewRadioButton;
  Portable: TNewRadioButton;

  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  _szPath: String;
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////

procedure RedesignWizardForm;
begin
  ISCustomPage1 := CreateCustomPage(wpWelcome, 'ISCustomPage1_Caption', 'ISCustomPage1_Description');

  { Installer }
  Installer := TNewRadioButton.Create(WizardForm);
  with Installer do
  begin
    Parent := ISCustomPage1.Surface;
    Left := ScaleX(16);
    Top := ScaleY(32);
    Width := ScaleX(113);
    Height := ScaleY(17);
    Caption := 'Установка';
    Checked := True;
  end;

  { Portable }
  Portable := TNewRadioButton.Create(WizardForm);
  with Portable do
  begin
    Parent := ISCustomPage1.Surface;
    Left := ScaleX(16);
    Top := ScaleY(72);
    Width := ScaleX(113);
    Height := ScaleY(17);
    Caption := 'Распаковка';
  end;

  Installer.TabOrder := 0;
  Portable.TabOrder := 1;
end;

#define A = (Defined UNICODE) ? "W" : "A"

const
  DRIVE_CDROM = 5;

var
  BrowseForm: TSetupForm;
  BrowseForm2: TSetupForm;
  DirTreeView: TFolderTreeView;
  DirFolderTreeView: TStartMenuFolderTreeView;
  EditTreeView: TNewEdit;
  EditFolderTreeView: TNewEdit;
  DB_Button: TNewButton;
  GB_Button: TNewButton;
  OldEvent_NoIconsCheckClick: TNotifyEvent;
  OKButton, ButtonNewFolder: TButton;

function GetDriveType(nDrive: string): Longint; external 'GetDriveType{#A}@kernel32.dll stdcall';


////////////////////////////////////////////////////////////////////////////////////////////////
function _szNameLastFolder( const _szPath: String ): String;
{ _szPath: path from which you want to get the name of the last folder }
{ Declared local variables }
var
    _i: Integer;
    _nLen: Integer;
    _szBuff: String;
begin
    _szBuff := RemoveBackslash( _szPath );
    _nLen := Length( _szBuff );

    for _i := _nLen downto 1 do
      begin
          if ( _szBuff[_i] = '\' ) then
            Break; { Stumbled upon a slash , stop the cycle }

          Result := Format( '%s%s', [Result, _szBuff[_i]] );
      end;

    _szBuff := Result;
    Result := '';
    _nLen := Length( _szBuff );

    for _i := _nLen downto 1 do
      Result := Format( '%s%s', [Result, _szBuff[_i]] );
end;
////////////////////////////////////////////////////////////////////////////////////////////////


function CDROM(Drive: String): Boolean;
begin
  Result:= GetDriveType(Drive) = 5;
end;

procedure GetDrive(Sender: TObject);
var
  Path, Path1: String;
begin
  Path:= ExtractFileDrive(DirTreeView.Directory);
  Path1:= ExtractFileDrive(EditTreeView.Text);
  ButtonNewFolder.Enabled:= not CDROM(Path);
  OKButton.Enabled:= not CDROM(Path1);
    if CDROM(Path1) then MsgBox('Установка на выбранный диск невозможна!', mbError, MB_OK);
end;

procedure DirTreeViewChange(Sender: TObject);
begin
  if DirTreeView.Directory <> WizardForm.DirEdit.Text then begin

    /////////////////////////////////////////////////////////////////////////////////////////////////////////
    EditTreeView.Text := AddBackslash(DirTreeView.Directory) + _szNameLastFolder( _szPath );
    /////////////////////////////////////////////////////////////////////////////////////////////////////////

    GetDrive(nil);
  end else
    EditTreeView.Text := DirTreeView.Directory;
end;

procedure DirFolderTreeViewChange(Sender: TObject);
begin
  if DirFolderTreeView.Directory <> WizardForm.GroupEdit.Text then
  EditFolderTreeView.Text := AddBackslash(DirFolderTreeView.Directory) + '{#Name}' else
  EditFolderTreeView.Text := DirFolderTreeView.Directory;
end;

procedure BrowseFormButtonsTreeViewOnClick(Sender: TObject);
begin
  case TButton(Sender).Tag of
    1:  begin

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    EditTreeView.Text := _szPath;
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    GetDrive(nil);
  end;
    2:  begin
    DirTreeView.CreateNewDirectory(SetupMessage(msgNewFolderName));

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    EditTreeView.Text := AddBackslash(DirTreeView.Directory) + _szNameLastFolder( _szPath );
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        end;

    3:  if EditTreeView.Text <> WizardForm.DirEdit.Text then WizardForm.DirEdit.Text := EditTreeView.Text;
  end;
end;

procedure BrowseFormButtonsFolderTreeViewOnClick(Sender: TObject);
begin
  case TButton(Sender).Tag of
    4:  EditFolderTreeView.Text := RemoveBackslashUnlessRoot(ExpandConstant('{#Name}'));

    5:  begin
          DirFolderTreeView.CreateNewDirectory(SetupMessage(msgNewFolderName));
          EditFolderTreeView.Text := AddBackslash(DirFolderTreeView.Directory) + '{#Name}';
        end;

    6:  if EditFolderTreeView.Text <> WizardForm.GroupEdit.Text then WizardForm.GroupEdit.Text := EditFolderTreeView.Text;
  end;
end;

procedure BrowseDirTreeViewClick(Sender: TObject);
begin
  BrowseForm := CreateCustomForm();
  with BrowseForm do
  begin
    Width := ScaleX(413);
    Height := ScaleY(361);
    Caption := SetupMessage(msgBrowseDialogTitle);
    Position := poScreenCenter;

    with TLabel.Create(nil) do
    begin
      SetBounds(ScaleX(12), ScaleY(12), ScaleX(207), ScaleY(16));
      Caption := SetupMessage(msgBrowseDialogLabel);
      Parent := BrowseForm;
      Font.Size := 8;
    end;

    DirTreeView := TFolderTreeView.Create(nil)
    with DirTreeView do
    begin
      SetBounds(ScaleX(16), ScaleY(64), ScaleX(375), ScaleY(225));
      OnChange := @DirTreeViewChange;
      Parent := BrowseForm;
    end;

    EditTreeView := TNewEdit.Create(nil);
    with EditTreeView do
    begin
      SetBounds(ScaleX(16), ScaleY(36), ScaleX(376), ScaleY(21));
      Text := DirTreeView.Directory;
      Parent := BrowseForm;
      Font.Color := clWindowText;
    end;

    with TButton.Create(nil) do
    begin
      SetBounds(ScaleX(16), ScaleY(301), ScaleX(90), ScaleX(23));
      Parent := BrowseForm;
      Caption := SetupMessage(msgButtonCancel);
      ModalResult := mrCancel;
    end;

    with TButton.Create(nil) do
    begin
      SetBounds(ScaleX(111), ScaleY(301), ScaleX(90), ScaleY(23));
      Parent := BrowseForm;
      Caption := ExpandConstant('{cm:RestoreButton}');
      Tag := 1;
      OnClick := @BrowseFormButtonsTreeViewOnClick;
    end;

    ButtonNewFolder:= TButton.Create(nil)
    with ButtonNewFolder do
    begin
      SetBounds(ScaleX(206), ScaleY(301), ScaleX(90), ScaleY(23));
      Parent := BrowseForm;
      Caption := SetupMessage(msgButtonNewFolder);
      Tag := 2;
      OnClick := @BrowseFormButtonsTreeViewOnClick;
    end;

    OKButton:= TButton.Create(nil);
    with OKButton do
    begin
      SetBounds(ScaleX(301), ScaleY(301), ScaleX(90), ScaleY(23));
      Parent := BrowseForm;
      Caption := SetupMessage(msgButtonOK);
      Tag := 3;
      OnClick := @BrowseFormButtonsTreeViewOnClick;
      ModalResult := mrOk;
    end;

    DirTreeView.ChangeDirectory(AddBackslash(WizardForm.DirEdit.Text), True);
    ShowModal;
    Free;
  end;
end;

procedure BrowseDirFolderTreeViewClick(Sender: TObject);
begin
  BrowseForm2 := CreateCustomForm();
  with BrowseForm2 do
  begin
    Width := ScaleX(413);
    Height := ScaleY(361);
    Caption := SetupMessage(msgBrowseDialogTitle);
    Position := poScreenCenter;

    with TLabel.Create(nil) do
    begin
      SetBounds(ScaleX(12), ScaleY(12), ScaleX(207), ScaleY(16));
      Caption := SetupMessage(msgBrowseDialogLabel);
      Parent := BrowseForm2;
      Font.Size := 8;
    end;

    DirFolderTreeView := TStartMenuFolderTreeView.Create(nil)
    with DirFolderTreeView do
    begin
      SetBounds(ScaleX(16), ScaleY(64), ScaleX(375), ScaleY(225));
      SetPaths(ExpandConstant('{userprograms}'),ExpandConstant('{commonprograms}'),ExpandConstant('{userstartup}'),ExpandConstant('{commonstartup}'));
      OnChange := @DirFolderTreeViewChange;
      Parent := BrowseForm2;
    end;

    EditFolderTreeView := TNewEdit.Create(nil);
    with EditFolderTreeView do
    begin
      SetBounds(ScaleX(16), ScaleY(36), ScaleX(376), ScaleY(21));
      Text := DirFolderTreeView.Directory;
      Parent := BrowseForm2;
      Font.Color := clWindowText;
    end;

    with TButton.Create(nil) do
    begin
      SetBounds(ScaleX(16), ScaleY(301), ScaleX(90), ScaleX(23));
      Parent := BrowseForm2;
      Caption := SetupMessage(msgButtonCancel);
      ModalResult := mrCancel;
    end;

    with TButton.Create(nil) do
    begin
      SetBounds(ScaleX(111), ScaleY(301), ScaleX(90), ScaleY(23));
      Parent := BrowseForm2;
      Caption := ExpandConstant('{cm:RestoreButton}');
      Tag := 4;
      OnClick := @BrowseFormButtonsFolderTreeViewOnClick;
    end;

    with TButton.Create(nil) do
    begin
      SetBounds(ScaleX(206), ScaleY(301), ScaleX(90), ScaleY(23));
      Parent := BrowseForm2;
      Caption := SetupMessage(msgButtonNewFolder);
      Tag := 5;
      OnClick := @BrowseFormButtonsFolderTreeViewOnClick;
    end;

    with TButton.Create(nil) do
    begin
      SetBounds(ScaleX(301), ScaleY(301), ScaleX(90), ScaleY(23));
      Parent := BrowseForm2;
      Caption := SetupMessage(msgButtonOK);
      Tag := 6;
      OnClick := @BrowseFormButtonsFolderTreeViewOnClick;
      ModalResult := mrOk;
    end;

    DirFolderTreeView.ChangeDirectory(AddBackslash(WizardForm.GroupEdit.Text), True);
    ShowModal;
    Free;
  end;
end;

procedure NoIconsCheckClick(Sender: TObject);
 begin
   OldEvent_NoIconsCheckClick(Sender);
   GB_Button.Enabled := not WizardForm.NoIconsCheck.Checked;
 end;

procedure InitializeWizard();
begin
  RedesignWizardForm;
  OldEvent_NoIconsCheckClick := WizardForm.NoIconsCheck.OnClick;
  WizardForm.NoIconsCheck.OnClick := @NoIconsCheckClick;

  WizardForm.DirBrowseButton.Hide;
  DB_Button := TNewButton.create(WizardForm);
  with DB_Button do
  begin
    Parent := WizardForm.SelectDirPage;
    SetBounds(WizardForm.DirBrowseButton.Left, WizardForm.DirBrowseButton.Top, WizardForm.DirBrowseButton.Width, WizardForm.DirBrowseButton.Height - ScaleY(1));
    Caption := SetupMessage(msgButtonBrowse);
    OnClick := @BrowseDirTreeViewClick;
  end;

  WizardForm.GroupBrowseButton.Hide;
  GB_Button := TNewButton.create(WizardForm);
  with GB_Button do
  begin
    Parent := WizardForm.SelectProgramGroupPage;
    SetBounds(WizardForm.GroupBrowseButton.Left, WizardForm.GroupBrowseButton.Top, WizardForm.GroupBrowseButton.Width, WizardForm.GroupBrowseButton.Height - ScaleY(1));
    Caption := SetupMessage(msgButtonBrowse);
    OnClick := @BrowseDirFolderTreeViewClick;
  end;
end;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure CurPageChanged(CurPageID: Integer);
begin
  case CurPageID of
      wpSelectDir:
      begin
          case Installer.Checked of
              False: _szPath := ( AddBackslash(ExpandConstant('{src}')) + '{#Name}Portable' );
              True: _szPath := RemoveBackslashUnlessRoot(ExpandConstant('{#SetupSetting("DefaultDirName")}') );
          end;

          WizardForm.DirEdit.Text := _szPath;
      end;
  end;
end;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

[ISFormDesigner]
WizardForm=FF0A005457495A415244464F524D003010C403000054504630F10B5457697A617264466F726D0A57697A617264466F726D0C436C69656E744865696768740368010B436C69656E74576964746803F1010C4578706C696369744C65667402000B4578706C69636974546F7002000D4578706C6963697457696474680301020E4578706C69636974486569676874038E010D506978656C73506572496E636802600A54657874486569676874020D00F10C544E65774E6F7465626F6F6B0D4F757465724E6F7465626F6F6B00F110544E65774E6F7465626F6F6B506167650B57656C636F6D6550616765084E65787450616765070D4953437573746F6D50616765310D4578706C69636974576964746803F1010E4578706C696369744865696768740339010000F110544E65774E6F7465626F6F6B5061676509496E6E6572506167650D4578706C69636974576964746803F1010E4578706C6963697448656967687403390100F10C544E65774E6F7465626F6F6B0D496E6E65724E6F7465626F6F6B00F110544E65774E6F7465626F6F6B506167650B4C6963656E7365506167650C50726576696F757350616765070D4953437573746F6D50616765310D4578706C69636974576964746803A1010E4578706C6963697448656967687403ED000000F110544E65774E6F7465626F6F6B506167650D53656C65637
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:47, 02-02-2016 | #1283