Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » [архив] Скрипты Inno Setup. Помощь и советы [часть 2]

Закрытая тема
Настройки темы
[архив] Скрипты Inno Setup. Помощь и советы [часть 2]

Ветеран


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


Конфигурация

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


Изменения
Автор: jameszero
Дата: 08-11-2010
Описание: тема закрыта
Лимит страниц.
Тема закрыта.
Продолжение по ссылке Скрипты Inno Setup. Помощь и советы [часть 3]




Внимание! Данная тема предназначена только для обсуждения написания скриптов !
Остальные вопросы, а также последние версии компилятора в теме
Inno Setup. Прочие вопросы.


Показать/скрыть: Справка, руководство, примеры:
Показать/скрыть: Ссылки на примеры скриптов:
Показать/скрыть: Дополнительные программы для Inno Setup:
  • ISTool - неплохой редактор скриптов Inno Setup.
    Последняя версия: 5.3.0.1 [29.09.2009] - Скачать | зеркало;
    Предыдущая версия: 5.3.0 [07.04.2009] - Скачать (зеркало) | Русификатор (зеркало);

  • Inno Script Generator - ещё один редактор скриптов Inno Setup. Обладает некоторыми полезными функциями, которых нет ни у самого Inno Setup, ни у ISTool.
    Последняя версия: 1.0.3.1 [23.03.2008] - Скачать;

  • Inno Setup Form Designer - редактор страниц Inno Setup, можно создавать свои страницы. Официальный сайт - недоступен.
    Последняя версия: 2.0.8 [12.11.2006] - Страница с зеркалами;

  • Inno Setup GameScript Generator - программа генерирует скрипты для Inno Setup . С помощью GameScript Generator и Inno Setup вы сможете быстро создать простенький инсталляционный пакет для любой игры. В инсталлятор можно встроить музыку, слайдшоу и фоновый рисунок. Для специалистов созданный скрипт, возможно, будет неплохой заготовкой для дальнейшей модернизации;

  • ISSkin - Программа для создания и добавления в инсталлятор скинов. Инструкция.
    Последняя версия: 3.0.0.0 [19.01.2010] - Скачать;

  • InnoSetup Script Joiner - Программа для объединения нескольких скриптов InnoSetup в один;

  • Converter - Программа конвертирует reg-файлы в формат *.iss (формат скриптов Inno Setup).
    Последняя версия: 0.1.3 [11.09.2009] - Скачать;


Ссылка на архив предыдущей темы (также можно скачать из вложения)

-------
Книги нужны, чтобы напоминать человеку, что его оригинальные мысли не так уж новы... Авраам Линкольн.


Отправлено: 22:06, 23-08-2009

 

Новый участник


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

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


Спасибо, <b>serg aka lain</b>, за отличный ответ!

Отправлено: 08:13, 10-12-2009 | #611



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Dark Engel

Старожил


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

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


Serega, Добрый день попытаюсь описать подробнее. в компании имеется большой набор софта. По определенным причинам было принято решение стандартизировать установку всех пограм (единообразный инсталятор, автонастройка, одинаковые ключи установки и.т.д.). Так как установкой софта будет заниматся скрипт то было было решено что сведения об установленных программах будут хранится в реестре примерно в таком виде

Код: Выделить весь код
HKLM\Software\UIT\FAP\
                     \proga1 (Reg_Dword) 1
                     \proga2 (Reg_Dword) 15
                     \proga3 (Reg_Dword) 3
Где ключ это признак установленности программы, а значение это версия. Если ключа нет вообще это значит что программа не стоит вообще.

-------

"Чем больше мы умнеем, тем больше понимаем что мы глупцы."


Последний раз редактировалось Dark Engel, 10-12-2009 в 08:34.


Отправлено: 08:20, 10-12-2009 | #612


Аватара для R.i.m.s.k.y.

Ветеран


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

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


Подскажите, пожалуйста, как засунуть код в цикл, необходимо для бэкапа реестра при установке и восстановлении при удалении

