Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 7]
diman_21Ru
17-04-2014, 10:06
audiofeel, Немного не то , Короче вот как я сделал :
Name: Fonts;Description:Fonts; Types: full compact custom; Flags: fixed
Source:"Fonts\*"; DestDir: {Fonts};Components:Fonts; Flags: onlyifdoesntexist uninsneveruninstall; FontInstall: Calibri Light Italic
установщик ставит как надо шрифты но не все почему ?
audiofeel
17-04-2014, 10:27
Короче вот как я сделал : »
нужно для каждого шрифта повторять строку, и после "FontInstall:" указывать свой шрифт, а в примере у тебя указан "Calibri Light Italic", если его нет в папке "Source:"Fonts" то он и не установится, звездочку та убери и не поленись и пропиши все шрифты, название указывай не по названию файла шрифта а так как на самом деле называется шрифт (это можно просмотреть "запустив" шрифт
diman_21Ru
17-04-2014, 10:32
audiofeel, т.е я как понял сразу написав тока папку он так не определит , попытаюсь каждую тогда вписать
audiofeel
17-04-2014, 10:34
diman_21Ru,
Source:"папка где лежат шрифты\твой шрифт1.ttf"; DestDir: {Fonts};Components:Fonts; Flags: onlyifdoesntexist uninsneveruninstall; FontInstall: название шрифта1
Source:"папка где лежат шрифты\твой шрифт2.ttf"; DestDir: {Fonts};Components:Fonts; Flags: onlyifdoesntexist uninsneveruninstall; FontInstall: название шрифта2
diman_21Ru
17-04-2014, 10:36
audiofeel, вот гораздо удобнее ) спасибо
Dodakaedr
17-04-2014, 13:13
Можно одному элементу присвоить несколько caption? Например, имеется новый StatusLabel и нужно присвоить ему две-три надписи (caption) в течении установки.
Dodakaedr, по идее можно. Просто в каждый конкретный момент будет доступен последний присвоенный.
Dodakaedr
17-04-2014, 13:29
Shkutu, Как это можно осуществить?
А есть такая функция которая задает время показа элемента?
Dodakaedr, задавать время показа - это вряд ли. Ну или я про такое не знаю.
Вообще, если речь о каких-то действиях после установки, то это все запихивается в CurStepChanged
procedure CurStepChanged(CurStep: tSetupStep);
begin
if (CurStep=ssPostInstall) then
begin
WizardForm.StatusLabel.Caption := 'Статус1';
//что-то делаем
WizardForm.StatusLabel.Caption := 'Статус2';
end;
end;
А еще, если что-то запускается во время основной установки с помощью секции [Run], то там можно задавать StatusLabel с помощью параметра StatusMsg.
Dodakaedr
17-04-2014, 14:55
Вообще, если речь о каких-то действиях после установки, то это все запихивается в CurStepChanged »
Я просто заменил стандартный StatusLabel своим и теперь хочу вывести на него две надписи...
Dodakaedr, вы как-то не слишком конкретно вопросы задаете:) Т е менять статусы надо во время стандартной установки, используя не стандартный статус-лэйбл? Ну можно попробовать так например
[Files]
Source: "myapp.exe"; DestDir: {app}; BeforeInstall: ChangeLabel('files')
[Registry]
Root: "HKLM"; Subkey:"Software\MyApp"; ValueType: string; ValueName: "path"; ValueData: "{app}"; BeforeInstall: ChangeLabel('reg')
[Сode]
var StatusLbl: TLabel; //новый статус-лэйбл
procedure ChangeLabel(param:string);
begin
case param of
'files': StatusLbl.Caption:='Копирование файлов';
'reg': StatusLbl.Caption:='Создание записи в реестре';
end;
Dodakaedr
17-04-2014, 15:22
вы как-то не слишком конкретно вопросы задаете »
Ну так я изначально так и спросил http://forum.oszone.net/post-2339390-446.html. Вариант хорош, сейчас попробую... отпишусь:)
Shkutu, а на иконки (секция [Icon]) можно такое сделать?
Dodakaedr
17-04-2014, 15:53
Можно эту процедуру оформить как функция, потому что мой статус-лэйбл уже используется в процедуре? По позже вырежу сам код покажу....Не могу ничего придумать(( В оригинале намного больше файлов...
Часть кода отвечающий за статус-лэйбл:
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp
DisableFinishedPage=yes
[Files]
Source: "C:\Program Files\Inno Setup 5 Ultra\Examples\MyProg.exe"; DestDir: {app};
[...code]
var
Portable,Installer: TNewRadioButton;
function InstallerCheck: Boolean;
begin
Result := Installer.Checked;
end;
function PortableCheck: Boolean;
begin
Result := Portable.Checked;
end;
function GetSystemMetrics(nIndex:Integer):integer; external 'GetSystemMetrics@user32.dll stdcall delayload';
procedure MiniInstall;
var
NewStatusLabel: TLabel;
begin
with WizardForm do
begin
Bevel.Hide;
Bevel1.Hide;
MainPanel.Hide;
AutoScroll := False;
ClientHeight := ScaleY(85);
ClientWidth := ScaleX (320);
InnerNotebook.Align := alClient;
ProgressGauge.Left := ScaleX(10);
CancelButton.Left := ScaleX(235);
CancelButton.Top := ScaleY(65);
CancelButton.Height := ScaleX(17);
CancelButton.BringToFront;
Left:=GetSystemMetrics(16)-Width;
Top:=GetSystemMetrics(17)-Height;
FilenameLabel.Hide;
StatusLabel.Hide;
NewStatusLabel := TLabel.Create(WizardForm);
with NewStatusLabel do
begin
Parent := StatusLabel.Parent;
SetBounds(90, StatusLabel.Top, StatusLabel.Width, StatusLabel.Height);
if Installer.Checked then
Caption:='Установка файлов...';
if Portable.Checked then
Caption:='Распаковка файлов...';
end;
end;
end;
procedure InitializeWizard();
begin
Portable := TNewRadioButton.Create(WizardForm);
with Portable do
begin
Parent := WizardForm.WelcomePage;
Left := ScaleX(314);
Top := ScaleY(266);
Width := ScaleX(200);
Height := ScaleY(17);
Caption := 'Портативная';
end;
Installer := TNewRadioButton.Create(WizardForm);
with Installer do
begin
Parent := WizardForm.WelcomePage;
Left := ScaleX(200);
Top := ScaleY(266);
Width := ScaleX(100);
Height := ScaleY(17);
Caption := 'Стационарная';
Checked:=True;
end;
end;
procedure CurPageChanged(CurPageID: Integer);
begin
case CurPageID of
wpInstalling:
begin
MiniInstall;
end;
end;
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssDone then
MsgBox('Приятного использования!', mbInformation, MB_OK);
end;
Dodakaedr
17-04-2014, 20:43
Shkutu, Удалил свой статус-лэйбл, подставил ваш, но не знаю теперь как его вывести в процедуре MiniInstall? Если не выводить, то выбивает ошибку...Как это сделать?
Stealthmax
17-04-2014, 21:12
Проверял, запускает удаление »
Не вопрос, по порядку. AppID я указываю, само собой это упрощает все действия. Но в данном примере, как я разобрался, две неточности, а именно:
function UninstallMyApp(): Boolean;
var
Buff: String;
i: Integer;
begin
Result := not RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}', 'UninstallString', Buff );
if not Result then Result := not FileExists(RemoveQuotes(Buff));
if not Result then if MsgBox('Перед установкой необходимо удалить предыдущую версию приложения. Продолжить?', mbError, MB_YESNO) = IDYES then // если убираем эти аргументы, то диалог появляется, т.е. получается что изначально отрицаем существование ключа в реестре, а ОН ЕСТЬ))))
try
Exec(RemoveQuotes(Buff), '', ExtractFilePath(RemoveQuotes(Buff)), SW_SHOW, ewWaitUntilTerminated, i);
finally
И теперь самое интересное, о чем я выше писал, но наверно никто не понял что же не так происходит с извлекаемой строкой реестра.
А происходит следующее: указываем RemoveQuotes, т.е. убираем кавычки, а строка в реестре выглядит так: "C:\Windows\Installer\SandboxieInstall64.exe" /remove, то в итоге при выполнении получаем такой вид: C:\Windows\Installer\SandboxieInstall64.exe" /, т.е. обрезает начало и конец, и получаем явную ошибку. Пробовал играться с добавлением недостающих символов в строке, но результат снова 0.
P.S. Все, решил вопрос снимается. Exec(ExpandConstant('{cmd}'), '/C ' + (Buff),'', SW_HIDE, ewWaitUntilTerminated, i);
Извлекаем параметр в интерпретатор командной строки, и получаем требуемый результат. Другого способа не нашел.
diman_21Ru
17-04-2014, 21:24
Какой самый простой способ в установщик добавить другую мышку ,заранее спасибо.
Но в данном примере, как я разобрался, две неточности »
В данном коде неточностей нет.
---------------------------------------------------
Касательно вашего вопроса, самое просто - использовать StringChange, а после вызывать исполняемый файл через Exec с параметром /remove
[Setup]
AppName=My Program
AppVersion=1.5
AppId={{D61E0604-FA55-4DFD-8ED3-CAF85483713A}
DefaultDirName={pf}\My Program
OutputDir=...
[Code]
function InitializeSetup(): Boolean;
var
Buff: String;
begin
Buff := '"C:\Windows\Installer\SandboxieInstall64.exe" /remove';
StringChange(Buff, ' /remove', '');
MsgBox(RemoveQuotes(Buff), mbError, MB_YESNO);
end;
Stealthmax
17-04-2014, 23:19
В данном коде неточностей нет. »
Ну как же нет неточностей, если диалог деинсталляции не появляется?! Идет проверка ключа и вызов удаления, если таковое условие соблюдается, верно? Если так, то я реально не понял как он так работает в первоначальном виде. Установщик родной Sandboxie отнюдь не Inno, а NSIS. А изменять строку- это усложнение процесса, на мой взгляд. Командная строка энергичнее справляется. Exec(ExpandConstant('{cmd}'), '/C ' + GetPath+ ' /S','', SW_HIDE, ewWaitUntilTerminated, ResultCode); Добавляю только параметр /S и ноу проблем-с, тихое удаление. Но за отклик, все равно спасибо, буду иметь виду такой вариант.
Ну как же нет неточностей, если диалог деинсталляции не появляется?! »
С представленным вами ключем реестра и не будет появлятся, так как инсталятор получает некорректный путь к файлу, а следовательно решает, что файла нет.
В своем первоначальном виде код работает как и надо.
не понял как он так работает в первоначальном виде »
Result := Возвращает Да, если искомой ветки реестра нет. Если условие возвращает Да работа функции прерывается. Если Нет - переходит ко второму условию
if not Result then Result := Возвращает Да, если нет искомого файла. Обрабатывается только если первое условие вернет Нет. Если условие возвращает Да работа функции прерывается.
if not Result then if Отображает MsgBox, если условие выше возвращает Нет.
Получаем своеобразную иерархию условий - если запись в реестре существует, ищем файл, если находим, выводим сообщение с предложением удалить и при ответе Да вызываем деинсталятор.
Dodakaedr, надо было не удалять свой лейбл и менять его на мой, а немного подумать, вообще говоря.
Возвращаете свой лейбл обратно, но при этом делаете его глобальной переменной, чтобы можно было использовать не только в вашей процедуре MiniInstall (инициализацию лейбла, т е create, присвоение parent и setbounds, лучше тоже вынести из процедуры MiniInstall в процедуру InitializeWizard). А в моем примере заменяете мой лейбл на ваш.
Насчет Icons - по идее на иконки тоже можно такое повесить. Подробнее смотрите справку о параметре BerforeInstall.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC