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

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

Автор: JuNoS
Дата сообщения: 14.12.2008 15:21
У меня не работает скрипт "Верхняя часть как в NSIS.iss", постоянно пишет "Unknown identifier 'ShowAccelChar'"
Автор: Aion13
Дата сообщения: 14.12.2008 15:29
serg_aka_lain
Спасибо!
По 1 пункту будет вылетать страничка подтверждения а она мне не нужна. И это решается тем, что параметр /silent нужно устанавливать, только тогда другой код получится.
По 2 пункту: если допустим определённые папки (их не одна) я хочу связать их с этой страничкой? Но основные файлы установятся в любом случае. А те, которые будут связаны с чекбоксами, только если выделены. Как это осуществить?
Автор: serg_aka_lain
Дата сообщения: 14.12.2008 15:41
Aion13

Цитата:
параметр /silent нужно устанавливать


Цитата:
По 2 пункту: если допустим определённые папки (их не одна) я хочу связать их с этой страничкой? Но основные файлы установятся в любом случае. А те, которые будут связаны с чекбоксами, только если выделены. Как это осуществить?

[more]

[Setup]
AppName=My Program
AppVerName=My Program v1.2
DefaultDirName={pf}\My Program
OutputDir=.

[Files]
Source: "compiler:Examples\MyProg.exe"; DestDir: "{app}"; Check: Checked; Flags: ignoreversion;
Source: "compiler:Examples\MyProg.exe"; DestDir: "{app}"; DestName: "MyProg_new.exe"; Check: Checked2; Flags: ignoreversion;

[Code]

var
Page: TInputOptionWizardPage;

function Checked: Boolean;
begin
Result := Page.Values[0];
end;

function Checked2: Boolean;
begin
Result := Page.Values[1];
end;

function InitializeSetup(): Boolean;
var
UnStr: String;
ErrorCode: Integer;
begin
Result := True;
if RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1', 'UninstallString', UnStr) then
begin
If UnStr <> '' then
begin
UnStr := RemoveQuotes(UnStr);
Exec(UnStr, '/silent', '', SW_Show, ewNoWait, ErrorCode);
Result := False;
Exit;
end;
end;
end;

procedure InitializeWizard();
begin
Page := CreateInputOptionPage(wpSelectTasks,'New Page', 'New Page Description.', 'Please check the box below, then click Next.', False, False);
Page.Add('Check the box');
Page.Values[0] := False;
Page.Add('Check the box2');
Page.Values[1] := False;
end;

[/more]

Автор: Aion13
Дата сообщения: 14.12.2008 16:01
Итак, решил проблему лучшим способ, на сколько смог.
Если кому нужен код, который определяет установленное приложение и даёт выбор, начать удаление или продолжить установку, то вот:

Код: [Setup]
; Определит имя раздела в реестре с информацией для удаления
AppID=My Program //Можно задать любое значение, например: {0872DB47-24CB-4C7F-AC4B-E6EFC27BD244}

[Code]
var
ResultStr:string;
msgres, ResultCode: integer;
begin
RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1', 'DisplayName', ResultStr)
if ResultStr='My Program Name '
then
msgres:=MsgBox('"'+ ResultStr + '" уже установлена на Ваш компьютер.'+#10#10+'Для новой установки следует удалить предыдущую. Удалить её?', mbInformation, MB_YESNO);
case msgres of
IdYes: begin
// Проверка правильности ключа удаления
if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1', 'UninstallString', ResultStr)
then
begin
if ResultStr<>''
then
begin
ResultStr:=RemoveQuotes(ResultStr);
Exec(ResultStr, '/silent', '', SW_SHOWNORMAL, ewWaitUntilIdle, ResultCode)
end else
// Если не были найдены файлы удаления, то выдаётся сообщение об ошибке
if not Exec(ResultStr, '', '', SW_SHOWNORMAL, ewWaitUntilIdle, ResultCode)
then
MsgBox('Ошибка удаления. ' #10#10 '' + SysErrorMessage(ResultCode) + '.' #10#10 'Вероятно, файл был перемещен, удален или переименован.', mbError, MB_OK);
end
end;
IdNo: Result:= False;
end;
if ResultStr<>''
then
Result := True;
end;
Автор: serg_aka_lain
Дата сообщения: 14.12.2008 16:31
Aion13
Ты уже определись, что тебе нужно.

Цитата:
Как сделать обнаружение установки\удаления программы вот по такой схеме:

- запускаем инсталлятор в 1 раз --> идёт установка программы
- запускаем его 2 раз --> появляется окошко, о том чтобы удалить, но НЕ через команду MsgBox, а стандартное сообщение об удалении. На панели задач в это время висит ТОЛЬКО процесс удаления.

теперь понадобилось через case... ?

Автор: clemenco
Дата сообщения: 14.12.2008 16:36
http://forum.ru-board.com/topic.cgi?forum=5&topic=27438&start=1880#6

Подскажите как быть с этим.
Автор: Aion13
Дата сообщения: 14.12.2008 16:43
serg_aka_lain
Не, я просто код поинтереснее нашёл и всё. И единственное что мне не удалось реализовать в нём (см. выше), так это если добавить кнопку отмены в case, то чтобы она вообще отменяла установку. Ты сможешь этот недочёт исправить?

p.S Большое спасибо что помогаешь.
p.p.S Может кто-нибудь внесёт разобранное в справку? Я не настаиваю просто очень полезные вещи, а главное лучше предыдущих кодов, особенно с меседжами.

Добавлено:
serg_aka_lain
А как на это второй страничке сделать выбор пункта в пункте? Т.е. как выбрал пункт 2, открывается ещё пункты с выбором (или появляются, или с самого начала неактивны, т.е. их нельзя выбрать), ниже этого пункта и чуть правее. Лучше конечно, чтобы появлялись.
Автор: JuNoS
Дата сообщения: 14.12.2008 17:07
У меня не работает скрипт "Верхняя часть как в NSIS.iss", постоянно пишет "Unknown identifier 'ShowAccelChar'"

Что делать? У меня 5.2.3.e4 (ISPP 5.2.3.0)
Автор: serg_aka_lain
Дата сообщения: 14.12.2008 17:42

Цитата:
Не, я просто код поинтереснее нашёл и всё. И единственное что мне не удалось реализовать в нём (см. выше), так это если добавить кнопку отмены в case, то чтобы она вообще отменяла установку. Ты сможешь этот недочёт исправить?

Предложу [more=Так]

function InitializeSetup(): Boolean;
var
UnStr: String;
ErrorCode, Mesages: Integer;
begin
Result := True;
if RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1', 'UninstallString', UnStr) then
begin
If UnStr <> '' then
begin
Mesages := MsgBox('My Program уже установлена на Ваш компьютер.'+#10#10+'Для новой установки следует удалить предыдущую. Удалить её?', mbInformation, MB_YESNOCANCEL);
case Mesages of
idYes:
begin
UnStr := RemoveQuotes(UnStr);
Exec(UnStr, '/silent', '', SW_Show, ewWaitUntilTerminated, ErrorCode);
Result := True;
end
idNo:
begin
Result := True;
end
idCancel:
begin
Result := False;
end;
end;
end;
end;
end;

[/more]


Цитата:
А как на это второй страничке сделать выбор пункта в пункте? Т.е. как выбрал пункт 2, открывается ещё пункты с выбором (или появляются, или с самого начала неактивны, т.е. их нельзя выбрать), ниже этого пункта и чуть правее. Лучше конечно, чтобы появлялись.

[more=Так]

[Code]

var
Page: TInputOptionWizardPage;

procedure InitializeWizard();
begin
Page := CreateInputOptionPage(wpSelectTasks,'New Page', 'New Page Description.', 'Please check the box below, then click Next.', False, False);
Page.Add('Check the box');
Page.Values[0] := False;
Page.Add('Check the box2');
Page.AddEx('Sub Check the box2', 1, True);
Page.Values[2] := True;
Page.AddEx('Sub 2 Check the box2', 1, True);
end;

[/more]
Автор: Aion13
Дата сообщения: 14.12.2008 18:02
serg_aka_lain
Большое человеческое СПАСИБО тебе, Добрый Человек!
Очень мне помог, просто таки выручил. Радости нет предела!


И ещё: в коде на опрделение установки можно ли на несколько долей секунды задежать выполнение установки после удаления?
Автор: serg_aka_lain
Дата сообщения: 14.12.2008 21:18
Aion13

Цитата:
И ещё: в коде на опрделение установки можно ли на несколько долей секунды задежать выполнение установки после удаления?

Sleep();
т.е.

Exec(UnStr, '/silent', '', SW_Show, ewWaitUntilTerminated, ErrorCode);
Result := True;
Sleep(2000);
end
Автор: ingvar1972
Дата сообщения: 14.12.2008 22:08
Можно ли установить для создаваемого ярлыка (запускаемая программа консольная типа FAR) следующие параметры : тип и размер шрифта, размеры окна и буфера экрана (ширина и высота) ?
Автор: Aion13
Дата сообщения: 15.12.2008 01:11
2ALL
Помогите разобраться с нижеследующим кодом.
Здесь представлено создание 2 страницы доп задач с привязкой к папкам.
Как мне сделать так, чтобы, например "Подпапку 1" НЕЛЬЗЯ было выбрать, пока не выбран пункт "Основные папки" (они должны будут быть выделены серым в таком случае)

Код: [Code]
// Создание страницы с чекбоксами
var
Page: TInputOptionWizardPage;

[Files]
Source: подпапка 1\*; DestDir: "{app}\cstrike"; Check: SubChecked1; Flags: ignoreversion recursesubdirs createallsubdirs;
Source: подпапка 2\*; DestDir: "{app}\cstrike"; Check: SubChecked2; Flags: ignoreversion recursesubdirs createallsubdirs;


// Привязка папок из секции [Files] к чекбоксам страницы CreateInputOptionPage
function SubChecked1: Boolean;
begin
Result := Page.Values[1];
end;
function SubChecked2: Boolean;
begin
Result := Page.Values[3];
end;

// Страница чекбоксов с выбором папок
procedure InitializeWizard();
begin
Page := CreateInputOptionPage(wpSelectTasks,
'Выбор дополнительных карт', 'Какие карты Вы желаете установить?',
'Выберете карты, которые Вы хотите дополнительно установить на сервер', False, False);
Page.Add('Основные паки');
Page.AddEx('Подпапка 1', 1, False);
Page.Values[1] := True;
Page.Add('Другие папки');
Page.AddEx('Подпапка 2', 1, False);
Page.Values[3] := True;
end;
Автор: Artem_Butenko
Дата сообщения: 15.12.2008 07:47
Большая просьба к специалистам -- пожалуйста, помогите мне решить вопросы, сформулированные мною на 94 странице. Без этого я и к новому году не реализую задуманное. Буду рад Вашей помощи!
Автор: Serega0675
Дата сообщения: 15.12.2008 13:20
Здравствуйте, помогите пожалуйста исправить [more=код][Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program

[Files]
Source: ReadMe1.rtf; Flags: dontcopy
Source: ReadMe2.rtf; Flags: dontcopy
Source: ReadMe3.rtf; Flags: dontcopy

[_Code]
var
Page: TWizardPage;
ListBox: TNewCheckListBox;
Memo: TRichEditViewer;
CheckLabel: TLabel;
MouseY: integer;

procedure CheckOnClick (Sender: TObject);
begin
if MouseY < ListBox.Items.Count then
ListBox.Checked[MouseY]:= Not(ListBox.Checked[MouseY]);
end;

procedure CheckMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
MouseY:= Y/ScaleY(16);
if MouseY < ListBox.Items.Count then
Memo.RTFText:= TStrings(ListBox.ItemObject[MouseY]).Text;
end;

Procedure InitializeWizard();
begin
ExtractTemporaryFile('ReadMe1.rtf');
ExtractTemporaryFile('ReadMe2.rtf');
ExtractTemporaryFile('ReadMe3.rtf');

Page:=CreateCustomPage(3, 'Интерфейс', 'Выберите компоненты, которые вы хотите установить.')

ListBox:= TNewCheckListBox.Create(Page);
with ListBox do
begin
Left := 15
Top := 0
Width := 200
Height := 149
Parent := Page.Surface
AddCheckBox('aaa', 'ddd', 0, True, True, False, True, TStringList.Create); // здесь ругается
AddCheckBox('bbb', 'eee', 0, True, True, False, True, TStringList.Create); // здесь ругается
AddCheckBox('ccc', 'fff', 0, True, True, False, True, TStringList.Create); // здесь ругается

TStrings(ItemObject[0]).LoadFromFile(ExpandConstant('{tmp}\ReadMe1.rtf'));
TStrings(ItemObject[1]).LoadFromFile(ExpandConstant('{tmp}\ReadMe2.rtf'));
TStrings(ItemObject[2]).LoadFromFile(ExpandConstant('{tmp}\ReadMe3.rtf'));
end;

Memo:= TRichEditViewer.Create(Page);
with Memo do
begin
Left := ListBox.Left + ListBox.Width + 8;
Top := ListBox.Top;
Width := ListBox.Width
Height := ListBox.Height
Color := clBtnFace
Enabled := False
BorderStyle := bsNone
Parent := Page.Surface
end;

CheckLabel:= TLabel.Create(Page);
with CheckLabel do
begin
Width :=ListBox.Width
Height :=ListBox.Height
Autosize :=False
Transparent :=True
OnMouseMove :=@CheckMouseMove
OnClick :=@CheckOnClick
Parent :=ListBox
end;
end;[/more], а то при компиляции ругается на недействительное значение параметра...
Автор: SotM
Дата сообщения: 15.12.2008 14:42
Serega0675
У меня твой код спокойно скомпилялся (правда пришлось закоментить раздел Files и строки распаковки и загрузки *.rtf) и запустился.
Автор: clemenco
Дата сообщения: 15.12.2008 15:08
Извеняюсь за беспокойство, проблема решилась и очень просто
Автор: Serega0675
Дата сообщения: 15.12.2008 15:13
SotM

Цитата:
У меня твой код спокойно скомпилялся (правда пришлось закоментить раздел Files и строки распаковки и загрузки *.rtf) и запустился.
Спасибо.
Да интересная штука... Использую ispack-5.2.3.exe с препроцессором, обновленный Inno Setup до расширенной версии от ResTools и думал всё нормально, а именно при таком наборе и выдаёт ошибку. Нашёл в каталоге программ старого компьютера обычный Inno Setup и действительно всё скомпилировалось без проблем...
Автор: LordVeider
Дата сообщения: 15.12.2008 16:03
Такой вопрос.
Создаётся апдейтер для программы.
Основной инсталлятор проги пишет в реестр нужные данные.
Апдейтер же проверяет их наличие в реестре и при этом обновляет только те компоненты, что установлены.
Т.е. грубо говоря имеется параметр в реестре. Если у него в значении к примеру единичка - компонент ставится. Если 0 - соответственно нет.
Вопрос традиционно упёрся в реализацию.
Выдернуть параметр из реестра можно с помощью {reg:параметр}, а вот как заставить делать проверку.
Автор: SotM
Дата сообщения: 15.12.2008 16:04
Serega0675

Цитата:
обновленный Inno Setup до расширенной версии от ResTools

Ну дык, у него ведь, насколько я знаю, другое количество параметров передаваемых в функции AddCheckBox...

LordVeider
Ты бы привел пример скрипта. В хелпе написано:
RegGetSubkeyNames
RegGetValueNames
ну и т.д.

Думаю не трудно будет найти то, что нужно. К тому же, здесь время от времени это повторяется. Поиск по форуму тебе в помощь.
Автор: Serega0675
Дата сообщения: 15.12.2008 16:22
SotM

Цитата:
Ну дык, у него ведь, насколько я знаю, другое количество параметров передаваемых в функции AddCheckBox...
Я не силён в программировании и не знал об этом...
Автор: LordVeider
Дата сообщения: 15.12.2008 18:49
SotM
Гхм. Спасибо. Будем разбираться с пасквилем...

Ещё одна задача:
При выборе нужного компонента к нужному ярлыку будет добавляться нужный параметр.
Пример: есть компонент isolatedmode, если его выбрать при установке - к параметрам ярлыка программы допишется /isolated.
Таких компонентов планируется несколько, при выборе каждого к параметрам опять же будет дописываться соответствующий компоненту параметр. Поэтому вариант "тупо создать 2 варианта ярлыков" тут не катит.
Понятно что без пасквиля и тут не обойтись, но опять не понятно в какую сторону копать.

Добавлено:
Вот кстати реализация первой задачи.
Цитата:
Создаётся апдейтер для программы.
Основной инсталлятор проги пишет в реестр нужные данные.
Апдейтер же проверяет их наличие в реестре и при этом обновляет только те компоненты, что установлены.
Т.е. грубо говоря имеется параметр в реестре. Если у него в значении к примеру единичка - компонент ставится. Если 0 - соответственно нет.
Может кому пригодится.
В основной инсталлятор:
Код: [Components]
Name: component_name; Description: component_description; Types: full compact custom
[Registry]
Root: HKLM; Subkey: Software\program_name; ValueName: component_reg_name; ValueType: String; ValueData: 1; Components: component_name
Автор: Serega0675
Дата сообщения: 15.12.2008 21:19
Использую такой [more=код][Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program

[Tasks]
Name: alluser; Description: Создать иконку для всех пользователей; GroupDescription: {cm:AdditionalIcons}; Flags: exclusive
Name: user; Description: Создать иконку только для данного пользователя; GroupDescription: {cm:AdditionalIcons}; Flags: exclusive unchecked

[Dirs]
Name: {commonprograms}\My Program; Attribs: readonly; Tasks: alluser
Name: {userprograms}\My Program; Attribs: readonly; Tasks: user

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}

[INI]
Filename: {commonprograms}\My Program\Desktop.ini; Section: .ShellClassInfo; Key: IconFile; String: {app}\MyProg.exe; Tasks: alluser
Filename: {commonprograms}\My Program\Desktop.ini; Section: .ShellClassInfo; Key: IconIndex; String: 0; Tasks: alluser
Filename: {userprograms}\My Program\Desktop.ini; Section: .ShellClassInfo; Key: IconFile; String: {app}\MyProg.exe; Tasks: user
Filename: {userprograms}\My Program\Desktop.ini; Section: .ShellClassInfo; Key: IconIndex; String: 0; Tasks: user

[UninstallDelete]
Type: files; Name: {commonprograms}\My Program\Desktop.ini; Tasks: alluser
Type: files; Name: {userprograms}\My Program\Desktop.ini; Tasks: user

[Icons]
Name: {commonprograms}\My Program\My Program; Filename: {app}\MyProg.exe; WorkingDir: {app}; Tasks: alluser
Name: {userprograms}\My Program\My Program; Filename: {app}\MyProg.exe; WorkingDir: {app}; Tasks: user

[_Code]
var
ErrorCode: Integer;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssDone then
begin
Exec('attrib', ' +h +s ' + '"' + ExpandConstant('{commonprograms}\My Program\Desktop.ini') + '"', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
end;
end;
[/more], вопрос: как на файл поставить Attribs: hidden system, в зависимости от выбора расположения ярлыка? Понимаю, что нужно скорей всего использовать функцию IsTaskSelected, но каким образом не могу разобраться... Может, кто-нибудь поможет?
Автор: Aion13
Дата сообщения: 16.12.2008 04:04
Может кто-нибудь поможет решить проблемку!!!!
Инстал почти готов, осталась только вот она:
http://forum.ru-board.com/topic.cgi?forum=5&topic=27438&start=1900#4
Автор: mikutu
Дата сообщения: 16.12.2008 07:10

Цитата:
Victor_Dobrov

Вот так я представляю примерно страницу лицензии (извените что так долго, просто руки ни как до photoshop не доходили)
http://pic.ipicture.ru/uploads/081216/TQSzQzMnqQ.jpg
Автор: Artem_Butenko
Дата сообщения: 16.12.2008 12:59
Genri -- очень нуждаюсь в Вашей помощи. На странице 94 я задал два, конструктивных, на мой взгляд, вопроса. Поиск по форуму ничего не дал. Постараюсь еще детальнее описать суть проблемы. В моем инсталляторе путь установки считывается по ключу системного реестра, а страница выбора директории установки отключена. В чем проблема? Необходимо реализовать следующее, при условии, что ключ системного реестра (отражающий путь установки) не обнаружен: 1) организовать проверку (по имени и md5) наличие определенного файла рядом с исполнительным файлом инсталлятора, и если этот файл найден, то происходит распаковка инсталла "тут же"; 2) если данный файл не найден, то должно появляться диалоговое окно выбора каталога установки, и при нажати "OK" происходит распаковка файлов (в указанную папку). Буду благодарен за Ваши рекомендации. Если, конечно в Inno Setup можно реализовать эти действия.
Автор: Dermuin
Дата сообщения: 16.12.2008 18:04
Есть ли у каго исходники демки
http://forum.ru-board.com/topic.cgi?forum=5&topic=27438&start=1360#17 [?]
и скрипт для распаковки архивов FreeArc с отображением в прогрессбаре.
Автор: Diawer
Дата сообщения: 17.12.2008 15:44
Можно ли вставить в любое окно инсталлятора изображение не .bmp а .png
Нужно это затем, что формат .png поддерживает прозрачность – вот она собственно и интересует. Есть код для вставки [more=.bmp][Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

[Files]
Source: compiler:WizModernSmallImage.bmp; Flags: dontcopy

[_Code]
procedure InitializeWizard();
var
BitmapImage: TBitmapImage;
BitmapFileName: String;
begin
BitmapFileName := ExpandConstant('{tmp}\WizModernSmallImage.bmp');
ExtractTemporaryFile(ExtractFileName(BitmapFileName));
BitmapImage := TBitmapImage.Create(WizardForm);
BitmapImage.Top := WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + ScaleY(8);
BitmapImage.Left := WizardForm.DirEdit.Left;
BitmapImage.AutoSize := True;
BitmapImage.Bitmap.LoadFromFile(BitmapFileName);
BitmapImage.Parent := WizardForm.SelectDirPage;
WizardForm.TasksList.Width := ScaleX(290);
end;[/more] и [more=.png но Splash][Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

[Files]
Source: arrowright.png; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: isgsg.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression

[_Code]
procedure ShowSplashScreen(p1:HWND;p2:string;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal;p10:integer); external 'ShowSplashScreen@files:isgsg.dll stdcall delayload';

procedure InitializeWizard;
begin
WizardForm.Position:=poScreenCenter;
ExtractTemporaryFile('arrowright.png');
ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\arrowright.png',1000,3000,1000,0,255,False,$FFFFFF,10);
end;[/more], взял из GameScript Generator – может как то поможет (это все, что нашел), может уже есть готовое решение этого. Не оставьте без внимания!
Просмотрел все четыре части форума по Инно, но толи тему эту не поднимали, то ли читал (искал) не внимательно. Но факт остается фактом.
Автор: Aion13
Дата сообщения: 17.12.2008 18:53
Может найдётся добрый человек и ответить вот на это: http://forum.ru-board.com/topic.cgi?forum=5&topic=27438&start=1900#4
Автор: LordVeider
Дата сообщения: 17.12.2008 20:43
Вторую задачу кто решить поможет ?

Добавлено:
И такое ещё.
Нужно список компонентов сделать таким:

Уже спрашивали, да.
Единственный предложенный вариант - китайский мод для IS.
Качал, смотрел, не разобрался =(

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970

Предыдущая тема: Презентация


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