Код: Выделить весь код
procedure BackupReg();
var
res: Integer;
BackupDir, Key, RegEdit: string;
begin
RegEdit:= ExpandConstant('{win}\regedit.exe');
BackupDir:= ExpandConstant('{pf}\InstallShield Installation Information\$RimPackUninstall$\');
Key:= 'HKEY_LOCAL_MACHINE\SOFTWARE\GNU';
Exec(RegEdit, ' -ea 00.reg ' + AddQuotes(Key), BackupDir, SW_HIDE, ewNoWait, Res);
Key:= 'HKEY_CURRENT_USER\SOFTWARE\GNU';
Exec(RegEdit, ' -ea 01.reg ' + AddQuotes(Key), BackupDir, SW_HIDE, ewNoWait, Res);
и

Код: Выделить весь код
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
reg,RegEdit: string;
res: integer;
begin
RegEdit:= ExpandConstant('{sys}\reg.exe');
if CurUninstallStep = usPostUninstall then begin
reg:= ExpandConstant('{pf}\InstallShield Installation Information\$RimPackUninstall$\00.reg');
if FileExists(reg) = True then
Exec(RegEdit, ' import ' + AddQuotes(reg),ExpandConstant('{win}'),SW_HIDE,ewNoWait,res);
reg:= ExpandConstant('{pf}\InstallShield Installation Information\$RimPackUninstall$\01.reg');
if FileExists(reg) = True then
Exec(RegEdit, ' import ' + AddQuotes(reg),ExpandConstant('{win}'),SW_HIDE,ewNoWait,res);
Желательно для бэкапа предопределить массив строк с путями реестра (совсем хорошо если в итоге получится один файл - для этого в конце достаточно запустить copy 01.reg+02.reg+...+50.reg 000.reg в папке с бэкапами)

Примеры из InnoSetupScripts.7z пробовал - не получается запихать все в один цикл, у меня не одна ветка - их почти сорок.
Надо определить матрицу этих ключей и в цикле их обрабатывать. Но с Паскалем я на вы и шепотом.

Заранее благодарю!

-------
Хороший установщик тот, которого не замечаешь
Оформление в инно пустая трата времени: толку мало, головняка много, а ошибок истчо больше!


Последний раз редактировалось R.i.m.s.k.y., 10-12-2009 в 15:49. Причина: дополнение


Отправлено: 13:39, 10-12-2009 | #613


Новый участник


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

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


Здравствуйте..
Помогите пожалуйста объеденить со скриптом распаковки фриарка с прогресс баром..
читать дальше »
Код: Выделить весь код
const
  ButtonWidth = 80;
  ButtonHeight = 23;

  bidBack = 0;
  bidNext = 1;
  bidCancel = 2;
  bidDirBrowse = 3;
  bidGroupBrowse = 4;
  MaxLength = 48;
var
DirectX, Redist: TCheckBox;
Icons, Group: TCheckBox;
lblDirectX, lblSelectDir, lblSelectDirBrowse, lblRedist: TLabel;
lblIcons, lblGroup: TLabel;
PageNameLabel, PageDescriptionLabel: TLabel;
StatusLabel, FilenameLabel: TLabel;
WelcomeLabel1, WelcomeLabel2,
FinishedLabel, FinishedHeadingLabel: TLabel;
NeedSize:Integer;
FreeMB, TotalMB: Cardinal;
NeedSpaceLabel,FreeSpaceLabel: TLabel;
BmpFile: TBitmapImage;
ButtonPanel: array [0..4] of TPanel;
ButtonImage: array [0..4] of TBitmapImage;
ButtonLabel: array [0..4] of TLabel;
string: string;
  procedure ButtonLabelClick(Sender: TObject);
var
  Button: TButton;
begin
  ButtonImage[TLabel(Sender).Tag].Left:=0
  case TLabel(Sender).Tag of
    bidBack: Button:=WizardForm.BackButton
    bidNext: Button:=WizardForm.NextButton
    bidCancel: Button:=WizardForm.CancelButton
    bidDirBrowse: Button:=WizardForm.DirBrowseButton
    bidGroupBrowse: Button:=WizardForm.GroupBrowseButton
  else
    Exit
  end
  Button.OnClick(Button)
end;

procedure ButtonLabelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if ButtonLabel[TLabel(Sender).Tag].Enabled then
     ButtonImage[TLabel(Sender).Tag].Left:=-ButtonWidth
end;

procedure ButtonLabelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  ButtonImage[TLabel(Sender).Tag].Left:=0
end;

procedure LoadButtonImage(AButton: TButton; AButtonIndex: integer);
var
  Image: TBitmapImage;
  Panel: TPanel;
  Labl: TLabel;

begin
  Panel:=TPanel.Create(WizardForm)
  Panel.Left:=AButton.Left
  Panel.Top:=AButton.Top
  Panel.Width:=AButton.Width
  Panel.Height:=AButton.Height
  Panel.Tag:=AButtonIndex
  Panel.Parent:=AButton.Parent
  ButtonPanel[AButtonIndex]:=Panel

  Image:=TBitmapImage.Create(WizardForm)
  Image.Width:=160
  Image.Height:=23
  Image.Enabled:=False
  Image.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Button.bmp'))
  Image.Parent:=Panel
  ButtonImage[AButtonIndex]:=Image

with TLabel.Create(WizardForm) do begin
    Tag:=AButtonIndex
    Parent:=Panel
    Width:=Panel.Width
    Height:=Panel.Height
    Transparent:=True
    OnClick:=@ButtonLabelClick
    OnDblClick:=@ButtonLabelClick
    OnMouseDown:=@ButtonLabelMouseDown
    OnMouseUp:=@ButtonLabelMouseUp
end;

  Labl:=TLabel.Create(WizardForm)
  Labl.Left:=15
  Labl.Top:=5
  Labl.Autosize:=True
  Labl.Alignment:=taCenter
  Labl.Tag:=AButtonIndex
  Labl.Transparent:=True
  Labl.Font.Color:=clWhite
  Labl.Caption:=AButton.Caption
  Labl.OnClick:=@ButtonLabelClick
  Labl.OnDblClick:=@ButtonLabelClick
  Labl.OnMouseDown:=@ButtonLabelMouseDown
  Labl.OnMouseUp:=@ButtonLabelMouseUp
  Labl.Parent:=Panel
  ButtonLabel[AButtonIndex]:=Labl
end;

procedure UpdateButton(AButton: TButton;AButtonIndex: integer);
begin
  ButtonLabel[AButtonIndex].Caption:=AButton.Caption
  ButtonPanel[AButtonIndex].Visible:=AButton.Visible
  ButtonLabel[AButtonIndex].Enabled:=Abutton.Enabled
end;

procedure LicenceAcceptedRadioOnClick(Sender: TObject);
begin
  ButtonLabel[bidNext].Enabled:=True
end;

procedure LicenceNotAcceptedRadioOnClick(Sender: TObject);
begin
  ButtonLabel[bidNext].Enabled:=False
end;

function InstallDirectX: Boolean;
begin
Result:= DirectX.Checked;
end;

function InstallRedist: Boolean;
begin
Result:=Redist.Checked;
end;

function CreateIcons: Boolean;
begin
Result:=Icons.Checked;
end;

function GroupIcons: Boolean;
begin
Result:=Group.Checked;
end;

// задал процедуру, чтоб отмечался чебокс еси кликнуть по надписи lblCheckBox
procedure RedistOnClick(Sender: TObject);
begin
if Redist.Checked = False then
Redist.Checked:= True else
Redist.Checked:= False;
end;

procedure lblDirectXOnClick(Sender: TObject);
begin
if DirectX.Checked = False then
DirectX.Checked:= True else
DirectX.Checked:= False;
end;

procedure IconsOnClick(Sender: TObject);
begin
if Icons.Checked = False then
Icons.Checked:= True else
Icons.Checked:= False;
end;

procedure GroupOnClick(Sender: TObject);
begin
if Group.Checked = False then
Group.Checked:= True else
Group.Checked:= False;
end;

// задал процедуру, чтоб отмечался чебокс еси кликнуть по надписи lblCheckBox
//Свободное место
procedure GetFreeSpaceCaption(Sender: TObject);
var
Path: String;
begin
Path := ExtractFileDrive(WizardForm.DirEdit.Text);
GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
if FreeMB > 1024 then
FreeSpaceLabel.Caption := ExpandConstant('{cm:SPACE} ')+ FloatToStr(round(FreeMB/1024*100)/100) + ' GB' else
FreeSpaceLabel.Caption := ExpandConstant('{cm:SPACE} ')+ IntToStr(FreeMB)+ ' MB';
if FreeMB < NeedSize then
WizardForm.NextButton.Enabled := False else
WizardForm.NextButton.Enabled := True;
end;

procedure GetNeedSpaceCaption;
begin
if NeedSize > 1024 then
NeedSpaceLabel.Caption := ExpandConstant('{cm:SPACE1} ')+ FloatToStr(round(NeedSize/1024*100)/100) + ' GB' else
NeedSpaceLabel.Caption := ExpandConstant('{cm:SPACE1} ')+ IntToStr(NeedSize)+ ' MB';
end;
//Свободное место
procedure ProgressExt();
begin
FilenameLabel.Caption:= ExpandConstant(ExtractFileDir(CurrentFilename)) + '\' + ExtractFilename(CurrentFilename);
end;
//Загрузка скина
procedure LoadSkin(lpszPath: String; lpszIniFileName: String);
external 'LoadSkin@files:isskin.dll stdcall';

procedure UnloadSkin();
external 'UnloadSkin@files:isskin.dll stdcall';

function ShowWindow(hWnd: Integer; uType: Integer): Integer;
external 'ShowWindow@user32.dll stdcall';

function InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('Vista.cjstyles');
LoadSkin(ExpandConstant('{tmp}\Vista.cjstyles'), '');
Result := True;
end;

procedure DeinitializeSetup();
begin
ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0);
UnloadSkin();
end;
//Загрузка скина

