sergey spb 4 #260691 Posted March 30, 2015 (edited) Добрый день! Как добиться такого, чтобы кнопка "Далее" становилась неактивна, когда не выбран ни один компонент [Components] во время установки? Ведь нет никакого смысла ставить, если ничего не выбрано! Делал так: procedure ComponentOnClick(Sender: TObject);beginif WizardSelectedComponents(False) = '' thenWizardForm.NextButton.Enabled:= Falseelse WizardForm.NextButton.Enabled:= True;end; procedure InitializeWizard();beginWizardForm.ComponentsList.OnClick := @ComponentOnClick;end; но дальше первой страницы не пускает, не выбран компонент (из-за картинки не видно). Как отключить первую страницу? Может кому надо InnoSetupFAQ:InnoSetupFAQ_ru-board.rar Edited March 30, 2015 by sergey spb Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #260696 Posted March 30, 2015 (edited) @sergey spb, ну по твоему варианту лучше будет использовать свойство OnClickCheck. А вообще, для работы с кнопкой "далее", лучше использовать выделенную под неё функцию: Function NextButtonClick(CurPageID: Integer): Boolean; begin Result := True; case CurPageID of wpSelectComponents: begin if WizardSelectedComponents(False) = '' then begin MsgBox('Ни один из компонентов не выбран!', mbInformation, MB_OK); Result := False; end; end; end; end; Edited March 30, 2015 by Kotyarko_O Quote Share this post Link to post Short link Share on other sites
sergey spb 4 #260698 Posted March 30, 2015 @sergey spb, ну по твоему варианту лучше будет использовать свойство OnClickCheck. А вообще, для работы с кнопкой "далее", лучше использовать выделенную под неё функцию: Function NextButtonClick(CurPageID: Integer): Boolean; begin Result := True; case CurPageID of wpSelectComponents: begin if WizardSelectedComponents(False) = '' then begin MsgBox('Ни один из компонентов не выбран!', mbInformation, MB_OK); Result := False; end; end; end; end; Большое СПАСИБО!!! Quote Share this post Link to post Short link Share on other sites
sergey spb 4 #260923 Posted March 31, 2015 (edited) Добрый вечер. Делаю картинку внизу страницы со ссылкой: [Files]Source: logo.bmp; DestDir: {tmp}; Flags: dontcopy nocompression varLogoImage:TBitmapImage;LogoPanel: TPanel;LogoLabel: TLabel;procedure LogoLabelOnClick(Sender: TObject);varErrorCode: Integer;begin ShellExec('open', 'http ://forum.ru-board.com', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode)end;procedure InitializeWizard();/////////////////begin LogoPanel := TPanel.Create(WizardForm);with LogoPanel dobegin Parent := WizardForm; Left := ScaleX(8); Top := ScaleY(327); Width := ScaleX(120); Height := ScaleY(28); BevelOuter := bvNone;end; LogoImage := TBitmapImage.Create(WizardForm);with LogoImage dobegin Parent := LogoPanel; Left := ScaleX(0); Top := ScaleY(0); AutoSize:=true; ReplaceColor:=clFuchsia; ReplaceWithColor:=clBtnFace; ExtractTemporaryFile('logo.bmp'); Bitmap.LoadFromFile(ExpandConstant('{tmp}\logo.bmp'));end; LogoLabel := TLabel.Create(WizardForm);with LogoLabel dobegin Parent := LogoPanel; Width := LogoPanel.Width; Height := LogoPanel.Height; Transparent:=True; Cursor := crHand; OnClick:=@LogoLabelOnClick;end;end; Ругаеться: Edited March 31, 2015 by sergey spb Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #260927 Posted March 31, 2015 Procedure InitializeWizard1(); begin ... ... end; Procedure InitializeWizard2(); begin ... ... end; Procedure InitializeWizard(); begin InitializeWizard1(); InitializeWizard2(); end; Quote Share this post Link to post Short link Share on other sites
sergey spb 4 #260932 Posted March 31, 2015 Procedure InitializeWizard1(); begin ... ... end; Procedure InitializeWizard2(); begin ... ... end; Procedure InitializeWizard(); begin InitializeWizard1(); InitializeWizard2(); end; Спасибо!!! Буду пробовать. По другому: ..... procedure RedesignWizardForm; var i: integer; BtnPanel: TPanel; BtnImage: TBitmapImage; begin ExtractTemporaryFile('logo.bmp') BtnPanel:=TPanel.Create(WizardForm) with BtnPanel do begin Left:=1 Top:=314 Width:=46 Height:=45 Cursor:=crHand OnClick:=@logoOnClick Parent:=WizardForm end; BtnImage:=TBitmapImage.Create(WizardForm) with BtnImage do begin AutoSize:=True; Enabled:=False; Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\logo.bmp') Parent:=BtnPanel end; with WizardForm do begin Caption := ExpandConstant('{cm:Main}'); end; with WizardForm.WizardBitmapImage do begin Width := ScaleX(502); end; with WizardForm.WelcomeLabel2 do begin Visible := False; end; with WizardForm.WelcomeLabel1 do begin Visible := False; end; with WizardForm.WizardSmallBitmapImage do begin Left := ScaleX(0); Width := ScaleX(502); Height := ScaleY(70); end; with WizardForm.PageDescriptionLabel do begin Visible := False; end; with WizardForm.PageNameLabel do begin Visible := False; end; with WizardForm.WizardBitmapImage2 do begin Width := ScaleX(502); end; with WizardForm.FinishedLabel do begin Visible := False; end; with WizardForm.FinishedHeadingLabel do begin Visible := False; end; end; procedure ShowPicHint(const PicFilePath: String); var pt: TPoint; begin if not GetCursorPos(pt) then Exit; InfoPic.Bitmap.LoadFromFile(PicFilePath); try with PicForm do begin SetBounds(ScaleX(pt.x + 16), ScaleY(pt.y + 7), InfoPic.Width, InfoPic.Height); Show; end; finally SetFocus(WizardForm.Handle); end; end; procedure CompOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea); var UndefPic: String; begin if Index = -1 then Exit; if Index = LastIndex then Exit; try //--------------------------------------------------------------------------------------------------Êàðòèíêè----------------------------------- case TNewCheckListBox(Sender).ItemCaption[index] of 'Öèôðû': UndefPic := '1.bmp'; // ïèøåì òî÷íî òàê æå, êàê ïðîïèñàíî â êîìïîíåíòàõ 'Èêîíêè': UndefPic := '2.bmp'; 'Òóíäðà': UndefPic := '3.bmp'; 'Ðåíãåí': UndefPic := '4.bmp'; 'Dendy': UndefPic := '5.bmp'; 'Çâóêîâîå îïîâåùåíèå: äî êîíöà áîÿ,ôðàãè + ìåäàëè': UndefPic := '6.bmp'; else begin LastIndex := UNDEF_INDEX; PicForm.Hide; Exit; end; end; if not FileExists(TempPath + UndefPic) then ExtractTemporaryFile(UndefPic); ShowPicHint(TempPath + UndefPic); finally LastIndex := Index; end; end; procedure CompOnMouseLeave(Sender: TObject); begin PicForm.Hide; LastIndex := -1; end; procedure InitInfo(); begin WizardForm.ComponentsList.OnItemMouseMove := @CompOnItemMouseMove; WizardForm.ComponentsList.OnMouseLeave := @CompOnMouseLeave; TempPath := AddBackslash(ExpandConstant('{tmp}')); LastIndex := UNDEF_INDEX; PicForm := TForm.Create(WizardForm) with PicForm do begin BorderStyle := bsNone; FormStyle := fsStayOnTop; InfoPic := TBitmapImage.Create(PicForm) with InfoPic do begin Parent := PicForm; AutoSize := True; end; end; SetWindowLong(PicForm.Handle, GWL_EXSTYLE, GetWindowLong(PicForm.Handle, GWL_EXSTYLE) or WS_EX_LAYERED); SetLayeredWindowAttributes(PicForm.Handle, 0, ALPHA_BLEND_LEVEL, LWA_ALPHA); end; Procedure CurPageChanged(CurPageID: Integer); var Reg, UninstallPath: String; ResultCode: Integer; begin case CurPageID of wpSelectComponents: begin Reg := ExpandConstant('Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{#emit SetupSetting("AppID")}_is1'); if RegValueExists(HKLM, Reg, 'UninstallString') then RegQueryStringValue(HKLM, Reg, 'UninstallString', UninstallPath); if Length(UninstallPath) > 0 then begin case MsgBoxEx(WizardForm.Handle, 'Ðåêîìåíäóåòñÿ óäàëèòü ðàíåå óñòàíîâëåííóþ âåðñèþ ñáîðêè.' + #13#10 + 'Õîòèòå ñäåëàòü ýòî ñåé÷àñ?', 'ModPack SG', MB_YESNO or MB_ICONQUESTION, 0, 0) of IDYES: Exec(RemoveQuotes(ExpandConstant(UninstallPath)), '/SILENT /SUPPRESSMSGBOXES', '', SW_SHOW, ewWaitUntilTerminated, ResultCode); IDNO: Exit; end; end; end; end; end; Function NextButtonClick(CurPageID: Integer): Boolean; begin Result := True; case CurPageID of wpSelectComponents: begin if WizardSelectedComponents(False) = '' then begin MsgBox('Íè îäèí èç êîìïîíåíòîâ íå âûáðàí!', mbInformation, MB_OK); Result := False; end; end; end; end; procedure InitializeWizard(); begin RedesignWizardForm; InitInfo(); RedesignWizardForm; InitializeWizard2(); BackupCheck_1(); end; 1 Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #260936 Posted March 31, 2015 (edited) @sergey spb, во-первых, код ложи под тег спойлера (в панели управления, выше поля ввода есть). Во-вторых, с RedesignWizardForm можно сделать то же самое, что и с InitializeWizard. Тем более, что процедура "RedesignWizardForm" может иметь почти любое название, не надо привязываться к названиям, которые были в примере (или откуда там был взят скрипт). Edited March 31, 2015 by Kotyarko_O Quote Share this post Link to post Short link Share on other sites
AtotIK 580 #260938 Posted March 31, 2015 sergey spb, неужто так сложно нажать Ctrl + F и найти где у тебя по коду повторяется процедура RedesignWizardForm, переименовать вторую и подключить её в InitializeWizard? И, чёрт тебя дери, ПОЛЬЗУЙСЯ спойлерами! Стены текта тут не нужны! 2 Quote Share this post Link to post Short link Share on other sites
sergey spb 4 #260941 Posted March 31, 2015 Kotyarko_O и AtotIK, Спасибо! Отдельное спасибо - за терпение. Quote Share this post Link to post Short link Share on other sites
xasic 14 #260974 Posted March 31, 2015 Коллеги, здравствуйте. Пардон за поднятие проблемы, которая уже была озвучена здесь. Однако, решения в теме так и не нашел, пролопатив по поиску с десяток страниц. Прошу помочь знающих, проблема очень простая. Суть: копирование папки audio из папки /res в папку /res_mods перед установкой аудио-модов. 1). создаваемый мод-пак содержит в себе несколько разных аудио-модов - юзер может выбрать компоненты, затем удалить старые и установить новые и т.д. 2). юзер уже мог до этого установить другие аудио-модов. то есть в его папке res_mods уже может присутствовать папка audio. Необходимо прописать в установщик, чтобы он проверял наличие в папке /res_mods/0.9.* папки audio - и если она есть, то при установке модов ничего не копировать. А если ее нет - скопировать ее только один раз. И не копировать затем при доустановке / переустановке и других операциях. Что уже сделано: добавлена строчка Source: "{app}\res\audio\*"; DestDir: "{app}\res_mods\0.9.7\audio\"; Flags: external recursesubdirs skipifsourcedoesntexist; Components: KMP\P; перед каждым компонентом. Однако в этом случае каждый раз происходит копирование все папки. Помогите, пожалуйста. Quote Share this post Link to post Short link Share on other sites
AtotIK 580 #260975 Posted March 31, 2015 (edited) xasic, с проверками шляпа конечно, знаю по инсталлятору "Озвучки WGTV". Копай в сторону DirExists: DirPath:=ExpandConstant('{app}\res_mods\') + GetModsDir + ExpandConstant('\audio'); If DirExists(DirPath) then Не забывай ещё про проверку на наличие файлов в папке audio.Запиши всё функцией, подключай на шаге CurStep=ssInstall, и через Check можно проверять копировать ли папку. Edited March 31, 2015 by AtotIK 1 Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #260976 Posted March 31, 2015 (edited) Что уже сделано: добавлена строчка Source: "{app}\res\audio\*"; DestDir: "{app}\res_mods\0.9.7\audio\"; Flags: external recursesubdirs skipifsourcedoesntexist; Components: KMP\P; перед каждым компонентом. Однако в этом случае каждый раз происходит копирование все папки. Ну гораздо лучше будет сделать копирование один раз. Например, есть компонент KMP\AUDIO, и все остальные компоненты являются ему дочерними (KMP\AUDIO\VEHICLE, KMP\AUDIO\CREW и т.д.) и копирование папки audio из игровых ресурсов сделать так: Source: "{app}\res\audio\*"; DestDir: "{app}\res_mods\0.9.7\audio\"; Flags: external recursesubdirs skipifsourcedoesntexist; Components: KMP\AUDIO; В таком случае нет разницы, выбран один компонент или несколько - копироваться папка будет один раз. И описанная вами проблема исчезнет. Необходимо прописать в установщик, чтобы он проверял наличие в папке /res_mods/0.9.* папки audio - и если она есть, то при установке модов ничего не копировать. Это сделать не проблема, проверять наличие папки можно способом, описанным выше, @AtotIK`ом. И получившуюся функцию добавить как дополнительное условие в параметре "Check". А если ее нет - скопировать ее только один раз. И не копировать затем при доустановке / переустановке и других операциях. Ну так не получится. Вернее, получится, но будет не совсем правильно. Т.к. пользователь мог вручную установить какую-то звуковую модификацию после первой установки модПака. И при повторной установке этого модпака, папка не очистится от "лишнего". Так что это может быть проблемой. Edited March 31, 2015 by Kotyarko_O 3 Quote Share this post Link to post Short link Share on other sites
xasic 14 #260981 Posted March 31, 2015 @AtotIK, @Kotyarko_O, спасибо за решения, пробую, о результатах отпишусь.. Quote Share this post Link to post Short link Share on other sites
sergey spb 4 #261041 Posted April 1, 2015 Добрый день. А как убрать (заменить) надпись: "Установка-" (сверху слева) Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #261044 Posted April 1, 2015 А как убрать (заменить) надпись: "Установка-" (сверху слева) Например: Procedure InitializeWizard(); begin WizardForm.Caption := 'Не установка'; end; Имя приложения можно вытащить из секции Setup: WizardForm.Caption := '{#emit SetupSetting("AppName")}'; Quote Share this post Link to post Short link Share on other sites
sergey spb 4 #261046 Posted April 1, 2015 Например: Procedure InitializeWizard(); begin WizardForm.Caption := 'Не установка'; end; Имя приложения можно вытащить из секции Setup: WizardForm.Caption := '{#emit SetupSetting("AppName")}'; Спасибо!!! Quote Share this post Link to post Short link Share on other sites
xasic 14 #261055 Posted April 1, 2015 @AtotIK, @Kotyarko_O, Комрады? Могу я попросить вас о помощи снова? Ничего не получается с составлением самого скрипта: логику понимаю, составить правильно код - не могу. Не сочтите за труд помочь вставить правильный код. Проблема всё та же - проверка наличия папки аудио в папке 0.9.7. Приложил файл, который при компиляции выдаёт ошибку. Или просто помогите составить правильный код. RTCS 0.9.7_1.rar Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #261057 Posted April 1, 2015 (edited) @xasic, так должно компильнуться: RTCS 0.9.7_1.rar. Edited April 1, 2015 by Kotyarko_O Quote Share this post Link to post Short link Share on other sites
AtotIK 580 #261067 Posted April 1, 2015 (edited) xasic, логика составления скрипта не правильная: function MyDirName(S:String): String; var InsPath: String; er: boolean; myFile:String; audio: boolean; begin Result:=ExpandConstant('C:\World_of_Tanks\'); er := RegQueryStringValue(HKLM, 'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1', 'InstallLocation', InsPath); if er and (InsPath<>'') then begin Result := InsPath; end; audio:=DirExists('{app}\res_mods\0.9.7\audio\'); If NOT audio then begin CopyDir(ExpandConstant('{app}\res\audio\'),ExpandConstant('{app}\res_mods\0.9.7\audio\')); end; end; Проверять эти данные нужно непосредственно перед началом установки, а не при запуске инсталлятора. У многих игры нет ни в реестре, ни по выставляемому пути в этой процедуре. Приложенный выше скрипт конечно скомпилируется, но толку от этого не много. Нужно перенести нужный код в отдельную процедуру и вызывать его на этапе ssInstall, тогда инсталлятор 100% знает в какую папку начинается установка: [Files] Source: "{app}\res\audio\*.*"; DestDir: "{app}\res_mods\0.9.7\audio"; Flags: uninsneveruninstall skipifsourcedoesntexist overwritereadonly ignoreversion external; Check: ModsInstallCheck; [~Code~] var DirPath, FilePath: AnsiString; SoundCheck: Boolean; function ModsInstallCheck_1(): Boolean; begin Result:=False; SoundCheck:=False; DirPath:=ExpandConstant('{app}\res_mods\') + GetModsDir + ExpandConstant('\audio'); If DirExists(DirPath) then FilePath:=ExpandConstant('{app}\res_mods\') + GetModsDir + ExpandConstant('\audio\ingame_voice.fev'); If DirExists(DirPath) and FileExists(FilePath) then begin Result:=True; SoundCheck:=True; end; end; function ModsInstallCheck(): Boolean; begin Result:=False; If SoundCheck then Result:=True; end; procedure CurStepChanged(CurStep: TSetupStep); begin If CurStep=ssInstall then begin ModsInstallCheck_1(); end; Сильно не вникал в код, но тут суть передать первая задача. На GetModsDir не обращай внимания, в неё у меня считывается текущая версия игры. З.Ы. Kotyarko_O, правильнее вот так: RegQueryStringValue(HKCU, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1', 'InstallLocation', ResultCode); Wow6432Node есть только на х64 системах. Так там отображается х86 разделы. Формально указанный мной путь существует, но отображается через Wow6432Node на х64. Edited April 1, 2015 by AtotIK Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #261068 Posted April 1, 2015 З.Ы. Kotyarko_O, правильнее вот так Я не правил остальной код, а только пофиксил то, на что была жалоба. 1 Quote Share this post Link to post Short link Share on other sites