Запоминание компонентов

AtotIK

Новичок
Всем привет!

Есть скрипт, установка производится шагами, присутствует 5 TNewCheckListBox + стандартный ComponentsList и TasksList.
Как можно реализовать запоминание установленных компонентов из всех областей при удалении и следующей установке (обновление инсталлятора)?

Может как-то по-хитрому всё записать в ini-файл или в реестре хранить эти данные?

Надеюсь на помощь.
 

sergey3695

Ветеран
Модератор
Может как-то по-хитрому всё записать в ini-файл или в реестре хранить эти данные?
И накакать в системе пользователя хламом.
При следующей установки, если предыдущая установка не была удалена, то настройки подхватываются автоматически, главное чтоб AppId совпадали у установщиков.
 

AtotIK

Новичок
В том то и дело, что удаляется каждый раз предыдущая установка. А выбор в TNewCheckListBox не запоминается даже после установки и запуска установщика ещё раз.
 

sergey3695

Ветеран
Модератор
AtotIK, а AppId в [Setup] задан один и тот же? А то в справке так пишут и на практике у меня все работало (да и -ет).
 

AtotIK

Новичок
У меня всё мудрено, таким макаром не работает.

А есть примеры использования GetPreviousData и SetPreviousData на TNewCheckListBox, ComponentsList и TasksList? Особенно интересует возможность присваивания нужных значений TNewCheckListBox.
 

AtotIK

Новичок
Подкиньте примеров использования GetPreviousData и SetPreviousData, пожалуйста.
 

sergey3695

