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

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

Автор: NumberI
Дата сообщения: 09.09.2011 09:33
Возможно ли создание циклов в секции Types?
Можно ли ее заменить полностью функцией из кода? {code:gets} А не только Name: и Description: ?

Существует ли функция для определения количества секций в INI файле? Если нет, то как их можно подсчитать?

вот примерно то что я хочу сделать

Код:
function InitializeSetup(): Boolean;
begin
for I := 1 to [количество секций в ini-файле] do
begin
str:='org'+inttostr(i);
org[i] := GetIniString(str, 'org', 'Error', 'C:\временная\example.ini');
if GetIniString(str, 'ex1', 'Error', 'C:\временная\example.ini') = '1' then
s1 :=s1 +' ' + GetIniString(str, 'org', 'Error', 'C:\временная\example.ini');
if GetIniString(str, 'ex2', 'Error', 'C:\временная\example.ini') = '1' then
s2 :=s2 +' ' + GetIniString(str, 'org', 'Error', 'C:\временная\example.ini');
end;
Result := True;
end;
Автор: ShadowHawk
Дата сообщения: 09.09.2011 09:34
qwerqwer444



Цитата:
ShadowHawk
спасибо попробую. я как раз точно знаю что у меня есть и файл и номер строчки

Н.П.

Для лучшего (гибкого) функционирования можешь добавить парочку вещей:

Проверку на существование файла и если он существует то поместить его содержимое в массив, а если нет то массив создать соответствующей размерностью и заполнить его по дефаулту.
Думаю будет полезно, что бы голова не болела .


Добавлено:
NumberI


Цитата:
[Types]
for i := 1 to [количество секций в ini-файле] do
Name: {code:gets|org[i]}; Description: {code:gets|org[i]}


По поводу твоей задачки есть соображения:

...
[Types]
; переменная для цикла
#define i

; переменная, в которую поместим кол-во циклов
#define countSection {code:getCountSection}

; создаем массив размерностью видимо по количеству секций
#dim org countSection

; итак: пишем подпрограмму, которая будет делать все что нам нужно countSection раз ( и можно )
#sub AddDescription
Name: {code:gets|org[i]}; Description: {code:gets|org[i]}
#endsub

; создаем цикл с вызовом нашей подпрограммы
#for {i = 0; i < countSection; i++} AddDescription
...
[code]
; твоя функция gets
function gets(Param: string): string;
begin
...
Result:= ...
...
end;

; твоя функция по определению кол-ва секций
; как??? это сделать пока не знаю - возможно парсить ini файл на предмет
; есть ли в начале строки символ '[' и есть ли в конце символ ']' и все символы
; между ними только буквы - вот как то так -соответственно если все условия gроверки
; выполнены то мы нашли очередную section - увеличиваем Result

function getCountSection(Param: string): integer;
begin
Result := 0;
...
Result := Result + 1;
...
end;

возможно это велосипед и есть более правильное решение. но знатоки что-то видимо то ли в отпуске то ли заняты
Автор: NumberI
Дата сообщения: 09.09.2011 14:06
ShadowHawk #define countSection {code:getCountSection}
пишет [ISPP] Expression expected but opening brace ("{") found.
Автор: ShadowHawk
Дата сообщения: 09.09.2011 15:40
NumberI

есть предложение!
список секций известен?
может все-таки массив и по нему пробежаться и что надо сделать?

Либо объясни всю проблему может (уже говорил ) есть проще и элегантней решение чем эксепшены ловить.


Цитата:
ShadowHawk #define countSection {code:getCountSection}
пишет [ISPP] Expression expected but opening brace ("{") found.


А здесь скорее всего надо написать функцию ну или взглянуть на нее

Добавлено:
NumberI

Вот например такая функция посчитает тебе кол-во секций (без проверки на правильность написания названия секции). Рядом надо положить tmp.ini


[more]

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


[Code]

