Как создать INI-файл (если его нет) и модифицировать (если он есть) - всего с одним значением?

NicTon

Новичок
Стандартная страница Inno Setup "Выберите дополнительные задачи. Какие дополнительные задачи необходимо выполнить?"

Тут и создание ярлыка на Рабочий стол и т.п.
И здесь же выбор языка интерфейса программы, вот в зависимости от того какую "радиобуттон", выберет пользователь такое значение и нужно прописать в INI-файл. Без Section! Только ключ и значение!

Нужно написать Locale = ru или Locale - en.

Проблема заключается ещё в том что этот INI файл должен быть в "Моих Документах":

C:\Users\Имя пользователя\Documents\Название программы\setup.ini и этот файл уже может существовать!

ЕСЛИ ЭТОТ ФАЙЛ СУЩЕСТВУЕТ, то только добавить/изменить (ВНЕ СЕКЦИИ) Locale = en/ru (в зависимости от выбора при установке), НЕ трогая остальные значения и секции в этом файле. А если его НЕ существует, то просто создать файл setup.ini - с одним значение Locale = ru или Locale - en.

Это вообще возможно, помогите, пожалуйста!
 

Mickey1s

Ветеран
Модератор
[Ini]
Filename: "{userdocs}\setup.ini"; Section: "Settings"; Key: "Locale"; String: "ru"; Components: text\ru;

если компоненты не нужны убрать Components: text\ru
 

NicTon

Новичок
[Ini]
Filename: "{userdocs}\setup.ini"; Section: "Settings"; Key: "Locale"; String: "ru"; Components: text\ru;

если компоненты не нужны убрать Components: text\ru
Здравствуйте!

Нужно от выбора на странице дополнительные задачи:

Код:
[Tasks]
Name: "eng"; Description: "Английский"; GroupDescription: "Интерфейс:"; Flags: exclusive
Name: "rus"; Description: "Русский"; GroupDescription: "Интерфейс:"; Flags: exclusive
Name: "desktopicon"; Description: "Создать ярлык для запуска игры на Рабочем столе"; GroupDescription: "{cm:AdditionalIcons}"
Name: "DirectX"; Description: "Обновить DirectX"; GroupDescription: "Системные задачи:"

И как я писал ранее Section - НЕ нужно!!!


В этом файле setup.ini - ТОЛЬКО ключ со значением: Locale = ru (или eng) - ВНЕ СЕКЦИИ, ОТДЕЛЬНО наверху самой первой строчкой!

Вот так вот:
Код:
Locale = ru

; А потом уже идут различные секции, например:

[option]
Вот если этого файла нет в Моих документах\Название приложения, то создать setup.ini ТОЛЬКО с этой строчкой "Locale = ..." (без секций, только значение и ключ), в зависимости от выбора в Tasks, а если этот файл уже есть, то как быть? Нужно ТОЛЬКО его проверить и заменить/добавить этот ключ Locale, на нужный, в зависимости от выбора языка в Tasks, при установке!
 
Последнее редактирование:

vint56

Ветеран
Проверенный
NicTon,
[Setup]
AppName=My Program
AppVersion=1.5
;AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"

[Tasks]
Name: "eng"; Description: "Английский"; GroupDescription: "Интерфейс:"; Flags: exclusive
Name: "rus"; Description: "Русский"; GroupDescription: "Интерфейс:"; Flags: exclusive
Name: "desktopicon"; Description: "Создать ярлык для запуска игры на Рабочем столе"; GroupDescription: "{cm:AdditionalIcons}"
Name: "DirectX"; Description: "Обновить DirectX"; GroupDescription: "Системные задачи:"

[Files]

[Icons]
Name: "{group}\My Program"; Filename: "{app}\MyProg.exe"
Name: "{group}\{cm:UninstallProgram,My Program}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\My Program"; Filename: "{app}\MyProg.exe"; Tasks: desktopicon