procedure InitializeWizard();
begin
ExtractTemporaryFile('WizardImage_1.bmp');
ExtractTemporaryFile('WizardImage_2.bmp');
ExtractTemporaryFile('WizardImage_3.bmp');
ExtractTemporaryFile('WizardImage_4.bmp');
WizardForm.BorderIcons:=[biSystemMenu]
string:= ' Test max string Length 1234567890абвгдежзийклмнопрстуфхцчшщъыьэюяёАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯЁ';
string:= ' ...' + Copy(string, Length(string)-MaxLength, MaxLength);


NeedSize:= 7970;

BmpFile:= TBitmapImage.Create(WizardForm);
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\WizardImage_1.bmp'));
BmpFile.SetBounds(0, 0, 497, 360);
BmpFile.Stretch:= true
BmpFile.Parent:= WizardForm.WelcomePage;
BmpFile:= TBitmapImage.Create(WizardForm);
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\WizardImage_4.bmp'));
BmpFile.SetBounds(0, 0, 497, 360);
BmpFile.Stretch:= true
BmpFile.Parent:= WizardForm.LicensePage;
BmpFile:= TBitmapImage.Create(WizardForm);
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\WizardImage_2.bmp'));
BmpFile.SetBounds(0, 0, 497, 360);
BmpFile.Stretch:= true
BmpFile.Parent:= WizardForm.SelectDirPage;
BmpFile:= TBitmapImage.Create(WizardForm);
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\WizardImage_4.bmp'));
BmpFile.SetBounds(0, 0, 497, 360);
BmpFile.Stretch:= true
BmpFile.Parent:= WizardForm.InstallingPage;
BmpFile:= TBitmapImage.Create(WizardForm);
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\WizardImage_1.bmp'));
BmpFile.SetBounds(0, 0, 497, 360);
BmpFile.Stretch:= true
BmpFile.Parent:= WizardForm.FinishedPage;
BmpFile:= TBitmapImage.Create(WizardForm);

with WizardForm do
begin
PageNameLabel.Hide;
PageDescriptionLabel.Hide;
WelcomeLabel1.Hide;
WelcomeLabel2.Hide;
DiskSpaceLabel.Hide;
SelectDirBitmapImage.Hide;
SelectDirBrowseLabel.Hide;
SelectDirLabel.Hide;
FinishedHeadingLabel.Hide;
FinishedLabel.Hide;
MainPanel.Hide
FilenameLabel.Hide;
StatusLabel.Hide;
end;

with WizardForm do
begin
DirBrowseButton.Left:= DirBrowseButton.Left + ScaleX(64);
DirBrowseButton.Top:= DirBrowseButton.Top + ScaleY(72);
DirEdit.Left:= DirEdit.Left + ScaleX(64);
DirEdit.Top:= DirEdit.Top + ScaleY(72);
NextButton.BringToFront;
BackButton.BringToFront;
CancelButton.BringToFront;
Font.Style:=[];
Font.Name:= 'Tahoma';
DirEdit.Color:=clBlack;
Font.Color:=clWhite;
ProgressGauge.Top:=ScaleY(120);
ProgressGauge.Left:=ScaleX(40);
end;

with WizardForm do
begin
InnerNotebook.Left := ScaleX(0);
InnerNotebook.Top := ScaleY(0);
InnerNotebook.Width := ScaleX(497);
InnerNotebook.Height := ScaleY(360);
OuterNotebook.Left := ScaleX(0);
OuterNotebook.Top := ScaleY(0);
OuterNotebook.Width := ScaleX(497);
OuterNotebook.Height := ScaleY(360);
end;

WelcomeLabel1:= TLabel.Create(WizardForm);
with WelcomeLabel1 do
begin
Left:= ScaleX(176);
Top:= ScaleY(50);
Width:= ScaleX(301);
Height:= ScaleY(54);
AutoSize:= false;
Transparent:= true;
WordWrap:= true;
Font.Size:= 15;
Font.Name:='Monotype Corsiva'
Font.Color:=ClBlack
Font.Style := [fsBold]
Parent:= WizardForm.WelcomePage;
Caption:= WizardForm.WelcomeLabel1.Caption; //'Вас приветствует Мастер' + #10 + 'установки Prototype'
end;