function GetCountSection(FileNameINI: String): Integer;
var
S: TArrayOfString;
F: String;
i: Integer;
begin
Result := 0;
if FileExists(FileNameINI) then
begin
LoadStringsFromFile(FileNameINI, S);
for i := 0 to GetArrayLength(S)-1 do
begin
if (Pos('[', S[i]) = 1) and (Pos(']', S[i]) = Length(S[i]) ) then
begin
Result := Result + 1;
end;
end;
end;
end;


procedure MyButtonOnClick(Sender: TObject);
begin
MsgBox(IntToStr( GetCountSection('tmp.ini') ) , mbInformation, MB_OK);
end;

procedure PanelButtons();
var
MyButton: TButton;
MyPanel: TPanel;
Begin
MyPanel := TPanel.Create( WizardForm );
with MyPanel do
begin
Parent := WizardForm;
Left := WizardForm.WelcomePage.Left;
Top := WizardForm.WelcomePage.Height + ScaleX(1);
Width := WizardForm.WelcomePage.Width- 200;
Height := WizardForm.ClientHeight - WizardForm.WelcomePage.Height - 2;
Align := alBottom;
End;

WizardForm.NextButton.Parent := MyPanel;
WizardForm.CancelButton.Parent := MyPanel;
WizardForm.BackButton.Parent := MyPanel;
WizardForm.NextButton.Top := WizardForm.NextButton.Top - (WizardForm.WelcomePage.Height + ScaleX(1));
WizardForm.CancelButton.Top := WizardForm.CancelButton.Top - (WizardForm.WelcomePage.Height + ScaleX(1));
WizardForm.BackButton.Top := WizardForm.BackButton.Top - (WizardForm.WelcomePage.Height + ScaleX(1));

MyButton:=TButton.Create( WizardForm );
with MyButton do
begin
Parent:=MyPanel;
Top:=WizardForm.BackButton.Top;
Left:=WizardForm.BackButton.Left - WizardForm.BackButton.Width - 30;
Width:=WizardForm.BackButton.Width + 30;
Height:=WizardForm.BackButton.Height;
Caption:='Сколько секций';
OnClick:=@MyButtonOnClick;
Font.Name:= 'arial';
Font.Size:= 9;
Font.Style:= [fsBold, fsItalic];
end;
end;



procedure InitializeWizard();
begin
PanelButtons();
end;


[/more]
Автор: NumberI
Дата сообщения: 09.09.2011 17:06
ShadowHawk
#sub AddDescription
Name: {code:gets|org[i]}; Description: {code:gets|org[i]}
#endsub

; создаем цикл с вызовом нашей подпрограммы
#for {i = 0; i < countSection; i++} AddDescription

В org[i] индекс не присваивается и в функцию передается "org[i]", а не "org[1]", "org[2]" и т.д.
Автор: vintage_1
Дата сообщения: 09.09.2011 18:29
Здравствуйте.
Хочу представить вам свою наработку:


EXArchives.dll v.1.0b от VinTagE
Описание:
* Это распаковка архивов.
* 1 прогресс бар показывает распаковку архивов
* 2 прогресс бар показывает обработку архивов
* Сделал плавный индикатор (2 прогресс бар) обработки архивов
* Версия EXArchives.dll v.1.0b
Автор - VinTagE
-----------
Скачать
-----------


P.S.: Прошу протестировать и если найдёте какие нибудь ошибки, сообщите мне.
Спасибо за внимание =)
Автор: VaZz9
Дата сообщения: 09.09.2011 18:49
Здравствуйте, помогите решить задачу, нужно заменить при установке в уже имеющемся файле .xml рандомное значение между двумя строками (Ник)
<Nick type="string">ТутЛюбойНик</Nick>. Как это можно реализовать. Спасибо.
Автор: R3Pa4eK
Дата сообщения: 09.09.2011 20:08
All
WinExec.dll
Описание:
> Библиотека для запуска приложений и ожидания их завершения.
> Распаковка архивов: 7-zip, FreeArc, srep, precomp, oggenc.
> Активная кнопка "Отмена".
> Функция InsertNextDisk.
> В следующей версиях всё запихну в одну dll

