Kotyarko_O 1,906 #220442 Posted October 6, 2014 я как будто со стеной говорю мой мод пак работает 3 месяца спасибо этому форуму мне не нужна помощь онлайн спеЦов в его создании мне нужна ваша помощь в его улучшении Как бы никто вам в создании и не рвётся помогать. 1 1 Quote Share this post Link to post Short link Share on other sites
XXX_MUTANT 76 #220457 Posted October 6, 2014 (edited) Не пробовали загуглить то, что вам подсказали? Я, почему-то, уверен, что вы 100% найдёте правильный вариант. Попробуй вот так: Function NextButtonClick(CurPageID: Integer): Boolean; begin Result := True; case CurPageID of wpSelectDir: if not FileExists(ExpandConstant('{app}\WorldOfTanks.exe')) then begin MsgBox('Не верно указана папка World of Tanks!', mbError, MB_OK); Result := False; end else #ifdef DateToEnd begin Result := CompareStr(GetDateTimeString('yyyy.mm.dd', '.', #0), '{#DateToEnd}') <= 0; If not Result then begin MsgBox('Install time limit, it is not possible to install this program.', mbError, MB_OK); end else begin Result := True; end; #endif end; end; end; Так дату не проверяет. Вот мой код. при прошедшей дате не пропускает дальше, но при правильной указывает на отсутствие экзешника, но всеровно переходит потом на следующую страницу. function NextButtonClick(CurPageID: Integer): Boolean; begin Result := True; case CurPageID of wpSelectDir: if not FileExists(ExpandConstant('{app}\WorldOfTanks.exe')) then begin MsgBox('Не верно указана папка World of Tanks!', mbError, MB_OK); Result := False; end; end; #ifdef DateToEnd begin Result := CompareStr(GetDateTimeString('yyyy.mm.dd hh:nn:ss', '.', ':'), '{#DateToEnd}') <= 0; If not Result then begin MsgBox('Install time limit, it is not possible to install this program.', mbError, MB_OK); end else begin Result := True; end; end; #endif end; Edited October 6, 2014 by XXX_MUTANT Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #220462 Posted October 6, 2014 @XXX_MUTANT, это не забыл? #define DateToEnd "2015.08.08" Quote Share this post Link to post Short link Share on other sites
XXX_MUTANT 76 #220468 Posted October 6, 2014 (edited) @XXX_MUTANT, это не забыл? #define DateToEnd "2015.08.08" Нет, не забыл, я только эту часть ковыряю, меняя дату в #define DateToEnd "2014.10.06 16:09:59" Видать конфликтуют между собой они... Edited October 6, 2014 by XXX_MUTANT Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #220474 Posted October 6, 2014 (edited) Видать конфликтуют между собой они... Изначально логичнее было бы сделать так: #define DateToEnd "05.12.2013 15:55" [Code] #ifdef DateToEnd Function InitializeSetup(): Boolean; begin Result := CompareStr(GetDateTimeString('dd.mm.yyyy hh:nn', '.', ':'), '{#DateToEnd}') <= 0; If not Result then begin MsgBox('Install time limit, it is not possible to install this program.', mbError, MB_OK); end; end; #endif Function NextButtonClick(CurPageID: Integer): Boolean; begin Result := True; case CurPageID of wpSelectDir: if not FileExists(ExpandConstant('{app}\WorldOfTanks.exe')) then begin MsgBox('Не верно указана папка World of Tanks!', mbError, MB_OK); Result := False; end else begin Result := True; end; end; end; Edited October 6, 2014 by Kotyarko_O 2 Quote Share this post Link to post Short link Share on other sites
XXX_MUTANT 76 #220507 Posted October 6, 2014 Изначально логичнее было бы сделать так: #define DateToEnd "05.12.2013 15:55" [Code] #ifdef DateToEnd Function InitializeSetup(): Boolean; begin Result := CompareStr(GetDateTimeString('dd.mm.yyyy hh:nn', '.', ':'), '{#DateToEnd}') <= 0; If not Result then begin MsgBox('Install time limit, it is not possible to install this program.', mbError, MB_OK); end; end; #endif Function NextButtonClick(CurPageID: Integer): Boolean; begin Result := True; case CurPageID of wpSelectDir: if not FileExists(ExpandConstant('{app}\WorldOfTanks.exe')) then begin MsgBox('Не верно указана папка World of Tanks!', mbError, MB_OK); Result := False; end else begin Result := True; end; end; end; Спасибо!+ Этот вариант помог! Quote Share this post Link to post Short link Share on other sites
Prokers 0 #220595 Posted October 7, 2014 Quote Share this post Link to post Short link Share on other sites
Andrew_Dark 8 #220632 Posted October 7, 2014 (edited) я как будто со стеной говорю мой мод пак работает 3 месяца спасибо этому форуму мне не нужна помощь онлайн спеЦов в его создании мне нужна ваша помощь в его улучшении Ахах, а день удался... Спасибо ещё один екземпляр, уважаемый, по-моему Вам совсем не нужна помощь, Вы сами справитесь, ахахахах. Кстати, Атотик, как там с ползанием интерфейса на широкоформатниках, по прежнему частично глухо? Edited October 7, 2014 by Darksoul Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #220749 Posted October 7, 2014 (edited) Помогите не могу А пытались? В данной теме есть подходящие для вас примеры, просто поищите и хоть попробуйте сделать что-то. В шапке есть архив с примерами, посмотрите их. И попытайтесь сделать сами. А уже по ходу ваших попыток - задавайте вопросы (если будут возникать трудности). Так вы хоть немного обучитесь самостоятельной работе с Inno. Edited October 7, 2014 by Kotyarko_O Quote Share this post Link to post Short link Share on other sites
woole 5 #221106 Posted October 8, 2014 (edited) Ребят, привет :) Понимаю, что скорее всего, этот вопрос поднимался и скорее всего решался, но я не нашел решения( Пытаюсь добавить этот скрипт: http://www.koreanrandom.com/forum/topic/9050-инсталлятор-для-модпаков/page-4#entry150208 но не получается. Сделал все точно по инструкции, не работает :( /*тут был код*/ Edited October 21, 2014 by woole Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #221221 Posted October 9, 2014 Сделал все точно по инструкции, не работает :( Да ладно? Точно, что всё точно? Итак, по порядку: 1) Код у тебя так и находится в секции [Components]? 2) Код не полный. Вот так будет выглядеть нормальная конструкция: script.rar. з.ы. заменишь компоненты на свои, и вывод картинки по имени компонента тоже. Картинки ложи в папку img_mod. Quote Share this post Link to post Short link Share on other sites
woole 5 #221228 Posted October 9, 2014 (edited) 1) Код у тебя так и находится в секции [Components]?Там несколько картинок, если что. Я опустил ненужное. 2) Код не полный. Если надо, вот полный : /*тут был код*/ Edited October 21, 2014 by woole Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #221295 Posted October 9, 2014 Если надо, вот полный Если и надо - то полный. Абсолютно полный. Весь скрипт. Quote Share this post Link to post Short link Share on other sites
leeuniverse 61 #221684 Posted October 11, 2014 (edited) Hey all, could someone help me fix two three issues with my code? I'm not a coder. I understand what needs to be done, but not how. 1. I need my code to be edited so that it allows the "Next" button to be highlighted when on the License Page, and the "Accept Agreement" checkmark is checked. As it currently is, clicking "Next" does not work, unless you click "Back" and then "Next", and then you can continue. 2. For the "Progress Bar" to not show when on the Credit Page, thus messing up the page formating. BTW, the code also needs to be able to work still without problems IF I choose NOT to have some or any of those pages show: //(InfoBeforeFile=faq.rtf //LicenseFile=license.rtf //InfoAfterFile=credit.rtf), i.e. commented out. However, if this makes fixing the code harder, don't worry about it. I'm fine to show all these pages in my installer. Thank you much, appreciated. Code: /////////////////////////////////////////////////////////////////////////////////// // Script for World of Tanks from San4oPack 2014 // // A simple form of music, backup files (recovery after uninstalling) // // with pictures, etc. // /////////////////////////////////////////////////////////////////////////////////// ; At each update patch game, change only the numbers ( eg: #define Patch "0.9.2" #define Patch "0.9.3" etc.) #define Patch "0.9.3" ; Skins are located in the Styles folder. If you want to change the skin, change only the name (for example: #define SkinName "skin.cjstyles" or #define SkinName "VistaAero.cjstyles" ) #define SkinName "CharcoalDarkSlate.vsf" ; Backup module, do not touch! To backup individual files must be the flag BeforeInstall: CreateBackup (example in this script, see: Source: "Mods\Grafika\Norm\preferences.xml"; DestDir: "{userappdata}/Wargaming.net/WorldOfTanks"; Flags: ignoreversion; BeforeInstall: CreateBackup; Tasks: grafika; ) #include "Modules\SHFileOperation.iss" [Setup] ; Dont put a "'" in any of these. AppName=[LAMP] Lees ALL MOD Pack AppVersion=0.9.3.v4 AppCopyright=Copyright (C)2014 LAMP VersionInfoVersion=0.9.3 DefaultDirName={code:GetAppDir} DirExistsWarning=no ;ShowComponentSizes=no WizardSmallImageFile=MyFiles\WizardSmallImage.bmp DefaultGroupName=LAMP DisableProgramGroupPage=yes InfoBeforeFile=faq.rtf LicenseFile=license.rtf InfoAfterFile=credit.rtf ;AllowNoIcons=True SetupIconFile=MyFiles\Wot.ico OutputBaseFilename=LAMP_0.9.3.v4 Compression=lzma2/ultra64 InternalCompressLevel=ultra SolidCompression=yes ; Comment the following line to disable the "Select Setup Language" ; dialog and have it rely solely on auto-detection. ShowLanguageDialog=Yes ; If you want all languages to be listed in the "Select Setup Language" ; dialog, even those that can't be displayed in the active code page, ; uncomment the following line. Note: Unicode Inno Setup always displays ; all languages. ShowUndisplayableLanguages=yes [Languages] Name: en; MessagesFile: "compiler:Default.isl" Name: nl; MessagesFile: "compiler:Languages\Dutch.isl" Name: de; MessagesFile: "compiler:Languages\German.isl" Name: ru; MessagesFile: "compiler:Languages\Russian.isl" [Types] Name: "full"; Description: "Full" Name: "custom"; Description: "Custom"; Flags: iscustom [Components] Name: XVM; Description: XVM; Types: full custom; Flags: disablenouninstallwarning checkablealone dontinheritcheck Name: xvm\pref; Description: Prime_eff; Flags: exclusive disablenouninstallwarning Name: pricel; Description: Sights; Types: full custom; Flags: disablenouninstallwarning checkablealone dontinheritcheck Name: pricel\jmb; Description: J1mbo; Types: full; Flags: exclusive disablenouninstallwarning Name: pricel\zyz; Description: Zayaz; Flags: exclusive disablenouninstallwarning Name: pricel\20; Description: Spectr20; Flags: exclusive disablenouninstallwarning Name: chat; Description: Text Chat; Types: full custom; Flags: disablenouninstallwarning checkablealone dontinheritcheck Name: chat\pod; Description: Advanced Tips; Types: full; Flags: disablenouninstallwarning Name: chat\mcm; Description: Maud colored posts; Types: full; Flags: disablenouninstallwarning Name: angar; Description: Hangar Mods; Types: full custom; Flags: disablenouninstallwarning checkablealone dontinheritcheck Name: angar\mn; Description: Hangar Minimalistic; Types: full; Flags: disablenouninstallwarning exclusive Name: zvonok; Description: Sound Mods; Types: full custom; Flags: disablenouninstallwarning checkablealone dontinheritcheck Name: zvonok\zk; Description: 6 voice feelings fire; Types: full; Flags: disablenouninstallwarning [Icons] Name: "{group}\{cm:UninstallProgram,{#SetupSetting("AppName")}}"; Filename: "{uninstallexe}"; IconFilename: "{app}\uninstall.ico"; Comment: "Remove {#SetupSetting("AppName")} from your computer"; [Tasks] Name: "grafika"; Description: "Graphics settings (average PC)"; GroupDescription: "Settings:"; Flags: checkedonce Name: "fps"; Description: Disable the smoke and flames when fired; GroupDescription: "Performance:"; Flags: checkedonce Name: "fps2"; Description: Disable the smoke from the exhaust pipe; GroupDescription: "Performance:"; Flags: checkedonce Name: "fps3"; Description: Disable the smoke from the tanks destroyed; GroupDescription: "Performance:"; Flags: checkedonce Name: "fps4"; Description: Disable the effect of explosions and shells; GroupDescription: "Performance:"; Flags: unchecked Name: "fps5"; Description: Disable the effect of motion of the trees; GroupDescription: "Performance:"; Flags: checkedonce Name: "fps6"; Description: Disable the effect of contact with objects; GroupDescription: "Performance:"; Flags: unchecked Name: "fps7"; Description: Disable the effect of falling into the tank; GroupDescription: "Performance:"; Flags: unchecked Name: "fps8"; Description: Disable the effect of destruction of the tank; GroupDescription: "Performance:"; Flags: checkedonce Name: "fps9"; Description: Disable effects of destruction of objects; GroupDescription: "Performance:"; Flags: checkedonce [Files] Source: "dll\*"; DestDir: "{app}"; Flags: ignoreversion solidbreak; BeforeInstall: ChangeCaption('Copying files...wait..'); Attribs: hidden system; Source: "MyFiles\*"; DestDir: "{app}"; Flags: ignoreversion dontcopy; Attribs: hidden system; Source: "Styles\{#SkinName}"; DestDir: "{app}"; Flags: ignoreversion; Attribs: hidden system; Source: "image\*"; Flags: dontcopy noencryption; Source: {app}\Backup\xvm\db\tokens.xdb; DestDir: {app}\res_mods\xvm\db; Flags: skipifsourcedoesntexist external; Source: "Mods\Grafika\Norm\preferences.xml"; DestDir: "{userappdata}/Wargaming.net/WorldOfTanks"; Flags: ignoreversion; BeforeInstall: CreateBackup; Tasks: grafika; Source: "Mods\wot\fps\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Tasks: fps; Source: "Mods\wot\fps2\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Tasks: fps2; Source: "Mods\wot\fps3\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Tasks: fps3; Source: "Mods\wot\fps4\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Tasks: fps4; Source: "Mods\wot\fps5\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Tasks: fps5; Source: "Mods\wot\fps6\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Tasks: fps6; Source: "Mods\wot\fps7\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Tasks: fps7; Source: "Mods\wot\fps8\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Tasks: fps8; Source: "Mods\wot\fps9\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Tasks: fps9; //============== MODS =======================================\\ Source: "Mods\xvm\Prime_eff\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: xvm\pref; Source: "Mods\pricel\JIMBO\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: pricel\jmb; Source: "Mods\pricel\zayaz\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: pricel\zyz; Source: "Mods\pricel\Spectr20\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: pricel\20; //=== the beginning of text mode =======================================================================================================================\\ Source: "{app}\res\text\*"; DestDir: "{app}\res_mods\{#Patch}\text\"; Flags: external recursesubdirs skipifsourcedoesntexist; Components: chat; Source: "Mods\chat\podskaz\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: chat\pod; Source: "Mods\chat\mcm\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: chat\mcm; //=== end of text mode ===// Source: "Mods\angar\garage\mini\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: angar\mn; //=== the beginning of the audio files ===============================================================================================================================\\ Source: "{app}\res\audio\*"; DestDir: "{app}\res_mods\{#Patch}\audio\"; Flags: external recursesubdirs skipifsourcedoesntexist; Components: zvonok; Source: "Mods\zvonok\zvuki\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: zvonok\zk; //=== end of the audio files ===// [Code] const BColor = clBlue; EColor = clblack; BM_CLICK=$00F5; type TBtnEventProc = procedure (h:HWND); TImgPB = record Left, Top, Width, Height, MaxWidth : integer; img1,img2 : Longint; end; var InfoPanel: TPanel; LogoLabel: TLabel; PBCount, ResultCode, LastIndex, CurrentImage, ProgressStep,LastIndex,ErrorCode,X,Y,i,n: Integer; Rus: boolean; GIFHWND2, MusicButton, hCancelBtn, hNextBtn, hBackBtn, hDirBrowseBtn, hGroupBrowseBtn, hCancelUninstBtn: HWND; WFButtonFont, UPFButtonFont: TFont; UndefPic, GifFileName, OldDisk, TimeLeft, TempPath: string; Workspace, DirFolder, GroupFolder, WizardImg, MyLogo: Longint; InfoCaption, Info, Lbl: TNewStaticText; InfoPic: TBitmapImage; const HALIGN_CENTER = 0; HALIGN_LEFT = 1; HALIGN_RIGHT = 2; VALIGN_CENTER = 0; VALIGN_TOP = 1; VALIGN_BOTTOM = 2; FIT_NONE = 0; FIT_WIDTH = 1; FIT_HEIGHT = 2; FIT_BOTH = 3; CLR_INVALID = $FFFFFFFF; UNDEF_INDEX = -777; BtnClickEventID = 1; BtnMouseEnterEventID = 2; #include "Modules\MDL.iss" #include "Modules\Button.iss" #include "Modules\bass.iss" #include "Modules\TextureProgressBar.iss" procedure ShowPicHint(const PicFilePath: String); var pt: TPoint; begin if not GetCursorPos(pt) then Exit; InfoPic.Bitmap.LoadFromFile(PicFilePath); InfoPic.SetBounds(ScaleX(300), ScaleY(10), 310, 280); InfoPic.Show; end; procedure CompOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea); begin if Index = -1 then Exit; if Index = LastIndex then Exit; try case TNewCheckListBox(Sender).ItemCaption[Index] of 'XVM': UndefPic := '2.bmp'; 'Prime_eff': UndefPic := '4.bmp'; 'J1mbo': UndefPic := '12.bmp'; 'Zayaz': UndefPic := '13.bmp'; 'Advanced tips': UndefPic := '30.bmp'; 'Maud colored posts': UndefPic := '31.bmp'; 'hangar Minimalistic': UndefPic := '34.bmp'; '6 Ozvuchka feelings fire': UndefPic := '53.bmp'; 'Spectr20': UndefPic := '62.bmp'; else begin LastIndex := UNDEF_INDEX; InfoPic.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 InfoPic.Hide; LastIndex := -1; end; procedure InitInfo(); begin WizardForm.TypesCombo.Hide; WizardForm.ComponentsList.OnItemMouseMove := @CompOnItemMouseMove; WizardForm.ComponentsList.OnMouseLeave := @CompOnMouseLeave; TempPath := AddBackslash(ExpandConstant('{tmp}')); LastIndex := UNDEF_INDEX; InfoPic := TBitmapImage.Create(WizardForm) with InfoPic do begin Parent := WizardForm.SelectComponentsPage; AutoSize := true; end; end; function GetAppDir(Path: String): String; begin if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1') then begin RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1', 'InstallLocation', Path); Result := Path end else Result := ExpandConstant('C:\Games\World_of_Tanks') end; // hint ------------- procedure HintStr(Sender: TObject; X: Integer; Y: Integer; Index: Integer; Area: TItemArea); begin if Index<>LastIndex then begin LastIndex:= Index; WizardForm.TasksList.ShowHint:= False; WizardForm.TasksList.Hint:= ''; Exit; end; with WizardForm.TasksList do case Index of 0 : Hint := ''; 1 : Hint := 'Optimal graphics settings for the average PC'; 2 : Hint := ''; 3 : Hint := 'Increasing FPS by disabling certain Perm. effects have a negative impact on system performance'; 4 : Hint := ''; 5 : Hint := ''; 6 : Hint := ''; else Hint := ''; end; WizardForm.TasksList.ShowHint:= True; end; // hint ------------- procedure ChangeCaption(str: string); begin WizardForm.StatusLabel.Caption:= str; end; procedure CreateBackup; var srcFile, destFile: string; begin srcFile:= ExpandConstant(CurrentFileName); destFile:= srcFile + '.bak'; DeleteFile(destFile); RenameFile(srcFile, destFile); end; procedure RestoreBackup(backupDir: string); var srcFile, destFile: string; FSR, DSR: TFindRec; FindResult: Boolean; APath: string; begin APath := AddBackslash(backupDir); FindResult := FindFirst(APath + '*.bak', FSR); try while FindResult do begin if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then begin srcFile:= APath + FSR.Name; destFile:= Copy(srcFile, 0, Length(srcFile)-4); DeleteFile(destFile); RenameFile(srcFile, destFile); end; FindResult := FindNext(FSR); end; FindResult := FindFirst(APath + '*.*', DSR); while FindResult do begin if ((DSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and not ((DSR.Name = '.') or (DSR.Name = '..')) then {Recursion} RestoreBackup(APath + DSR.Name); FindResult := FindNext(DSR); end; finally FindClose(FSR); FindClose(DSR); end; end; // Import the LoadVCLStyle function from VclStylesInno.DLL procedure LoadVCLStyle(VClStyleFile: String); external 'LoadVCLStyleA@files:VclStylesInno.dll stdcall'; // Import the UnLoadVCLStyles function from VclStylesInno.DLL procedure UnLoadVCLStyles; external 'UnLoadVCLStyles@files:VclStylesInno.dll stdcall'; function InitializeSetup(): Boolean; begin //SetThemeAppProperties(0); // ExtractTemporaryFile('isskin.dll'); // ExtractTemporaryFile('{#SkinName}'); // LoadSkin(ExpandConstant('{tmp}\{#SkinName}'), ''); ExtractTemporaryFile('{#SkinName}'); LoadVCLStyle(ExpandConstant('{tmp}\{#SkinName}')); GIFHWND2 := 0; ExtractTemporaryFile('MusicButton.bmp'); ExtractTemporaryFile('music.mp3'); ExtractTemporaryFile('innocallback.dll'); ExtractTemporaryFile('Click.wav'); ExtractTemporaryFile('WFEnter.wav'); if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll'); Result:=True; end; procedure LogoLabelOnClick(Sender: TObject); begin ShellExec('open', 'http://www.leeuniverse.com', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode) end; procedure LblOnClick(Sender: TObject); begin ShellExec('open', 'http://www.leeuniverse.com', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode); end; procedure CreateForm; begin with WizardForm do begin X:=ScaleX(200); Y:=ScaleX(150); Position := poScreenCenter; Width:= WizardForm.Width + X; Height:= WizardForm.Height + Y; Bevel.top:= WizardForm.Bevel.top + Y; Bevel.Width:= WizardForm.Width; Bevel1.Width:= WizardForm.Width; OuterNotebook.Width := WizardForm.OuterNotebook.Width + X OuterNotebook.Height := WizardForm.OuterNotebook.Height + Y InnerNotebook.Width := WizardForm.InnerNotebook.Width + X InnerNotebook.Height := WizardForm.InnerNotebook.Height + Y Caption := ExpandConstant('{#SetupSetting("AppName")}'); // BorderStyle := bsDialog; WelcomeLabel1.Hide; WelcomeLabel2.Hide; PageNameLabel.Hide; PageDescriptionLabel.Hide; SelectComponentsLabel.Hide; ComponentsDiskSpaceLabel.Hide; DiskSpaceLabel.Hide; FinishedLabel.Hide; FinishedHeadingLabel.Hide; WizardBitmapImage.Hide; WizardBitmapImage2.Hide; SelectDirBitmapImage.Hide; SelectGroupBitmapImage.Hide; InfoAfterClickLabel.Hide; with WizardForm do begin Font.Name:='Georgia'; Font.Style := []; end; with NextButton do begin Left := WizardForm.NextButton.left + 255; Top := WizardForm.Bevel.top + 8; end; with BackButton do begin Left := WizardForm.BackButton.left + 250; Top := WizardForm.Bevel.top + 8; end; if not FileExists(ExpandConstant('{tmp}\fon.jpg')) then ExtractTemporaryFile('fon.jpg'); ImgLoad(WizardForm.WelcomePage.Handle, ExpandConstant('{tmp}\fon.jpg'), ScaleX(0),ScaleY(0),WizardForm.OuterNotebook.Width, WizardForm.OuterNotebook.Height,true,true); ImgApplyChanges(WizardForm.WelcomePage.Handle); if not FileExists(ExpandConstant('{tmp}\znak.png')) then ExtractTemporaryFile('znak.png'); ImgLoad(WizardForm.SelectDirPage.Handle, ExpandConstant('{tmp}\znak.png'), ScaleX(465), ScaleY(73), ScaleX(150), ScaleY(150), true, true); ImgApplyChanges(WizardForm.SelectDirPage.Handle); if not FileExists(ExpandConstant('{tmp}\finish.jpg')) then ExtractTemporaryFile('finish.jpg'); ImgLoad(WizardForm.FinishedPage.Handle, ExpandConstant('{tmp}\finish.jpg'), ScaleX(0),ScaleY(0),WizardForm.OuterNotebook.Width, WizardForm.OuterNotebook.Height,true,true); ImgApplyChanges(WizardForm.FinishedPage.Handle); if not FileExists(ExpandConstant('{tmp}\DirFolder.png')) then ExtractTemporaryFile('DirFolder.png'); DirFolder:=ImgLoad(WizardForm.SelectDirPage.Handle,ExpandConstant('{tmp}\DirFolder.png'),ScaleX(0), ScaleY(0),ScaleX(34),ScaleY(30),True,True); if not FileExists(ExpandConstant('{tmp}\GroupFolder.png')) then ExtractTemporaryFile('GroupFolder.png'); GroupFolder:=ImgLoad(WizardForm.SelectDirPage.Handle,ExpandConstant('{tmp}\GroupFolder.png'),ScaleX(0), ScaleY(120),ScaleX(34),ScaleY(30),True,True); ImgApplyChanges(WizardForm.SelectDirPage.Handle); if not FileExists(ExpandConstant('{tmp}\img.png')) then ExtractTemporaryFile('img.png'); Workspace:=ImgLoad(WizardForm.SelectComponentsPage.Handle,ExpandConstant('{tmp}\img.png'), ScaleX(300), ScaleY(10), ScaleX(310), ScaleY(280),True,True); ImgApplyChanges(WizardForm.SelectComponentsPage.Handle); ExtractTemporaryFile('button.png'); ExtractTemporaryFile('Check.wav'); ExtractTemporaryFile('logo.png'); MyLogo:=ImgLoad(WizardForm.WelcomePage.Handle,ExpandConstant('{tmp}\logo.png'), ScaleX(520), ScaleY(6), ScaleX(160), ScaleY(140), False, False); ImgApplyChanges(WizardForm.WelcomePage.Handle); LogoLabel := TLabel.Create(WizardForm); with LogoLabel do begin Parent := WizardForm.WelcomePage; SetBounds(ScaleX(520), ScaleY(6), 160, 140); Transparent:=True; Cursor := crHand; OnClick:=@LogoLabelOnClick; end; // =================== [Form] ============================== with MainPanel do Width:= WizardForm.MainPanel.Width + X; with WizardSmallBitmapImage do begin SetBounds(ScaleX(0), ScaleY(0), 700, 60); end; with WizardForm.DirEdit do begin AutoSelect := False; ReadOnly := True; end; with ComponentsList do begin SetBounds(ScaleX(5), ScaleY(10), 280, 280); Color := clBtnFace; Font.Name := 'Tahoma'; Font.Size := 9; Font.Style := []; Parent:= WizardForm.SelectComponentsPage; end; with WizardForm.GroupBrowseButton do begin Top := ScaleY(191); Parent := WizardForm.SelectDirPage; end; with WizardForm.GroupEdit do begin Top := ScaleY(192); Parent := WizardForm.SelectDirPage; end; with WizardForm.SelectStartMenuFolderBrowseLabel do begin Parent := WizardForm.SelectDirPage; Top := ScaleY(155); end; with WizardForm.SelectStartMenuFolderLabel do begin Parent := WizardForm.SelectDirPage; Top := ScaleY(128); end; with NoIconsCheck do begin Parent := WizardForm.SelectDirPage; Top := ScaleY(250); Visible := true end; WizardForm.ReadyMemo.SetBounds(ScaleX(0), ScaleY(60), 610, 300); end; with WizardForm.SelectTasksPage do begin WizardForm.TasksList.SetBounds(ScaleX(0), WizardForm.TasksList.Top, 610, 340); end; with WizardForm do begin with TasksList do begin ShowHint := True; Hint := ''; OnItemMouseMove := @HintStr; end; with WizardForm.InfoAfterMemo do begin WizardForm.InfoAfterMemo.SetBounds(ScaleX(0), ScaleY(30), 610, 300); end; with WizardForm.PreparingLabel do begin Width := ScaleX(610); end; WizardForm.PreparingMemo.SetBounds(ScaleX(0), WizardForm.PreparingMemo.Top, 610, WizardForm.PreparingMemo.Height); end; with WizardForm.FilenameLabel do begin Left := ScaleX(0) Top := ScaleY(50); Width := ScaleX(580); end; WizardForm.StatusLabel.Left := ScaleX(0) with WizardForm.ProgressGauge do begin Parent:=WizardForm; SetBounds(ScaleX(40), ScaleY(100), 580, 30); Hide; end; TextureProgressBar(WizardForm.ProgressGauge, $898987, cllime, false); end; // =================== [Form] ============================== procedure InitializeWizard(); begin InitInfo(); CreateForm; ButtonsTextures; Music; mp3Name := ExpandConstant('{tmp}\music.mp3'); BASS_Init(-1, 44100, 0, 0, 0); mp3Handle := BASS_StreamCreateFile(FALSE, PAnsiChar(mp3Name), 0, 0, 0, 0, BASS_SAMPLE_LOOP); BASS_Start(); BASS_ChannelPlay(mp3Handle, False); ExtractTemporaryFile('logo.gif'); GIFHWND2 := NewGifbWnd(WizardForm.Handle, ScaleX(80), WizardForm.Bevel.Top + ScaleY(8), 160, 33); GifWndLoadFromFile(GIFHWND2, HALIGN_CENTER, VALIGN_CENTER, CLR_INVALID, FIT_NONE, ExpandConstant('{tmp}\logo.gif')); Lbl := TNewStaticText.Create(WizardForm); Lbl.Parent := WizardForm; Lbl.AutoSize := False; Lbl.SetBounds(ScaleX(80), WizardForm.Bevel.Top + ScaleY(8), 160, 33); Lbl.OnClick := @LblOnClick; Lbl.Cursor := crHand; InfoPanel := TPanel.Create(WizardForm); InfoPanel.SetBounds(ScaleX(5), ScaleY(300), 605, 80); Info := TNewStaticText.Create(WizardForm); Info.Parent := WizardForm.SelectComponentsPage; Info.AutoSize := False; Info.SetBounds(ScaleX(15), ScaleY(310), 588, 68); Info.Caption := ''; Info.Font.Name := ''; Info.Font.Size := 9; Info.WordWrap := true; enabledesc(WizardForm.ComponentsList.Handle,Info.Handle, 'XVM: eXtended Visualization Mod — modification of the combat interface for the popular MMO World of Tanks. To display statistics, you need to enable it on the site XVM (www.modxvm.com);'+ 'XVM Ded_Shalfey configs "Prime_eff". Rating statistics Total victory of and techniques chance;'+ // ' ;'+ 'The sight of Jimbo. This sight can be classified as futuristic. Though he is equipped with additional graphic details - they do not have an overabundance, established a rather compact and organically.;'+ 'Sights from Zayaz help you not only comfortable and shoot accurately, but still give you a chance to not get under the opponents shots.;'+ 'The sight of Spectr20. Simple minimalist sight calculator enemy armor. The first value of your penetration of the projectile, the second tank armor at this point. Art sight can be adjusted from the config file CPSSetting.xml;'+ // ' ;'+ // 'Modification of fashion "Advanced tips for skills and abilities" of phantasm, add an extension to the description of the skills, abilities, medals, consumables and snaryadam.Ves font normal size, the positive effects are highlighted in green;'+ // 'Maud colored messages (MCM) from Vslav666. Detailed statistics on the battle, the number of wins and losses, the entire wage experience wage display free experience for the fight;'+ // ' ;'+ // 'The easiest and fastest hangar of Hellinger. This hangar is notable for the fact that its author has made every effort to improve system performance while in the hangar. Ideal for owners of low-end PCs.;'+ // ' ;'+ '6 Ozvuchka feelings sound fire perezaryad and t.p;' ); end; procedure ShowComponents(CurPageID: Integer); begin case CurPageID of wpSelectDir: begin ImgSetVisibility(DirFolder,True); ImgSetVisibility(GroupFolder,True); end; end; end; procedure CurPageChanged(CurPageID: Integer); begin if CurPageID = wpSelectDir then WizardForm.NoIconsCheck.Checked := True; SetStateNewButtons; ImgSetVisibility(DirFolder,False); ImgSetVisibility(GroupFolder,False); ShowComponents(CurPageID); ImgApplyChanges(WizardForm.InnerPage.Handle) ImgApplyChanges(WizardForm.Handle); if CurPageID=wpFinished then begin WizardForm.ProgressGauge.Hide; SendMessage(WizardForm.NextButton.Handle,BM_CLICK,0,0); end; end; procedure CurStepChanged(CurStep: TSetupStep); begin ProgressTimer(CurStep); if CurStep = ssInstall then begin MoveDir(ExpandConstant('{app}\res_mods\'),ExpandConstant('{app}\Backup')); WizardForm.ProgressGauge.Show; end; //begin //if CurStep = ssDone then //if MsgBox('modification ' + 'successfully' + ' performed!' + #10#10#13 + 'Start ' + 'game' + '?' , mbInformation, MB_OKCANCEL) = IDOK then //Exec(ExpandConstant('{app}\WorldOfTanks.exe'), '', '', SW_SHOW, ewNoWait, ResultCode); //end; end; procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); begin if CurUninstallStep = usPostUninstall then begin MoveDir(ExpandConstant('{app}\Backup\'),ExpandConstant('{app}\res_mods')); RemoveDir(ExpandConstant('{app}\Backup')); RestoreBackup(ExpandConstant('{app}')) end; end; procedure DeinitializeSetup(); begin ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0); // UnloadSkin; gdipShutdown; FreeAllGifWnd(); WFButtonFont.Free; disabledesc(); BASS_Stop(); BASS_Free(); end; //function InitializeUninstall: Boolean; // begin // FileCopy(ExpandConstant('{app}\VclStylesinno.dll'), ExpandConstant('{tmp}\VclStylesinno.dll'), False); // FileCopy(ExpandConstant('{app}\{#SkinName}'), ExpandConstant('{tmp}\{#SkinName}'), False); // LoadSkin(ExpandConstant('{tmp}\{#SkinName}'), ''); // Result:=True; // end; License Accept Page: (LicenseFile=license.rtf) End of Install Credits Page: (InfoAfterFile=credit.rtf) ---------- Forgot one other thing..... 3. Could you help me fix this alignment issue? I think the code took the alignment from the next page, which is the "Select Directory" section which has an "Image" in the empty Right Space area. I see the issue also occurs with the above "Licensing Page" section. Need it fixed there also. Introduction Page: (InfoBeforeFile=faq.rtf) Enjoy. (Thanks to san4o for help in making this possible.) P.S. These three issues do not occur when not including the three pages into the script. The installer works perfect. //InfoBeforeFile=faq.rtf//LicenseFile=license.rtf//InfoAfterFile=credit.rtf Also.... I think starting at line 600 or so is where one has to edit the code so the "Progress Bar" doesn't show in the Credit Page. Seems anyway. But again, not being a coder, not sure how. Edited October 12, 2014 by leeuniverse Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #221695 Posted October 11, 2014 (edited) 1. I need my code to be edited so that it allows the "Next" button to be highlighted when on the License Page, and the "Accept Agreement" checkmark is checked. As it currently is, clicking "Next" does not work, unless you click "Back" and then "Next", and then you can continue. I don`t know, what happend with this button) 90%, what guilty is: Button.iss, MDL.iss, botva.dll. 2. For the "Progress Bar" to not show when on the Credit Page, thus messing up the page formating. fixed. BTW, the code also needs to be able to work still without problems IF I choose NOT to have some or any of those pages show: //(InfoBeforeFile=faq.rtf //LicenseFile=license.rtf //InfoAfterFile=credit.rtf), i.e. commented out. Should be ok. 3. Could you help me fix this alignment issue? I think the code took the alignment from the next page, which is the "Select Directory" section which has an "Image" in the empty Right Space area. fixed. Link to download: https://www.dropbox.com/s/1uc136j3236a5jj/World%20of%20Tanks_Mods.rar?dl=0 Edited October 11, 2014 by Kotyarko_O Quote Share this post Link to post Short link Share on other sites
san4o 5 #221698 Posted October 11, 2014 (edited) leeuniverse, нужно просто выровнять страницы. прогрессбар закрепить на нужной странице и всё. В лиц. станице баг из-за текстуированных кнопок. Закомментил, но звуки клика оставил. Вобщем вот твой код. /////////////////////////////////////////////////////////////////////////////////// // Script for World of Tanks from San4oPack 2014 // // A simple form of music, backup files (recovery after uninstalling) // // with pictures, etc. // /////////////////////////////////////////////////////////////////////////////////// ; At each update patch game, change only the numbers ( eg: #define Patch "0.9.2" #define Patch "0.9.3" etc.) #define Patch "0.9.3" ; Skins are located in the Styles folder. If you want to change the skin, change only the name (for example: #define SkinName "skin.cjstyles" or #define SkinName "VistaAero.cjstyles" ) #define SkinName "CharcoalDarkSlate.vsf" ; Backup module, do not touch! To backup individual files must be the flag BeforeInstall: CreateBackup (example in this script, see: Source: "Mods\Grafika\Norm\preferences.xml"; DestDir: "{userappdata}/Wargaming.net/WorldOfTanks"; Flags: ignoreversion; BeforeInstall: CreateBackup; Tasks: grafika; ) #include "Modules\SHFileOperation.iss" [Setup] ; Dont put a "'" in any of these. AppName=[LAMP] Lees ALL MOD Pack AppVersion=0.9.3.v4 AppCopyright=Copyright (C)2014 LAMP VersionInfoVersion=0.9.3 DefaultDirName={code:GetAppDir} DirExistsWarning=no ;ShowComponentSizes=no WizardSmallImageFile=MyFiles\WizardSmallImage.bmp DefaultGroupName=LAMP DisableProgramGroupPage=yes InfoBeforeFile=faq.rtf LicenseFile=license.rtf InfoAfterFile=credit.rtf ;AllowNoIcons=True SetupIconFile=MyFiles\Wot.ico OutputBaseFilename=LAMP_0.9.3.v4 Compression=lzma2/ultra64 InternalCompressLevel=ultra SolidCompression=yes ; Comment the following line to disable the "Select Setup Language" ; dialog and have it rely solely on auto-detection. ShowLanguageDialog=Yes ; If you want all languages to be listed in the "Select Setup Language" ; dialog, even those that can't be displayed in the active code page, ; uncomment the following line. Note: Unicode Inno Setup always displays ; all languages. ShowUndisplayableLanguages=yes [Languages] Name: en; MessagesFile: "compiler:Default.isl" Name: nl; MessagesFile: "compiler:Languages\Dutch.isl" Name: de; MessagesFile: "compiler:Languages\German.isl" Name: ru; MessagesFile: "compiler:Languages\Russian.isl" [Types] Name: "full"; Description: "Full" Name: "custom"; Description: "Custom"; Flags: iscustom [Components] Name: XVM; Description: XVM; Types: full custom; Flags: disablenouninstallwarning checkablealone dontinheritcheck Name: xvm\pref; Description: Prime_eff; Flags: exclusive disablenouninstallwarning Name: pricel; Description: Sights; Types: full custom; Flags: disablenouninstallwarning checkablealone dontinheritcheck Name: pricel\jmb; Description: J1mbo; Types: full; Flags: exclusive disablenouninstallwarning Name: pricel\zyz; Description: Zayaz; Flags: exclusive disablenouninstallwarning Name: pricel\20; Description: Spectr20; Flags: exclusive disablenouninstallwarning Name: chat; Description: Text Chat; Types: full custom; Flags: disablenouninstallwarning checkablealone dontinheritcheck Name: chat\pod; Description: Advanced Tips; Types: full; Flags: disablenouninstallwarning Name: chat\mcm; Description: Maud colored posts; Types: full; Flags: disablenouninstallwarning Name: angar; Description: Hangar Mods; Types: full custom; Flags: disablenouninstallwarning checkablealone dontinheritcheck Name: angar\mn; Description: Hangar Minimalistic; Types: full; Flags: disablenouninstallwarning exclusive Name: zvonok; Description: Sound Mods; Types: full custom; Flags: disablenouninstallwarning checkablealone dontinheritcheck Name: zvonok\zk; Description: 6 voice feelings fire; Types: full; Flags: disablenouninstallwarning [Icons] Name: "{group}\{cm:UninstallProgram,{#SetupSetting("AppName")}}"; Filename: "{uninstallexe}"; IconFilename: "{app}\uninstall.ico"; Comment: "Remove {#SetupSetting("AppName")} from your computer"; [Tasks] Name: "grafika"; Description: "Graphics settings (average PC)"; GroupDescription: "Settings:"; Flags: checkedonce Name: "fps"; Description: Disable the smoke and flames when fired; GroupDescription: "Performance:"; Flags: checkedonce Name: "fps2"; Description: Disable the smoke from the exhaust pipe; GroupDescription: "Performance:"; Flags: checkedonce Name: "fps3"; Description: Disable the smoke from the tanks destroyed; GroupDescription: "Performance:"; Flags: checkedonce Name: "fps4"; Description: Disable the effect of explosions and shells; GroupDescription: "Performance:"; Flags: unchecked Name: "fps5"; Description: Disable the effect of motion of the trees; GroupDescription: "Performance:"; Flags: checkedonce Name: "fps6"; Description: Disable the effect of contact with objects; GroupDescription: "Performance:"; Flags: unchecked Name: "fps7"; Description: Disable the effect of falling into the tank; GroupDescription: "Performance:"; Flags: unchecked Name: "fps8"; Description: Disable the effect of destruction of the tank; GroupDescription: "Performance:"; Flags: checkedonce Name: "fps9"; Description: Disable effects of destruction of objects; GroupDescription: "Performance:"; Flags: checkedonce [Files] Source: "dll\*"; DestDir: "{app}"; Flags: ignoreversion solidbreak; BeforeInstall: ChangeCaption('Copying files...wait..'); Attribs: hidden system; Source: "MyFiles\*"; DestDir: "{app}"; Flags: ignoreversion dontcopy; Attribs: hidden system; Source: "Styles\{#SkinName}"; DestDir: "{app}"; Flags: ignoreversion; Attribs: hidden system; Source: "image\*"; Flags: dontcopy noencryption; ;Source: {app}\Backup\xvm\db\tokens.xdb; DestDir: {app}\res_mods\xvm\db; Flags: skipifsourcedoesntexist external; ;Source: "Mods\Grafika\Norm\preferences.xml"; DestDir: "{userappdata}/Wargaming.net/WorldOfTanks"; Flags: ignoreversion; BeforeInstall: CreateBackup; Tasks: grafika; ;Source: "Mods\wot\fps\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Tasks: fps; ;Source: "Mods\wot\fps2\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Tasks: fps2; ;Source: "Mods\wot\fps3\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Tasks: fps3; ;Source: "Mods\wot\fps4\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Tasks: fps4; ;Source: "Mods\wot\fps5\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Tasks: fps5; ;Source: "Mods\wot\fps6\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Tasks: fps6; ;Source: "Mods\wot\fps7\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Tasks: fps7; ;Source: "Mods\wot\fps8\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Tasks: fps8; ;Source: "Mods\wot\fps9\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Tasks: fps9; ; ;//============== MODS =======================================\\ ;Source: "Mods\xvm\Prime_eff\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: xvm\pref; ;Source: "Mods\pricel\JIMBO\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: pricel\jmb; ;Source: "Mods\pricel\zayaz\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: pricel\zyz; ;Source: "Mods\pricel\Spectr20\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: pricel\20; ;//=== the beginning of text mode =======================================================================================================================\\ ;Source: "{app}\res\text\*"; DestDir: "{app}\res_mods\{#Patch}\text\"; Flags: external recursesubdirs skipifsourcedoesntexist; Components: chat; ;Source: "Mods\chat\podskaz\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: chat\pod; ;Source: "Mods\chat\mcm\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: chat\mcm; ;//=== end of text mode ===// ;Source: "Mods\angar\garage\mini\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: angar\mn; ;//=== the beginning of the audio files ===============================================================================================================================\\ ;Source: "{app}\res\audio\*"; DestDir: "{app}\res_mods\{#Patch}\audio\"; Flags: external recursesubdirs skipifsourcedoesntexist; Components: zvonok; ;Source: "Mods\zvonok\zvuki\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: zvonok\zk; ;//=== end of the audio files ===// [code] const BColor = clBlue; EColor = clblack; BM_CLICK=$00F5; type TBtnEventProc = procedure (h:HWND); TImgPB = record Left, Top, Width, Height, MaxWidth : integer; img1,img2 : Longint; end; var InfoPanel: TPanel; LogoLabel: TLabel; PBCount, ResultCode, LastIndex, CurrentImage, ProgressStep,LastIndex,ErrorCode,X,Y,i,n: Integer; Rus: boolean; GIFHWND2, MusicButton, hCancelBtn, hNextBtn, hBackBtn, hDirBrowseBtn, hGroupBrowseBtn, hCancelUninstBtn: HWND; WFButtonFont, UPFButtonFont: TFont; UndefPic, GifFileName, OldDisk, TimeLeft, TempPath: string; Workspace, DirFolder, GroupFolder, WizardImg, MyLogo: Longint; InfoCaption, Info, Lbl: TNewStaticText; InfoPic: TBitmapImage; CheckLicense: TCheckBox; const HALIGN_CENTER = 0; HALIGN_LEFT = 1; HALIGN_RIGHT = 2; VALIGN_CENTER = 0; VALIGN_TOP = 1; VALIGN_BOTTOM = 2; FIT_NONE = 0; FIT_WIDTH = 1; FIT_HEIGHT = 2; FIT_BOTH = 3; CLR_INVALID = $FFFFFFFF; UNDEF_INDEX = -777; BtnClickEventID = 1; BtnMouseEnterEventID = 2; #include "Modules\MDL.iss" //#include "Modules\Button.iss" #include "Modules\bass.iss" #include "Modules\TextureProgressBar.iss" procedure LicenseOnClick(Sender: TObject); begin if (CheckLicense.Checked) = True then begin WizardForm.LicenseAcceptedRadio.Checked := True; end else begin WizardForm.LicenseNotAcceptedRadio.Checked := True; end; end; procedure ShowPicHint(const PicFilePath: String); var pt: TPoint; begin if not GetCursorPos(pt) then Exit; InfoPic.Bitmap.LoadFromFile(PicFilePath); InfoPic.SetBounds(ScaleX(300), ScaleY(10), 310, 280); InfoPic.Show; end; procedure CompOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea); begin if Index = -1 then Exit; if Index = LastIndex then Exit; try case TNewCheckListBox(Sender).ItemCaption[Index] of 'XVM': UndefPic := '2.bmp'; 'Prime_eff': UndefPic := '4.bmp'; 'J1mbo': UndefPic := '12.bmp'; 'Zayaz': UndefPic := '13.bmp'; 'Advanced tips': UndefPic := '30.bmp'; 'Maud colored posts': UndefPic := '31.bmp'; 'hangar Minimalistic': UndefPic := '34.bmp'; '6 Ozvuchka feelings fire': UndefPic := '53.bmp'; 'Spectr20': UndefPic := '62.bmp'; else begin LastIndex := UNDEF_INDEX; InfoPic.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 InfoPic.Hide; LastIndex := -1; end; procedure InitInfo(); begin WizardForm.TypesCombo.Hide; WizardForm.ComponentsList.OnItemMouseMove := @CompOnItemMouseMove; WizardForm.ComponentsList.OnMouseLeave := @CompOnMouseLeave; TempPath := AddBackslash(ExpandConstant('{tmp}')); LastIndex := UNDEF_INDEX; InfoPic := TBitmapImage.Create(WizardForm) with InfoPic do begin Parent := WizardForm.SelectComponentsPage; AutoSize := true; end; end; function GetAppDir(Path: String): String; begin if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1') then begin RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1', 'InstallLocation', Path); Result := Path end else Result := ExpandConstant('C:\Games\World_of_Tanks') end; // hint ------------- procedure HintStr(Sender: TObject; X: Integer; Y: Integer; Index: Integer; Area: TItemArea); begin if Index<>LastIndex then begin LastIndex:= Index; WizardForm.TasksList.ShowHint:= False; WizardForm.TasksList.Hint:= ''; Exit; end; with WizardForm.TasksList do case Index of 0 : Hint := ''; 1 : Hint := 'Optimal graphics settings for the average PC'; 2 : Hint := ''; 3 : Hint := 'Increasing FPS by disabling certain Perm. effects have a negative impact on system performance'; 4 : Hint := ''; 5 : Hint := ''; 6 : Hint := ''; else Hint := ''; end; WizardForm.TasksList.ShowHint:= True; end; // hint ------------- procedure PlaySoundOnEnter(Sender: TObject); begin sndPlaySound(ExpandConstant('{tmp}\Check.WAV'),$0001); end; procedure PlaySoundOnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin sndPlaySound(ExpandConstant('{tmp}\Click.WAV'),$0001); end; procedure PlaySoundOnMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin sndPlaySound(ExpandConstant('{tmp}\WFEnter.WAV'),$0001); end; procedure ChangeCaption(str: string); begin WizardForm.StatusLabel.Caption:= str; end; procedure CreateBackup; var srcFile, destFile: string; begin srcFile:= ExpandConstant(CurrentFileName); destFile:= srcFile + '.bak'; DeleteFile(destFile); RenameFile(srcFile, destFile); end; procedure RestoreBackup(backupDir: string); var srcFile, destFile: string; FSR, DSR: TFindRec; FindResult: Boolean; APath: string; begin APath := AddBackslash(backupDir); FindResult := FindFirst(APath + '*.bak', FSR); try while FindResult do begin if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then begin srcFile:= APath + FSR.Name; destFile:= Copy(srcFile, 0, Length(srcFile)-4); DeleteFile(destFile); RenameFile(srcFile, destFile); end; FindResult := FindNext(FSR); end; FindResult := FindFirst(APath + '*.*', DSR); while FindResult do begin if ((DSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and not ((DSR.Name = '.') or (DSR.Name = '..')) then {Recursion} RestoreBackup(APath + DSR.Name); FindResult := FindNext(DSR); end; finally FindClose(FSR); FindClose(DSR); end; end; // Import the LoadVCLStyle function from VclStylesInno.DLL procedure LoadVCLStyle(VClStyleFile: String); external 'LoadVCLStyleA@files:VclStylesInno.dll stdcall'; // Import the UnLoadVCLStyles function from VclStylesInno.DLL procedure UnLoadVCLStyles; external 'UnLoadVCLStyles@files:VclStylesInno.dll stdcall'; function InitializeSetup(): Boolean; begin //SetThemeAppProperties(0); // ExtractTemporaryFile('isskin.dll'); // ExtractTemporaryFile('{#SkinName}'); // LoadSkin(ExpandConstant('{tmp}\{#SkinName}'), ''); ExtractTemporaryFile('{#SkinName}'); LoadVCLStyle(ExpandConstant('{tmp}\{#SkinName}')); GIFHWND2 := 0; ExtractTemporaryFile('MusicButton.bmp'); ExtractTemporaryFile('music.mp3'); ExtractTemporaryFile('innocallback.dll'); if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll'); Result:=True; end; procedure LogoLabelOnClick(Sender: TObject); begin ShellExec('open', 'http://www.leeuniverse.com', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode) end; procedure LblOnClick(Sender: TObject); begin ShellExec('open', 'http://www.leeuniverse.com', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode); end; procedure CreateForm; begin with WizardForm do begin X:=ScaleX(200); Y:=ScaleX(150); Position := poScreenCenter; Width:= WizardForm.Width + X; Height:= WizardForm.Height + Y; Bevel.top:= WizardForm.Bevel.top + Y; Bevel.Width:= WizardForm.Width; Bevel1.Width:= WizardForm.Width; OuterNotebook.Width := WizardForm.OuterNotebook.Width + X OuterNotebook.Height := WizardForm.OuterNotebook.Height + Y InnerNotebook.Width := WizardForm.InnerNotebook.Width + X InnerNotebook.Height := WizardForm.InnerNotebook.Height + Y Caption := ExpandConstant('{#SetupSetting("AppName")}'); // BorderStyle := bsDialog; WelcomeLabel1.Hide; WelcomeLabel2.Hide; PageNameLabel.Hide; PageDescriptionLabel.Hide; SelectComponentsLabel.Hide; ComponentsDiskSpaceLabel.Hide; DiskSpaceLabel.Hide; FinishedLabel.Hide; FinishedHeadingLabel.Hide; WizardBitmapImage.Hide; WizardBitmapImage2.Hide; SelectDirBitmapImage.Hide; SelectGroupBitmapImage.Hide; InfoAfterClickLabel.Hide; with WizardForm do begin Font.Name:='Georgia'; Font.Style := []; end; with NextButton do begin Left := WizardForm.NextButton.left + 255; Top := WizardForm.Bevel.top + 8; end; with BackButton do begin Left := WizardForm.BackButton.left + 250; Top := WizardForm.Bevel.top + 8; end; if not FileExists(ExpandConstant('{tmp}\fon.jpg')) then ExtractTemporaryFile('fon.jpg'); ImgLoad(WizardForm.WelcomePage.Handle, ExpandConstant('{tmp}\fon.jpg'), ScaleX(0),ScaleY(0),WizardForm.OuterNotebook.Width, WizardForm.OuterNotebook.Height,true,true); ImgApplyChanges(WizardForm.WelcomePage.Handle); if not FileExists(ExpandConstant('{tmp}\znak.png')) then ExtractTemporaryFile('znak.png'); ImgLoad(WizardForm.SelectDirPage.Handle, ExpandConstant('{tmp}\znak.png'), ScaleX(465), ScaleY(73), ScaleX(150), ScaleY(150), true, true); ImgApplyChanges(WizardForm.SelectDirPage.Handle); if not FileExists(ExpandConstant('{tmp}\finish.jpg')) then ExtractTemporaryFile('finish.jpg'); ImgLoad(WizardForm.FinishedPage.Handle, ExpandConstant('{tmp}\finish.jpg'), ScaleX(0),ScaleY(0),WizardForm.OuterNotebook.Width, WizardForm.OuterNotebook.Height,true,true); ImgApplyChanges(WizardForm.FinishedPage.Handle); if not FileExists(ExpandConstant('{tmp}\DirFolder.png')) then ExtractTemporaryFile('DirFolder.png'); DirFolder:=ImgLoad(WizardForm.SelectDirPage.Handle,ExpandConstant('{tmp}\DirFolder.png'),ScaleX(0), ScaleY(0),ScaleX(34),ScaleY(30),True,True); if not FileExists(ExpandConstant('{tmp}\GroupFolder.png')) then ExtractTemporaryFile('GroupFolder.png'); GroupFolder:=ImgLoad(WizardForm.SelectDirPage.Handle,ExpandConstant('{tmp}\GroupFolder.png'),ScaleX(0), ScaleY(120),ScaleX(34),ScaleY(30),True,True); ImgApplyChanges(WizardForm.SelectDirPage.Handle); if not FileExists(ExpandConstant('{tmp}\img.png')) then ExtractTemporaryFile('img.png'); Workspace:=ImgLoad(WizardForm.SelectComponentsPage.Handle,ExpandConstant('{tmp}\img.png'), ScaleX(300), ScaleY(10), ScaleX(310), ScaleY(280),True,True); ImgApplyChanges(WizardForm.SelectComponentsPage.Handle); ExtractTemporaryFile('Click.WAV'); ExtractTemporaryFile('WFEnter.WAV'); ExtractTemporaryFile('Check.WAV'); ExtractTemporaryFile('logo.png'); MyLogo:=ImgLoad(WizardForm.WelcomePage.Handle,ExpandConstant('{tmp}\logo.png'), ScaleX(520), ScaleY(6), ScaleX(160), ScaleY(140), False, False); ImgApplyChanges(WizardForm.WelcomePage.Handle); LogoLabel := TLabel.Create(WizardForm); with LogoLabel do begin Parent := WizardForm.WelcomePage; SetBounds(ScaleX(520), ScaleY(6), 160, 140); Transparent:=True; Cursor := crHand; OnClick:=@LogoLabelOnClick; end; // =================== [Form] ============================== with WizardForm do begin with NextButton do begin OnMouseEnter := @PlaySoundOnEnter; OnMouseDown := @PlaySoundOnMouseDown; OnMouseUp := @PlaySoundOnMouseUp; end; with BackButton do begin OnMouseEnter := NextButton.OnMouseEnter; OnMouseDown := NextButton.OnMouseDown; OnMouseUp := NextButton.OnMouseUp; end; with CancelButton do begin OnMouseEnter := NextButton.OnMouseEnter; OnMouseDown := NextButton.OnMouseDown; OnMouseUp := NextButton.OnMouseUp; end; with DirBrowseButton do begin OnMouseEnter := NextButton.OnMouseEnter; OnMouseDown := NextButton.OnMouseDown; OnMouseUp := NextButton.OnMouseUp; end; with GroupBrowseButton do begin OnMouseEnter := NextButton.OnMouseEnter; OnMouseDown := NextButton.OnMouseDown; OnMouseUp := NextButton.OnMouseUp; end; with MainPanel do Width:= WizardForm.MainPanel.Width + X; with WizardSmallBitmapImage do begin SetBounds(ScaleX(0), ScaleY(0), 700, 60); end; with WizardForm.DirEdit do begin AutoSelect := False; ReadOnly := True; end; with ComponentsList do begin SetBounds(ScaleX(5), ScaleY(10), 280, 280); Color := clBtnFace; Font.Name := 'Tahoma'; Font.Size := 9; Font.Style := []; Parent:= WizardForm.SelectComponentsPage; end; with WizardForm.GroupBrowseButton do begin Top := ScaleY(191); Parent := WizardForm.SelectDirPage; end; with WizardForm.GroupEdit do begin Top := ScaleY(192); Parent := WizardForm.SelectDirPage; end; with WizardForm.SelectStartMenuFolderBrowseLabel do begin Parent := WizardForm.SelectDirPage; Top := ScaleY(155); end; with WizardForm.SelectStartMenuFolderLabel do begin Parent := WizardForm.SelectDirPage; Top := ScaleY(128); end; // with NoIconsCheck do // begin // Parent := WizardForm.SelectDirPage; // Top := ScaleY(250); // Visible := true end; WizardForm.ReadyMemo.SetBounds(ScaleX(0), ScaleY(60), 610, 300); end; with WizardForm.SelectTasksPage do begin WizardForm.TasksList.SetBounds(ScaleX(0), WizardForm.TasksList.Top, 610, 340); end; with WizardForm do begin with TasksList do begin ShowHint := True; Hint := ''; OnItemMouseMove := @HintStr; end; with WizardForm.InfoAfterMemo do begin WizardForm.InfoAfterMemo.SetBounds(ScaleX(0), ScaleY(30), 610, 300); end; with WizardForm.InfoBeforeMemo do begin WizardForm.InfoBeforeMemo.SetBounds(ScaleX(0), ScaleY(60), 610, 300); end WizardForm.LicenseNotAcceptedRadio.Hide; WizardForm.LicenseAcceptedRadio.Hide; WizardForm.LicenseMemo.Left := ScaleX(0); WizardForm.LicenseMemo.Top := ScaleY(60); WizardForm.LicenseMemo.Width := ScaleX(610); WizardForm.LicenseMemo.Height := ScaleY(300); CheckLicense:= TCheckBox.Create(WizardForm); CheckLicense.Left:= ScaleX(0); CheckLicense.Top:= ScaleY(360); CheckLicense.Caption:= WizardForm.LicenseAcceptedRadio.Caption; CheckLicense.Width:= ScaleX(410); CheckLicense.OnClick:= @LicenseOnClick; CheckLicense.Parent:= WizardForm.LicensePage; with WizardForm.PreparingLabel do begin Width := ScaleX(610); end; WizardForm.PreparingMemo.SetBounds(ScaleX(0), WizardForm.PreparingMemo.Top, 610, WizardForm.PreparingMemo.Height); end; with WizardForm.FilenameLabel do begin Left := ScaleX(0) Top := ScaleY(50); Width := ScaleX(580); end; WizardForm.StatusLabel.Left := ScaleX(0) with WizardForm.ProgressGauge do begin Parent:=WizardForm.InstallingPage; SetBounds(ScaleX(0), ScaleY(100), 580, 30); Hide; end; TextureProgressBar(WizardForm.ProgressGauge, $898987, cllime, false); end; // =================== [Form] ============================== procedure InitializeWizard(); begin InitInfo(); CreateForm; // ButtonsTextures; Music; mp3Name := ExpandConstant('{tmp}\music.mp3'); BASS_Init(-1, 44100, 0, 0, 0); mp3Handle := BASS_StreamCreateFile(FALSE, PAnsiChar(mp3Name), 0, 0, 0, 0, BASS_SAMPLE_LOOP); BASS_Start(); BASS_ChannelPlay(mp3Handle, False); ExtractTemporaryFile('logo.gif'); GIFHWND2 := NewGifbWnd(WizardForm.Handle, ScaleX(80), WizardForm.Bevel.Top + ScaleY(8), 160, 33); GifWndLoadFromFile(GIFHWND2, HALIGN_CENTER, VALIGN_CENTER, CLR_INVALID, FIT_NONE, ExpandConstant('{tmp}\logo.gif')); Lbl := TNewStaticText.Create(WizardForm); Lbl.Parent := WizardForm; Lbl.AutoSize := False; Lbl.SetBounds(ScaleX(80), WizardForm.Bevel.Top + ScaleY(8), 160, 33); Lbl.OnClick := @LblOnClick; Lbl.Cursor := crHand; InfoPanel := TPanel.Create(WizardForm); InfoPanel.SetBounds(ScaleX(5), ScaleY(300), 605, 80); Info := TNewStaticText.Create(WizardForm); Info.Parent := WizardForm.SelectComponentsPage; Info.AutoSize := False; Info.SetBounds(ScaleX(15), ScaleY(310), 588, 68); Info.Caption := ''; Info.Font.Name := ''; Info.Font.Size := 9; Info.WordWrap := true; enabledesc(WizardForm.ComponentsList.Handle,Info.Handle, 'XVM: eXtended Visualization Mod — modification of the combat interface for the popular MMO World of Tanks. To display statistics, you need to enable it on the site XVM (www.modxvm.com);'+ 'XVM Ded_Shalfey configs "Prime_eff". Rating statistics Total victory of and techniques chance;'+ // ' ;'+ 'The sight of Jimbo. This sight can be classified as futuristic. Though he is equipped with additional graphic details - they do not have an overabundance, established a rather compact and organically.;'+ 'Sights from Zayaz help you not only comfortable and shoot accurately, but still give you a chance to not get under the opponents shots.;'+ 'The sight of Spectr20. Simple minimalist sight calculator enemy armor. The first value of your penetration of the projectile, the second tank armor at this point. Art sight can be adjusted from the config file CPSSetting.xml;'+ // ' ;'+ // 'Modification of fashion "Advanced tips for skills and abilities" of phantasm, add an extension to the description of the skills, abilities, medals, consumables and snaryadam.Ves font normal size, the positive effects are highlighted in green;'+ // 'Maud colored messages (MCM) from Vslav666. Detailed statistics on the battle, the number of wins and losses, the entire wage experience wage display free experience for the fight;'+ // ' ;'+ // 'The easiest and fastest hangar of Hellinger. This hangar is notable for the fact that its author has made every effort to improve system performance while in the hangar. Ideal for owners of low-end PCs.;'+ // ' ;'+ '6 Ozvuchka feelings sound fire perezaryad and t.p;' ); end; procedure ShowComponents(CurPageID: Integer); begin case CurPageID of wpSelectDir: begin ImgSetVisibility(DirFolder,True); ImgSetVisibility(GroupFolder,True); end; end; end; procedure CurPageChanged(CurPageID: Integer); begin // if CurPageID = wpSelectDir then // WizardForm.NoIconsCheck.Checked := true; // SetStateNewButtons; ImgSetVisibility(DirFolder,False); ImgSetVisibility(GroupFolder,False); ShowComponents(CurPageID); ImgApplyChanges(WizardForm.InnerPage.Handle) ImgApplyChanges(WizardForm.Handle); if CurPageID=wpFinished then begin WizardForm.ProgressGauge.Hide; //SendMessage(WizardForm.NextButton.Handle,BM_CLICK,0,0); end; end; procedure CurStepChanged(CurStep: TSetupStep); begin ProgressTimer(CurStep); if CurStep = ssInstall then begin MoveDir(ExpandConstant('{app}\res_mods\'),ExpandConstant('{app}\Backup')); WizardForm.ProgressGauge.Show; end; //begin //if CurStep = ssDone then //if MsgBox('modification ' + 'successfully' + ' performed!' + #10#10#13 + 'Start ' + 'game' + '?' , mbInformation, MB_OKCANCEL) = IDOK then //Exec(ExpandConstant('{app}\WorldOfTanks.exe'), '', '', SW_SHOW, ewNoWait, ResultCode); //end; end; procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); begin if CurUninstallStep = usPostUninstall then begin MoveDir(ExpandConstant('{app}\Backup\'),ExpandConstant('{app}\res_mods')); RemoveDir(ExpandConstant('{app}\Backup')); RestoreBackup(ExpandConstant('{app}')) end; end; procedure DeinitializeSetup(); begin ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0); // UnloadSkin; gdipShutdown; FreeAllGifWnd(); // WFButtonFont.Free; disabledesc(); BASS_Stop(); BASS_Free(); end; //function InitializeUninstall: Boolean; // begin // FileCopy(ExpandConstant('{app}\VclStylesinno.dll'), ExpandConstant('{tmp}\VclStylesinno.dll'), False); // FileCopy(ExpandConstant('{app}\{#SkinName}'), ExpandConstant('{tmp}\{#SkinName}'), False); // LoadSkin(ExpandConstant('{tmp}\{#SkinName}'), ''); // Result:=True; // end; Edited October 11, 2014 by san4o Quote Share this post Link to post Short link Share on other sites
leeuniverse 61 #221702 Posted October 11, 2014 Thank you so much guys..... These fixes work great! :) I guess we don't need the License Page anyway. That's fine for now. Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #221705 Posted October 11, 2014 (edited) I guess we don't need the License Page anyway. Yes, but you can create new page, with content from *.rtf: [Files] Source: NAME.rtf; DestDir: "{tmp}"; Flags: dontcopy; [Code] Procedure InitializeWizard(); var Page: TOutputMsgMemoWizardPage; Text: AnsiString; begin Page := CreateOutputMsgMemoPage(wpLicense, '', 'Description', 'Caption', ''); Page.RichEditViewer.Left := ScaleX(Page.RichEditViewer.Left); Page.RichEditViewer.Top := ScaleY(Page.RichEditViewer.Top); Page.RichEditViewer.Width := ScaleX(Page.RichEditViewer.Width); Page.RichEditViewer.Height := ScaleY(Page.RichEditViewer.Height); ExtractTemporaryFile('NAME.rtf'); LoadStringFromFile(ExpandConstant('{tmp}/NAME.rtf'), Text); Page.RichEditViewer.RTFText := Text; end; Edited October 11, 2014 by Kotyarko_O Quote Share this post Link to post Short link Share on other sites
woole 5 #221727 Posted October 11, 2014 (edited) Если и надо - то полный. Абсолютно полный. Весь скрипт. "Абсолютно полный код" /*тут был код*/ Edited October 21, 2014 by woole Quote Share this post Link to post Short link Share on other sites
AlaCraD 3 #221731 Posted October 11, 2014 Тупой вопрос конечно, но есть ли faq-и по коду inno, или учиться только по примерам скриптов? Quote Share this post Link to post Short link Share on other sites