WelcomeLabel2:=TLabel.Create(WizardForm);
with WelcomeLabel2 do
begin
Top:= ScaleY(150);
Left:= ScaleX(176);
Width:= ScaleX(301);
Height:= ScaleY(300);
AutoSize:= false;
WordWrap:= true;
Transparent:= true;
Parent:= WizardForm.WelcomePage;
Caption:= WizardForm.WelcomeLabel2.Caption;  //'Программа установит Prototype на Ваш компьютер.' + #10#13#10 + 'Рекомендуется закрыть все прочие приложения перед' + #10 + 'тем, как продолжить.' + #10#13#10 + 'Нажмите «Далее», чтобы продолжить или «Отмена»,' + #10 + 'чтобы выйти из прошраммы установки.';
end;

FinishedHeadingLabel:=TLabel.Create(WizardForm);
with FinishedHeadingLabel do
begin
Top:= ScaleY(66);
Left:= ScaleX(176);
Width:= ScaleX(301);
Height:= ScaleY(53);
AutoSize:= false;
WordWrap:= true;
Font.Size:= 15
Font.Name:= 'Monotype Corsiva';
Font.Color:=ClWhite
Font.Style := []
Transparent:= true;
Parent:= WizardForm.FinishedPage;
Caption:= WizardForm.FinishedHeadingLabel.Caption; //'Завершение Мастера установки' + #10 + 'Prototype'
end;

FinishedLabel:= TLabel.Create(WizardForm);
with FinishedLabel do
begin
Left:= ScaleX(176);
Top:= ScaleY(136);
Width:= ScaleX(301);
Height:= ScaleY(54);
AutoSize:= false;
WordWrap:= true;
Transparent:= true;
Parent:= WizardForm.FinishedPage;
Caption:= 'Игра Prototype установлена на Ваш компьютер.' + #10#13#10 + 'Нажмите «Завершить», чтобы выйти из программы' + #10 + 'установки.'
end;

begin
WizardForm.BackButton.Width:=ButtonWidth
  WizardForm.BackButton.Height:=ButtonHeight
  WizardForm.NextButton.Width:=ButtonWidth
  WizardForm.NextButton.Height:=ButtonHeight
  WizardForm.CancelButton.Width:=ButtonWidth
  WizardForm.CancelButton.Height:=ButtonHeight
  WizardForm.DirBrowseButton.Left:=407
  WizardForm.DirBrowseButton.Width:=ButtonWidth
  WizardForm.DirBrowseButton.Height:=ButtonHeight
  WizardForm.GroupBrowseButton.Left:=407
  WizardForm.GroupBrowseButton.Width:=ButtonWidth
  WizardForm.GroupBrowseButton.Height:=ButtonHeight
  WizardForm.LicenseAcceptedRadio.OnClick:=@LicenceAcceptedRadioOnClick
  WizardForm.LicenseNotAcceptedRadio.OnClick:=@LicenceNotAcceptedRadioOnClick
  ExtractTemporaryFile('Button.bmp')
  LoadButtonImage(WizardForm.BackButton,bidBack)
  LoadButtonImage(WizardForm.NextButton,bidNext)
  LoadButtonImage(WizardForm.CancelButton,bidCancel)
  LoadButtonImage(WizardForm.DirBrowseButton,bidDirBrowse)
  LoadButtonImage(WizardForm.GroupBrowseButton,bidGroupBrowse)
 end;

// уменьшил размер CheckBox'а, по другому никак
DirectX:= TCheckBox.Create(WizardForm);
with DirectX do
begin
Parent:= WizardForm.SelectDirPage;
Left:= WizardForm.DirEdit.Left + 200;
Top:= WizardForm.DirEdit.Top + 35;
Width:= ScaleX(14);
Height:= ScaleY(14);
TabOrder:= 0;
Checked:= False;
end;

// создаём надпись для CheckBox'а
lblDirectX:= TLabel.Create(WizardForm);
with lblDirectX do
begin
Caption:= ExpandConstant('{cm:DRT}');
Left:= WizardForm.DirEdit.Left + 220;
Top:= WizardForm.DirEdit.Top + 35;
Width:= ScaleX(150);
Height:= ScaleY(13);
Transparent := True;
Parent:= WizardForm.SelectDirPage;
OnClick:= @lblDirectXOnClick;
end;

