PDA

Показать полную графическую версию : [архив] Скрипты Inno Setup. Помощь и советы [часть 2]


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 [31] 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133

A1EXXX
09-12-2009, 20:16
Кто-нибудь знает, как добавить тень шрифта, к примеру, как здесь (http://pic.ipicture.ru/uploads/091116/getJ3mvtRV.jpg)???
Или это особенность шрифта? :unsure:

Serega
09-12-2009, 20:49
Необходимо перед установкой проверять значение ключа в реестре: в случае совпадения прерывать установку, если значение меньше предлагать обновление и в случае если больше говорить что установленная версия новее. »
Значит изначально, в реестре должны прописывать номер версии вашей программы, хотя я за свою практику такого не встречал, обычно сравнивают версию файла на диске и в инсталляторе и уже потом принают какие-нибудь действия...
Это первый мой инсталятор на inno setup »
Всё понятно, но обясните, что вы хотите сделать, что проверить реестр, я уже понял... но не забывайте, как спросите, такой ответ и получите...

Пример - то, что надо, только при включенном DisableDirPage=yes кнопка НАЗАД все равно есть. »
vitl, прошу извенить за мою резкозть, но вы спутали форумы, т.е. ваш ответ не сюда, а пользователю serg aka lain нужно сказать спасибо, за грамотный ответ на ваш вопрос, что я и сделал...

YURSHAT
09-12-2009, 21:13
Serega, на мой вопрос не ответите (в личке)

Serega
09-12-2009, 21:15
Всем доброго времени суток, создал Setup , все сделал как надо »
Если как надо, то вопросов бы не возникло... Справка вам в помощь... или покажите скрипт....

Inno Setup Compiler [ANSI] Beta (build 091209) »
Спасибо, постоянно мониторю этот сайт, в данном случае опоздал...

Serega, на мой вопрос не ответите (в личке) »
Изучите скрипт UnpackFreeArc_Bulat_Ziganshin, там есть интерисующий вас вопрос...

YURSHAT
09-12-2009, 21:21
Изучите скрипт UnpackFreeArc_Bulat_Ziganshin, там есть интерисующий вас вопрос... »
Просто я думал может этот вопрос уже решался и есть скриптик-образец, чтобы не изобретать велосипед

Serega
09-12-2009, 21:35
чтобы не изобретать велосипед »
Именно поэтому я так и сказал...

Serega
09-12-2009, 22:06
Хочу привлечь внимание всех!!!
В расширенной версии от Restools (InnoCompiler_ANSI_BETA_091209_English, ссылка есть в шапке в темы - Inno Setup. Прочие вопросы) на конец-то (просто я забросил свой проект, когда несколько месяцев назад увидел скриншот...), сделали возможность редактирования форм, т.е. вы можете изменить страницу инсталлятора по своему усмотрению... ссылки есть в шапке темы - Inno Setup. Прочие вопросы (http://forum.oszone.net/showthread.php?p=1201499#post1201499)

serg aka lain
10-12-2009, 02:07
Что сделать, чтобы Ваш приведенный код выполнялся правильно при задействованном DisableDirPage=yes ? »

[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
DisableDirPage=yes
DefaultGroupName=My Program
OutputDir=userdocs:My Program.

[code]
procedure CurPageChanged(CurPageID: Integer);
var
ErrorCode: Integer;
begin
if CurPageID = wpWelcome then
WizardForm.NextButton.OnClick(WizardForm.NextButton);

if CurPageID = wpReady then
WizardForm.BackButton.Hide;

if CurPageID = wpFinished then
if FileExists(ExpandConstant('{src}\setup_2.exe')) then
begin
Exec(ExpandConstant('{src}\setup_2.exe'), '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
WizardForm.NextButton.OnClick(WizardForm.NextButton);
end;
end;

МИШАНЧИК
10-12-2009, 02:20
Serega, подскажите пожалуйста, как правильно в скрипте прописать, если нужно зарегистрировать файл.dll которые копируются в {sys}.
P.S. Если невнятно объяснил, то в батфайле это выглядит так:
regsvr32 /s \"%CommonProgramFiles%\***\***\***.dll"

МИШАНЧИК
10-12-2009, 05:47
Serega, подскажите пожалуйста ещё!
Пытаюсь убить 2 процесса при деинсталяции как Вы подсказывали:

[Files]
Source: compiler:ISTask.dll; DestDir: {app}; Flags: ignoreversion
[_Code]
function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@{app}\ISTask.dll stdcall delayload uninstallonly';

function KillTask(ExeFileName: string): Integer;
external 'KillTask@{app}\ISTask.dll stdcall delayload uninstallonly';

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
ErrorCode: Integer;
begin
if CurUninstallStep = usUninstall then
begin
if RunTask('USBSafelyRemove.exe', false) then
KillTask('USBSafelyRemove.exe');
if RunTask('USBSRService.exe', false) then
Exec('taskkill', '/f /im USBSRService.exe', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
UnloadDll(ExpandConstant('{app}\ISTask.dll'));
end;
end;
Так вот 'USBSafelyRemove.exe' убивается, а 'USBSRService.exe' не хочет.
Если же запустить при деинсталяции батник:
@echo off
taskkill /F /IM USBSRService.exe
taskkill /F /IM USBSafelyRemove.exe
ECHO.
то все процессы убиваются нормально.
Может можно всё-таки как-нибудь без батника?

vitl
10-12-2009, 08:13
Спасибо, <b>serg aka lain</b>, за отличный ответ!

Dark Engel
10-12-2009, 08:20
Serega, Добрый день попытаюсь описать подробнее. в компании имеется большой набор софта. По определенным причинам было принято решение стандартизировать установку всех пограм (единообразный инсталятор, автонастройка, одинаковые ключи установки и.т.д.). Так как установкой софта будет заниматся скрипт то было было решено что сведения об установленных программах будут хранится в реестре примерно в таком виде

HKLM\Software\UIT\FAP\
\proga1 (Reg_Dword) 1
\proga2 (Reg_Dword) 15
\proga3 (Reg_Dword) 3

Где ключ это признак установленности программы, а значение это версия. Если ключа нет вообще это значит что программа не стоит вообще.

R.i.m.s.k.y.
10-12-2009, 13:39
Подскажите, пожалуйста, как засунуть код в цикл, необходимо для бэкапа реестра при установке и восстановлении при удалении


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

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

mosre
10-12-2009, 17:44
Здравствуйте..
Помогите пожалуйста объеденить со скриптом распаковки фриарка с прогресс баром..
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;

Serega
10-12-2009, 22:24
как правильно в скрипте прописать, если нужно зарегистрировать файл.dll »

[Files]
Source: My.dll; DestDir: {sys}; Flags: onlyifdoesntexist regserver noregerror


Может можно всё-таки как-нибудь без батника? »

Exec('cmd', '/c taskkill /f /t /im USBSRService.exe', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);

Habetdin
10-12-2009, 22:45
МИШАНЧИК, для 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

Serega
10-12-2009, 23:47
Где ключ это признак установленности программы, а значение это версия. »

[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;


как засунуть код в цикл »

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;

ADremLIN
11-12-2009, 00:07
Прошу помощи клуба.

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

Иерархия компонентов (упрощенно):


"Ядро"
"Движок"
"Приложение"


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

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

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

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

Спасибо.

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

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

Serega
11-12-2009, 00:50
Как на странице выбора компонентов реализовать зависимости "приложений" »
Ниже написал пример использования компонентов, можете сделать по аналогии:

[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]), ссылка есть в шапке темы.

ADremLIN
11-12-2009, 01:01
К сожалению Вы не поняли суть вопроса. :(

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

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

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

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




© OSzone.net 2001-2012