[code ]
procedure CurStepChanged(CurStep: TSetupStep);
var
List: TStringList;
ini: string;
begin
if CurStep = ssPostInstall then
begin
if IsTaskSelected('rus') then
begin
ini:= ExpandConstant('{userdocs}\setup.ini');
List:= TStringList.Create;
List.Add('Locale = ru');
List.SaveToFile(ini);
List.Free;
end;
if IsTaskSelected('eng') then
begin
ini:= ExpandConstant('{userdocs}\setup.ini');
List:= TStringList.Create;
List.Add('Locale = en');
List.SaveToFile(ini);
List.Free;
end;
end;
end;
 

NicTon

Новичок
NicTon,
[Setup]
AppName=My Program
AppVersion=1.5
;AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"

[Tasks]
Name: "eng"; Description: "Английский"; GroupDescription: "Интерфейс:"; Flags: exclusive
Name: "rus"; Description: "Русский"; GroupDescription: "Интерфейс:"; Flags: exclusive
Name: "desktopicon"; Description: "Создать ярлык для запуска игры на Рабочем столе"; GroupDescription: "{cm:AdditionalIcons}"
Name: "DirectX"; Description: "Обновить DirectX"; GroupDescription: "Системные задачи:"

[Files]

[Icons]
Name: "{group}\My Program"; Filename: "{app}\MyProg.exe"
Name: "{group}\{cm:UninstallProgram,My Program}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\My Program"; Filename: "{app}\MyProg.exe"; Tasks: desktopicon