Автор - R3Pa4eK aka dvd4el

Скачать
Автор: vintage_1
Дата сообщения: 09.09.2011 20:17
R3Pa4eK
Благодаря мне у тебя кнопка "отмена" работает.
Автор: R3Pa4eK
Дата сообщения: 09.09.2011 20:19
vintage_1
Да, признаю - спасибо.
Автор: Edison007007
Дата сообщения: 09.09.2011 21:05
R3Pa4eK
мда окончательно меня убил...
различия со скриптом от IsExc 0.7 от Volt'a...
расмотрим каждую процедуру/функцию отдельно...
[CustomMessages] {запрос диска} (разницы нет)
Поиск по маске - разницы нет.
поиск без маски - разницы нет.
распаковка ogg - различия незначительны и то из-за того что раные названия функций и в исехек есть:
type
TISCreateProcessCallback = function(): boolean;

распаковка pcf таже история что и с распаковкой ogg

PlsInsertNextDisk чуть изменена
о присутствует ZipExtract, хотя в паблике его не было, но написать 2 минуты...
различия только в том что разные функции в самой библиотеке...
Вывод наглый плагиат...

даже это:
ProgressBar1:=TNewProgressBar.Create(WizardForm);
with WizardForm.ProgressGauge do
begin
ProgressBar1.Left := WizardForm.ProgressGauge.Left;
ProgressBar1.Top := WizardForm.ProgressGauge.Top;
ProgressBar1.min:=0;
ProgressBar1.Width :=WizardForm.ProgressGauge.Width;
ProgressBar1.Height := WizardForm.ProgressGauge.Height;
ProgressBar1.Parent := WizardForm.InstallingPage;
ProgressBar1.Max:= {#MAX};
end;
end;
и то скопипастил...

Добавлено:
vintage_1
в чем разница между
procedure EXArcExtract(ArcArchName, ArcDestDir: String);
begin
If Cancel Then EXArchivesSource(ENP, ExpandConstant('{tmp}\arc.dll'), 'x ' + AddQuotes(ArcArchName) + ' -y -dp' + AddQuotes(ArcDestDir), EXArchivesProgress);
end;

и

procedure EXBinExtract(BinArchName, BinDestDir: String);
begin
If Cancel Then EXArchivesSource(ENP, ExpandConstant('{tmp}\arc.dll'), 'x ' + AddQuotes(BinArchName) + ' -y -dp' + AddQuotes(BinDestDir), EXArchivesProgress);
end;

какбэ разницы нет, только лишний код в скрипте...
Автор: vintage_1
Дата сообщения: 09.09.2011 21:15
Edison007007
Не нравится, можешь убрать =)
Все ошибки в скрипте уберу в будущей версии.
Автор: mezi
Дата сообщения: 09.09.2011 21:22
vintage_1
Один вопрос:
Кто им будет пользоваться кроме тебя ?
Ну может будут какие то кривые васи, но нормальные люди никогда, это какбы я гарантирую
та й в паблике достаточно качествених разпаковщиков архивов!. ИМХО
Автор: vintage_1
Дата сообщения: 09.09.2011 21:47
mezi
А я и не заставляю им пользоватся, я просто выложил свою работу, так что не нравится пройди мимо.
Автор: mezi
Дата сообщения: 09.09.2011 21:55
vintage_1
Вопрос остается тот же!
Автор: riperoc1
Дата сообщения: 10.09.2011 10:00
присоеденяюсь к mezi, ну нахрена
Автор: log1stable
Дата сообщения: 10.09.2011 10:36
Оцените внешний вид. Чего-то не хватает, или же наоборот?

Ссылка
Автор: PRIZ2rak
Дата сообщения: 10.09.2011 12:03
Здравствуйте. Подскажите пожалуйста код страницы:

1 стр - Содержит 3 и б. пунктов выбора (RadioButton):
Прога1
Прога2
Прога3
.........

2 стр - для каждой программы своя с возможностью выбора компонентов.

Т.е. в результате нужно получить, возможность установки только нужной программы с выбором необходимых параметров её установки.
Автор: vint56
Дата сообщения: 10.09.2011 12:46
PRIZ2rak
[more][Setup]
AppName=My Program
AppVersion=1.5
;AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputBaseFilename=setup
DirExistsWarning=no
Compression=none

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

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked

[Files]
;Models:
;Source: Scripts\*; DestDir: {app}\ModelClasicCheck; Flags: ignoreversion recursesubdirs createallsubdirs; Check: ModelClasicCheck
;Source: Scripts\*; DestDir: {app}\MaximumCheck; Flags: ignoreversion recursesubdirs createallsubdirs; Check: MaximumCheck
;Source: Scripts\*; DestDir: {app}\ModelSourceCheck; Flags: ignoreversion recursesubdirs createallsubdirs; Check: ModelSourceCheck
;Source: Scripts\*; DestDir: {app}\ModelSteamCheck; Flags: ignoreversion recursesubdirs createallsubdirs; Check: ModelSteamCheck
; Weapons:
;Source: Scripts\*; DestDir: {app}\WeaponsClasicCheck; Flags: ignoreversion recursesubdirs createallsubdirs; Check: WeaponsClasicCheck
;Source: Scripts\*; DestDir: {app}\WeaponsMaximumCheck; Flags: ignoreversion recursesubdirs createallsubdirs; Check: WeaponsMaximumCheck
;Source: Scripts\*; DestDir: {app}\WeaponsCSOCheck; Flags: ignoreversion recursesubdirs createallsubdirs; Check: WeaponsCSOCheck
;Source: Scripts\*; DestDir: {app}\WeaponsSourceCheck; Flags: ignoreversion recursesubdirs createallsubdirs; Check: WeaponsSourceCheck

[Icons]
Name: {userdesktop}\mm; Filename: {app}\my.exe; Check: MakeDesktopIcon


[Code]
var
Label1: TLabel;
DesktopIcon: TCheckBox; //ярлык на рабочем столе
//Models
Maximum: TNewRadioButton;
ModelSource: TNewRadioButton;
ModelSteam: TNewRadioButton;
ModelClasic: TNewRadioButton;

//Weapons
WeaponsSource: TNewRadioButton;
WeaponsClasic: TNewRadioButton;
WeaponsMaximum: TNewRadioButton;
WeaponsCSO: TNewRadioButton;

function MakeDesktopIcon: Boolean;
begin
Result:=DesktopIcon.Checked;
end;

// Maximum
function MaximumCheck: Boolean;
begin
Result:=Maximum.Checked;
end;

procedure MaximumOnClick(Sender: TObject);
begin
if Maximum.Checked = False then
Maximum.Checked:= True else
Maximum.Checked:= False;
end;

// Source
function ModelSourceCheck: Boolean;
begin
Result:=ModelSource.Checked;
end;

procedure ModelSourceOnClick(Sender: TObject);
begin
if ModelSource.Checked = False then
ModelSource.Checked:= True else
ModelSource.Checked:= False;
end;

// Steam
function ModelSteamCheck: Boolean;
begin
Result:=ModelSteam.Checked;
end;

procedure ModelSteamOnClick(Sender: TObject);
begin
if ModelSteam.Checked = False then
ModelSteam.Checked:= True else
ModelSteam.Checked:= False;
end;

// Clasic
function ModelClasicCheck: Boolean;
begin
Result:=ModelClasic.Checked;
end;

procedure ModelClasicOnClick(Sender: TObject);
begin
if ModelClasic.Checked = False then
ModelClasic.Checked:= True else
ModelClasic.Checked:= False;
end;

// Clasic
function WeaponsClasicCheck: Boolean;
begin
Result:=WeaponsClasic.Checked;
end;