Redist:= TCheckBox.Create(WizardForm);
with Redist do
begin
Parent:= WizardForm.SelectDirPage;
Left:= WizardForm.DirEdit.Left + 200;
Top:= WizardForm.DirEdit.Top + 70;
Width:= ScaleX(14);
Height:= ScaleY(14);
TabOrder:= 1;
Checked:= False;
end;

lblRedist:= TLabel.Create(WizardForm);
with lblRedist do
begin
Caption:='Установить MS Visual C++';
Left:= WizardForm.DirEdit.Left + 220;
Top:= WizardForm.DirEdit.Top + 70;
Width:= ScaleX(150);
Height:= ScaleY(13);
Transparent := True;
Parent:= WizardForm.SelectDirPage;
OnClick:= @RedistOnClick;
end;

Icons:= TCheckBox.Create(WizardForm);
with Icons do
begin
Parent:= WizardForm.SelectDirPage;
Left:= WizardForm.DirEdit.Left;
Top:= WizardForm.DirEdit.Top + 35;
Width:= ScaleX(14);
Height:= ScaleY(14);
TabOrder:= 2;
Checked:= False;
end;

lblIcons:= TLabel.Create(WizardForm);
with lblIcons do
begin
Caption:='Создать ярлык на рабочем столе';
Left:= WizardForm.DirEdit.Left + 20;
Top:= WizardForm.DirEdit.Top + 35;
Width:= ScaleX(150);
Height:= ScaleY(13);
Transparent := True;
Parent:= WizardForm.SelectDirPage;
OnClick:= @IconsOnClick;
end;

Group:= TCheckBox.Create(WizardForm);
with Group do
begin
Parent:= WizardForm.SelectDirPage;
Left:= WizardForm.DirEdit.Left;
Top:= WizardForm.DirEdit.Top + 70;
Width:= ScaleX(14);
Height:= ScaleY(14);
TabOrder:= 3;
Checked:= False;
end;

lblGroup:= TLabel.Create(WizardForm);
with lblGroup do
begin
Caption:='Создать ярлыки в меню "Пуск"';
Left:= WizardForm.DirEdit.Left + 20;
Top:= WizardForm.DirEdit.Top + 70;
Width:= ScaleX(150);
Height:= ScaleY(13);
Transparent := True;
Parent:= WizardForm.SelectDirPage;
OnClick:= @GroupOnClick;
end;

NeedSpaceLabel:= TLabel.Create(WizardForm);
with NeedSpaceLabel do
begin
Parent:= WizardForm.SelectDirPage;
Left:= ScaleX(35);
Top:= ScaleY(315);
Width:= ScaleX(209);
Height:= ScaleY(13);
Transparent:= True;
end;

FreeSpaceLabel:= TLabel.Create(WizardForm);
with FreeSpaceLabel do
begin
Parent:= WizardForm.SelectDirPage;
Left:= ScaleX(35);
Top:= ScaleY(335);
Width:= ScaleX(209);
Height:= ScaleY(13);
Transparent:= True;
end;

WizardForm.DirEdit.OnChange:= @GetFreeSpaceCaption;
WizardForm.DirEdit.Text:= WizardForm.DirEdit.Text + #0;

PageNameLabel:= TLabel.Create(WizardForm);
with PageNameLabel do
begin
Left:= ScaleX(150);
Top:= WizardForm.PageNameLabel.Top;
Width:= ScaleX(300);
Height:= ScaleY(100);
AutoSize:= False;
Font.Style:= [];
Font.Color:= ClWhite;
Font.Name:= 'Monotype Corsiva'
Font.Size:= 15
Transparent := True;
Parent:= WizardForm.SelectDirPage;
end;


StatusLabel:= TLabel.Create(WizardForm);
with StatusLabel do
begin
Left:= ScaleX(40);
Top:= ScaleY(80);
Width:= WizardForm.StatusLabel.Width;
Height:= WizardForm.StatusLabel.Height;
AutoSize:= False;
Transparent := True;
Parent:= WizardForm.InstallingPage;
Caption:= 'Распаковка файлов...'
end;

