Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 3]
Всем здравствуйте!
Проблема первая, как проверить версию .Net Framework при установке программы, запакованной в Inno Setup? В частности мне нужна версия 3.5 и выше. В нете нашёл много примеров, но они мне либо не подходят по функционалу, либо вызывают ошибку ещё на этапе компилляции. Хочется проверять версию .Net в реестре. Сам дистрибутив .Net входит в состав моего пакета, но пока-что устанавливается всегда, даже если в системе уже есть установленный Framework, что естественно плохо. Да и к тому же, на Vista и Seven установка dotNetFx40_Client_x86_x64.exe, который входит в состав моего пакета и устанавливается из секции Run, вызывает автоматическую перезагрузку системы даже с ключем /norestart еще на этапе установки, не позволяя её завершить, на XP такого не замечено.
Проблема вторая, из секции Run кроме .Net Framework устанавливается ещё и другое ПО, установка занимает дополнительное время, но прогресс уже не отображается, стандартный прогрессбар уже показывает все 100%. Вопрос, как добавить второй прогрессбар для программ из секции Run с правильным расчетом процентов при установке доп. ПО (не фейковый)? Ну или хотя бы чтобы было видно только сами проценты при установке каждого пакета из дополнительного ПО, что именно из доп. ПО сейчас устанавливается в мастере отображается. Находил варианты для 7-zip, FreeArc архивов, но мне нужен способ для разных дистрибутивов, в том числе для msi-пакетов. Доп. ПО запускается из {tmp}.
Gnom_aka_Lexander
25-12-2010, 21:43
Rostlv,
Если решиш, особенно по второму вопросу, буду рад узнать это решение, сам ищу...
как проверить версию .Net Framework при установке программы »
уже отвечал на похожий вопрос...
; определение версии установленного .Net Framework
[Setup]
AppName=NetFramework
AppVerName=NetFramework
DefaultDirName={pf}\NetFramework
OutputDir=.
Compression=lzma/ultra64
InternalCompressLevel=ultra64
SolidCompression=yes
VersionInfoCopyright=Serega
[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl
[Code]
const
MinNetFrameWork = 'v4.0'; // минимальная версия NetFrameWork
// Возможные версии = 'v1.0', 'v1.1', 'v2.0', 'v3.0', 'v3.5', 'v4.0'
var
url: string;
procedure GetUrlNetFrameWork(ver: string);
begin
// страница загрузок http://www.microsoft.com/downloads/results.aspx?pocId=&freetext=Framework&DisplayLang=ru
case ver of
// по этой ссылке v1.1, т.к. ссылку на v1.0, я не нашёл... раритет... ;)
'v1.0': url := 'http://download.microsoft.com/download/0/8/6/086e7824-ddad-45c0-b765-721e5e28e4c5/dotnetfx.exe';
'v1.1': url := 'http://download.microsoft.com/download/0/8/6/086e7824-ddad-45c0-b765-721e5e28e4c5/dotnetfx.exe';
'v2.0': url := 'http://download.microsoft.com/download/5/6/7/567758a3-759e-473e-bf8f-52154438565a/dotnetfx.exe';
'v3.0': url := 'http://download.microsoft.com/download/4/d/a/4da3a5fa-ee6a-42b8-8bfa-ea5c4a458a7d/dotnetfx3setup.exe';
'v3.5': url := 'http://download.microsoft.com/download/7/0/3/703455ee-a747-4cc8-bd3e-98a615c3aedb/dotNetFx35setup.exe';
'v4.0': url := 'http://download.microsoft.com/download/1/B/E/1BE39E79-7E39-46A3-96FF-047F95396215/dotNetFx40_Full_setup.exe';
else
url := 'http://download.microsoft.com/download/5/6/7/567758a3-759e-473e-bf8f-52154438565a/dotnetfx.exe';
end;
end;
function CompareMinVer(const ver: string): Boolean;
var
min_ver: string;
begin
Result := False;
min_ver := MinNetFrameWork;
if (Length(min_ver) > 2) and (Length(ver) > 2) then
if (min_ver[2] > #47) and (min_ver[2] < #58) and (ver[2] > #47) and (ver[2] < #58) then
Result := ver[2] > min_ver[2];
end;
function DetectInstallNetFrameWork: Boolean;
var
VerNetFrameWorkInstalled: TArrayOfString;
i: Integer;
begin
Result := False;
if RegGetSubkeyNames(HKLM, 'SOFTWARE\Microsoft\NET Framework Setup\NDP', VerNetFrameWorkInstalled) then
case CompareMinVer(VerNetFrameWorkInstalled[0]) of
True : Result := True;
False:
for i := 0 to GetArrayLength(VerNetFrameWorkInstalled)-1 do
if Pos(MinNetFrameWork, VerNetFrameWorkInstalled[i]) > 0 then
begin
Result := True;
Break;
end;
end;
end;
function SearchNetFrameWork: Boolean;
var
ErrorCode: Integer;
begin
Result := DetectInstallNetFrameWork;
if not Result then
if MsgBox('Для этой программы требуется установленный .NET Framework не ниже ' + MinNetFrameWork + '. ' +
'Пожалуйста загрузите и установите .NET Framework и запустите установку снова. ' +
'Вы хотите загрузить .NET Framework сейчас?', mbConfirmation, MB_YESNO) = idYes then
begin
GetUrlNetFrameWork(MinNetFrameWork);
ShellExec('open', url, '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
end;
end;
function InitializeSetup: Boolean;
begin
Result := SearchNetFrameWork;
end;
Проблема вторая »
Всё что вы хотите, всё это реализуемо, только если вы заставите свою запускаемую программу отвечать, насколько она процентов выполнилась...
Если это не задано автором программы, то вам это никогда не получиться, отображать реальный процент.
Но как говорится если очень сильно хочится...
1. Вариант:
Берём распакованный размер программы и в момент установки, сверяем размеры папок и уже от этого увеличиваем прогрессбар.
2. Вариант:
Просто задаём прогрессбару стиль, такой же как у прогрессбара при установке IE, т.е. нет реального процента, а полоска бегает и пользователь видит, что программа не зависла.
Как прявязать к радибаттонам в этом
[CODE]
var
MyNewPage: TWizardPage;
MyRadioBtn_1, MyRadioBtn_2: TRadioButton;
procedure GetMyNewPage();
begin
MyNewPage := CreateCustomPage(wpWelcome,
ExpandConstant('{cm:HeaderLabelPage}'), '');
MyRadioBtn_1 := TRadioButton.Create(WizardForm);
with MyRadioBtn_1 do
begin
Top := ScaleY(50);
Width := ScaleX(150);
Height := ScaleY(13);
Caption := ExpandConstant('{cm:MyRadioCaption_1}');
Checked := True;
Parent := MyNewPage.Surface;
end;
MyRadioBtn_2 := TRadioButton.Create(WizardForm);
with MyRadioBtn_2 do
begin
Top := ScaleY(120);
Width := ScaleX(150);
Height := ScaleY(13);
Caption := ExpandConstant('{cm:MyRadioCaption_2}');
Parent := MyNewPage.Surface;
end;
end;
procedure InitializeWizard();
begin
GetMyNewPage();
end;
копирование определенного файла (т.е для одной радиокнопки это один из секкции [Files] для второй другой)
например такие
Source: d:\Programs\!Install\norm\boot1.ini; DestDir: {app}; Components: a;
Source: d:\Programs\!Install\port\boot2.ini; DestDir: {app}; Components: b; (раньше я их привязывал в секциях компоненты к радиокнопкам, но охота сделать на новой странице это.
serg aka lain
26-12-2010, 00:05
Как прявязать к радибаттонам »
[Files]
Source: d:\Programs\!Install\norm\boot1.ini; DestDir: {app}; Components: a; Check: GetRadio_1Checked;
Source: d:\Programs\!Install\port\boot2.ini; DestDir: {app}; Components: b; Check: GetRadio_2Checked;
[Code]
function GetRadio_1Checked(): Boolean;
begin
Result := MyRadioBtn_1.Checked;
end;
function GetRadio_2Checked(): Boolean;
begin
Result := MyRadioBtn_2.Checked;
end;
С первой проблемой разобрался путём замены дистрибутива .Net с версии 4.0 на 3.5, которая, в отличие от 4.0, сама проверяет наличие установленной в системе версии .Net Framework и не устанавливает повторно то, что уже есть. Serega, приведённый код на Seven работает некорректно, в указанной ветке реестра на чистой системе есть только v2.0, хотя в системе установлена v3.5.
По второму вопросу полноценный прогрессбар сделать не получится, поэтому придётся довольствоваться фейковым, как при установке IE. Где найти код для него и как "прикрутить" его к секции Run? У меня сейчас уже задействован код для отображения процентов при распаковке всех файлов моего дистрибутива, поэтому нужно соединить обе части кода, первую привожу:
var
ProgressLabel, SizeLabel: TLabel;
procedure Progress();
var
size: integer;
begin
with WizardForm.ProgressGauge do
ProgressLabel.Caption:= IntToStr((Position-Min)/((Max - Min)/100)) + '%';
FileSize(ExpandConstant(CurrentFileName), size);
SizeLabel.Caption:= IntToStr(size) + ' bytes';
end;
procedure InitializeWizard();
begin
ProgressLabel := TLabel.Create(WizardForm);
with WizardForm.ProgressGauge do
begin
ProgressLabel.Top := Top + Height + ScaleY(8);
ProgressLabel.Left:= Left + Width/2 - ScaleX(8);
ProgressLabel.AutoSize := True;
ProgressLabel.Parent := WizardForm.InstallingPage;
end;
SizeLabel := TLabel.Create(WizardForm);
with WizardForm.ProgressGauge do
begin
SizeLabel.Top := Top + Height + ScaleY(8);
SizeLabel.Left:= Left;
SizeLabel.AutoSize := True;
SizeLabel.Parent := WizardForm.InstallingPage;
end;
end;
R.i.m.s.k.y.
26-12-2010, 09:37
Rostlv,
загляни в реестр HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP\ - по подключам типа 3.5 можно узнавать какая версия фреймворка стоит
Serega, приведённый код на Seven работает некорректно »
Переписал код в предыдущем сообщении, теперь должно работать нормально.
Где найти код для него »
Только самому написать :)
Вот накидал простой пример:
; Прогрессбар без отображения реального процента...
[Setup]
AppName=ProgressBarStyle
AppVerName=ProgressBarStyle v 1.0
DefaultDirName={pf}\ProgressBarStyle
OutputDir=.
Compression=lzma/ultra64
InternalCompressLevel=ultra64
SolidCompression=yes
VersionInfoCopyright=Serega
[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl
[Code]
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall';
const
WM_USER = $0400;
PBM_SETMARQUEE = WM_USER + 10;
GWL_STYLE = -16;
PBS_MARQUEE = $08;
procedure CreateForm;
var
Form: TSetupForm;
begin
try
Form := CreateCustomForm;
with Form do
begin
ClientWidth := ScaleX(400);
ClientHeight := ScaleY(70);
Center;
Caption := 'Пример';
end;
with TLabel.Create(Form) do
begin
Parent := Form;
AutoSize := True;
Left := ScaleX(12);
Top := ScaleY(12);
Font.Size := 9;
Caption := 'Прогрессбар без отображения реального процента...';
end;
with TNewProgressBar.Create(Form) do
begin
Parent := Form;
SetBounds(ScaleX(10), ScaleY(38), Form.ClientWidth - ScaleX(20), ScaleY(17));
SetWindowLong (Handle, GWL_STYLE, (GetWindowLong (Handle, GWL_STYLE) or PBS_MARQUEE));
SendMessage(Handle, PBM_SETMARQUEE, 1, 20);
end;
Form.ShowModal;
finally
Form.Free;
end;
end;
function InitializeSetup(): Boolean;
begin
CreateForm;
end;
Лександер
Спасибо.
Кто - нибудь может помочь поправить скрипт. Компилируется и программа устанавливается нормально, но при удалении выскакивают ошибки:
первая:
http://s52.radikal.ru/i138/1012/a6/fc2f0c0e61b5t.jpg (http://radikal.ru/F/s52.radikal.ru/i138/1012/a6/fc2f0c0e61b5.jpg.html)
а за ней вторая:
http://s005.radikal.ru/i211/1012/4b/027f887e880ft.jpg (http://radikal.ru/F/s005.radikal.ru/i211/1012/4b/027f887e880f.jpg.html)
Вот скрипт:
;
InnoSetupVersion=5.4.0 (a),ISPP=5.3.9 (a) (build 101211)
[Setup]
AppId={{2E115B70-E98C-463E-908A-E73C9CBFF816}
AppName=LikeRusXP Localization
AppVersion=6.01.12
AppVerName={cm:NameAndVersion,LikeRusXP Localization,6.01.12}
AppPublisher=Radialix, Inc.
AppPublisherURL=http://likerusxp.ru/
AppSupportURL=http://likerusxp.ru/
AppUpdatesURL=http://likerusxp.ru/
DefaultDirName={pf}\LikeRusXP Localization
DefaultGroupName=LikeRusXP Localization
AllowNoIcons=yes
LicenseFile=embedded\License.rtf
InfoBeforeFile=embedded\InfoBefore.rtf
OutputBaseFilename=Setup_LRXP_6.01.12
SetupIconFile={tmp}\MAINICON.ico
UninstallDisplayIcon={app}\Uninstall.ico
CreateUninstallRegKey=yes
Compression=lzma
WizardImageFile=embedded\WizardImage.bmp
WizardSmallImageFile=embedded\WizardSmallImage.bmp
[Files]
Source: "{tmp}\bass.dll"; DestDir: "{tmp}"; Flags: deleteafterinstall dontcopy
Source: "{tmp}\sound.mp3"; DestDir: "{tmp}"; Flags: deleteafterinstall dontcopy
Source: "{tmp}\ISSkin.dll"; DestDir: "{app}"; Flags: dontcopy
Source: "{tmp}\Codejock.cjstyles"; DestDir: "{app}"; Flags: dontcopy
Source: "{tmp}\Splash.png"; DestDir: "{tmp}"; Flags: deleteafterinstall ignoreversion dontcopy
Source: "{tmp}\isgsg.dll"; DestDir: "{tmp}"; Flags: deleteafterinstall ignoreversion dontcopy
Source: "{app}\*"; DestDir: "{app}"; Components: program
Source: "{app}\LikeRusXP.exe"; DestDir: "{app}"; MinVersion: 4.1.2222,5.0; Flags: ignoreversion
Source: "{app}\limage.exe"; DestDir: "{app}"; MinVersion: 4.1.2222,5.0; Flags: ignoreversion
Source: "{app}\Doc\LikeRusXP.chm"; DestDir: "{app}\Doc"; MinVersion: 4.1.2222,5.0; Flags: ignoreversion
Source: "{app}\Doc\likerusxp-overview.chm"; DestDir: "{app}\Doc"; MinVersion: 4.1.2222,5.0; Flags: ignoreversion
Source: "{app}\License.txt"; DestDir: "{app}"; MinVersion: 4.1.2222,5.0;
Source: "{app}\Store\elibrary.dll"; DestDir: "{app}\Store"; MinVersion: 4.1.2222,5.0; Flags: ignoreversion
Source: "{app}\Store\lresdumper.dll"; DestDir: "{app}\Store"; MinVersion: 4.1.2222,5.0; Flags: ignoreversion
Source: "{app}\Store\sl3core.dll"; DestDir: "{app}\Store"; MinVersion: 4.1.2222,5.0; Flags: ignoreversion
Source: "{app}\Store\lires.exe"; DestDir: "{app}\Store"; MinVersion: 4.1.2222,5.0; Flags: ignoreversion
Source: "{app}\Store\rb\lresdumper.dll"; DestDir: "{app}\Store\rb"; MinVersion: 4.1.2222,5.0; Flags: ignoreversion
Source: "{app}\Store\rb\ResBinder.exe"; DestDir: "{app}\Store\rb"; MinVersion: 4.1.2222,5.0; Flags: ignoreversion
Source: "{app}\Store\rb\readme.txt"; DestDir: "{app}\Store\rb"; MinVersion: 4.1.2222,5.0; Flags: ignoreversion
Source: "{app}\Store\rb\english.uil"; DestDir: "{app}\Store\rb"; MinVersion: 4.1.2222,5.0; Flags: ignoreversion
Source: "{app}\Store\rb\russian.uil"; DestDir: "{app}\Store\rb"; MinVersion: 4.1.2222,5.0; Flags: ignoreversion
Source: "{app}\Glossary\russian.lg3"; DestDir: "{app}\Glossary"; MinVersion: 4.1.2222,5.0; Flags: ignoreversion
Source: "Icons\MAINICON.ico"; DestDir: {win}\Icons; Attribs: System Hidden;
Source: "Icons\Uninstall.ico"; DestDir: {win}\Icons; Attribs: System Hidden;
Source: "Icons\ProgFilesIcon.ico"; DestDir: {win}\Icons; Attribs: System Hidden;
Source: "{app}\desktop.ini"; DestDir: {app}; Attribs: System Hidden;
Source: "{tmp}\desktop.ini"; DestDir: {pf}; Attribs: System Hidden;
;Source: "Components\*"; DestDir: "{app}"; Components: Additions
/////////////////// Components ////////////////////
[Types]
Name: "full"; Description: "Полная"
Name: "custom"; Description: "Выборочная"; Flags: iscustom
[Components]
Name: "program"; Description: "Program Files"; Types: full custom; Flags: fixed
Name: "Additions"; Description: "Словари"; Types: full
[Run]
Filename: "{app}\LikeRusXP.exe"; Description: "{cm:LaunchProgram,LikeRusXP}"; Flags: nowait postinstall skipifsilent; MinVersion: 4.1.2222,5.0;
[Icons]
Name: "{group}\LikeRusXP 6.01.12"; Filename: "{app}\LikeRusXP.exe"; MinVersion: 4.1.2222,5.0;
Name: "{group}\{cm:ProgramOnTheWeb,LikeRusXP 6.01.12}"; Filename: "http://likerusxp.ru/"; MinVersion: 4.1.2222,5.0;
Name: "{group}\{cm:UninstallProgram,LikeRusXP 6.01.12}"; Filename: "{uninstallexe}"; MinVersion: 4.1.2222,5.0;
Name: "{group}\Обзор LikeRusXP"; Filename: "{app}\Doc\likerusxp-overview.chm"; MinVersion: 4.1.2222,5.0;
Name: "{commondesktop}\LikeRusXP Localization"; Filename: "{app}\LikeRusXP.exe"; Tasks: "desktopicon"; MinVersion: 4.1.2222,5.0;
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\LikeRusXP"; Filename: "{app}\LikeRusXP.exe"; Tasks: "quicklaunchicon"; MinVersion: 4.1.2222,5.0;
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; MinVersion: 4.1.2222,5.0;
Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; MinVersion: 4.1.2222,5.0;
[CustomMessages]
russian.NameAndVersion=%1, версия %2
russian.AdditionalIcons=Дополнительные значки:
russian.CreateDesktopIcon=Создать значок на &Рабочем столе
russian.CreateQuickLaunchIcon=Создать значок в &Панели быстрого запуска
russian.ProgramOnTheWeb=Сайт %1 в Интернете
russian.UninstallProgram=Деинсталлировать %1
russian.LaunchProgram=Запустить %1
russian.AssocFileExtension=Св&язать %1 с файлами, имеющими расширение %2
russian.AssocingFileExtension=Связывание %1 с файлами %2...
[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl
[Messages]
BeveledLabel=RePack by Gu® 2010
////////////////////// Skin //////////////////////
[Code_]
{ RedesignWizardFormBegin } // Не удалять эту строку!
// Не изменять эту секцию. Она создана автоматически.
procedure RedesignWizardForm;
begin
with WizardForm.BeveledLabel do
begin
Color := cl3DLight;
Font.Height := -13;
ParentColor := False;
ParentFont := False;
Left := ScaleX(10);
Height := ScaleY(17);
end;
{ ReservationBegin }
// Вы можете добавить ваш код здесь.
{ ReservationEnd }
end;
// Не изменять эту секцию. Она создана автоматически.
{ RedesignWizardFormEnd } // Не удалять эту строку!
#ifdef UNICODE
#define PStr "AnsiString"
#else
#define PStr "String"
#endif
procedure LoadSkin(lpszPath: {#PStr}; lpszIniFileName: {#PStr});
external 'LoadSkin@files:isskin.dll stdcall delayload setuponly';
procedure LoadSkinUninst(lpszPath: {#PStr}; lpszIniFileName: {#PStr});
external 'LoadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';
procedure UnloadSkin();
external 'UnloadSkin@files:isskin.dll stdcall delayload setuponly';
procedure UnloadSkinUninst();
external 'UnloadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';
function ShowWindow(hWnd: Integer; uType: Integer): Integer;
external 'ShowWindow@user32.dll stdcall';
function InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('Codejock.cjstyles');
CreateDir(ExpandConstant('{sd}\ISSkin'));
FileCopy(ExpandConstant('{tmp}\Codejock.cjstyles'), ExpandConstant('{sd}\ISSkin\Codejock.cjstyles'), True);
LoadSkin(ExpandConstant('{sd}\ISSkin\Codejock.cjstyles'), 'NormalBlack.ini');
Result := True;
end;
function InitializeUninstall(): Boolean;
begin
FileCopy(ExpandConstant('{app}\isskin.dll'),
ExpandConstant('{tmp}\isskin.dll'), True);
FileCopy(ExpandConstant('{app}\Codejock.cjstyles'),
ExpandConstant('{tmp}\Codejock.cjstyles'), True);
LoadSkinUninst(ExpandConstant('{tmp}\Codejock.cjstyles'), 'NormalBlack.ini');
Result := True;
end;
procedure DeinitializeUninstall();
begin
UnloadSkinUninst();
end;
////////////////////// Splash ////////////////////////////
procedure ShowSplashScreen(p1:HWND;p2:string;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal;p10:integer); external 'ShowSplashScreen@files:isgsg.dll stdcall delayload';
////////////////////// Sound ///////////////////////////
const
BASS_SAMPLE_LOOP = 4; //повторение
type
HSTREAM = DWORD; //тип звукового потока
function BASS_Init(device: Integer; freq, flags: DWORD; win: hwnd; CLSID: Integer): Boolean;
external 'BASS_Init@files:BASS.dll stdcall delayload';
function BASS_StreamCreateFile(mem: BOOL; f: PChar; offset: DWORD; length: DWORD; flags: DWORD): HSTREAM;
external 'BASS_StreamCreateFile@files:BASS.dll stdcall delayload';
function BASS_Start(): Boolean;
external 'BASS_Start@files:BASS.dll stdcall delayload';
function BASS_ChannelPlay(handle: DWORD; restart: BOOL): Boolean;
external 'BASS_ChannelPlay@files:BASS.dll stdcall delayload';
function BASS_Stop(): Boolean;
external 'BASS_Stop@files:BASS.dll stdcall delayload';
function BASS_Free(): Boolean;
external 'BASS_Free@files:BASS.dll stdcall delayload';
procedure InitializeWizard();
var Name1: string; i: Integer;
begin
RedesignWizardForm;
////////////////// Spalsh //////////////////////
ExtractTemporaryFile('Splash.png');
ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\Splash.png',1000,3000,1000,0,255,False, $FFFFFF,10);
///////////////// Splash ///////////////////////
ExtractTemporaryFile('bass.dll');
ExtractTemporaryFile('sound.mp3');
if BASS_Init(-1, 44100, 0, 0, 0) then begin
BASS_Start();
Name1:=ExpandConstant('{tmp}\sound.mp3');
i:=BASS_StreamCreateFile(FALSE, PChar(Name1), 0, 0, 4);
if i <> 0 then begin
BASS_ChannelPlay(i, True);
end;
end;
end;
procedure DeInitializeSetup();
begin
//////////// ISSkin
ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0);
UnloadSkin();
DeleteFile(ExpandConstant('{sd}\ISSkin\isskin.dll'));
DeleteFile(ExpandConstant('{sd}\ISSkin\Codejock.cjstyles'));
RemoveDir(ExpandConstant('{sd}\ISSkin'));
//////////// ISSkin
BASS_Stop(); //нужно для остановки проигрывания
BASS_Free(); //нужно для быстрой выгрузки библиотеки вместе с муз. файлом
end;
////////////////////// Setup end //////////////////////
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssDone then
MsgBox('Программа ' + '{#SetupSetting("AppName")}' + ' установлена!', mbInformation, MB_OK);
end;
[ISFormDesigner]
WizardForm=FF0A005457495A415244464F524D003010C301000054504630F10B5457697A617264466F726D0A57697A61726 4466F726D0C436C69656E744865696768740366010B436C69656E74576964746803EF010C4578706C696369744C656674020 00B4578706C69636974546F7002000D4578706C69636974576964746803F7010E4578706C696369744865696768740386010 D506978656C73506572496E636802600A54657874486569676874020D00F10C544E65774E6F7465626F6F6B0D4F757465724 E6F7465626F6F6B00F110544E65774E6F7465626F6F6B506167650B57656C636F6D65506167650D4578706C6963697457696 4746803F1010E4578706C696369744865696768740339010000F110544E65774E6F7465626F6F6B5061676509496E6E65725 06167650D4578706C69636974576964746803F1010E4578706C69636974486569676874033901000000F10E544E657753746 1746963546578740C426576656C65644C6162656C044C656674020A06486569676874021105436F6C6F720709636C33444C6 96768740B466F6E742E48656967687402F30B506172656E74436F6C6F72080A506172656E74466F6E74080C4578706C69636 9744C656674020A0E4578706C696369744865696768740211000000
в дополнение к этому вопросу (который решен) - http://forum.oszone.net/post-1573479-236.html (http://), что сделать в [Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={sd}\My Program
OutputDir=.
OutputBaseFilename=test
[CustomMessages]
HeaderLabelPage=Выберите тип установки
MyRadioCaption_1=Обычная установка
MyRadioCaption_2=Портативная установка
[code]
var
MyNewPage: TWizardPage;
MyRadioBtn_1, MyRadioBtn_2: TRadioButton;
procedure GetMyNewPage();
begin
MyNewPage := CreateCustomPage(wpWelcome,
ExpandConstant('{cm:HeaderLabelPage}'), '');
MyRadioBtn_1 := TRadioButton.Create(WizardForm);
with MyRadioBtn_1 do
begin
Top := ScaleY(50);
Width := ScaleX(150);
Height := ScaleY(13);
Caption := ExpandConstant('{cm:MyRadioCaption_1}');
Checked := True;
Parent := MyNewPage.Surface;
end;
MyRadioBtn_2 := TRadioButton.Create(WizardForm);
with MyRadioBtn_2 do
begin
Top := ScaleY(120);
Width := ScaleX(150);
Height := ScaleY(13);
Caption := ExpandConstant('{cm:MyRadioCaption_2}');
Parent := MyNewPage.Surface;
end;
end;
procedure InitializeWizard();
begin
GetMyNewPage();
end; чтобы под радибаттаноми можно было написать текст - http://s004.radikal.ru/i206/1012/08/5c3f0964b30b.png.
попытался просто в секции [CustomMessages] в MyRadioCaption_1 и MyRadioCaption_2 дальше писать - вставив после Обыная установка" и "Портативная" переменную %n (вроде как это же перенос каретки), и написал делее нужный текст, но текст написался в строку и не был виден. (только начало, см на скрине)
Gnom_aka_Lexander
26-12-2010, 21:08
Rostlv, Тут (http://rghost.ru/2304090) фейковый прогресс-бар, я пока ищу решение для нормального отображения, но, похоже, без перепаковки в главный дистр того, для чего прогресс отображать нужно, не получится.
ksunechkin, сейчас попробую :)
Serega, именно такой прогрессбар и нужен, чтобы брал стиль из системы, но в XP бегунка нет. Только должен быть расположен на странице основного прогрессбара, немного ниже. И привязать его к секции Run, заодно соединить с кодом, который я давал в предыдущем сообщении. Думаю, это пригодится не только мне, но и многим другим, ведь из Run многие устанавливают доп. ПО. К сожалению, сам я не смогу решить эту задачу.
Нашёл как добавить второй прогрессбар ниже основного, но в нём отсутствует бегунок:
var
ProgressBar: TNewProgressBar;
procedure CurPageChanged(CurPageID: Integer);
var
i:Integer;
begin
If CurPageID=wpInstalling
then
begin
ProgressBar := TNewProgressBar.Create(WizardForm);
ProgressBar.Left := ScaleY(40);
ProgressBar.Top := ScaleX(180);
ProgressBar.Width := ScaleY(415);
ProgressBar.Height := ScaleX(18);
ProgressBar.Parent := WizardForm;
ProgressBar.Position := 0; //указывает количество заполняемых секторов
end;
begin
If CurPageID=wpFinished
then
ProgressBar.Hide
end;
end;
Лександер, спасибо, я его уже видел, вот только внешний вид не впечатлил, слишком грубо.
serg aka lain
26-12-2010, 21:47
ksunechkin, сейчас попробую »
Угу, и ещё пару иконок туда нацепить можно попробовать, на подобии ->
http://s04.radikal.ru/i177/1012/42/da7523848355t.jpg (http://radikal.ru/F/s04.radikal.ru/i177/1012/42/da7523848355.png.html)
Gnom_aka_Lexander
26-12-2010, 21:49
Rostlv, Там библиотечка IsProgressBar.dll, в которой можно попробовать поковырять битмапы, которыми анимация строится, или поискать предыдущую версию, там покрасивше было, глянцевая и объемная :)
serg aka lain, Если не смеешся, то можно и их попробовать, текст почти сделал :)
serg aka lain, было б неплохо и с иконками) но меня вполне устроит просто подпись...
serg aka lain
26-12-2010, 23:05
Если не смеешся, то можно и их попробовать, текст почти сделал »
Ды нет, можно конечно, вот моя
[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
[Languages]
Name: ru; MessagesFile: compiler:Languages\Russian.isl;
[CustomMessages]
HeaderLabelPage=Выберите тип установки
MyRadioCaption_1=Обычная установка
MyRadioCaption_2=Выборочная установка
PageTextHeader=На этой странице Вы можете выбрать тип установки, который для Вас наиболее удобен.
MyText_1=Установка будет произведена полностью в автоматическом режиме.%n(Подходит для не подготовленных пользователей)
MyText_2=Будет предложен выбор директории установки.%n(Для продвинутых пользователей)
[Code]
function GetModuleHandle(lpModuleName: LongInt): LongInt;
external 'GetModuleHandleA@kernel32.dll stdcall';
function ExtractIcon(hInst: LongInt; lpszExeFileName: AnsiString; nIconIndex: LongInt): LongInt;
external 'ExtractIconA@shell32.dll stdcall';
function DrawIconEx(hdc: LongInt; xLeft, yTop: Integer; hIcon: LongInt; cxWidth,
cyWidth: Integer; istepIfAniCur: LongInt; hbrFlickerFreeDraw, diFlags: LongInt): LongInt;
external 'DrawIconEx@user32.dll stdcall';
function DestroyIcon(hIcon: LongInt): LongInt;
external 'DestroyIcon@user32.dll stdcall';
const
DI_NORMAL = 3;
var
MyNewPage: TWizardPage;
Rect: TRect;
HIcon: LongInt;
AIconFileName: String;
MyRadioBtn_1, MyRadioBtn_2: TNewRadioButton;
procedure GetInstTypePage();
begin
MyNewPage := CreateCustomPage(wpWelcome,
ExpandConstant('{cm:HeaderLabelPage}'), '');
try
// в конкретном примере из этого файла (C:\Windows\System32\shell32.dll) берём иконки, для пробного показа.
// Можно использовать обычные .ico
AIconFileName := ExpandConstant('{sys}\shell32.dll');
//
Rect.Left := 0;
Rect.Top := 0;
Rect.Right := 32;
Rect.Bottom := 32;
hIcon := ExtractIcon(GetModuleHandle(0), AIconFileName, 26);
try
with TBitmapImage.Create(WizardForm) do
begin
Left := ScaleX(15);
Top := ScaleY(68);
Width := 32;
Height := 32;
with Bitmap do
begin
Width := 32;
Height := 32;
Canvas.Brush.Color := clBtnFace;
Canvas.FillRect(Rect);
DrawIconEx(Canvas.Handle, 0, 0, HIcon, 32, 32, 0, 0, DI_NORMAL);
end;
Parent := MyNewPage.Surface;
end;
finally
DestroyIcon(hIcon);
end;
hIcon := ExtractIcon(GetModuleHandle(0), AIconFileName, 19);
try
with TBitmapImage.Create(WizardForm) do
begin
Left := ScaleX(15);
Top := ScaleY(138);
Width := 32;
Height := 32;
with Bitmap do
begin
Width := 32;
Height := 32;
Canvas.Brush.Color := clBtnFace;
Canvas.FillRect(Rect);
DrawIconEx(Canvas.Handle, 0, 0, HIcon, 32, 32, 0, 0, DI_NORMAL);
end;
Parent := MyNewPage.Surface;
end;
finally
DestroyIcon(hIcon);
end;
except
end;
with TNewStaticText.Create(WizardForm) do
begin
Width := WizardForm.InnerNotebook.Width;
Height := ScaleY(26);
WordWrap := True;
Caption := ExpandConstant('{cm:PageTextHeader}');
Parent := MyNewPage.Surface;
end;
MyRadioBtn_1 := TNewRadioButton.Create(WizardForm);
with MyRadioBtn_1 do
begin
Top := ScaleY(50);
Width := ScaleX(150);
Caption := ExpandConstant('{cm:MyRadioCaption_1}');
Checked := True;
Parent := MyNewPage.Surface;
end;
with TNewStaticText.Create(WizardForm) do
begin
Left := ScaleX(60);
Top := ScaleY(68);
Width := WizardForm.InnerNotebook.Width - ScaleX(60);
Height := ScaleY(26);
WordWrap := True;
Caption := ExpandConstant('{cm:MyText_1}');
Parent := MyNewPage.Surface;
end;
MyRadioBtn_2 := TNewRadioButton.Create(WizardForm);
with MyRadioBtn_2 do
begin
Top := ScaleY(120);
Width := ScaleX(150);
Caption := ExpandConstant('{cm:MyRadioCaption_2}');
Parent := MyNewPage.Surface;
end;
with TNewStaticText.Create(WizardForm) do
begin
Left := ScaleX(60);
Top := ScaleY(138);
Width := WizardForm.InnerNotebook.Width - ScaleX(60);
Height := ScaleY(26);
WordWrap := True;
Caption := ExpandConstant('{cm:MyText_2}');
Parent := MyNewPage.Surface;
end;
end;
function ShouldSkipPage(PageID: Integer): Boolean;
begin
if (PageID >= wpSelectDir) and (PageID < wpReady) and (MyRadioBtn_1.Checked) then
Result := True;
end;
procedure InitializeWizard();
begin
GetInstTypePage();
end;
Gnom_aka_Lexander
26-12-2010, 23:09
А вот моя, иконки еще не приделал, но задел под них отвел :), если нужно, завтра сделаю.
[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={sd}\My Program
OutputDir=.
OutputBaseFilename=test
[Files]
Source: NewIconImage1.png; DestDir: {tmp}; Flags: dontcopy;
Source: NewIconImage2.png; DestDir: {tmp}; Flags: dontcopy;
Source: botva2.dll; DestDir: {tmp}; Flags: dontcopy;
[CustomMessages]
HeaderLabelPage=Выберите тип установки
MyRadioCaption_1=Обычная установка
MyRadioCaption_2=Портативная установка
MyRadioDeskrip_1=Текст под первой радиокнопкой
MyRadioDeskrip_2=Текст под второй радиокнопкой
[Code]
var
ISCustomPage1: TWizardPage;
NewIconImage1: TNewIconImage;
NewIconImage2: TNewIconImage;
NewRadioButton1: TNewRadioButton;
NewRadioButton2: TNewRadioButton;
NewStaticText1: TNewStaticText;
NewStaticText2: TNewStaticText;
procedure RedesignWizardForm;
begin
{ Creates custom wizard page }
ISCustomPage1 := CreateCustomPage(wpWelcome, 'ISCustomPage1_Caption', 'ISCustomPage1_Description');
{ NewIconImage1 }
NewIconImage1 := TNewIconImage.Create(WizardForm);
with NewIconImage1 do
begin
Name := 'NewIconImage1';
Parent := ISCustomPage1.Surface;
Left := ScaleX(8);
Top := ScaleY(8);
Width := ScaleX(81);
Height := ScaleY(81);
end;
{ NewIconImage2 }
NewIconImage2 := TNewIconImage.Create(WizardForm);
with NewIconImage2 do
begin
Name := 'NewIconImage2';
Parent := ISCustomPage1.Surface;
Left := ScaleX(8);
Top := ScaleY(120);
Width := ScaleX(81);
Height := ScaleY(81);
end;
{ NewRadioButton1 }
NewRadioButton1 := TNewRadioButton.Create(WizardForm);
with NewRadioButton1 do
begin
Name := 'NewRadioButton1';
Parent := ISCustomPage1.Surface;
Left := ScaleX(112);
Top := ScaleY(8);
Width := ScaleX(185);
Height := ScaleY(17);
Caption := ExpandConstant('{cm:MyRadioCaption_1}');
end;
{ NewRadioButton2 }
NewRadioButton2 := TNewRadioButton.Create(WizardForm);
with NewRadioButton2 do
begin
Name := 'NewRadioButton2';
Parent := ISCustomPage1.Surface;
Left := ScaleX(112);
Top := ScaleY(120);
Width := ScaleX(185);
Height := ScaleY(17);
Caption := ExpandConstant('{cm:MyRadioCaption_2}');
end;
{ NewStaticText1 }
NewStaticText1 := TNewStaticText.Create(WizardForm);
with NewStaticText1 do
begin
Name := 'NewStaticText1';
Parent := ISCustomPage1.Surface;
Caption := ExpandConstant('{cm:MyRadioDeskrip_1}');
Left := ScaleX(112);
Top := ScaleY(32);
Width := ScaleX(185);
Height := ScaleY(57);
end;
{ NewStaticText2 }
NewStaticText2 := TNewStaticText.Create(WizardForm);
with NewStaticText2 do
begin
Name := 'NewStaticText2';
Parent := ISCustomPage1.Surface;
Caption := ExpandConstant('{cm:MyRadioDeskrip_2}');
Left := ScaleX(112);
Top := ScaleY(144);
Width := ScaleX(185);
Height := ScaleY(57);
end;
NewRadioButton1.TabOrder := 0;
NewStaticText1.TabOrder := 1;
NewRadioButton2.TabOrder := 2;
NewStaticText2.TabOrder := 3;
end;
procedure InitializeWizard();
begin
RedesignWizardForm;
end;
serg aka lain, изящненько, только тогда библиотечку-бы со своими иконками, чтоб не ограничиватся системными :)
Я через ботву попробую, правда тяжеловато выходит для простенького скрипта....
serg aka lain, спасибо - очень классно! Лександер, тоже спасибо за труд!
Нужна помощь, кто использовал в Inno Setup распаковку архивов FreeArc. Есть архив Glossary.arc нужно чтобы он распаковывался при выборе на SelectComponentsPage в нужную папку. Как это можно осуществить???
serg aka lain
27-12-2010, 00:11
если нужно, завтра сделаю »
если не сложно, то будем посмотреть.
только тогда библиотечку-бы со своими иконками, чтоб не ограничиватся системными »
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.