procedure WeaponsClasicOnClick(Sender: TObject);
begin
if WeaponsClasic.Checked = False then
WeaponsClasic.Checked:= True else
WeaponsClasic.Checked:= False;
end;

// Maximum
function WeaponsMaximumCheck: Boolean;
begin
Result:=WeaponsMaximum.Checked;
end;

procedure WeaponsMaximumOnClick(Sender: TObject);
begin
if WeaponsMaximum.Checked = False then
WeaponsMaximum.Checked:= True else
WeaponsMaximum.Checked:= False;
end;

// WeaponsCSO
function WeaponsCSOCheck: Boolean;
begin
Result:=WeaponsCSO.Checked;
end;

procedure WeaponsCSOOnClick(Sender: TObject);
begin
if WeaponsCSO.Checked = False then
WeaponsCSO.Checked:= True else
WeaponsCSO.Checked:= False;
end;

//Source
function WeaponsSourceCheck: Boolean;
begin
Result:=ModelSource.Checked;
end;

procedure WeaponsSourceOnClick(Sender: TObject);
begin
if WeaponsSource.Checked = False then
WeaponsSource.Checked:= True else
WeaponsSource.Checked:= False;
end;


procedure InitializeWizard();
var
p1,p2:TPanel;
begin
WizardForm.TasksList.Hide;

p1:=TPanel.Create(WizardForm.SelectTasksPage);
with p1 do begin
SetBounds(0,30,200,200);
Parent:=WizardForm.SelectTasksPage;
BevelOuter:=bvNone;
BevelInner:=bvNone;
end;

p2:=TPanel.Create(WizardForm.SelectTasksPage);
with p2 do begin
SetBounds(p1.Left+p1.Width+10,30,200,200);
Parent:=WizardForm.SelectTasksPage;
BevelOuter:=bvNone;
BevelInner:=bvNone;
end;


{ Label1 }
Label1 := TLabel.Create(WizardForm);
with Label1 do
begin
Name := 'Label1';
Parent := p1;
Caption := 'Дополнительные значки:';
Transparent:=True;
Left := ScaleX(0);
Top := ScaleY(10);
Width := ScaleX(126);
Height := ScaleY(13);
end;

{Создание чекбокса для создания ярлыка на рабочем столе}
DesktopIcon := TCheckBox.Create(WizardForm);
with DesktopIcon do
begin
Caption := 'Создать значок на Рабочем столе';
Left := ScaleX(5);
Top := Top+30;
Width := ScaleX(400);
Height := ScaleY(15);
TabOrder := 0;
Checked := True;
Parent := p1;
end;

{ Clasic }
ModelClasic := TNewRadioButton.Create(WizardForm);
with ModelClasic do
begin
Name := 'ModelClasic';
Parent := p1;
Left := ScaleX(6);
Top := ScaleY(65);
Width := ScaleX(177);
Height := ScaleY(17);
Caption := 'Модели игроков Classic';
Checked:=True;
end;

{ Maximum }
Maximum := TNewRadioButton.Create(WizardForm);
with Maximum do
begin
Name := 'Maximum';
Parent := p1;
Left := ScaleX(6);
Top := ScaleY(95);
Width := ScaleX(177);
Height := ScaleY(17);
Caption := 'Модели игроков CS 1.6 Maximum';
end;
{Source}
ModelSource := TNewRadioButton.Create(WizardForm);
with ModelSource do
begin
Name := 'ModelSource';
Parent := p1;
Left := ScaleX(6);
Top := ScaleY(125);
Width := ScaleX(145);
Height := ScaleY(17);
Caption := 'Модели игроков Source';
end;
{Steam }
ModelSteam := TNewRadioButton.Create(WizardForm);
with ModelSteam do
begin
Name := 'ModelSteam';
Parent := p1;
Left := ScaleX(6);
Top := ScaleY(155);
Width := ScaleX(145);
Height := ScaleY(17);
Caption := 'Модели игроков Steam';
end;
{WeaponsClasic }
WeaponsClasic := TNewRadioButton.Create(WizardForm);
with WeaponsClasic do
begin
Name := 'WeaponsClasic';
Parent := p2;
Left := ScaleX(6);
Top := ScaleY(65);
Width := ScaleX(177);
Height := ScaleY(17);
Caption := 'Модели оружия Classic';
Checked:=True;
end;