Ветеран
Модератор
AtotIK,
В Program Files\Inno Setup 5\Examples CodeClasses.iss и CodeDlg.iss.
Код:
[Files]
Source: C:\NoMusic\*; DestDir: {app}; Check: NoMusic; Flags: ignoreversion overwritereadonly external
[Code]
procedure CreateTheWizardPages;
var  Page: TWizardPage;
begin
Page:=CreateCustomPage(wpWelcome, 'Выберите вариант установки ', ' Компакт-диск не требуется';
  NoMusicBtn:=TRadioButton.Create(Page);
  ..................
  NoMusicBtn.Checked:=GetPreviousData('NoMusic', '1') = '1';
  ...................
end;
procedure RegisterPreviousData(PreviousDataKey: Integer);
begin
SetPreviousData(PreviousDataKey, 'NoMusic', IntToStr(Ord(NoMusicBtn.Checked)));
........................
end;
function NoMusic: Boolean;
begin
Result:=NoMusicBtn.Checked;
end;
......
 

Хамик

Старожил
А можно пример?
Самый простой через реестр
Код:
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

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

[Registry]
Root: HKCU; Subkey: "SOFTWARE\MyApp"; Flags: uninsdeletekey
Root: HKCU; Subkey: "SOFTWARE\MyApp\IsComponentsChecked"; ValueType: dword; ValueName: "Component1"; ValueData: "$00000001"; Check: IsComponentChecked(2);
Root: HKCU; Subkey: "SOFTWARE\MyApp\IsComponentsChecked"; ValueType: dword; ValueName: "Component2"; ValueData: "$00000001"; Check: IsComponentChecked(3);
Root: HKCU; Subkey: "SOFTWARE\MyApp\IsComponentsChecked"; ValueType: dword; ValueName: "Component3"; ValueData: "$00000001"; Check: IsComponentChecked(4);
Root: HKCU; Subkey: "SOFTWARE\MyApp\IsComponentsChecked"; ValueType: dword; ValueName: "Component4"; ValueData: "$00000001"; Check: IsComponentChecked(6);
Root: HKCU; Subkey: "SOFTWARE\MyApp\IsComponentsChecked"; ValueType: dword; ValueName: "Component1"; ValueData: "$00000000"; Check: not IsComponentChecked(2);
Root: HKCU; Subkey: "SOFTWARE\MyApp\IsComponentsChecked"; ValueType: dword; ValueName: "Component2"; ValueData: "$00000000"; Check: not IsComponentChecked(3);
Root: HKCU; Subkey: "SOFTWARE\MyApp\IsComponentsChecked"; ValueType: dword; ValueName: "Component3"; ValueData: "$00000000"; Check: not IsComponentChecked(4);
Root: HKCU; Subkey: "SOFTWARE\MyApp\IsComponentsChecked"; ValueType: dword; ValueName: "Component4"; ValueData: "$00000000"; Check: not IsComponentChecked(6);


[CustomMessages]
rus.CompName1=Зима.
rus.CompName2=Снежинки при загрузке.
rus.CompName3=Обводка персонажа снежинкой.
rus.CompName4=Интерфейс игры.

[Code]
var
ComponentsPage: TWizardPage;
ComponentsList: TNewCheckListBox;

function IsComponentChecked( const nIndex: Integer ): Boolean;
begin
    Result := ComponentsList.Checked[nIndex];
end;

procedure CheckPreviousComponentsChecked;
var
i: array[0..4] of cardinal;
begin
if RegKeyExists(HKCU, 'SOFTWARE\MyApp\IsComponentsChecked') then begin
RegQueryDWordValue(HKCU, 'SOFTWARE\MyApp\IsComponentsChecked', 'Component1', i[1]);
RegQueryDWordValue(HKCU, 'SOFTWARE\MyApp\IsComponentsChecked', 'Component2', i[2]);
RegQueryDWordValue(HKCU, 'SOFTWARE\MyApp\IsComponentsChecked', 'Component3', i[3]);
RegQueryDWordValue(HKCU, 'SOFTWARE\MyApp\IsComponentsChecked', 'Component4', i[4]);
if i[1] = 1 then ComponentsList.Checked[2] := True else ComponentsList.Checked[2] := False;
if i[2] = 1 then ComponentsList.Checked[3] := True else ComponentsList.Checked[3] := False;
if i[3] = 1 then ComponentsList.Checked[4] := True else ComponentsList.Checked[4] := False;
if i[4] = 1 then ComponentsList.Checked[6] := True else ComponentsList.Checked[6] := False;
end;
end;

procedure RedesignWizardForm;
begin
  ComponentsPage := CreateCustomPage(wpSelectComponents, SetupMessage(msgWizardSelectComponents), SetupMessage(msgSelectComponentsDesc));

  ComponentsList := TNewCheckListBox.Create(WizardForm);
  with ComponentsList do
  begin
    Parent := ComponentsPage.Surface;
    SetBounds(ScaleX(0), ScaleY(0), ScaleX(416), ScaleY(220));
    AddCheckBox('Дополнительные компоненты.', '', 0, False, True, False, True, nil);
      AddCheckBox('Winter', '', 1, False, True, False, True, nil);
        AddCheckBox(CustomMessage('CompName1'), '', 2, True, True, False, True, nil);
        AddCheckBox(CustomMessage('CompName2'), '', 2, False, True, False, True, nil);
        AddCheckBox(CustomMessage('CompName3'), '', 2, True, True, False, True, nil);
      AddCheckBox('Interface', '', 1, False, True, False, True, nil);
        AddCheckBox(CustomMessage('CompName4'), '', 2, False, True, False, True, nil);
    end;
  CheckPreviousComponentsChecked;
end;

procedure InitializeWizard();
begin
    RedesignWizardForm;
end;
 

Ekspoint

Новичок
Самый простой через реестр
Код:
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

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

[Registry]
Root: HKCU; Subkey: "SOFTWARE\MyApp"; Flags: uninsdeletekey
Root: HKCU; Subkey: "SOFTWARE\MyApp\IsComponentsChecked"; ValueType: dword; ValueName: "Component1"; ValueData: "$00000001"; Check: IsComponentChecked(2);
Root: HKCU; Subkey: "SOFTWARE\MyApp\IsComponentsChecked"; ValueType: dword; ValueName: "Component2"; ValueData: "$00000001"; Check: IsComponentChecked(3);
Root: HKCU; Subkey: "SOFTWARE\MyApp\IsComponentsChecked"; ValueType: dword; ValueName: "Component3"; ValueData: "$00000001"; Check: IsComponentChecked(4);
Root: HKCU; Subkey: "SOFTWARE\MyApp\IsComponentsChecked"; ValueType: dword; ValueName: "Component4"; ValueData: "$00000001"; Check: IsComponentChecked(6);
Root: HKCU; Subkey: "SOFTWARE\MyApp\IsComponentsChecked"; ValueType: dword; ValueName: "Component1"; ValueData: "$00000000"; Check: not IsComponentChecked(2);
Root: HKCU; Subkey: "SOFTWARE\MyApp\IsComponentsChecked"; ValueType: dword; ValueName: "Component2"; ValueData: "$00000000"; Check: not IsComponentChecked(3);
Root: HKCU; Subkey: "SOFTWARE\MyApp\IsComponentsChecked"; ValueType: dword; ValueName: "Component3"; ValueData: "$00000000"; Check: not IsComponentChecked(4);
Root: HKCU; Subkey: "SOFTWARE\MyApp\IsComponentsChecked"; ValueType: dword; ValueName: "Component4"; ValueData: "$00000000"; Check: not IsComponentChecked(6);


[CustomMessages]
rus.CompName1=Зима.
rus.CompName2=Снежинки при загрузке.
rus.CompName3=Обводка персонажа снежинкой.
rus.CompName4=Интерфейс игры.

[Code]
var
ComponentsPage: TWizardPage;
ComponentsList: TNewCheckListBox;

function IsComponentChecked( const nIndex: Integer ): Boolean;
begin
    Result := ComponentsList.Checked[nIndex];
end;

procedure CheckPreviousComponentsChecked;
var
i: array[0..4] of cardinal;
begin
if RegKeyExists(HKCU, 'SOFTWARE\MyApp\IsComponentsChecked') then begin
RegQueryDWordValue(HKCU, 'SOFTWARE\MyApp\IsComponentsChecked', 'Component1', i[1]);
RegQueryDWordValue(HKCU, 'SOFTWARE\MyApp\IsComponentsChecked', 'Component2', i[2]);
RegQueryDWordValue(HKCU, 'SOFTWARE\MyApp\IsComponentsChecked', 'Component3', i[3]);
RegQueryDWordValue(HKCU, 'SOFTWARE\MyApp\IsComponentsChecked', 'Component4', i[4]);
if i[1] = 1 then ComponentsList.Checked[2] := True else ComponentsList.Checked[2] := False;
if i[2] = 1 then ComponentsList.Checked[3] := True else ComponentsList.Checked[3] := False;
if i[3] = 1 then ComponentsList.Checked[4] := True else ComponentsList.Checked[4] := False;
if i[4] = 1 then ComponentsList.Checked[6] := True else ComponentsList.Checked[6] := False;
end;
end;

procedure RedesignWizardForm;
begin
  ComponentsPage := CreateCustomPage(wpSelectComponents, SetupMessage(msgWizardSelectComponents), SetupMessage(msgSelectComponentsDesc));

  ComponentsList := TNewCheckListBox.Create(WizardForm);
  with ComponentsList do
  begin
    Parent := ComponentsPage.Surface;
    SetBounds(ScaleX(0), ScaleY(0), ScaleX(416), ScaleY(220));
    AddCheckBox('Дополнительные компоненты.', '', 0, False, True, False, True, nil);
      AddCheckBox('Winter', '', 1, False, True, False, True, nil);
        AddCheckBox(CustomMessage('CompName1'), '', 2, True, True, False, True, nil);
        AddCheckBox(CustomMessage('CompName2'), '', 2, False, True, False, True, nil);
        AddCheckBox(CustomMessage('CompName3'), '', 2, True, True, False, True, nil);
      AddCheckBox('Interface', '', 1, False, True, False, True, nil);
        AddCheckBox(CustomMessage('CompName4'), '', 2, False, True, False, True, nil);
    end;
  CheckPreviousComponentsChecked;
end;

procedure InitializeWizard();
begin
    RedesignWizardForm;
end;
спасибо
 
Сверху