Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 5]
нет. перед копированием переключи раскладку клавиатуры на русский. »теперь понял. Спасибо. как вариант учту, незнал. к Notepad++ просто привык, на нём работать удобнее. R.i.m.s.k.y., так бы сразу и сказал что находясь в компиляторе нужно раскладку клавиатуры переключить. а так эта инфа была для spice, да и не только к нему и к остальным тоже у меня такая пустяшная проблема не произошла б.
он у меня есть у меня ultra версия, в редакторе форм все на английском я не понимаю как с ним работать. »всё равно какая версия хоть ультра хотя макси инно один, а насчёт русского для расширенной версии, та возьми ты со старой версии например 5.4.0 из шапки в соседней теме http://forum.oszone.net/showthread.php?p=1201499#post1201499 и всё станет понятно.
Ivan_009
05-09-2012, 16:48
Небольшой вопрос а можно вместо 1 шрифта загрузить например 2 своих шрифта в инсталлятор... :search:
Snoopak96, Не работает все равно... :(
Snoopak96
05-09-2012, 19:22
Ivan_009,
скинь в лс весь проект.
Привет хотел попросить помощи дописать скрипт что не хватает для проверки места дело в том что у меня после смены языка пропадает данные размер игры и так далее.
вот скрин http://rghost.ru/40204893/image.png (http://rghost.ru/40204893.view)
вот сам скрипт http://rghost.ru/40204994
Snoopak96
05-09-2012, 21:25
vint56,
#define NeedSize 4380
#define NeedInstallSize 47890
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
[Files]
Source: Russian.isl; DestDir: {tmp}
Source: English.isl; DestDir: {tmp}
[_Code]
var
SettingButton: TButton;
Flag, SetParameters: Boolean;
LangFile: String;
SizePanel: TPanel;
TotalSpaceLabel, FreeSpaceLabel,InstallSpaceLabel, NeedSpacelabel,
TotalSpaceLabel2, FreeSpaceLabel2, NeedSpacelabel2, InstallSpaceLabel2: TLabel;
FreeMB, TotalMB: Cardinal;
function NumToStr(Float: Extended): String;
begin
Result:= format('%.2n', [Float]); StringChange(Result, ',', '.');
while ((Result[Length(Result)] = '0')or(Result[Length(Result)] = '.'))and(Pos('.', Result) > 0) do
SetLength(Result, Length(Result)-1);
end;
function MbOrTb(Float: Extended): String;
begin
if Float < 1024 then Result:= NumToStr(Float)+' '+GetIniString('Messages', 'mb', '', LangFile) else
if Float/1024 < 1024 then Result:= NumToStr(Float/1024)+' '+GetIniString('Messages', 'gb', '', LangFile) else
Result:= NumToStr(Float/(1024*1024))+' '+GetIniString('Messages', 'tb', '', LangFile);
end;
procedure ObjectFunc(Sender: TObject);
var
Drive: String;
begin
case Sender of
WizardForm.DirEdit: begin
Drive:= ExtractFileDrive(WizardForm.DirEdit.Text);
GetSpaceOnDisk(Drive, True, FreeMB, TotalMB);
TotalSpaceLabel.Caption := GetIniString('Messages', 'TotalMBLabel', '', LangFile)+MbOrTb(TotalMB);
FreeSpaceLabel.Caption := GetIniString('Messages', 'FreeSpaceLabel', '', LangFile)+MbOrTb(FreeMB);
InstallSpacelabel.Caption := GetIniString('Messages', 'TotalNeedSpaceLabel', '', LangFile)+MbOrTb({#NeedInstallSize});
NeedSpaceLabel.Caption := GetIniString('Messages', 'NeedSpaceLabel', '', LangFile)+MbOrTb({#NeedSize});
WizardForm.NextButton.Enabled:=(FreeMB>{#NeedInstallSize})and(FreeMB>{#NeedSize});
//if (FreeMB>{#NeedInstallSize})and(FreeMB>{#NeedSize}) then FreeSpaceLabel2.Font.Color:=$FFFFFF else FreeSpaceLabel2.Font.Color:=$0000FF;
end;
end;
end;
function InitializeSetup:boolean;
begin
if not FileExists(ExpandConstant('{tmp}\Russian.isl')) then ExtractTemporaryFile('Russian.isl');
if not FileExists(ExpandConstant('{tmp}\English.isl')) then ExtractTemporaryFile('English.isl');
Result:=True;
end;
procedure HideShowOnClick(Sender: TObject);
begin
if Flag = False then begin
LangFile:= ExpandConstant('{tmp}\Russian.isl');
Flag:= True;
SettingButton.Caption:= 'Ru';
end else begin
LangFile:= ExpandConstant('{tmp}\English.isl')
Flag:= False;
SettingButton.Caption:= 'En';
end;
WizardForm.NextButton.Caption := GetIniString('Messages', 'ButtonNext', '', LangFile);
WizardForm.BackButton.Caption := GetIniString('Messages', 'ButtonBack', '', LangFile);
WizardForm.CancelButton.Caption := GetIniString('Messages', 'ButtonCancel', '', LangFile);
WizardForm.DirBrowseButton.Caption := GetIniString('Messages', 'ButtonBrowse', '', LangFile);
WizardForm.GroupBrowseButton.Caption := GetIniString('Messages', 'ButtonBrowse', '', LangFile);
TotalSpaceLabel.Caption := GetIniString('Messages', 'TotalMBLabel', '', LangFile)+MbOrTb(TotalMB);
FreeSpaceLabel.Caption := GetIniString('Messages', 'FreeSpaceLabel', '', LangFile)+MbOrTb(FreeMB);
InstallSpacelabel.Caption := GetIniString('Messages', 'TotalNeedSpaceLabel', '', LangFile)+MbOrTb({#NeedInstallSize});
NeedSpaceLabel.Caption := GetIniString('Messages', 'NeedSpaceLabel', '', LangFile)+MbOrTb({#NeedSize});
end;
procedure InitializeWizard();
begin
SettingButton:= TButton.Create(WizardForm);
SettingButton.SetBounds(ScaleX(10),ScaleY(325), ScaleX(30), ScaleY(30))
SettingButton.Caption:= 'Ru';
SettingButton.OnClick:= @HideShowOnClick;
SettingButton.Parent:= WizardForm;
Flag:=True;
TotalSpaceLabel:= TLabel.Create(WizardForm);
with TotalSpaceLabel do begin
Parent := WizardForm.SelectDirPage;
AutoSize:=True;
Transparent := True;
SetBounds(ScaleX(0), ScaleY(120), ScaleX(0), ScaleY(0));
Font.Size:= 8;
end;
FreeSpaceLabel:= TLabel.Create(WizardForm);
with FreeSpaceLabel do begin
Parent := WizardForm.SelectDirPage;
AutoSize:=True;
Transparent := True;
SetBounds(ScaleX(0), ScaleY(140), ScaleX(0), ScaleY(0));
Font.Size:= 8;
end;
InstallSpacelabel:= TLabel.Create(WizardForm);
with InstallSpacelabel do begin
Parent := WizardForm.SelectDirPage;
AutoSize:=True;
Transparent := True;
SetBounds(ScaleX(150), ScaleY(120), ScaleX(0), ScaleY(0));
Font.Size:= 8;
end;
NeedSpaceLabel:= TLabel.Create(WizardForm);
with NeedSpaceLabel do begin
Parent := WizardForm.SelectDirPage;
AutoSize:=True;
Transparent := True;
SetBounds(ScaleX(150), ScaleY(140), ScaleX(0), ScaleY(0));
Font.Size:= 8;
end;
WizardForm.DirEdit.OnChange:=@ObjectFunc;
end;
procedure Showcomp(CurPageID: Integer);
begin
case CurPageID of
wpSelectDir:
begin
ObjectFunc(WizardForm.DirEdit);
end;
end;
end;
procedure CurPageChanged(CurPageID: Integer);
begin
ShowComp(CurPageID);
If Flag then begin
LangFile:= ExpandConstant('{tmp}\Russian.isl');
end else begin
LangFile:= ExpandConstant('{tmp}\English.isl')
WizardForm.NextButton.Caption := GetIniString('Messages', 'ButtonNext', '', LangFile);
WizardForm.BackButton.Caption := GetIniString('Messages', 'ButtonBack', '', LangFile);
WizardForm.CancelButton.Caption := GetIniString('Messages', 'ButtonCancel', '', LangFile);
WizardForm.DirBrowseButton.Caption := GetIniString('Messages', 'ButtonBrowse', '', LangFile);
WizardForm.GroupBrowseButton.Caption := GetIniString('Messages', 'ButtonBrowse', '', LangFile);
case CurPageID of
wpWelcome:
begin
end;
wpFinished:
begin
SettingButton.Hide;
WizardForm.NextButton.Caption := GetIniString('Messages', 'ButtonFinish', '', LangFile);
end;
end;
end;
end;Можно упростить - но мне лень :smirk:
Johny777
06-09-2012, 10:31
накатайте мне кто-нибудь пожалуйста пример считывания ини файла в массив строк (Array of String) и последующей загрузкой данных ключей из секций, но уже из переменной
те не каждый раз обращаться к файлу как в коде над моим сообщением
R.i.m.s.k.y.
06-09-2012, 12:35
Johny777, а зачем тебе парсить инишник если есть встроенные функции?
/// в начале считали, например в InitializeSetup
if FileExists(ExpandConstant('{pf}\MPC-HC\mpc-hc.ini')) then RenderType := StrToInt( GetIniString('Settings', 'DSVidRen', '0', ExpandConstant('{pf}\MPC-HC\mpc-hc.ini')) );
// в конце записали на шаге isDone
if FileExists(ExpandConstant('{pf}\MPC-HC\mpc-hc.ini')) then SetIniString('Settings', 'DSVidRen', IntToStr(RenderType), ExpandConstant('{pf}\MPC-HC\mpc-hc.ini'));
//в промежутке инишник дергать не надо
подскажите ответ на такой вопрос
имеются три игры которые расположены в C:\Program Files\Games в папках Game_X таких папок три где X цифра.
[Setup]
AppName=Extende
AppVersion=1.0
AppVerName=Extende 1.0
DefaultDirName={pf}\Games
DefaultGroupName=Extende
AllowNoIcons=yes
OutputDir=.
OutputBaseFilename=ExtSetup
Compression=lzma
SolidCompression=yes
[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl
[Components]
Name: game_1; Description: Game_1; Flags: dontinheritcheck; Types: full
Name: game_2; Description: Game_2; Flags: dontinheritcheck; Types: full
Name: game_3; Description: Game_3; Flags: dontinheritcheck; Types: full
[Files]
Source: Game_1\*; DestDir: {app}\Game_1; Flags: ignoreversion recursesubdirs createallsubdirs; Components: game_1
Source: Game_2\*; DestDir: {app}\Game_2; Flags: ignoreversion recursesubdirs createallsubdirs; Components: game_2
Source: Game_3\*; DestDir: {app}\Game_3; Flags: ignoreversion recursesubdirs createallsubdirs; Components: game_3каждый компонент на каждую игру.
Что нужно сделать а главное как сделать чтоб если один из ключей в реестре
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game1_is1]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game2_is1]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game3_is1]
не найден то и компонент становился скрытым?
R.i.m.s.k.y.
06-09-2012, 15:20
SatHan, [Components]
Name: game_1; Description: Game_1; Flags: dontinheritcheck; Types: full; Check: RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game1_is1');
Name: game_2; Description: Game_2; Flags: dontinheritcheck; Types: full; Check: RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game2_is1');
Name: game_3; Description: Game_3; Flags: dontinheritcheck; Types: full; Check: RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game3_is1');
_____________
Johny777, я в таких случая тупо инициализирую в память на начальном шаге все нужные переменные, благо их немного
R.i.m.s.k.y., не работает, пишет "Directive or parameter "Check" expression error: Can only call Function "ExpandConstant" within parameter lists".
Нашёл для себя вот такой вариант
[Setup]
AppName=Extende
AppVersion=1.0
AppVerName=Extende 1.0
DefaultDirName={pf}\Games
DefaultGroupName=Extende
AllowNoIcons=yes
OutputDir=.
OutputBaseFilename=ExtSetup
Compression=lzma
SolidCompression=yes
[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl
[Components]
Name: game_1; Description: Game_1; Flags: dontinheritcheck; Types: full; Check: CheckRegGame1
Name: game_2; Description: Game_2; Flags: dontinheritcheck; Types: full; Check: CheckRegGame2
Name: game_3; Description: Game_3; Flags: dontinheritcheck; Types: full; Check: CheckRegGame3
[Files]
Source: Game_1\*; DestDir: {app}\Game_1; Flags: ignoreversion recursesubdirs createallsubdirs; Components: game_1
Source: Game_2\*; DestDir: {app}\Game_2; Flags: ignoreversion recursesubdirs createallsubdirs; Components: game_2
Source: Game_3\*; DestDir: {app}\Game_3; Flags: ignoreversion recursesubdirs createallsubdirs; Components: game_3
[Icons]
Name: {group}\{cm:UninstallProgram,Extende}; Filename: {uninstallexe}
[#code]
Function CheckRegGame1: Boolean;
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game1_is1') then
Result:= True;
end;
Function CheckRegGame2: Boolean;
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game2_is1') then
Result:= True;
end;
Function CheckRegGame3: Boolean;
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game3_is1') then
Result:= True;
end;
только теперь проблема в следующем
когда не одного компонента нет (не найдены ключи в реестре) то инсталятор всё равно запускается. Гуру подскажите как сделать чтоб если не одного компонента нет (не найдены ключи в реестре) то инсталятор не запускался а выдавал сообщение что "на компьютере не найдено установлено игр"?
R.i.m.s.k.y.
06-09-2012, 16:53
SatHan,
Function CheckRegGame1: Boolean;
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game1_is1') then
Result:= True else Result := False;
end;
Function CheckRegGame2: Boolean;
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game2_is1') then
Result:= True else Result := False;
end;
Function CheckRegGame3: Boolean;
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game3_is1') then
Result:= True else Result := False;
end;
Function InitializeSetup: Boolean;
Begin
if ( (not CheckRegGame1) and (not CheckRegGame2) and (not CheckRegGame3) ) then begin
MsgBox('на компьютере не найдено установлено игр', mbInformation, MB_OK);
Result := False;
end;
end;
R.i.m.s.k.y., опять проблема. когда в системе ключи присутствуют то инсталятор не запускается. Как решить проблему?
R.i.m.s.k.y.
06-09-2012, 17:13
SatHan, Function InitializeSetup: Boolean;
Begin
Result := True;
if ( (not CheckRegGame1) and (not CheckRegGame2) and (not CheckRegGame3) ) then begin
MsgBox('На компьютере не найдено установленых игр', mbInformation, MB_OK);
Result := False else Result := True;
end;
R.i.m.s.k.y., на Result-е тот что идёт после MsgBox останавливается и выдаёт ошибку с сообщением identifier expected.
Johny777
06-09-2012, 17:42
я в таких случая тупо инициализирую в память на начальном шаге все нужные переменные, благо их немного »
Не совсем понял
они и так инициализируются при запуске или при работе процедуры
вот смотри
ты 10 раз открываешь файл с жёсткого диска чтоб взять из него значение (10 значений)
или открываешь 1 раз, пишешь все 10 значений в переменную массива и потом работаешь уже с переменной тк она в оперативке (в стеке кажись.)
а из оперативы брать быстрее в разы чем раскручивать жд
понимаешь зачем мне массив
до последнего времени я обходился простой GetIniString но это малость неразумно когда нужно считывать не 1 и не 2 знчения, а больше в разы
SatHan,
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
[ Code]
Function CheckRegGame(nParam: Integer): Boolean;
begin
case nParam of
1: Result:= RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game1_is1');
2: Result:= RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game2_is1');
3: Result:= RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game3_is1');
else
Result := RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game1_is1') and
RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game2_is1') and
RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game3_is1')
end;
end;
Function InitializeSetup: Boolean;
Begin
if not CheckRegGame(0) then
begin
MsgBox('На компьютере не найдено установленых игр', mbInformation, MB_OK);
Result := False;
end else
Result := True;
end;
R.i.m.s.k.y.
06-09-2012, 17:47
Johny777, через getIniString я ручками получаю с десяток нужных мне переменных из инишника, заношу только не в аррэй а в десять переменных и с ними дальше работаю. Я вообще не понимаю целесообразности вопроса.
SatHan, [ Code]
Function CheckRegGame1: Boolean;
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game1_is1') then
Result:= True else Result := False;
end;
Function CheckRegGame2: Boolean;
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game2_is1') then
Result:= True else Result := False;
end;
Function CheckRegGame3: Boolean;
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game3_is1') then
Result:= True else Result := False;
end;
Function InitializeSetup: Boolean;
Begin
Result := True;
if ( (CheckRegGame1) and (CheckRegGame2) and (CheckRegGame3) ) then Result := True
else begin
MsgBox('На компьютере не найдено установленых игр', mbInformation, MB_OK);
Result := false;
end;
end;
end.
Snoopak96
06-09-2012, 17:58
SatHan,
Ну скрыть компоненты не получится, тк в инно нет свойства ItemVisible, можно сделать так как вариант:
[Setup]
AppName=Extende
AppVersion=1.0
AppVerName=Extende 1.0
DefaultDirName={pf}\Games
DefaultGroupName=Extende
AllowNoIcons=yes
OutputDir=.
OutputBaseFilename=ExtSetup
Compression=lzma
SolidCompression=yes
[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl
[Components]
Name: game_1; Description: Game_1; Flags: dontinheritcheck; Types: full
Name: game_2; Description: Game_2; Flags: dontinheritcheck; Types: full
Name: game_3; Description: Game_3; Flags: dontinheritcheck; Types: full
[_Code]
Function CheckRegGame1: Boolean;
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game1_is1') then Result:= True;
end;
Function CheckRegGame2: Boolean;
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game2_is1') then Result:= True;
end;
Function CheckRegGame3: Boolean;
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game3_is1') then Result:= True;
end;
procedure InitializeWizard;
begin
WizardForm.ComponentsList.Checked[0]:= CheckRegGame1;
WizardForm.ComponentsList.Checked[1]:= CheckRegGame2;
WizardForm.ComponentsList.Checked[2]:= CheckRegGame3;
WizardForm.ComponentsList.ItemEnabled[0]:= CheckRegGame1;
WizardForm.ComponentsList.ItemEnabled[1]:= CheckRegGame2;
WizardForm.ComponentsList.ItemEnabled[2]:= CheckRegGame3;
end;
Johny777
06-09-2012, 17:59
заношу только не в аррэй а в десять переменных и с ними дальше работаю »
не использую переменные
вот пример кода Run_Game_CheckBox.Checked := (GetIniString('MySettings', 'Run_Games', '', ExpandConstant('{src}\Selfish.ini')) = '1'); (скоро сам всё увидишь когда докачаешь :) )
Я вообще не понимаю целесообразности вопроса. »
повышение скорости работы путём сокращения ненужных действий
ненужное действие у меня выполняется двумя ини - 10 считываний вместо одного
Ну скрыть компоненты не получится »
в этом случае их можно прото не добавлять в чеклистбокс таким вот макаром
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
[Components]
Name: game_1; Description: Game_1; Flags: dontinheritcheck; Types: full; Check: CheckRegGame(1);
Name: game_2; Description: Game_2; Flags: dontinheritcheck; Types: full; Check: CheckRegGame(3);
Name: game_3; Description: Game_3; Flags: dontinheritcheck; Types: full
[ Code]
Function CheckRegGame(nParam: Integer): Boolean;
begin
case nParam of
1: Result:= RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game1_is1');
2: Result:= RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game2_is1');
3: Result:= RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game3_is1');
else
Result := RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game1_is1') and
RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game2_is1') and
RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game3_is1')
end;
end;
R.i.m.s.k.y.
06-09-2012, 18:02
Snoopak96, ты в этом ошибаешься, если в моем примере выше подчековая функция вернет фолсе то в списке компонентов соответствующей строчки не будет, проверь сам ;)
Johny777, чуток осталось
Snoopak96
06-09-2012, 18:08
R.i.m.s.k.y., я про свойство ItemVisible, а у тебя строит компонент лист на ходу при старте, путаешь ты =) хотя и так тоже можно сделать.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.