{WeaponsMaximum }
WeaponsMaximum := TNewRadioButton.Create(WizardForm);
with WeaponsMaximum do
begin
Name := 'WeaponsMaximum';
Parent := p2;
Left := ScaleX(6);
Top := ScaleY(95);
Width := ScaleX(177);
Height := ScaleY(17);
Caption := 'Модели оружия CS 1.6 Maximum';
end;

{ WeaponsCSo }
WeaponsCSo := TNewRadioButton.Create(WizardForm);
with WeaponsCSo do
begin
Name := 'WeaponsCSo';
Parent := p2;
Left := ScaleX(6);
Top := ScaleY(125);
Width := ScaleX(145);
Height := ScaleY(17);
Caption := 'Модели оружия CSO';
end;

{WeaponsSource }
WeaponsSource := TNewRadioButton.Create(WizardForm);
with WeaponsSource do
begin
Name := 'WeaponsSource';
Parent := p2;
Left := ScaleX(6);
Top := ScaleY(155);
Width := ScaleX(145);
Height := ScaleY(17);
Caption := 'Модели игроков Source';
end;
end;[/more]
Автор: R3Pa4eK
Дата сообщения: 10.09.2011 13:17
Протестируйте инсталлятор: http://rghost.ru/21071931
Автор: Zloy_Gelud
Дата сообщения: 10.09.2011 13:31
R3Pa4eK

Наверно никто из вас не тестирует свои инсталляторы на классическом оформлении Винды? Ибо у всех все криво/косо..
Автор: Y4enik32
Дата сообщения: 10.09.2011 13:43
R3Pa4eK, в конце после установки игры пишет неверный путь к установленной игре.
Автор: R3Pa4eK
Дата сообщения: 10.09.2011 13:46
Zloy_Gelud
У меня нормально отображается.
Y4enik32
Спасибо! Сейчас посмотрим!
Автор: PRIZ2rak
Дата сообщения: 10.09.2011 13:49
vint56, в данном коде нет 2-й страницы, возможностью выбора компонентов!
Автор: Vasario85
Дата сообщения: 10.09.2011 14:00
Помогите!!!
Люди,что в скрипте нужно прописать,так чтоб DirectX устанавливался через интернет.
Инсталятор от Юршата NFSU.
Автор: Karbid87
Дата сообщения: 10.09.2011 14:03
R3Pa4eK
Я заметил это и значок деинсталлятора в меню пуск прописан неверно
Автор: PavZver
Дата сообщения: 10.09.2011 14:11
Karbid87
это все мелочи. подогнать любой сможет.
Zloy_Gelud
у меня такого косяка нет. тока у тебя.

R3Pa4eK у тебя даже получилось лучше чем у каталистов)
скрипт выкладывать будешь?
кста компоненты просто слева
Автор: R3Pa4eK
Дата сообщения: 10.09.2011 14:17
PavZver

Цитата:
у тебя даже получилось лучше чем у каталистов)

У них нормальная страница Завершения

Цитата:
скрипт выкладывать будешь?

Пока что - нет.

Цитата:
кста компоненты просто слева

Я твоя не понимать.
Автор: Zloy_Gelud
Дата сообщения: 10.09.2011 14:17
R3Pa4eK
PavZver

Наверно это из-за этого:

Так что
Автор: meekrab
Дата сообщения: 10.09.2011 14:18
R3Pa4eK
Тебе над ним работать и работать ты да же с фаиири не разобрался.
Открывается с боку стр. финиш срабатывает раньше потом все кнопки и лого через фаири.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177

Предыдущая тема: поиск


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