PDA

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


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 [158] 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188

Qu@dr0
23-09-2011, 13:08
El Sanchez
Хоть программированием я никогда не занимался и уровень знаний в этой области нулевой, но ошибку (спасибо, что была она не очень сложной) в скрипте я нашёл и даже исправил))) Правда, интуиции хватило только на это, да ещё на изменение имеющихся текстов в окне...
Пока получилось такое:
http://i038.radikal.ru/1109/1d/0381c5ee850at.jpg (http://radikal.ru/F/i038.radikal.ru/1109/1d/0381c5ee850a.jpg.html)

Вопросы:
1) Как сделать, чтобы строка с галочкой (про сохранение в UTF-8) не была так далеко от формы ввода имени, а располагалась прямо под ней вплотную?
2) Как добавить под этой строкой про UTF-8 (не прямо под ней, а на 3 пробела ниже) информацию следующего содержания:
"Вы в любое время сможете сменить никнейм, для этого войдите в папку игры, откройте Блокнотом файл rev.ini, найдите строчку PlayerName и после знака "=" впишите желаемый никнейм."
И чтобы выравнивание этого текста было по ширине (так выглядит лучше)?

Заранее благодарю за помощь!

El Sanchez
23-09-2011, 14:47
1) Как сделать, чтобы строка с галочкой (про сохранение в UTF-8) не была так далеко от формы ввода имени, а располагалась прямо под ней вплотную?
2) Как добавить под этой строкой про UTF-8 (не прямо под ней, а на 3 пробела ниже) информацию следующего содержания:
"Вы в любое время сможете сменить никнейм, для этого войдите в папку игры, откройте Блокнотом файл rev.ini, найдите строчку PlayerName и после знака "=" впишите желаемый никнейм." »

Измените процедуру InitializeWizard:

...
ConvertCheckBox := TCheckBox.Create(WizardForm);
with ConvertCheckBox do
begin
Parent := RevEmuPage.Surface;
SetBounds(RevEmuPage.Edits[0].Left, RevEmuPage.Edits[0].Top + ScaleY(30), ScaleX(200), ScaleY(17));
Caption := 'Сохранить в UTF-8';
end;

with TLabel.Create(WizardForm) do
begin
Parent := RevEmuPage.Surface;
Caption := 'Вы в любое время сможете сменить никнейм, для этого войдите в папку игры, откройте Блокнотом файл rev.ini, найдите строчку PlayerName и после знака "=" впишите желаемый никнейм.';
SetBounds(0, ConvertCheckBox.Top + ScaleY(25), WizardForm.InnerNotebook.Width, ScaleY(34));
WordWrap := True;
Transparent := True;
end;


Координаты по высоте галки и надписи регулируйте по своему усмотрению (выделено красным).

И чтобы выравнивание этого текста было по ширине (так выглядит лучше) »
Доступно выравнивание только по правой, левой сторонам и по середине.


Хоть программированием я никогда не занимался и уровень знаний в этой области нулевой, но ошибку (спасибо, что была она не очень сложной) в скрипте я нашёл и даже исправил))) Правда, интуиции хватило только на это, да ещё на изменение имеющихся текстов в окне... »
Qu@dr0, респект. Я тоже не программист и, как и вы, начинал изучение Inno с анализа чужих кодов.

insombia
23-09-2011, 20:06
Опять столкнулся с проблемой что когда идет установка и слайд-шоу то прогресс бара почему то не видно(скрипт в ЛС даю)

Gnom_aka_Lexander
23-09-2011, 20:10
insombia, В этот ра скрипт не нужен :) У IsSlideShow специфика такая - изображения всегда поверх всего. ПРосто сдвинь прогрессбар так, что слайды его не закрывали.

insombia
23-09-2011, 20:20
Лександер то прикол в том что вчера(до того как я кидал тебе скрипт все было нормально) но проблема решается так