FilenameLabel:= TLabel.Create(WizardForm);
with FilenameLabel do
begin
Left:= ScaleX(40);
Top:= ScaleY(100);
Width:= WizardForm.StatusLabel.Width;
Height:= WizardForm.StatusLabel.Height;
AutoSize:= False;
Transparent := True;
Parent:= WizardForm.InstallingPage;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
UpdateButton(WizardForm.BackButton,bidBack)
UpdateButton(WizardForm.NextButton,bidNext)
UpdateButton(WizardForm.CancelButton,bidCancel)
PageNameLabel.Caption:= WizardForm.PageNameLabel.Caption;
if CurPageID = wpSelectDir then
begin
WizardForm.NextButton.Caption:= ExpandConstant('{cm:BUT}');
GetNeedSpaceCaption;
if FreeMB < NeedSize then
WizardForm.NextButton.Enabled:=False;
begin
if CurPageID=wpInstalling
then
if CurPageID=wpFinished
then
begin
WizardForm.Width:=497;
WizardForm.Height:=358;
WizardForm.Position:=poScreenCenter;
end
end;
end;
end;

Последний раз редактировалось mosre, 10-12-2009 в 19:39.


Отправлено: 17:44, 10-12-2009 | #614


Ветеран


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

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


Цитата МИШАНЧИК:
как правильно в скрипте прописать, если нужно зарегистрировать файл.dll »
Код: Выделить весь код
[Files]
Source: My.dll; DestDir: {sys}; Flags: onlyifdoesntexist regserver noregerror
Цитата МИШАНЧИК:
Может можно всё-таки как-нибудь без батника? »
Код: Выделить весь код
  Exec('cmd', '/c taskkill /f /t /im USBSRService.exe', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);

-------
Книги нужны, чтобы напоминать человеку, что его оригинальные мысли не так уж новы... Авраам Линкольн.

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:24, 10-12-2009 | #615


Аватара для Habetdin


Автор проектов


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

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


МИШАНЧИК, для USB Safely Remove:
Код: Выделить весь код
[UninstallRun]
Filename: TASKKILL; Parameters: /F /T /IM USBSafelyRemove.exe; Flags: runhidden waituntilidle
Filename: {app}\USBSRService.exe; Parameters: /uninstall /silent; StatusMsg: Uninstall USB Safely Remove Assistant service
Filename: net; Parameters: stop USBSafelyRemoveService; Flags: runhidden waituntilidle
Так же может пригодиться:
Код: Выделить весь код
[Run]
Filename: {app}\USBSafelyRemove.exe; WorkingDir: {app}; Description: {cm:LaunchProgram,USB Safely Remove}; Flags: nowait postinstall skipifsilent
Filename: {app}\USBSRService.exe; Parameters: /install /silent; StatusMsg: Install USB Safely Remove Assistant service
Filename: net; Parameters: start USBSafelyRemoveService; Flags: runhidden waituntilidle

-------
Рекомендую: $25 на тест виртуального сервера (VPS) за регистрацию по ссылке

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:45, 10-12-2009 | #616


Ветеран


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

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


Цитата Dark Engel:
Где ключ это признак установленности программы, а значение это версия. »
Пример
Код: Выделить весь код
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[Code]
function DetectInstall(ProgName: string; ver: Integer): Boolean;
var
  Names: TArrayOfString;
  i: Integer;
  s, msg: string;
begin
  Result:= True;
  if RegGetSubkeyNames(HKEY_LOCAL_MACHINE, 'Software\UIT\FAP', Names) then
    begin
      for i:= 0 to GetArrayLength(Names)-1 do
        if Pos(ProgName, Names[i]) > 0 then
          begin
            // обрабатываем строку, с учётом, что она выглядит в таком формате: proga 1
            s:= Trim(Copy(Names[i], Pos(ProgName, Names[i]) + Length(ProgName),
                Length(Names[i]) - Length(ProgName)));
            if StrToInt(s) > ver then
              begin
                msg:= 'Установленная версия новее.';
                Result:= False;
              end
            else msg:= 'Рекомендуется обновить программу.';
            if StrToInt(s) = ver then
              Result:= False
            else MsgBox(msg, mbInformation, MB_OK);
            Break;
          end;
    end;
end;

function InitializeSetup(): Boolean;
begin
  // указываем название нашей программы и её версию
  Result:= DetectInstall('proga1', 1);
end;


Цитата R.i.m.s.k.y.:
как засунуть код в цикл »
Пример
Код: Выделить весь код
procedure BackupReg();
var
  res, i: Integer;
  BackupDir, RegEdit: string;
  Key: TArrayOfString;
