Пара вопросов по компонентам и ини файлам

0040

Новичок
Здравствуйте. Подскажите пожалуйста
Хочу реализовать смену языка игры посредством изменения значения в имеющимся ини-файле.

почитал справку, темы на форуме и сделал следующее, но это не совсем то что надо. В этом примере трется все содержимое ИНИ файла, и создается секция, параметр и значение.
Код:
  begin
    if IsComponentSelected('text\ru') then
      SetIniString('Settings', 'language', 'russian', ExpandConstant('{app}\steam_emu.ini'))
else
      SetIniString('Settings', 'language', 'english', ExpandConstant('{app}\steam_emu.ini'));
  end;
Подскажите как найти и изменить значение, без перезаписи всего содержимого ини файла?



И еще один вопросик
Имеется компонент лист
Код:
[Components]
; Язык текста
Name: "text"; Description: "{code:FetchPhrase|Comp0}"; Types: full; Flags: fixed
Name: "text\ru"; Description: "{code:FetchPhrase|Comp1}"; Flags: exclusive
Name: "text\en"; Description: "{code:FetchPhrase|Comp2}"; Flags: exclusive
; Язык озвучки
Name: "voice"; Description: "{code:FetchPhrase|Comp3}"; Types: full; Flags: fixed
Name: "voice\ru"; Description: "{code:FetchPhrase|Comp4}"; Flags: exclusive
Name: "voice\en"; Description: "{code:FetchPhrase|Comp5}"; Flags: exclusive
в инсталляторе свободный выбор сочетания (енг текст + ру звук а это как бы глупо))). Как сделать так, чтоб при выборе английского текста озвучка становилась английской, а русская становилась неактивной (чтоб нельзя было ее выбрать) .

Заранее благодарен
 

agent555

Участник
[Ini]
FileName: "{app}\steam_api.ini"; Section: "Settings"; Key: "Language"; String: "french"; Components: text\rus ;
FileName: "{app}\steam_api.ini"; Section: "Settings"; Key: "Language"; String: "english"; Components: text\eng ;
вот так чтобы не перезаписывать файл а редактировать то что нужно (разберешься)
[Components]
Name: text; Description: {cm:languageSetting}; Types: full; Flags: Fixed
Name: text\rus; Description: {cm:compRU}; Flags: exclusive;
Name: text\eng; Description: {cm:compEN}; Flags: exclusive;
 

sergey3695

Ветеран
Модератор
енг текст + ру звук а это как бы глупо
а я для borderlands 2 так сделал, получилось прикольно :D
Подскажите как найти и изменить значение, без перезаписи всего содержимого ини файла?
я не пользуюсь секцией ini.
Код:
procedure RePlaceTextinFile(FilePath:string; find:string; replace1, replace2:string);
var
  S: TStringList;
  i : Integer;
begin
if FileExists(FilePath) then begin
  S:=tstringlist.create;
  S.LoadFromFile(FilePath);
for i := 0 to S.Count-1 do
begin
if S.Names[i]=find then
begin
  S.Delete(i);
  S.Insert(i,replace1+'='+replace2);
end;
end;
  S.SaveToFile(FilePath);
end;
end;
пример
if not Russian then
RePlaceTextinFile(ExpandConstant('{app}\Binaries\Win32\steam_api.ini'),'Language','Language','english');
Как сделать так, чтоб при выборе английского текста озвучка становилась английской, а русская становилась неактивной (чтоб нельзя было ее выбрать) .
Код:
[Setup]
AppName=Example
AppVerName=Example
DefaultDirName={pf}\Example
DefaultGroupName=Example
OutputDir=.

[Types]
Name: full; Description: Full installation; Flags: iscustom

[Components]
Name: text; Description: Язык субтитров; Types: full; Flags: fixed
Name: text\rus; Description: Русский; Flags: exclusive;
Name: text\eng; Description: Английский; Flags: exclusive;
Name: voice; Description: Язык озвучки; Types: full; Flags: fixed
Name: voice\rus; Description: Русский; Flags: exclusive;
Name: voice\eng; Description: Английский; Flags: exclusive;

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

[Code]
var
  OldEvent_ComponentsListClickCheck: TNotifyEvent;

procedure ComponentsListClickCheck(Sender: TObject);
begin
  OldEvent_ComponentsListClickCheck(Sender);
if TNewCheckListBox(Sender).Checked[2] then // Язык субтитров / Английский
  TNewCheckListBox(Sender).Checked[5]:= True; // Язык озвучки / Английский
end;

procedure InitializeWizard;
begin
with WizardForm.ComponentsList do begin
  OldEvent_ComponentsListClickCheck:=OnClickCheck;
  OnClickCheck:=@ComponentsListClickCheck;
end;
end;
 

Nemko

Дилетант
Модератор
0040, на счет INI можно еще так:

Код:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={sd}\My Application

[Files]
Source: "MyIni.ini"; DestDir: "{app}";

[Components]
Name: "text"; Description: "Язык Озвучки"; Types: full;
Name: "text\ru"; Description: "Русский"; Flags: exclusive
Name: "text\en"; Description: "Английский"; Flags: exclusive

[Code]
procedure ChangeINIString(INIFile, Section, Key, Value: PAnsiChar);
begin
if not IsIniSectionEmpty(Section, ExpandConstant('{app}\'+INIFile)) then begin
  if IniKeyExists(Section, Key, ExpandConstant('{app}\'+INIFile)) then DeleteIniEntry(Section, Key, ExpandConstant('{app}\'+INIFile));
  SetIniString(Section, Key, Value, ExpandConstant('{app}\'+INIFile));
 end else SetIniString(Section, Key, Value, ExpandConstant('{app}\'+INIFile));
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssDone then
    if IsComponentSelected('text\ru') then ChangeINIString('MyIni.ini', 'Settings', 'Language', 'Russian')
    else ChangeINIString('MyIni.ini', 'Settings', 'Language', 'English');
end;

А на счет второго вопроса, ИМХО зачем создавать столько компонентов не дав пользователю выбора, проще слить в два (Русский Звук + Русский Текст) и (Английский звук + Английский Текст). ИМХО конечно же...
 

Nemko

Дилетант
Модератор
0040, изменения происходят в каталоге {app} после установки, у меня все работает вроде.
 

0040

Новичок
а у меня почему то нет, ну да ладно.
вариант с ини файлом от sergey3695 мне прекрасно подходит
 

0040

Новичок
пример
if not Russian then
RePlaceTextinFile(ExpandConstant('{app}\Binaries\Win32\steam_api.ini'),'Language','Language','english');
спасибо большое.
если не указать
[files]
Source: "steam_api.ini"; DestDir: "{app}";
и не положить ини рядом с сетапом, то после установки ини файла в арр нет

как можно сделать чтоб ини брался из распакованного архива, а не из сетапа?
 
Сверху