procedure CurStepChanged2(CurStep: TSetupStep);
var res: integer;
begin
CurStepChanged1(CurStep: TSetupStep);
if CurStep = ssPostInstall then begin
If Soft.Checked then begin
WizardForm.FileNameLabel.Caption:=ExpandConstant('{cm:SoftInstall}');
Exec(ExpandConstant('Hard Reset repack\Redist\DirectX\DXSETUP.exe'), '/silent', ExpandConstant('Redist\DirectX'), SW_SHOW, ewWaitUntilTerminated, Res);
Exec(ExpandConstant('Hard Reset repack\Redist\vcredist.exe'), '/Q', ExpandConstant('Redist'), SW_SHOW, ewWaitUntilTerminated, Res);
end;
end;
end;

если CurStepChanged1(CurStep: TSetupStep); убрать все нормально но архивы не распаковываются а если оставить то не видно прогресс бара

может вообще убрать слайды?

Qu@dr0
23-09-2011, 22:52
El Sanchez, почти всё работает прекрасно. Кроме сохранения введённого в форму никнейма в кодировке UTF-8. Я ввожу в форму никнейм спецсимволами, отмечаю пункт "Сохранить в UTF-8", однако в rev.ini вместо символов вписываются вопросительные знаки, т.е. всё сохраняется в ANSI без спецсимволов.

Можно ли сделать, чтобы введённый в форму никнейм сохранялся в кодировке UTF-8, а кодировка остальной части файла оставалась ANSI?
Например, в Notepad++ можно вставить в rev.ini отдельное слово, выделить его, нажать "Encoding -> Convert to UTF-8 without BOM", и rev.ini будет в ANSI, кроме единственного слова, которое будет в UTF-8. Реально ли такое сделать в скрипте InnoSetup?

И можно ли встроить опцию "Восстановление", которую можно выбрать в "Программах и компонентах", и которая бы удаляла все новые и изменённые файлы и восстанавливала состояние, которое было сразу после установки?

Если бы были такие Pascal-скрипты с подробным описанием вплоть до каждого параметра и значения, изучать было бы гораздо легче и быстрее, а то читаю этот скрипт и 99% текста ни о чём не говорит...

insombia
24-09-2011, 09:35
В 6 исдоне есть ошибка что припустим у меня распаковывает архивы а у других людей нет как быть?

El Sanchez
24-09-2011, 11:21
Я ввожу в форму никнейм спецсимволами, отмечаю пункт "Сохранить в UTF-8", однако в rev.ini вместо символов вписываются вопросительные знаки, т.е. всё сохраняется в ANSI без спецсимволов »
Qu@dr0, а что вы хотели? ANSI не знает ваших спецсимволов, поэтому документ, открытый в ANSI-кодировке, неизвестные символы будет отображать абы как. Кстати, Блокнот не годится для редактирования rev.ini, пользуйтесь, например, AkelPad. В инсталляторе вбейте никнейм кириллицей с конвертацией в UTF-8 и откройте потом его в AkelPad. Никнейм будет крякозяблами, это нормально, в статусной строке - ANSI.

Скрин (http://i.piccy.info/i7/426ac2112bb53b80b04ea943d4bcea84/1-5-88/48246299/rev.png)

Qu@dr0
24-09-2011, 15:35
El Sanchez, тут важно не то, как никнейм отображается при открытии rev.ini в редакторах, а как его понимает сама игра.

Сейчас хоть отмечай "сохранить в UTF-8" в инсталляторе, хоть не отмечай, а сохраняются вопросительные знаки вместо спецсимволов. А через тот же Notepad++ можно сохранить так, чтобы и файл вроде как остался в ANSI, и никнейм игра поняла нормально, например:

rev.ini (http://ifolder.ru/25925752)

http://i018.radikal.ru/1109/6d/1a22ec47b48dt.jpg (http://radikal.ru/F/i018.radikal.ru/1109/6d/1a22ec47b48d.jpg.html)
При открытии rev.ini в том же обычном "Блокноте" в строке PlayerName отображаются кракозябры, а игра всё воспринимает нормально.

Фишка в том, что никнейм спецсимволами можно сделать только в UTF-8, но если сохранить в UTF-8 весь rev.ini, игра будет работать некорректно, а если в UTF-8 будет только никнейм, а остальной файл - в ANSI, то и игра запустится нормально, и спецсимволы в никнейме не потеряются.
Можно ли, чтобы при отмечании пункта "Сохранить в UTF-8" rev.ini сохранялся в таком виде, как по вышеупомянутой ссылке?

leha---83
24-09-2011, 20:32
Qu@dr0,
Я тоже не понимаю в программировании но у меня есть код который работает как надо но есть одно но. надо его поправить добавить смену ClanTag и чтоб продолжение без ввода символа было не возможным
кстати сохраняет ник нормально (utf-8)
[Code]
const
CP_ACP = 0; CP_UTF8 = 65001;
var
SystemPage, SelectTasksPage: TWizardPage;
RequirementsLbl: TLabel;
Edit, Edit1: TNewEdit;
Nick: string;

Function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: string; cbMultiByte: integer; lpWideCharStr: string; cchWideChar: integer): longint; external 'MultiByteToWideChar@kernel32.dll stdcall';
Function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: string; cchWideChar: integer; lpMultiByteStr: string; cbMultiByte: integer; lpDefaultChar: integer; lpUsedDefaultChar: integer): longint; external 'WideCharToMultiByte@kernel32.dll stdcall';