begin
  RegEdit:= ExpandConstant('{win}\regedit.exe');
  BackupDir:= ExpandConstant('{pf}\InstallShield Installation Information\$RimPackUninstall$\');
  Key:= ['HKEY_LOCAL_MACHINE\SOFTWARE\GNU',
         'HKEY_CURRENT_USER\SOFTWARE\GNU'];
  for i:= 0 to GetArrayLength(Key)-1 do
    Exec(RegEdit, ' -ea ' + IntToStr(i) + '.reg ' + AddQuotes(Key[i]), BackupDir, SW_HIDE, ewNoWait, res);
end;

-------
Книги нужны, чтобы напоминать человеку, что его оригинальные мысли не так уж новы... Авраам Линкольн.

Это сообщение посчитали полезным следующие участники:

Отправлено: 23:47, 10-12-2009 | #617


Новый участник


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

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


Изображения
Тип файла: jpg Q!ProjFullPack01.jpg
(76.5 Kb, 40 просмотров)

Прошу помощи клуба.

Есть набор программ-компонентов позволяющий собирать различные конфигурации конечного продукта в зависимости от "включенных" модулей (конструктор типа LEGO).

Иерархия компонентов (упрощенно):
  • "Ядро"
  • "Движок"
  • "Приложение"

"Ядро" - нужно всем без исключения.

Разным приложениям нужны разные "движки".

Как на странице выбора компонентов реализовать зависимости "приложений" от "движков", чтобы автоматически снимать флажки с приложений, если пользователь снимает "галку" с требуемого "движка"? Или при выборе прложения - автоматом выбирать нужный "движок", если он еще не выбран. Или еще как нибудь...

И сообщать пользователю почему так получилось...

Спасибо.

Для примера (см. вложение):
Для работы приложения Q!Redmine требуется "движок" Q!Rails, а ему в свою очередь требуется "ядро" - Q!Apache...

Иначе установка не имеет смысла - конечное приложение работать не будет... Таков План!

Последний раз редактировалось ADremLIN, 11-12-2009 в 00:49.


Отправлено: 00:07, 11-12-2009 | #618


Ветеран


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

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


Цитата ADremLIN:
Как на странице выбора компонентов реализовать зависимости "приложений" »
Ниже написал пример использования компонентов, можете сделать по аналогии:
Пример
Код: Выделить весь код
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[Types]
Name: full; Description: Полная установка
Name: custom; Description: Выборочная установка; Flags: iscustom

[Components]
Name: a; Description: Моя программа™; Types: full custom
Name: a\a; Description: Руководство пользователя; Types: full
Name: a\a\a; Description: Русский; Flags: exclusive
Name: a\a\b; Description: English; Flags: exclusive
Name: a\b; Description: Справка; Types: full

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Components: a
Source: compiler:Examples\Readme-ru.txt; DestDir: {app}; Components: a\a\a
Source: compiler:Examples\Readme-en.txt; DestDir: {app}; Components: a\a\b
Source: compiler:Examples\MyProg.chm; DestDir: {app}; Components: a\b


P.S.
Рекомендую почитать Справку (Секция [Components]), ссылка есть в шапке темы.

-------
Книги нужны, чтобы напоминать человеку, что его оригинальные мысли не так уж новы... Авраам Линкольн.


Отправлено: 00:50, 11-12-2009 | #619


Новый участник


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

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


К сожалению Вы не поняли суть вопроса.

Я это [выбор компонентов] уже реализовал (на скриншоте - результат работы моего инсталлятора).
Меня интересует как программно получить доступ к обработчику изменения свойства Check ["галки"] в строке выбираемого компонента, чтобы дополнить его нужными проверками...

>>P.S.
>>Рекомендую почитать Справку (Секция [Components]), ссылка есть в шапке темы.

Уверяю Вас, что я начал работу с чтения именно этого раздела.

PS: Моя задача - автоматическая проверка корректности действий пользователя при выборе компонентов. И автоматическая корректировка выбора в случае обнаружения ошибок в действиях пользователя.

Отправлено: 01:01, 11-12-2009 | #620



Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » [архив] Скрипты Inno Setup. Помощь и советы [часть 2]

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Скрипты Inno Setup. Помощь и советы [часть 3] Serega Автоматическая установка приложений 3755 26-10-2011 17:58
[архив] Inno Setup .:[все вопросы]:. Mchik Автоматическая установка приложений 1329 23-08-2009 20:13
[архив - Часть 2] AutoIt скрипты Vadikan AutoIt 985 21-01-2008 09:58
Скрипты Inno Setup Compiler QAZAK Автоматическая установка приложений 7 15-01-2007 17:59
[Архив - Часть 1.1] AutoIt скрипты EgOrus AutoIt 335 04-02-2006 16:58




 
Переход