Ru-Board.club
← Вернуться в раздел «Программы»

» Inno Setup (создание инсталяционных пакетов)

Автор: vint56
Дата сообщения: 04.01.2014 21:33
AlekseyPopovv
[UninstallDelete]
Name: {app}\multiset.ini; Type: filesandordirs

procedure CurStepChanged(CurStep: TSetupStep);
begin
if (CurStep = ssPostInstall) then
if Installer.Checked and RusLang then
SetIniString('gereral', 'language', 'russian', ExpandConstant('{app}\multiset.ini'));
if Installer.Checked and EngLang then
SetIniString('gereral', 'language', 'english', ExpandConstant('{app}\multiset.ini'));
if Installer.Checked and UkrLang then
SetIniString('gereral', 'language', 'ukrainian', ExpandConstant('{app}\multiset.ini'));
end;
Автор: BlackInferno1989
Дата сообщения: 04.01.2014 21:52
Народ, так и не получил ответа на мой вопрос, поэтому еще раз подниму его:

Цитата:
Решил сделать Slideshow под ProgressBar`ом в пределах окна инсталлятора. Нашел кучу скриптов. Но при добавлении их в свой скрипт у меня возникают те или иные ошибки, а все из-за того что эти скрипты были выдраны из различных готовых скриптов + я некудышный программист. Не могли бы Вы, умные люди с ГОРАЗДО прямыми руками, а не то как у меня, написать, как, что, куда прописывать. Скрипт мне подойдет любой (по времени или по процентам). И если можно напишите скрипт только с необходимым содержимым, без всякого мусора и не нужных секций. Буду очень признателен.   Заранее спасибо.

Автор: vint56
Дата сообщения: 04.01.2014 22:10
BlackInferno1989
isSlideShow v1.03 от ExpeditorR http://rghost.ru/51405730
Автор: AlekseyPopovv
Дата сообщения: 04.01.2014 22:45
vint56
Спасибо, допетрил.
Есть ещё вопрос: к примеру после деинсталяции программы остаётся два файла (если программу не закрыть перед удалением висят в процессе) AtomicAlarmClock.exe и timeserv.exe, как завершить эти два процесса при установки и после удаления программы?
Автор: BlackInferno1989
Дата сообщения: 04.01.2014 23:15
vint56
спасибо! то что нужно! и даже больше!
Автор: vint56
Дата сообщения: 04.01.2014 23:20
AlekseyPopovv
IsTask v1.0.1 работает только в ansi
http://rghost.ru/51407124
Автор: AlekseyPopovv
Дата сообщения: 05.01.2014 01:10
vint56
Спасибо. А как быть с реестром? Как записать через code например вот это:
Root: HKCU; Subkey: "Software\Almeza"; Check: InstallerCheck; Flags: uninsdeletekeyifempty
Root: HKCU; Subkey: "Software\Almeza\MultiSet"; Check: InstallerCheck; Flags: uninsdeletekeyifempty
Root: HKCR; Subkey: ".mst"; ValueType: String; ValueData: "MultiSet"; Check: InstallerCheck; Flags: uninsdeletevalue
Root: HKCR; Subkey: "MultiSet"; ValueType: String; ValueData: "MultiSet File"; Check: InstallerCheck; Flags: uninsdeletekey
Root: HKCR; Subkey: "MultiSet\DefaultIcon"; ValueType: String; ValueData: "{app}\doc.ico,0"; Check: InstallerCheck
Root: HKCR; Subkey: "MultiSet\shell\open\command"; ValueType: String; ValueData: "{app}\MULTISET.EXE %1"; Check: InstallerCheck
Root: HKCR; Subkey: ".amltkey"; ValueType: String; ValueData: "MultiSet"; Check: InstallerCheck; Flags: uninsdeletevalue
Root: HKCR; Subkey: "MultiSet"; ValueType: String; ValueData: "MultiSet File"; Check: InstallerCheck; Flags: uninsdeletekey
Root: HKCR; Subkey: "MultiSet\DefaultIcon"; ValueType: String; ValueData: "{app}\doc.ico,0"; Check: InstallerCheck
Root: HKCR; Subkey: "MultiSet\shell\open\command"; ValueType: String; ValueData: "{app}\MULTISET.EXE %1"; Check: InstallerCheck
Заранее спасибо
Автор: vint56
Дата сообщения: 05.01.2014 09:17
AlekseyPopovv за чем это делать есть же секция реестра

procedure CurStepChanged(CurStep: TSetupStep);
begin
if (CurStep=ssDone) then
begin
RegWriteStringValue(HKEY_CLASSES_ROOT, '.amltkey', '', 'MultiSet');
RegWriteStringValue(HKEY_CLASSES_ROOT, 'MultiSet\DefaultIcon', '', ExpandConstant('{app}\doc.ico,0'));
RegWriteStringValue(HKEY_CLASSES_ROOT, 'MultiSet\shell\open\command', '', ExpandConstant('{app}\MULTISET.EXE " "%1"'));
end;
end;
Автор: AlekseyPopovv
Дата сообщения: 05.01.2014 11:35
vint56 я знаю, но хотелось бы через code. Поможете?


Добавлено:
vint56 спасибо. Вот ещё проблема, давно не могу с ней разобраться:
procedure CurPageChanged(CurPageID: Integer);
begin
if Installer.Checked then
begin
WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{pf}')) + 'Almeza MultiSet Professional';
end else
if Portable.Checked then
begin
WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{src}')) + 'Almeza MultiSet Professional Portable';
end;
end;
В чём подвох? При установке обычной версии, всё равно установка идёт в {pf}\Almeza MultiSet Professional даже если я выбрал другую папку и портативная распаковывается рядом с инсталятором. Как исправить?
Автор: vint56
Дата сообщения: 05.01.2014 13:11
AlekseyPopovv читай справку по константы
[more=пример]#define MyAppName "Almeza MultiSet Professional"
#define MyAppVersion "1.5"
#define MyAppExeName "MyProg.exe"

[Setup]
AppName={#MyAppName}
AppVersion={#MyAppVersion}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}

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

[Files]
Source: Files\*; DestDir: {tmp}; Flags: dontcopy;
Source: "C:\Program Files (x86)\Inno Setup 5\Examples\MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: RusLang and InstallerCheck;
Source: "C:\Program Files (x86)\Inno Setup 5\Examples\MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: EngLang and InstallerCheck;
Source: "C:\Program Files (x86)\Inno Setup 5\Examples\MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: UkrLang and InstallerCheck;

Source: "C:\Program Files (x86)\Inno Setup 5\Examples\MyProg.exe"; DestDir: "{commondesktop}\Portable"; Flags: ignoreversion uninsrestartdelete; Check: RusLang and PortableCheck;
Source: "C:\Program Files (x86)\Inno Setup 5\Examples\MyProg.exe"; DestDir: "{commondesktop}\Portable"; Flags: ignoreversion uninsrestartdelete; Check: EngLang and PortableCheck;
Source: "C:\Program Files (x86)\Inno Setup 5\Examples\MyProg.exe"; DestDir: "{commondesktop}\Portable"; Flags: ignoreversion uninsrestartdelete; Check: UkrLang and PortableCheck;

[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" ; Check: StartmenuCheck;
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"; Check: StartmenuCheck;
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Check: IconsCheck;

[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent; Check: RusLang and InstallerCheck;
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent; Check: EngLang and InstallerCheck;
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent; Check: UkrLang and InstallerCheck;

Filename: "{commondesktop}\Portable\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent; Check: RusLang and PortableCheck;
Filename: "{commondesktop}\Portable\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent; Check: EngLang and PortableCheck;
Filename: "{commondesktop}\Portable\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent; Check: UkrLang and PortableCheck;

[UninstallDelete]
Name: {app}\multiset.ini; Type: filesandordirs

[Code]
var
Component: TWizardPage;
Portable,Installer,LangRus,LangEng,LangUkr: TNewRadioButton;
FlagImage,InstallerImage,PortableImage: TBitmapImage;
Lang,IconsPanelLabel: TLabel;
IconsPanel: TPanel;
Icons,Startmenu: TNewCheckBox;

function InitializeSetup(): Boolean;
begin
if not FileExists(ExpandConstant('{tmp}\rus.bmp')) then ExtractTemporaryFile('rus.bmp');
if not FileExists(ExpandConstant('{tmp}\eng.bmp')) then ExtractTemporaryFile('eng.bmp');
if not FileExists(ExpandConstant('{tmp}\ukr.bmp')) then ExtractTemporaryFile('ukr.bmp');
if not FileExists(ExpandConstant('{tmp}\Installer.bmp')) then ExtractTemporaryFile('Installer.bmp');
if not FileExists(ExpandConstant('{tmp}\Portable.bmp')) then ExtractTemporaryFile('Portable.bmp');
Result := True;
end;

function RusLang: Boolean;
begin
Result:= LangRus.Checked;
end;
function EngLang: Boolean;
begin
Result:= LangEng.Checked;
end;
function UkrLang: Boolean;
begin
Result:= LangUkr.Checked;
end;

function IconsCheck: Boolean;
begin
Result:= Icons.Checked;
end;
function StartmenuCheck: Boolean;
begin
Result:= Startmenu.Checked;
end;

function InstallerCheck: Boolean;
begin
Result := Installer.Checked;
end;
function PortableCheck: Boolean;
begin
Result := Portable.Checked;
end;

procedure CopmpClick(Sender: TObject);
begin
case TNewRadioButton(Sender) of
Portable:
begin
PortableImage.Show;
Icons.Checked:=False;
Icons.Enabled:= Icons.Checked;
Startmenu.Checked:=False;
Startmenu.Enabled:= Startmenu.Checked;
WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{src}')) + 'Almeza MultiSet Professional Portable';
end;
Installer:
begin
PortableImage.Hide;
Icons.Checked:=True;
Icons.Enabled:= Icons.Checked;
Startmenu.Checked:=True;
Startmenu.Enabled:= Startmenu.Checked;
WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{pf}')) + 'Almeza MultiSet Professional';
end;
end;
end;

procedure LangClick(Sender: TObject);
begin
case TNewRadioButton(Sender) of
LangRus:
begin
FlagImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\rus.bmp'));
FlagImage.Width := ScaleX(100);
FlagImage.Height := ScaleY(60);
FlagImage.Left := ScaleX(250);
end;
LangEng:
begin
FlagImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\eng.bmp'));
FlagImage.Width := ScaleX(100);
FlagImage.Height := ScaleY(60);
FlagImage.Left := ScaleX(250);
end;
LangUkr:
begin
FlagImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\ukr.bmp'));
FlagImage.Width := ScaleX(100);
FlagImage.Height := ScaleY(60);
FlagImage.Left := ScaleX(250);
end;
end;
end;


procedure InitializeWizard();
begin
Component := CreateCustomPage(wpInfoBefore, 'Выбор компонентов', 'Какие компоненты должны быть установлены?');

FlagImage := TBitmapImage.Create(WizardForm);
with FlagImage do
begin
Name := 'FlagImage';
Parent := Component.Surface;
Left := ScaleX(250);
Top := ScaleY(134);
Width := ScaleX(100);
Height := ScaleY(60);
end;

IconsPanel := TPanel.Create(WizardForm);
with IconsPanel do
begin
Parent := Component.Surface;
Left := ScaleX(0);
Top := ScaleY(0);
Width := ScaleX(417);
Height := ScaleY(100);
BevelOuter := bvNone;
end;

InstallerImage := TBitmapImage.Create(WizardForm);
with InstallerImage do
begin
Name := 'InstallerImage';
Parent := IconsPanel;
Left := ScaleX(255);
Top := ScaleY(15);
Width := ScaleX(80);
Height := ScaleY(80);
InstallerImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Installer.bmp'));
end;

PortableImage := TBitmapImage.Create(WizardForm);
with PortableImage do
begin
Name := 'PortableImage';
Parent := IconsPanel;
Left := ScaleX(255);
Top := ScaleY(15);
Width := ScaleX(80);
Height := ScaleY(80);
PortableImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Portable.bmp'));
end;

IconsPanelLabel := TLabel.Create(WizardForm);
with IconsPanelLabel do
begin
Parent := IconsPanel;
Caption := 'Тип и компоненты:';
Left := ScaleX(0);
Top := ScaleY(5);
Width := ScaleX(150);
Height := ScaleY(13);
end;

Portable := TNewRadioButton.Create(WizardForm);
with Portable do
begin
Parent := IconsPanel;
Left := ScaleX(5);
Top := ScaleY(25);
Width := ScaleX(200);
Height := ScaleY(17);
Caption := 'Распаковка портативной версий';
OnClick:=@CopmpClick;
end;

Icons := TNewCheckBox.Create(WizardForm);
with Icons do
begin
Parent := IconsPanel;
Left := ScaleX(25);
Top := ScaleY(65);
Width := ScaleX(200);
Height := ScaleY(17);
Caption := 'Ярлык(и) на «Рабочем столе»';
Checked:=True;
end;

Startmenu := TNewCheckBox.Create(WizardForm);
with Startmenu do
begin
Parent := IconsPanel;
Left := ScaleX(25);
Top := ScaleY(85);
Width := ScaleX(200);
Height := ScaleY(17);
Caption := 'Ярлык в «Пуск меню»';
Checked:=True;
end;

Installer := TNewRadioButton.Create(WizardForm);
with Installer do
begin
Parent := IconsPanel;
Left := ScaleX(5);
Top := ScaleY(45);
Width := ScaleX(200);
Height := ScaleY(17);
Caption := 'Установка обычной версий';
OnClick:=@CopmpClick;
Checked:=True;
end;

Lang := TLabel.Create(WizardForm);
with Lang do
begin
Parent := Component.Surface;
Caption := 'Язык интерфейса:';
Left := ScaleX(0);
Top := ScaleY(120);
Width := ScaleX(150);
Height := ScaleY(13);
end;

LangRus := TNewRadioButton.Create(WizardForm);
with LangRus do
begin
Parent := Component.Surface;
Left := ScaleX(5);
Top := ScaleY(135);
Width := ScaleX(200);
Height := ScaleY(17);
Caption := 'Язык интерфейса Русский';
OnClick:=@LangClick;
Checked:=True;
end;

LangEng := TNewRadioButton.Create(WizardForm);
with LangEng do
begin
Parent := Component.Surface;
Left := ScaleX(5);
Top := ScaleY(155);
Width := ScaleX(200);
Height := ScaleY(17);
Caption := 'Язык интерфейса Английский';
OnClick:=@LangClick;
end;

LangUkr := TNewRadioButton.Create(WizardForm);
with LangUkr do
begin
Parent := Component.Surface;
Left := ScaleX(5);
Top := ScaleY(175);
Width := ScaleX(200);
Height := ScaleY(17);
Caption := 'Язык интерфейса Украйнский';
OnClick:=@LangClick;
end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if (CurStep = ssPostInstall) then
if Installer.Checked and RusLang then
SetIniString('gereral', 'language', 'russian', ExpandConstant('{app}\multiset.ini'));
if Installer.Checked and EngLang then
SetIniString('gereral', 'language', 'english', ExpandConstant('{app}\multiset.ini'));
if Installer.Checked and UkrLang then
SetIniString('gereral', 'language', 'ukrainian', ExpandConstant('{app}\multiset.ini'));
end;[/more]
Автор: AlekseyPopovv
Дата сообщения: 05.01.2014 13:42
vint56
А как избавиться от этого:
[more] [/more]
Папка сбрасывается при выборе

Добавлено:
vint56
Сделал вот так:
[Setup]
DefaultDirName={pf}
AppendDefaultDirName=no
Не катит:
[more] [/more]
Создаёт {pf}
Но всё равно хотелось бы, что бы папка дописывалась и в портабле и в истале



Добавлено:
vint56
Попробовал вот так ещё:
[more]#define MyAppName "Almeza MultiSet Professional"
#define MyAppNamePortable "Almeza MultiSet Professional Portable"

[Setup]
DefaultDirName={code:MyInstaller|MyPortable}

[Code]
function MyInstaller(Param: String): String;
begin
Result := ExpandConstant('{pf}\{#MyAppName}');
end;
function MyPortable(Param: String): String;
begin
Result := ExpandConstant('{src}\{#MyAppNamePortable}');
end;[/more]

Как к этому всему прикрутить Check: InstallerCheck и Check: PortableCheck?
Автор: vint56
Дата сообщения: 05.01.2014 16:07
AlekseyPopovv
[more=пример]
#define MyAppName "Almeza MultiSet Professional"
#define MyAppVersion "1.5"
#define MyAppExeName "MyProg.exe"

[Setup]
AppName={#MyAppName}
AppVersion={#MyAppVersion}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
DirExistsWarning=no
Uninstallable=not PortableCheck

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

[Files]
Source: Files\*; DestDir: {tmp}; Flags: dontcopy;
Source: "C:\Program Files (x86)\Inno Setup 5\Examples\MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: RusLang and InstallerCheck;
Source: "C:\Program Files (x86)\Inno Setup 5\Examples\MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: EngLang and InstallerCheck;
Source: "C:\Program Files (x86)\Inno Setup 5\Examples\MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: UkrLang and InstallerCheck;

Source: "C:\Program Files (x86)\Inno Setup 5\Examples\MyProg.exe"; DestDir: "{commondesktop}\Portable"; Flags: ignoreversion uninsrestartdelete; Check: RusLang and PortableCheck;
Source: "C:\Program Files (x86)\Inno Setup 5\Examples\MyProg.exe"; DestDir: "{commondesktop}\Portable"; Flags: ignoreversion uninsrestartdelete; Check: EngLang and PortableCheck;
Source: "C:\Program Files (x86)\Inno Setup 5\Examples\MyProg.exe"; DestDir: "{commondesktop}\Portable"; Flags: ignoreversion uninsrestartdelete; Check: UkrLang and PortableCheck;

Source: {win}\Help\*; DestDir: {app}; Flags: external recursesubdirs; Check: RusLang and InstallerCheck;
Source: {win}\Help\*; DestDir: {app}; Flags: external recursesubdirs; Check: RusLang and PortableCheck;


[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" ; Check: StartmenuCheck;
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"; Check: StartmenuCheck;
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Check: IconsCheck;

[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent; Check: RusLang and InstallerCheck;
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent; Check: EngLang and InstallerCheck;
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent; Check: UkrLang and InstallerCheck;

Filename: "{commondesktop}\Portable\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent; Check: RusLang and PortableCheck;
Filename: "{commondesktop}\Portable\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent; Check: EngLang and PortableCheck;
Filename: "{commondesktop}\Portable\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent; Check: UkrLang and PortableCheck;

[UninstallDelete]
Name: {app}\multiset.ini; Type: filesandordirs

[Code]
var
Component: TWizardPage;
Portable,Installer,LangRus,LangEng,LangUkr: TNewRadioButton;
FlagImage,InstallerImage,PortableImage: TBitmapImage;
Lang,IconsPanelLabel: TLabel;
IconsPanel: TPanel;
Icons,Startmenu: TNewCheckBox;

dirBrowseForm: TSetupForm;
dirBrowse, dirOK, dirNO, dirback: TButton;
DirTreeView: TFolderTreeView;
Edit: TNewEdit;
BrowseBevel: TBevel;
BrowsePanel: TPanel;
BrowsePanel2: TPanel;
BrowseBevel2,BrowseBevel3: TBevel;
BrowseForm : TSetupForm;


function InitializeSetup(): Boolean;
begin
if not FileExists(ExpandConstant('{tmp}\rus.bmp')) then ExtractTemporaryFile('rus.bmp');
if not FileExists(ExpandConstant('{tmp}\eng.bmp')) then ExtractTemporaryFile('eng.bmp');
if not FileExists(ExpandConstant('{tmp}\ukr.bmp')) then ExtractTemporaryFile('ukr.bmp');
if not FileExists(ExpandConstant('{tmp}\Installer.bmp')) then ExtractTemporaryFile('Installer.bmp');
if not FileExists(ExpandConstant('{tmp}\Portable.bmp')) then ExtractTemporaryFile('Portable.bmp');
Result := True;
end;

function RusLang: Boolean;
begin
Result:= LangRus.Checked;
end;
function EngLang: Boolean;
begin
Result:= LangEng.Checked;
end;
function UkrLang: Boolean;
begin
Result:= LangUkr.Checked;
end;

function IconsCheck: Boolean;
begin
Result:= Icons.Checked;
end;
function StartmenuCheck: Boolean;
begin
Result:= Startmenu.Checked;
end;

function InstallerCheck: Boolean;
begin
Result := Installer.Checked;
end;
function PortableCheck: Boolean;
begin
Result := Portable.Checked;
end;

procedure CopmpClick(Sender: TObject);
begin
case TNewRadioButton(Sender) of
Portable:
begin
PortableImage.Show;
Icons.Checked:=False;
Icons.Enabled:= Icons.Checked;
Startmenu.Checked:=False;
Startmenu.Enabled:= Startmenu.Checked;
WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{commondesktop}')) + 'Almeza MultiSet Professional Portable';
//wizardform.GroupEdit.enabled:= false;
//wizardform.GroupBrowseButton.enabled:= false;
end;
Installer:
begin
PortableImage.Hide;
Icons.Checked:=True;
Icons.Enabled:= Icons.Checked;
Startmenu.Checked:=True;
Startmenu.Enabled:= Startmenu.Checked;
WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{pf}')) + 'Almeza MultiSet Professional';
//wizardform.GroupEdit.enabled:= true;
//wizardform.GroupBrowseButton.enabled:= true;
end;
end;
end;

procedure LangClick(Sender: TObject);
begin
case TNewRadioButton(Sender) of
LangRus:
begin
FlagImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\rus.bmp'));
FlagImage.Width := ScaleX(100);
FlagImage.Height := ScaleY(60);
FlagImage.Left := ScaleX(250);
end;
LangEng:
begin
FlagImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\eng.bmp'));
FlagImage.Width := ScaleX(100);
FlagImage.Height := ScaleY(60);
FlagImage.Left := ScaleX(250);
end;
LangUkr:
begin
FlagImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\ukr.bmp'));
FlagImage.Width := ScaleX(100);
FlagImage.Height := ScaleY(60);
FlagImage.Left := ScaleX(250);
end;
end;
end;

procedure dirOkclick(Sender: TObject);
begin
dirBrowseForm.Close;
WizardForm.Enabled:=True;
WizardForm.DirEdit.Text:=Edit.Text;
end;

procedure dirBackClick(Sender: TObject);
begin
Edit.Text:=AddBackslash(ExpandConstant('{pf}\')+'{#MyAppName}');
DirTreeView.ChangeDirectory(AddBackslash(ExpandConstant('{pf}\')), True);
end;

procedure dirNOclick(Sender: TObject);
begin
dirBrowseForm.Close;
WizardForm.Enabled:=true;
end;

procedure DirFolderChange(Sender: TObject);
Begin
Edit.Text:=AddBackslash(DirTreeView.Directory) + '{#MyAppName}';
if Portable.Checked then
Edit.Text:=AddBackslash(DirTreeView.Directory) + 'Almeza MultiSet Professional Portable';
end;

procedure FormClosedir(Sender: TObject; var Action: TCloseAction);
begin
WizardForm.Enabled:=true;
end;

procedure BrowseClick(Sender: TObject);
begin
dirBrowseForm := CreateCustomForm();
with dirBrowseForm do begin
ClientWidth := ScaleX(352);
ClientHeight := ScaleY(388);
CenterInsideControl(WizardForm, False);
Caption:='Обзор папок';
onClose:=@FormClosedir;

with tlabel.create(dirBrowseForm) do begin
SetBounds(ScaleX(15),ScaleY(15),ScaleX(350),ScaleY(15));
caption:='Выберите папку из списка и нажмите «ОK».';
parent:=dirBrowseForm;
Font.Color:=clBlack;
Font.Size:=8;

BrowseBevel := TBevel.Create(WizardForm);
BrowseBevel.SetBounds(ScaleX(0),ScaleY(40),ScaleX(352),ScaleY(2));
BrowseBevel.parent:=dirBrowseForm;

BrowseBevel3 := TBevel.Create(WizardForm);
BrowseBevel3.SetBounds(ScaleX(0),ScaleY(342),ScaleX(352),ScaleY(2));
BrowseBevel3.parent:=dirBrowseForm;

BrowsePanel := TPanel.Create(WizardForm);
with BrowsePanel do
begin
parent:=dirBrowseForm;
Left := ScaleX(5);
Top := ScaleY(45);
Width := ScaleX(342);
Height := ScaleY(292);
Caption := '';
end;
BrowsePanel2 := TPanel.Create(WizardForm);
with BrowsePanel2 do
begin
BrowsePanel2.Parent := BrowsePanel;
Left := ScaleX(5);
Top := ScaleY(5);
Width := ScaleX(332);
Height := ScaleY(282);
BevelOuter := bvLowered;
Caption := '';
end;
BrowseBevel2 := TBevel.Create(WizardForm);
with BrowseBevel2 do
begin
BrowseBevel2.Parent := BrowsePanel2;
Left := ScaleX(5);
Top := ScaleY(5);
Width := ScaleX(322);
Height := ScaleY(272);
Style := bsRaised;
end;

Edit:= TNewEdit.Create(dirBrowseForm);
with edit do begin
SetBounds(ScaleX(10),ScaleY(10),ScaleX(311),ScaleY(21));
Text:=WizardForm.DirEdit.text;
Parent:= BrowsePanel2;
Font.Color:=clBlack;
end;

DirTreeView:= TFolderTreeView.Create(dirBrowseForm)
with DirTreeView do begin
SetBounds(ScaleX(10),ScaleY(35),ScaleX(311),ScaleY(235));
OnChange:=@DirFolderChange;
Parent:=BrowsePanel2;
end;

dirback:=tbutton.create(dirBrowseForm)
with dirback do begin
SetBounds(ScaleX(16),ScaleY(351),ScaleX(100),ScaleY(30));
parent:=dirBrowseForm;
Caption:='Сброс';
onclick:=@dirBackClick;
end;

dirok:=tbutton.create(dirBrowseForm)
with dirok do begin
SetBounds(ScaleX(126),ScaleY(351),ScaleX(100),ScaleY(30));
parent:=dirBrowseForm;
Caption:='OK';
onclick:=@dirOKclick;
end;

dirno:=tbutton.create(dirBrowseForm)
with dirno do begin
SetBounds(ScaleX(236),ScaleY(351),ScaleX(100),ScaleY(30));
parent:=dirBrowseForm;
Caption:='Отмена';
onclick:=@dirNOclick;
end;
end;
end;
DirTreeView.ChangeDirectory(AddBackslash(WizardForm.dirEdit.Text), true);
Edit.Text:=(DirTreeView.Directory);
dirBrowseForm.Show;
WizardForm.Enabled:=false;
end;

procedure InitializeWizard();
begin
WizardForm.DirBrowseButton.Visible:=false;
Component := CreateCustomPage(wpInfoBefore, 'Выбор компонентов', 'Какие компоненты должны быть установлены?');

FlagImage := TBitmapImage.Create(WizardForm);
with FlagImage do
begin
Name := 'FlagImage';
Parent := Component.Surface;
Left := ScaleX(250);
Top := ScaleY(134);
Width := ScaleX(100);
Height := ScaleY(60);
end;

IconsPanel := TPanel.Create(WizardForm);
with IconsPanel do
begin
Parent := Component.Surface;
Left := ScaleX(0);
Top := ScaleY(0);
Width := ScaleX(417);
Height := ScaleY(100);
BevelOuter := bvNone;
end;

InstallerImage := TBitmapImage.Create(WizardForm);
with InstallerImage do
begin
Name := 'InstallerImage';
Parent := IconsPanel;
Left := ScaleX(255);
Top := ScaleY(15);
Width := ScaleX(80);
Height := ScaleY(80);
InstallerImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Installer.bmp'));
end;

PortableImage := TBitmapImage.Create(WizardForm);
with PortableImage do
begin
Name := 'PortableImage';
Parent := IconsPanel;
Left := ScaleX(255);
Top := ScaleY(15);
Width := ScaleX(80);
Height := ScaleY(80);
PortableImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Portable.bmp'));
end;

IconsPanelLabel := TLabel.Create(WizardForm);
with IconsPanelLabel do
begin
Parent := IconsPanel;
Caption := 'Тип и компоненты:';
Left := ScaleX(0);
Top := ScaleY(5);
Width := ScaleX(150);
Height := ScaleY(13);
end;

Portable := TNewRadioButton.Create(WizardForm);
with Portable do
begin
Parent := IconsPanel;
Left := ScaleX(5);
Top := ScaleY(25);
Width := ScaleX(200);
Height := ScaleY(17);
Caption := 'Распаковка портативной версий';
OnClick:=@CopmpClick;
end;

Icons := TNewCheckBox.Create(WizardForm);
with Icons do
begin
Parent := IconsPanel;
Left := ScaleX(25);
Top := ScaleY(65);
Width := ScaleX(200);
Height := ScaleY(17);
Caption := 'Ярлык(и) на «Рабочем столе»';
Checked:=True;
end;

Startmenu := TNewCheckBox.Create(WizardForm);
with Startmenu do
begin
Parent := IconsPanel;
Left := ScaleX(25);
Top := ScaleY(85);
Width := ScaleX(200);
Height := ScaleY(17);
Caption := 'Ярлык в «Пуск меню»';
Checked:=True;
end;

Installer := TNewRadioButton.Create(WizardForm);
with Installer do
begin
Parent := IconsPanel;
Left := ScaleX(5);
Top := ScaleY(45);
Width := ScaleX(200);
Height := ScaleY(17);
Caption := 'Установка обычной версий';
OnClick:=@CopmpClick;
Checked:=True;
end;

Lang := TLabel.Create(WizardForm);
with Lang do
begin
Parent := Component.Surface;
Caption := 'Язык интерфейса:';
Left := ScaleX(0);
Top := ScaleY(120);
Width := ScaleX(150);
Height := ScaleY(13);
end;

LangRus := TNewRadioButton.Create(WizardForm);
with LangRus do
begin
Parent := Component.Surface;
Left := ScaleX(5);
Top := ScaleY(135);
Width := ScaleX(200);
Height := ScaleY(17);
Caption := 'Язык интерфейса Русский';
OnClick:=@LangClick;
Checked:=True;
end;

LangEng := TNewRadioButton.Create(WizardForm);
with LangEng do
begin
Parent := Component.Surface;
Left := ScaleX(5);
Top := ScaleY(155);
Width := ScaleX(200);
Height := ScaleY(17);
Caption := 'Язык интерфейса Английский';
OnClick:=@LangClick;
end;

LangUkr := TNewRadioButton.Create(WizardForm);
with LangUkr do
begin
Parent := Component.Surface;
Left := ScaleX(5);
Top := ScaleY(175);
Width := ScaleX(200);
Height := ScaleY(17);
Caption := 'Язык интерфейса Украйнский';
OnClick:=@LangClick;
end;
dirBrowse:=tbutton.create(WizardForm);
with dirBrowse do begin
Parent := WizardForm.SelectDirPage;
SetBounds(ScaleX(342),ScaleY(80),ScaleX(75),ScaleY(23));
Caption:='Обзор...';
OnClick:=@BrowseClick;
end;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
if Portable.Checked then
if (PageID = 8) then
Result:= True;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if (CurStep = ssPostInstall) then
if Installer.Checked and RusLang then
SetIniString('gereral', 'language', 'russian', ExpandConstant('{app}\multiset.ini'));
if Installer.Checked and EngLang then
SetIniString('gereral', 'language', 'english', ExpandConstant('{app}\multiset.ini'));
if Installer.Checked and UkrLang then
SetIniString('gereral', 'language', 'ukrainian', ExpandConstant('{app}\multiset.ini'));
end;[/MORE]

Автор: Habib2302
Дата сообщения: 05.01.2014 21:23
vint56 17:32 04-01-2014
а можно под .png картинки
Автор: BUU
Дата сообщения: 05.01.2014 23:30
Всем привет, можно в inno setup сделать такое - при указании куда будет ставиться игра или программа, и установщик определял есть там файлы какие нибудь, запрет проще сказать, указал с файлами, нельзя, выбрал пустую, начал установку, спс заранее
Автор: BlackInferno1989
Дата сообщения: 06.01.2014 11:38
Со вставкой слайд-шоу ниже прогрессбара разобрался, а вот вопрос полегче, как мне кажется...
Необходимо под прогрессбар вставить информационное окно с текстом, например информацию об устанавливаемом обновлении для игры, вот сюда:
http://i59.fastpic.ru/big/2014/0106/b5/5e7c6c85b5ccacaa372fa201b19011b5.png
Необходимо что бы информация бралась из текстового файла .rtf, но не затрагивая при этом файлы с лицензией, с информацией перед и после установки...
Может кто подсказать код?
Автор: vint56
Дата сообщения: 06.01.2014 12:11
Habib2302
http://rghost.ru/51437504
BlackInferno1989
http://rghost.ru/51438013
Автор: Habib2302
Дата сообщения: 06.01.2014 14:30
vint56
Thank You!!!
Автор: tyumenik
Дата сообщения: 06.01.2014 16:11
Всех, с Новым годом и Рождеством!!!
Хотел сделать TTrackBar, но не знаю как сделать

Заранее блгодарен!!!
Автор: vint56
Дата сообщения: 06.01.2014 16:22
tyumenik пример от Gnom3
[more][Setup]
AppName=Alpha+Trackbar
AppVerName=Alpha+Trackbar
DefaultDirName={pf}\Alpha+Trackbar

[Code]
var
AlphaTrackBar: TTrackBar;

function SetLayeredWindowAttributes(hwnd: HWND; crKey: TColor; bAlpha: BYTE; dwFlags: DWORD): Boolean; external 'SetLayeredWindowAttributes@user32.dll stdcall';
function GetWindowLong(Wnd: HWnd; Index: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall';
function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint;external 'SetWindowLongA@user32.dll stdcall';

procedure AlphaTrackBarChange(Sender: TObject);
begin
SetWindowLong(WizardForm.Handle, (-20), GetWindowLong(WizardForm.Handle, (-20)) or $80000);
SetLayeredWindowAttributes(WizardForm.Handle, 0, AlphaTrackBar.Position, 2);
end;

Procedure InitializeWizard();
begin
AlphaTrackBar:=TTrackBar.Create(WizardForm);
AlphaTrackBar.Name:='AlphaTrackBar';
AlphaTrackBar.Parent:=WizardForm;
AlphaTrackBar.SetBounds(ScaleX(0),ScaleY(327),ScaleX(238),ScaleY(29));
AlphaTrackBar.Max:=255;
AlphaTrackBar.Position:=255;
AlphaTrackBar.OnChange:=@AlphaTrackBarChange;
end;[/more]
Автор: BlackInferno1989
Дата сообщения: 06.01.2014 16:39
vint56
благодарю!

Добавлено:
vint56
Есть маленький косяк, окно это под прогрессбаром не имеет ползунок прокрутки текста, т.е. если текста слишком много для прокрутки его нужно поставить курсор в поле с текстом и стрелочками "вверх/вниз" двигать окно.
Как это исправить?
Автор: AlekseyPopovv
Дата сообщения: 06.01.2014 17:51
vint56
Как сделать, что бы при деинсталяции это всё удалилось:
procedure CurStepChanged(CurStep: TSetupStep);
begin
if (CurStep=ssDone) then
begin
RegWriteStringValue(HKEY_CLASSES_ROOT, '.amltkey', '', 'MultiSet');
RegWriteStringValue(HKEY_CLASSES_ROOT, 'MultiSet\DefaultIcon', '', ExpandConstant('{app}\doc.ico,0'));
RegWriteStringValue(HKEY_CLASSES_ROOT, 'MultiSet\shell\open\command', '', ExpandConstant('{app}\MULTISET.EXE " "%1"'));
end;
end;
Автор: vint56
Дата сообщения: 06.01.2014 18:13
BlackInferno1989

[more]procedure InitializeWizard();
begin
ExtractTemporaryFile('ReadMe.rtf');
LoadStringFromFile(ExpandConstant('{tmp}')+'\ReadMe.rtf', Readme);

RichEditViewer1 := TRichEditViewer.Create(WizardForm);
with RichEditViewer1 do
begin
Parent := WizardForm.InstallingPage;
Left := ScaleX(0);
Top := ScaleY(72);
Width := ScaleX(417);
Height := ScaleY(153);
ReadOnly:= true;
RTFText:= Readme;
ScrollBars := ssVertical;
end;
end;[/more]


AlekseyPopovv

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usUninstall then
begin
RegDeleteKeyIncludingSubkeys(HKCR, '.amltkey')
RegDeleteKeyIncludingSubkeys(HKCR, 'MultiSet')
end;
end;
Автор: Tapas77789
Дата сообщения: 06.01.2014 18:26
BUU

Цитата:
Всем привет, можно в inno setup сделать такое - при указании куда будет ставиться игра или программа, и установщик определял есть там файлы какие нибудь, запрет проще сказать, указал с файлами, нельзя, выбрал пустую, начал установку, спс заранее


[more=NotEmptyFile][Setup]
AppName=My Program
AppVersion=1.5
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DirExistsWarning=False

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

[CustomMessages]
ru.NotEmptyFile=Папка установки не пустая, выберите другую!

[Code]
function FindFirstNotEmptyFile(FromDir: String; Mask: String): LongWord;
var
FSR, DSR: TFindRec; FindResult: Boolean;
begin
Result:=0;
FindResult:= FindFirst(AddBackslash(FromDir) + Mask, FSR);
while FindResult do begin
if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
Result:= FSR.SizeLow + FSR.SizeHigh;

if Result>0 then Exit;
FindResult:= FindNext(FSR);
end;
if (Result=0) then begin
FindResult:= FindFirst(AddBackslash(FromDir)+ '*.*', DSR);
while FindResult do begin
if ((DSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and not ((DSR.Name = '.') or (DSR.Name = '..')) then begin
Result:=FindFirstNotEmptyFile(AddBackSlash(FromDir)+DSR.Name, Mask);
break;
end;
FindResult:= FindNext(DSR);
end;
end;
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result:=True;
if CurPageID = wpSelectDir then
begin
if FindFirstNotEmptyFile(Trim(WizardForm.DirEdit.Text)+'\', '*.*')<>0 then
begin
MsgBox(ExpandConstant('{cm:NotEmptyFile}'), mbError, MB_OK);
Result:=False;
end;
end;
end;
[/more]
[more=NotEmptyFile2][Setup]
AppName=My Program
AppVersion=1.5
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program

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

[CustomMessages]
ru.NotEmptyFile=Папка установки не пустая, выберите другую!

[Code]
function FindFirstNotEmptyFile(FromDir: String; Mask: String): LongWord;
var
FSR, DSR: TFindRec; FindResult: Boolean;
begin
Result:=0;
FindResult:= FindFirst(AddBackslash(FromDir) + Mask, FSR);
while FindResult do begin
if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
Result:= FSR.SizeLow + FSR.SizeHigh;

if Result>0 then Exit;
FindResult:= FindNext(FSR);
end;
if (Result=0) then begin
FindResult:= FindFirst(AddBackslash(FromDir)+ '*.*', DSR);
while FindResult do begin
if ((DSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and not ((DSR.Name = '.') or (DSR.Name = '..')) then begin
Result:=FindFirstNotEmptyFile(AddBackSlash(FromDir)+DSR.Name, Mask);
break;
end;
FindResult:= FindNext(DSR);
end;
end;
end;

procedure DirEditOnChanged(Sender: TObject);
begin
case Sender of
WizardForm.DirEdit: begin
if FindFirstNotEmptyFile(Trim(WizardForm.DirEdit.Text)+'\', '*.*')<>0 then
begin
MsgBox(ExpandConstant('{cm:NotEmptyFile}'), mbError, MB_OK);
WizardForm.NextButton.Enabled:=False;
end;
end;
end;
end;

procedure InitializeWizard();
begin
WizardForm.DirEdit.OnChange:=@DirEditOnChanged;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
case CurPageID of
wpSelectDir: begin
DirEditOnChanged(WizardForm.DirEdit);
end;
end;
end;
[/more]
Автор: AlekseyPopovv
Дата сообщения: 06.01.2014 18:31
Как сделать, что бы сначала (уже после выбора папки по нажатию на кнопку "установить") запускался .bat файл в скрытом режиме, а после того как он все функции выполнит продолжалась установка?
Автор: Tapas77789
Дата сообщения: 06.01.2014 18:48
AlekseyPopovv
function NextButtonClick(CurPageID: Integer): Boolean;
var
ResultCode: Integer;
begin
Result:=True;
if CurPageID = wpReady then
ShellExec('',ExpandConstant('{app}\script.bat'),'','',SW_HIDE,ewWaitUntilTerminated,ResultCode);
end;
Автор: AlekseyPopovv
Дата сообщения: 06.01.2014 19:06
Tapas77789
Спасибо.
Как сделать, что бы при деинсталяции это всё удалилось:
procedure CurStepChanged(CurStep: TSetupStep);
begin
if (CurStep=ssDone) then
begin
RegWriteStringValue(HKEY_CLASSES_ROOT, '.amltkey', '', 'MultiSet');
RegWriteStringValue(HKEY_CLASSES_ROOT, 'MultiSet\DefaultIcon', '', ExpandConstant('{app}\doc.ico,0'));
RegWriteStringValue(HKEY_CLASSES_ROOT, 'MultiSet\shell\open\command', '', ExpandConstant('{app}\MULTISET.EXE " "%1"'));
end;
end;
Автор: tyumenik
Дата сообщения: 06.01.2014 19:31
vint56, понимаю, например 1 - медленно, 3 - среднее, 5 - быстро. Вот надо скрипт

Добавлено:
P.S. пример файл-ини и реестр
Автор: BUU
Дата сообщения: 06.01.2014 20:16
Tapas77789
Спс, буду тестить
Автор: Tapas77789
Дата сообщения: 06.01.2014 20:26
AlekseyPopovv
Вот так у меня все работает

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssDone then
begin
RegWriteStringValue(HKEY_CLASSES_ROOT, '.amltkey', '', 'MultiSet');
RegWriteStringValue(HKEY_CLASSES_ROOT, 'MultiSet\DefaultIcon', '', ExpandConstant('{app}\doc.ico,0'));
RegWriteStringValue(HKEY_CLASSES_ROOT, 'MultiSet\shell\open\command', '', ExpandConstant('{app}\MULTISET.EXE " "%1"'));
end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usPostUninstall then
begin
RegDeleteKeyIncludingSubkeys(HKCR, '.amltkey');
RegDeleteKeyIncludingSubkeys(HKCR, 'MultiSet');
end;
end;
Автор: AlekseyPopovv
Дата сообщения: 06.01.2014 20:37
Tapas77789
Спасибо. Вот такая ещё проблема, может я просто не вижу в чём дело:
[more]procedure CurStepChanged(CurStep: TSetupStep);
begin
if (CurStep = ssPostInstall) then
if LangRus.Checked then
SetIniString('Options', 'Language', '0', ExpandConstant('{userappdata}\Atomic Alarm Clock 6\settings.ini'));
if LangEng.Checked then
SetIniString('Options', 'Language', '1', ExpandConstant('{userappdata}\Atomic Alarm Clock 6\settings.ini'));
if LangUkr.Checked then
SetIniString('Options', 'Language', '3', ExpandConstant('{userappdata}\Atomic Alarm Clock 6\settings.ini'));
end;[/more]
Ни папку не создаёт ни файла ни чего. Что не так?

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758

Предыдущая тема: Только инсталлятор


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.