procedure CreatePageComponents;
var
Pdm: string;
vr,VidRam : Longint;
Version: TWindowsVersion;
begin
SystemPage:=CreateCustomPage(wpLicense, ExpandConstant('Выбор ника'), ExpandConstant('Выбор Ника'));
Edit := TNewEdit.Create(SystemPage);
Edit.Top := ScaleY(8);
Edit.Width := SystemPage.SurfaceWidth div 2 - ScaleX(8);
Edit.Text := 'Ник';
Edit.Parent := SystemPage.Surface;
end;

procedure InitializeWizard;
begin
CreatePageComponents;
end;

function AnsiToUtf8( strSource: string ): string;
var
nRet : integer;
WideCharBuf: string;
MultiByteBuf: string;
begin
strSource:= strSource + chr(0);
SetLength( WideCharBuf, Length( strSource ) * 2 );
SetLength( MultiByteBuf, Length( strSource ) * 2 );

nRet:= MultiByteToWideChar( CP_ACP, 0, strSource, -1, WideCharBuf, Length(WideCharBuf) );
nRet:= WideCharToMultiByte( CP_UTF8, 0, WideCharBuf, -1, MultiByteBuf, Length(MultiByteBuf), 0, 0);

Result:= MultiByteBuf;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if (CurStep = ssPostInstall) then
begin
SetIniString('steamclient', 'PlayerName', AnsiToUTF8(Edit.Text), ExpandConstant('{app}')+'\rev.ini');
end;
end;

El Sanchez
24-09-2011, 22:28
leha---83, имя игрока, предложенное Qu@dr0, вашим кодом нормально не перекодируется, будут те же вопросительные знаки, проверено.
Qu@dr0, попробовал несколько вариантов перекодировки, все не то, плюнул, написал по-своему. Требуется юникодная версия компилятора:


[Code]
#ifndef UNICODE
#error Unicode version of Inno Setup is required to compile this script
#endif

var
RevEmuPage: TInputQueryWizardPage;
ConvertCheckBox: TCheckBox;

