Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 3]
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); убрать все нормально но архивы не распаковываются а если оставить то не видно прогресс бара
может вообще убрать слайды?
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)
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.