[code ]
procedure CurStepChanged(CurStep: TSetupStep);
var
List: TStringList;
ini: string;
begin
if CurStep = ssPostInstall then
begin
if IsTaskSelected('rus') then
begin
ini:= ExpandConstant('{userdocs}\setup.ini');
List:= TStringList.Create;
List.Add('Locale = ru');
List.SaveToFile(ini);
List.Free;
end;
if IsTaskSelected('eng') then
begin
ini:= ExpandConstant('{userdocs}\setup.ini');
List:= TStringList.Create;
List.Add('Locale = en');
List.SaveToFile(ini);
List.Free;
end;
end;
end;
vint56, спасибо, принцип, примерно тот, НО только он перезаписывает, сносит всё в INI-файле (все ключи, все секции, все значения, которые там были) и вписывает только Locale = ru или en! (((

Я специально подобавлял там различные секции ключи и значения и попробовал при установке выбрать русский, потом английский, НЕ прокатило.

В итоге Моих документах создан setup.ini, в котором ТОЛЬКО ключ Locale со значением выбранного языка и всё... А всё остальное (если файл setup.ini, ранее существовал) - удалено!

!!!А если файла setup.ini и/или папки в которой он должен лежать НЕ существует, то вообще файл НЕ создаётся и установку отменить НЕЛЬЗЯ теперь, всё вешается, кнопка Отмены НЕ активна и даже процесс через Диспетчер задач снимается не сразу! (((


А мне надо (я же писал выше) - если файла и папки в Моих документах НЕТ, то создать их (и папку и файл), а в файле ключ: Locale и значением: ru/en (в зависимости от выбора языка при установке).

А ЕСЛИ файл и папка УЖЕ ЕСТЬ - то заменить ТОЛЬКО значение, в файле setup.ini (в зависимости от выбора языка при установке), в ключе Locale!
Если файл setup.ini есть, НО ключа Locale в нём нет, то добавить его со значением ru или eng. КЛЮЧ Locale ДОЛЖЕН БЫТЬ на самом верху без секций 1-2 строчка.
И в случае ошибки, чтобы можно было отменить установку, чтобы кнопка Отмена - была рабочей.


Спасибо. Это вообще возможно?
 
Последнее редактирование:

SBalykov

Старожил
Виталий, а если так :
Код:
[Setup]
AppName=My Program
AppVersion=1.5
;AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"

[Tasks]
Name: "eng"; Description: "Английский"; GroupDescription: "Интерфейс:"; Flags: exclusive
Name: "rus"; Description: "Русский"; GroupDescription: "Интерфейс:"; Flags: exclusive
Name: "desktopicon"; Description: "Создать ярлык для запуска игры на Рабочем столе"; GroupDescription: "{cm:AdditionalIcons}"
Name: "DirectX"; Description: "Обновить DirectX"; GroupDescription: "Системные задачи:"

[Files]

[Icons]
Name: "{group}\My Program"; Filename: "{app}\MyProg.exe"
Name: "{group}\{cm:UninstallProgram,My Program}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\My Program"; Filename: "{app}\MyProg.exe"; Tasks: desktopicon

[code ]
procedure CurStepChanged(CurStep: TSetupStep);
var
List: TStringList;
begin
if CurStep = ssPostInstall then begin
List:= TStringList.Create;
try
with List do begin
LoadFromFile(ExpandConstant('{userdocs}\Название программы\setup.ini'));
Delete(1);
if IsTaskSelected('rus') then Insert(1, 'Locale=ru') else
if IsTaskSelected('eng') then Insert(1, 'Locale=en');
SaveToFile(ExpandConstant('{userdocs}\Название программы\setup.ini'));
end;
finally
List.free;
end;
end;
 

vint56

Ветеран
Проверенный
NicTon, а ты покажи что должно быть в setup.ini

SBalykov там будет ошибка если файла нету
 

SBalykov

Старожил
SBalykov там будет ошибка если файла нету
Ну, это в принципе легко поправить:
Код:
[Setup]
AppName=My Program
AppVersion=1.5
;AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"

[Tasks]
Name: "eng"; Description: "Английский"; GroupDescription: "Интерфейс:"; Flags: exclusive
Name: "rus"; Description: "Русский"; GroupDescription: "Интерфейс:"; Flags: exclusive
Name: "desktopicon"; Description: "Создать ярлык для запуска игры на Рабочем столе"; GroupDescription: "{cm:AdditionalIcons}"
Name: "DirectX"; Description: "Обновить DirectX"; GroupDescription: "Системные задачи:"

[Files]

[Icons]
Name: "{group}\My Program"; Filename: "{app}\MyProg.exe"
Name: "{group}\{cm:UninstallProgram,My Program}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\My Program"; Filename: "{app}\MyProg.exe"; Tasks: desktopicon

[code ]
procedure CurStepChanged(CurStep: TSetupStep);
var
List: TStringList;
begin
if CurStep = ssPostInstall then begin
if FileExists(ExpandConstant('{userdocs}\Название программы\setup.ini')) then begin
List:= TStringList.Create;
try
with List do begin
LoadFromFile(ExpandConstant('{userdocs}\Название программы\setup.ini'))
Delete(1);
if IsTaskSelected('rus') then Insert(1, 'Locale=ru') else
if IsTaskSelected('eng') then Insert(1, 'Locale=en');
end;
SaveToFile(ExpandConstant('{userdocs}\Название программы\setup.ini'));
finally
List.free;
end;
end else begin
if IsTaskSelected('rus') then SetIniString('', 'Locale=ru', '{userdocs}\Название программы\setup.ini') else
if IsTaskSelected('eng') then SetIniString('', 'Locale=en', '{userdocs}\Название программы\setup.ini');
end;
end;
end;
 
Последнее редактирование:

vint56

Ветеран
Проверенный
SBalykov, будет выглядеть так это SetIniString
[]
Locale=ru
 

NicTon

Новичок
Ну, это в принципе легко поправить:
Код:
[Setup]
AppName=My Program
AppVersion=1.5
;AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"

[Tasks]
Name: "eng"; Description: "Английский"; GroupDescription: "Интерфейс:"; Flags: exclusive
Name: "rus"; Description: "Русский"; GroupDescription: "Интерфейс:"; Flags: exclusive
Name: "desktopicon"; Description: "Создать ярлык для запуска игры на Рабочем столе"; GroupDescription: "{cm:AdditionalIcons}"
Name: "DirectX"; Description: "Обновить DirectX"; GroupDescription: "Системные задачи:"

[Files]

[Icons]
Name: "{group}\My Program"; Filename: "{app}\MyProg.exe"
Name: "{group}\{cm:UninstallProgram,My Program}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\My Program"; Filename: "{app}\MyProg.exe"; Tasks: desktopicon

[code ]
procedure CurStepChanged(CurStep: TSetupStep);
var
List: TStringList;
begin
if CurStep = ssPostInstall then begin
if FileExists(ExpandConstant('{userdocs}\Название программы\setup.ini')) then begin
List:= TStringList.Create;
try
with List do begin
LoadFromFile(ExpandConstant('{userdocs}\Название программы\setup.ini'))
Delete(1);
if IsTaskSelected('rus') then Insert(1, 'Locale=ru') else
if IsTaskSelected('eng') then Insert(1, 'Locale=en');
end;
SaveToFile(ExpandConstant('{userdocs}\Название программы\setup.ini'));
finally
List.free;
end;
end else begin
if IsTaskSelected('rus') then SetIniString('', 'Locale=ru', '{userdocs}\Название программы\setup.ini') else
if IsTaskSelected('eng') then SetIniString('', 'Locale=en', '{userdocs}\Название программы\setup.ini');
end;
end;
end;
SBalykov, НЕ компилируется - ругается на SaveToFile(ExpandConstant - неизвестный идентификатор!
 

NicTon

Новичок
NicTon, а ты покажи что должно быть в setup.ini
Если пустой, то БЕЗ разницы где будет Locale = ...
Когда зайдёшь в программу и изменишь там какие-то настройки, то Locale - само перенесётся на вторую строчку, где бы этот ключ НЕ стоял изначально.

Вот так вот выглядит setup.ini, если уже зайти в программу и что-то там изменить:

Код:
; ЭТИ 2 ключа - ВНЕ секций:
Profile = Название профиля (генерируется каждый раз по-новой, случайный набор символов)
Locale = ru / en
; ВНЕ секций

[option]
...

[sound]
...

[display]
...

[keyboard]
...

[settings]
...

[different]
...

[Thumb]
...
Всё кроме языка (Locale) и названия профиля (Profile) - можно изменить в настройках в графическом интерфейсе, а вот язык, только ручками править (((

Если просто создать 2 setup.ini, с Locale = ru и с Locale = en, и чтобы они копировались в зависимости от выбора языка при установки - это прокатит, только если файл setup.ini НЕ существовал.
А если он существует, то его затрёшь и потеряешь ссылку на профиль и пользователь потеряет ВСЕ свои данные и все настройки, уже НЕ будут привязаны к его профилю, создастся новый!

Поэтому мне и надо только изменить значение ключа Locale, если файл setup.ini существует уже. А если нет, то создать setup.ini, только с одним ключом Locale = ...
 
Последнее редактирование:

vint56

Ветеран
Проверенный
NicTon, проще сделай заготовки setup.ini с ru / en
[Setup]
AppName=My Program
AppVersion=1.5
;AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl

[Tasks]
Name: eng; Description: Английский; GroupDescription: Интерфейс:; Flags: exclusive
Name: rus; Description: Русский; GroupDescription: Интерфейс:; Flags: exclusive
Name: desktopicon; Description: Создать ярлык для запуска игры на Рабочем столе; GroupDescription: {cm:AdditionalIcons}
Name: DirectX; Description: Обновить DirectX; GroupDescription: Системные задачи:

[Files]
Source: C:\Users\Администратор\Desktop\rus.ini; DestDir: {userdocs}; DestName: setup.ini; Tasks: rus
Source: C:\Users\Администратор\Desktop\eng.ini; DestDir: {userdocs}; DestName: setup.ini; Tasks: eng


[Setup]
AppName=My Program
AppVersion=1.5
;AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"

[Tasks]
Name: "eng"; Description: "Английский"; GroupDescription: "Интерфейс:"; Flags: exclusive
Name: "rus"; Description: "Русский"; GroupDescription: "Интерфейс:"; Flags: exclusive
Name: "desktopicon"; Description: "Создать ярлык для запуска игры на Рабочем столе"; GroupDescription: "{cm:AdditionalIcons}"
Name: "DirectX"; Description: "Обновить DirectX"; GroupDescription: "Системные задачи:"

[Files]

[Icons]
Name: "{group}\My Program"; Filename: "{app}\MyProg.exe"
Name: "{group}\{cm:UninstallProgram,My Program}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\My Program"; Filename: "{app}\MyProg.exe"; Tasks: desktopicon

Код:
procedure CurStepChanged(CurStep: TSetupStep);
var
List: TStringList;
begin
if CurStep = ssPostInstall then begin
if FileExists(ExpandConstant('{userdocs}\setup.ini')) then begin
List:= TStringList.Create;
try
with List do begin
LoadFromFile(ExpandConstant('{userdocs}\setup.ini'))
Delete(1);
if IsTaskSelected('rus') then Insert(1, 'Locale=ru') else
if IsTaskSelected('eng') then Insert(1, 'Locale=en');
SaveToFile(ExpandConstant('{userdocs}\setup.ini'));
end;
finally
List.free;
end;
end else begin
if IsTaskSelected('rus') then SetIniString('', 'Locale', 'ru', ExpandConstant('{userdocs}\setup.ini')) else
if IsTaskSelected('eng') then SetIniString('', 'Locale', 'en', ExpandConstant('{userdocs}\setup.ini'));
end;
end;
end;
[/SPOILER]
 

NicTon

Новичок
NicTon, проще сделай заготовки setup.ini с ru / en
[Setup]
AppName=My Program
AppVersion=1.5
;AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl

[Tasks]
Name: eng; Description: Английский; GroupDescription: Интерфейс:; Flags: exclusive
Name: rus; Description: Русский; GroupDescription: Интерфейс:; Flags: exclusive
Name: desktopicon; Description: Создать ярлык для запуска игры на Рабочем столе; GroupDescription: {cm:AdditionalIcons}
Name: DirectX; Description: Обновить DirectX; GroupDescription: Системные задачи:

[Files]
Source: C:\Users\Администратор\Desktop\rus.ini; DestDir: {userdocs}; DestName: setup.ini; Tasks: rus
Source: C:\Users\Администратор\Desktop\eng.ini; DestDir: {userdocs}; DestName: setup.ini; Tasks: eng


[Setup]
AppName=My Program
AppVersion=1.5
;AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"

[Tasks]
Name: "eng"; Description: "Английский"; GroupDescription: "Интерфейс:"; Flags: exclusive
Name: "rus"; Description: "Русский"; GroupDescription: "Интерфейс:"; Flags: exclusive
Name: "desktopicon"; Description: "Создать ярлык для запуска игры на Рабочем столе"; GroupDescription: "{cm:AdditionalIcons}"
Name: "DirectX"; Description: "Обновить DirectX"; GroupDescription: "Системные задачи:"

[Files]

[Icons]
Name: "{group}\My Program"; Filename: "{app}\MyProg.exe"
Name: "{group}\{cm:UninstallProgram,My Program}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\My Program"; Filename: "{app}\MyProg.exe"; Tasks: desktopicon

Код:
procedure CurStepChanged(CurStep: TSetupStep);
var
List: TStringList;
begin
if CurStep = ssPostInstall then begin
if FileExists(ExpandConstant('{userdocs}\setup.ini')) then begin
List:= TStringList.Create;
try
with List do begin
LoadFromFile(ExpandConstant('{userdocs}\setup.ini'))
Delete(1);
if IsTaskSelected('rus') then Insert(1, 'Locale=ru') else
if IsTaskSelected('eng') then Insert(1, 'Locale=en');
SaveToFile(ExpandConstant('{userdocs}\setup.ini'));
end;
finally
List.free;
end;
end else begin
if IsTaskSelected('rus') then SetIniString('', 'Locale', 'ru', ExpandConstant('{userdocs}\setup.ini')) else
if IsTaskSelected('eng') then SetIniString('', 'Locale', 'en', ExpandConstant('{userdocs}\setup.ini'));
end;
end;
end;
[/SPOILER]
ДО этого я додумался сразу же! ))) НО:

Если просто создать 2 setup.ini, с Locale = ru и с Locale = en, и чтобы они копировались в зависимости от выбора языка при установке - это прокатит, только если файл setup.ini НЕ существовал.

А если он существует, то его затрёшь и потеряешь ссылку на профиль и пользователь потеряет ВСЕ свои данные и все настройки, уже НЕ будут привязаны к его профилю, создастся новый!

!!! Если только попробовать с флагом "onlyifdoesntexist", чтобы установщик копировал файл setup.ini (заготовку), в том случае, если его нет!
А вот если он есть, что делать, нужен какой-то код?!
 

vint56

Ветеран
Проверенный
NicTon, сделай файл со всеми своими настройками
и что за программа
 

NicTon

Новичок
NicTon, сделай файл со всеми своими настройками
и что за программа
Код:
Profile = 0x20043E04340430043D04
Locale = ru

[option]
  autoload:  1
  subtitles:  1
  tutorial:  1
  complexity:  normal

[sound]
  Effects:  1
  Music:  1
  Speech:  1

[display]
  Resolution:  1600 1200
  ColorBits:  32
  Brightness:  0.5
  Antialiasing:  0
  Details:  2
  TextureDetails:  2
  Exposure:  1

[keyboard]
  MouseResponce:  1
  FlipMouse:  0

[gamepad]
  ThumbResponce:  1
  FlipThumb:  0

Но они могут быть и другими ))) А Profile вообще генерируется случайно и его значение ведёт к ещё одной подпапке уже в которой находятся и профили, и настройки и сохранения. Главная строчка тут как раз Profile, если её нет, то всё (((
А задать невозможно вручную (или оставить вот эту которая есть сейчас), потому что она генерируется сама... И тут НЕ путь к подпапке, а просто набор символов... Все остальные ключи и значения пользователь и сам может выставить, но вот профиль он потеряет!
 
Последнее редактирование:

SBalykov

Старожил
Виталий,
ему надо :
"... INI файл должен быть в "Моих Документах":
C:\Users\Имя пользователя\Documents\Название программы\setup.ini и этот файл уже может существовать!
ЕСЛИ ЭТОТ ФАЙЛ СУЩЕСТВУЕТ, то только добавить/изменить (ВНЕ СЕКЦИИ) Locale = en/ru (в зависимости от выбора при установке), НЕ трогая остальные значения и секции в этом файле. А если его НЕ существует, то просто создать файл setup.ini - с одним значение Locale = ru или Locale - en."
Для этого не надо городить такой огород.
Немного поправил скрипт:
Код:
[Setup]
AppName=My Program
AppVersion=1.5
;AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"

[Tasks]
Name: "eng"; Description: "Английский"; GroupDescription: "Интерфейс:"; Flags: exclusive
Name: "rus"; Description: "Русский"; GroupDescription: "Интерфейс:"; Flags: exclusive
Name: "desktopicon"; Description: "Создать ярлык для запуска игры на Рабочем столе"; GroupDescription: "{cm:AdditionalIcons}"
Name: "DirectX"; Description: "Обновить DirectX"; GroupDescription: "Системные задачи:"

[Files]
// создать пустой файл "setup.ini"
Source: files\ini\setup.ini; DestDir: {tmp}; Flags: Dontcopy

[Icons]
Name: "{group}\My Program"; Filename: "{app}\MyProg.exe"
Name: "{group}\{cm:UninstallProgram,My Program}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\My Program"; Filename: "{app}\MyProg.exe"; Tasks: desktopicon

[code]
procedure CurStepChanged(CurStep: TSetupStep);
var List: TStringList;
begin
if CurStep = ssPostInstall then begin
// если есть ini файл, то прописываем значение Local...
if FileExists(ExpandConstant('{userdocs}\My Program\setup.ini')) then begin
List:= TStringList.Create;
try
with List do begin
LoadFromFile(ExpandConstant('{userdocs}\My Program\setup.ini'))
Delete(1);
if IsTaskSelected('rus') then Insert(1, 'Locale=ru') else
if IsTaskSelected('eng') then Insert(1, 'Locale=en');
SaveToFile(ExpandConstant('{userdocs}\My Program\setup.ini'));
end;
finally
List.free;
end;
end else begin
// если файла ini нет, то извлекаем ...
if not FileExists(ExpandConstant('{tmp}\setup.ini')) then ExtractTemporaryFile('setup.ini');
// ... создаем папку в моих документах для установки ini файла, если она не существует ...
if not DirExists(ExpandConstant('{userdocs}\My Program')) then CreateDir(ExpandConstant('{userdocs}\My Program'));
// ... копируем ini файл ...
FileCopy(ExpandConstant('{tmp}\setup.ini'), ExpandConstant('{userdocs}\My Program\setup.ini'), False);
// ... прописываем необходимые значения ...
if IsTaskSelected('rus') then SaveStringToFile(ExpandConstant('{userdocs}\My Program\setup.ini'), 'Profile=0x20043E04340430043D04'+#13#10+'Locale=ru', False) else
if IsTaskSelected('eng') then SaveStringToFile(ExpandConstant('{userdocs}\My Program\setup.ini'), 'Profile=0x20043E04340430043D04'+#13#10+'Locale=en', False);
end;
end;
end;
 
Последнее редактирование:

NicTon

Новичок
Виталий,
ему надо :
"... INI файл должен быть в "Моих Документах":
C:\Users\Имя пользователя\Documents\Название программы\setup.ini и этот файл уже может существовать!
ЕСЛИ ЭТОТ ФАЙЛ СУЩЕСТВУЕТ, то только добавить/изменить (ВНЕ СЕКЦИИ) Locale = en/ru (в зависимости от выбора при установке), НЕ трогая остальные значения и секции в этом файле. А если его НЕ существует, то просто создать файл setup.ini - с одним значение Locale = ru или Locale - en."
Для этого не надо городить такой огород.
Немного поправил скрипт:
Код:
[Setup]
AppName=My Program
AppVersion=1.5
;AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"

[Tasks]
Name: "eng"; Description: "Английский"; GroupDescription: "Интерфейс:"; Flags: exclusive
Name: "rus"; Description: "Русский"; GroupDescription: "Интерфейс:"; Flags: exclusive
Name: "desktopicon"; Description: "Создать ярлык для запуска игры на Рабочем столе"; GroupDescription: "{cm:AdditionalIcons}"
Name: "DirectX"; Description: "Обновить DirectX"; GroupDescription: "Системные задачи:"

[Files]
// создать пустой файл "setup.ini"
Source: files\ini\setup.ini; DestDir: {tmp}; Flags: Dontcopy

[Icons]
Name: "{group}\My Program"; Filename: "{app}\MyProg.exe"
Name: "{group}\{cm:UninstallProgram,My Program}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\My Program"; Filename: "{app}\MyProg.exe"; Tasks: desktopicon

[code]
procedure CurStepChanged(CurStep: TSetupStep);
var List: TStringList;
begin
if CurStep = ssPostInstall then begin
// если есть ini файл, то прописываем значение Local...
if FileExists(ExpandConstant('{userdocs}\My Program\setup.ini')) then begin
List:= TStringList.Create;
try
with List do begin
LoadFromFile(ExpandConstant('{userdocs}\My Program\setup.ini'))
Delete(1);
if IsTaskSelected('rus') then Insert(1, 'Locale=ru') else
if IsTaskSelected('eng') then Insert(1, 'Locale=en');
SaveToFile(ExpandConstant('{userdocs}\My Program\setup.ini'));
end;
finally
List.free;
end;
end else begin
// если файла ini нет, то извлекаем ...
if not FileExists(ExpandConstant('{tmp}\setup.ini')) then ExtractTemporaryFile('setup.ini');
// ... создаем папку в моих документах для установки ini файла, если она не существует ...
if not DirExists(ExpandConstant('{userdocs}\My Program')) then CreateDir(ExpandConstant('{userdocs}\My Program'));
// ... копируем ini файл ...
FileCopy(ExpandConstant('{tmp}\setup.ini'), ExpandConstant('{userdocs}\My Program\setup.ini'), False);
// ... прописываем необходимые значения ...
if IsTaskSelected('rus') then SaveStringToFile(ExpandConstant('{userdocs}\My Program\setup.ini'), 'Profile=0x20043E04340430043D04'+#13#10+'Locale=ru', False) else
if IsTaskSelected('eng') then SaveStringToFile(ExpandConstant('{userdocs}\My Program\setup.ini'), 'Profile=0x20043E04340430043D04'+#13#10+'Locale=en', False);
end;
end;
end;
Здравствуйте! Спасибо сработало!

Есть несколько уточнений только:

1. Есть ли смысл в этом:
Source: setup.ini; DestDir: {tmp}; Flags: Dontcopy

Может быть просто вот так вот:
Source: setup.ini; Flags: Dontcopy

В секции Code, всё равно ведь прописано куда именно извлекать:
Код:
if FileExists(ExpandConstant('{userdocs}\My Program\setup.ini'))
Или обязательно нужно извлечь "пустышку" во временную папку Windows, а потом из неё переместить файл куда нужно?

2. Если мне НЕ нужен Profile прописывать, вот здесь:
Код:
if IsTaskSelected('rus') then SaveStringToFile(ExpandConstant('{userdocs}\My Program\setup.ini'), 'Profile=0x20043E04340430043D04'+#13#10+'Locale=ru', False) else
Можно ли его убрать вот так вот:
Код:
if IsTaskSelected('rus') then SaveStringToFile(ExpandConstant('{userdocs}\My Program\setup.ini'), 'Locale=ru', False) else
3. Возникает ПРОБЛЕМА при повторной установке, (если кто-то вдруг по какой-то причине решит "затереть", "установить поверх"), БЕЗ корректного удаления приложения с помощью деинсталлятора, перед тем как снова установить это же приложение (при "чистой" установке, - удалил приложение, установил снова - всё нормально). А вот если НЕ удалять приложение УСТАНОВЩИК "РУГАЕТСЯ", установка зависает в самом конце её прервать нельзя, - "Отмена" НЕ активна, скришоты под спойлером:




 
Последнее редактирование:

SBalykov

Старожил
Здравствуйте! Спасибо сработало!

Есть несколько уточнений только:

1. Есть ли смысл в этом:
Source: setup.ini; DestDir: {tmp}; Flags: Dontcopy

Может быть просто вот так вот:
Source: setup.ini; Flags: Dontcopy
Можно.
2. Если мне НЕ нужен Profile прописывать, вот здесь:
Код:
if IsTaskSelected('rus') then SaveStringToFile(ExpandConstant('{userdocs}\My Program\setup.ini'), 'Profile=0x20043E04340430043D04'+#13#10+'Locale=ru', False) else
Можно ли его убрать вот так вот:
Код:
if IsTaskSelected('rus') then SaveStringToFile(ExpandConstant('{userdocs}\My Program\setup.ini'), 'Locale=ru', False) else
Можно, но тогда ...
3. Возникает ПРОБЛЕМА при повторной установке, (если кто-то вдруг по какой-то причине решит "затереть", "установить поверх"), БЕЗ корректного удаления приложения с помощью деинсталлятора, перед тем как снова установить это же приложение (при "чистой" установке, - удалил приложение, установил снова - всё нормально). А вот если НЕ удалять приложение УСТАНОВЩИК "РУГАЕТСЯ", установка зависает в самом конце её прервать нельзя, - "Отмена" НЕ активна, скришоты под спойлером:




Необходимо отредактировать :
1. Delete(0);
2. Insert(0,...
 
Сверху