procedure SetNickname(Nickname: String; Filename: String; IsConvert: Boolean);
var
arrAnsi, arrUtf8: TArrayOfString;
i: Integer;
begin
if IsConvert then
begin
LoadStringsFromFile(Filename, arrAnsi);
SetArrayLength(arrUtf8, 1);
for i := 0 to GetArrayLength(arrAnsi)-1 do
begin
if Pos(LowerCase('PlayerName='), LowerCase(arrAnsi[i])) = 0 then
SaveStringToFile(Filename, arrAnsi[i] + #13#10, i <> 0)
else begin
arrUtf8[0] := Copy(arrAnsi[i], 0, Length('PlayerName=')) + Nickname + #10;
SaveStringsToUTF8File(Filename, arrUtf8, i <> 0);
end;
end;
end else SetIniString('steamclient', 'PlayerName', Nickname, Filename);
end;

procedure NicknameOnChange(Sender: TObject);
begin
WizardForm.NextButton.Enabled := RevEmuPage.Values[0] <> '';
end;

//
procedure InitializeWizard();
begin
RevEmuPage := CreateInputQueryPage(wpInfoAfter, 'Настройка RevEmu', '', 'Пожалуйста, введите данные профиля и нажмите Далее.');
with RevEmuPage do
begin
Add('Ник:', False);
Edits[0].OnChange := @NicknameOnChange;
end;
ConvertCheckBox := TCheckBox.Create(WizardForm);
with ConvertCheckBox do
begin
Parent := RevEmuPage.Surface;
SetBounds(RevEmuPage.Edits[0].Left, RevEmuPage.Edits[0].Top + ScaleY(40), ScaleX(200), ScaleY(17));
Caption := 'Сохранить в UTF-8';
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = RevEmuPage.ID then WizardForm.NextButton.Enabled := RevEmuPage.Values[0] <> '';
if CurPageID = wpFinished then SetNickname(RevEmuPage.Values[0], ExpandConstant('{app}\rev.ini'), ConvertCheckBox.Checked);
end;

insombia
24-09-2011, 22:31
Как сделать чтобы если не хватает места на диске то установку нельзя было продолжить вот скрипт http://rghost.ru/22901291

leha---83
24-09-2011, 22:36
Нормально кодируется!
http://savepic.net/2090567m.png (http://savepic.net/2090567.htm)

insombia
25-09-2011, 11:07
Как сделать чтобы во время распаковки архивов у исдона не было его кнопки отмены а стояла моя и чтобы моя отменяла тоже распаковку если надо а то когда-то убрал кнопку исдана то моя не отменяла скрипт в ЛС

http://i27.fastpic.ru/thumb/2011/0925/ad/847843c0d307aab12c5df8cf2fe70fad.jpeg (http://fastpic.ru/view/27/2011/0925/847843c0d307aab12c5df8cf2fe70fad.jpg.html) http://i29.fastpic.ru/thumb/2011/0925/53/e48c46527b5d928ac7e597a1b619aa53.jpeg (http://fastpic.ru/view/29/2011/0925/e48c46527b5d928ac7e597a1b619aa53.jpg.html)

insombia
25-09-2011, 14:19
Arsi000
Parameters: /q пробовал?

insombia
25-09-2011, 14:43
Arsi000 попробуй скажешь что будет

как сделать такие проценты http://i27.fastpic.ru/thumb/2011/0925/a8/f6d6439d724717738888cfa3454e76a8.jpeg (http://fastpic.ru/view/27/2011/0925/f6d6439d724717738888cfa3454e76a8.jpg.html)

VASYAKRN
25-09-2011, 15:44
дайте пожалста ЕХЕ вариант BlackSelf

insombia
25-09-2011, 15:50
VASYAKRN когда ты научишся нормально просить?? какой именно ехе вариант??? да и зачем он тебе?

Raf-9600
25-09-2011, 16:30
А можно какнить "синхронизировать" галочки, между двумя компонентами?
Тоесть допустим есть два компонента, GameLoD и GameLoD\VoiceLoD. GameLoD опционален, а GameLoD\VoiceLoD не должен быть опциональным, т.е. если юзер выбрал GameLoD, то должен автоматически выбираться и GameLoD\VoiceLoD, без возможности снять с него "птичку".
Сугубо теоретически, эту возможность должен реализовывать такой скрипт:
[Components]
Name: GameLoD; Description: LoD; Types: full compact custom;
Name: GameLoD\VoiceLoD; Description: Озвучка; Types: full

[code]
var
OldEvent_ComponentsListClickCheck: TNotifyEvent;

procedure ComponentsListClickCheck(Sender: TObject);
begin
If IsComponentSelected('GameLoD') then
WizardForm.ComponentsList.ItemEnabled[1]:=False
else
WizardForm.ComponentsList.ItemEnabled[1]:=True;
OldEvent_ComponentsListClickCheck(Sender);
end;

procedure InitializeWizard();
begin
with WizardForm.ComponentsList do
begin
OldEvent_ComponentsListClickCheck := OnClickCheck;
OnClickCheck := @ComponentsListClickCheck;
ItemEnabled[1]:=False;
end;
end;
Но если так сделать, то исчезает возможность не выбрать GameLoD.
Можно эту возможность реализовать как-то иначе?

insombia
25-09-2011, 16:39
Raf-9600 зачем же так делать если можно поставить exclusive чтобы только один компонент был выбран




© OSzone.net 2001-2012