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

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

Автор: Diawer
Дата сообщения: 10.11.2008 16:27
htuos
Благодарю за помощь, единственный вопрос, когда в меню выбираешь язык, фон меняется с белого на серый, а что бы он сразу был такой, т.е. также как в самом Inno в выборе языка, вставлял типа LangEdit.Color:=clSilver, но дает не тот результат.

А спросил про ваш вариант с целью изучения возможных решений, я уже несколько месяцев не упаковывал проги, изучаю.


Добавлено:
Artem_Butenko

Цитата:
Что здесь не так? Во-первых, необходимо, чтобы каждый файл срабатывал один раз, а у меня они запускаются дважды. Во-вторых, константа {src} не срабатывает и файлы, которые по идее должны лежать рядом с исполнительным файлом инсталлятора, просто пакуются в него!

Может их не прописывать в [Files]
Автор: GriSky
Дата сообщения: 10.11.2008 16:33
Подскажите всеже, мучаюсь вопросом, возможно ли добавить дополнительное окно для ввода пользователем данных, и последующее использование этиз данных для прописывания строчек в конфигурационных файлах?
Автор: Diawer
Дата сообщения: 10.11.2008 16:55
htuos
Вопрос снимается, дело не в цвете, а что по умолчанию выбрана эта функция.
Все отлично, спасибо.



Добавлено:
Sampron
Спасибо
Автор: Genri
Дата сообщения: 10.11.2008 17:14
Artem_Butenko

Цитата:
почему упаковываются в исполнительный файл инсталлятора файлы "MyProgram1.ex_" и "MyProgram2.ex_", ведь на них стоит константа {src}.
-- константа {src} у тебя прописана в параметре DestDir. Этот параметр определяет куда будут установлены эти файлы. А вот откуда брать файлы (внешние или из самого инсталлятора), определяет флаг external. А он у тебя не прописан.
Автор: Artem_Butenko
Дата сообщения: 10.11.2008 17:37
Genri -- спасибо, понял. Ранее задавал Вам вопрос, но, видимо, Вы были заняты. Не судите строго, постараюсь изложить идею повторно. Можно ли забэкапить файлы в папке назначения, если инсталлятор распаковывает файлы патча из внешнего *.zip-архива?
Автор: Sig666
Дата сообщения: 10.11.2008 17:39
htuos

Большое спасибо, это именно то, что нужно.
Автор: Genri
Дата сообщения: 10.11.2008 18:13
Artem_Butenko

Цитата:
Можно ли забэкапить файлы в папке назначения, если инсталлятор распаковывает файлы патча из внешнего *.zip-архива?
-- в принципе можно. Но для этого надо либо иметь список файлов из архива и бекапить по списку; либо распаковывать архив во временную папку, строить тот же список и после бекапа по списку переносить файлы.
В любом случае, это трудоемко.
Автор: skeptik_vdm
Дата сообщения: 10.11.2008 19:10
Всем доброго времени суток!
Ребята помогите мне пожалуйста! Вы не подскажете как будет выглядеть код чтобы он показывал системные требования компьютера и чтоб на странице выбора директории показывало список с локальными дисками????
Автор: Genri
Дата сообщения: 10.11.2008 19:32
Diawer

Цитата:
...если имя файла длинное и не влазит в окно, а также не имеет пробелов то оно не переносится...
-- значит надо добавить пробелы [more]
Код: [no]
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program

[Files]
Source: Files\*; DestDir: {app}

[Code]
const
bidDelAll = 1;
bidSkipAll = 2;
var
Form: TSetupForm;
CheckListBox: TNewCheckListBox;
AllButton, UnAllButton: TButton;
CancelButton, DelButton: TButton;

MsgForm: TSetupForm;
MsgAllButton, MsgSkipAllButton: TButton;
MsgCancelButton, MsgDelButton: TButton;

DelAllReadOnly: Boolean;
SkipAllReadOnly: Boolean;

function Size64(Hi, Lo: integer): Extended;
var
i: integer;
begin
Result:= Lo;
if Lo < 0 then
Result:= Result + 2147483647 + 2147483647 + 2;
i:= Hi;
while i > 0 do
begin
Result:= Result + 2147483647 + 2147483647 + 2;
i:= i - 1;
end;
end;

function FormatString(FileName: string; Level: byte; SizeLength: integer): string;
var
i, j: integer;
begin
j:= 44 - 3*Level - SizeLength;
if Length(FileName) > j then
for i:= j to Length(FileName) do
begin
Insert(' ', FileName, i);
i:= i + j;
end;
Result:= FileName;
end;

procedure FillListBox(const fromDir, fileMask: string; Level: Byte);
var
FSR, DSR: TFindRec;
FindResult: Boolean;
APath, SizeString: string;
i: integer;
begin
APath := AddBackslash(fromDir);
FindResult := FindFirst(APath + fileMask, FSR);
try
while FindResult do
begin
if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
begin
SizeString:= FloatToStr(Size64(FSR.SizeHigh, FSR.SizeLow)) + ' byte';
{files} i:= CheckListBox.AddCheckBox(FormatString(FSR.Name, Level, Length(SizeString)),
SizeString,
Level, True, True, False, True, TStringList.Create);
TStrings(CheckListBox.ItemObject[i]).Text:= APath + FSR.Name;
end;
FindResult := FindNext(FSR);
end;
FindResult := FindFirst(APath + '*.*', DSR);
while FindResult do
begin
if ((DSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and
not ((DSR.Name = '.') or (DSR.Name = '..')) then
begin
{dir} i:= CheckListBox.AddCheckBox(DSR.Name,'DIR', Level,
True, True, False, True, TStringList.Create);
TStrings(CheckListBox.ItemObject[i]).Text:= APath + DSR.Name;
{Recursion} FillListBox(APath + DSR.Name, fileMask, Level+1);
end;
FindResult := FindNext(DSR);
end;
finally
FindClose(FSR);
FindClose(DSR);
end;
end;

procedure ButtonOnClick(Sender: TObject);
begin
if TButton(Sender).Tag = 0 then
CheckListBox.CheckItem(0, coCheckWithChildren)
else
CheckListBox.CheckItem(0, coUnCheck);
end;

procedure MsgButtonOnClick(Sender: TObject);
begin
Case TButton(Sender).Tag of
bidDelAll : DelAllReadOnly:= True;
bidSkipAll: SkipAllReadOnly:= True;
end;
MsgForm.Close;
end;

function DelMsgBox(FileName: string): Boolean;
var
MsgLabel: TLabel;
begin
MsgForm:= CreateCustomForm;
MsgForm.ClientWidth := ScaleX(400);
MsgForm.ClientHeight := ScaleY(120);
MsgForm.Caption := 'Files to delete';
MsgForm.Center;

MsgLabel := TLabel.Create(MsgForm);
MsgLabel.Left := ScaleX(20);
MsgLabel.Top := ScaleY(20);
MsgLabel.Caption:= FileName + ' is protected file or directory!' + #10#10#13 + 'Do you want to delete the file with READONLY attribute?';
MsgLabel.Parent := MsgForm;

MsgAllButton := TButton.Create(MsgForm);
MsgAllButton.Parent := MsgForm;
MsgAllButton.Width := ScaleX(75);
MsgAllButton.Height := ScaleY(23);
MsgAllButton.Left := ScaleX(20);
MsgAllButton.Top := MsgForm.ClientHeight - ScaleY(23 + 10);
MsgAllButton.Caption := 'Delete All';
MsgAllButton.Tag:= bidDelAll;
MsgAllButton.OnClick := @MsgButtonOnClick;

MsgSkipAllButton := TButton.Create(MsgForm);
MsgSkipAllButton.Parent := MsgForm;
MsgSkipAllButton.Width := ScaleX(75);
MsgSkipAllButton.Height := ScaleY(23);
MsgSkipAllButton.Left := MsgAllButton.Left + MsgAllButton.Width + ScaleX(10);
MsgSkipAllButton.Top := MsgForm.ClientHeight - ScaleY(23 + 10);
MsgSkipAllButton.Caption := 'Skip All';
MsgSkipAllButton.Tag:= bidSkipAll;
MsgSkipAllButton.OnClick := @MsgButtonOnClick;

MsgCancelButton := TButton.Create(MsgForm);
MsgCancelButton.Parent := MsgForm;
MsgCancelButton.Width := ScaleX(75);
MsgCancelButton.Height := ScaleY(23);
MsgCancelButton.Left := MsgForm.ClientWidth - MsgCancelButton.Width - ScaleX(20);
MsgCancelButton.Top := MsgForm.ClientHeight - ScaleY(23 + 10);
MsgCancelButton.Caption := 'Skip';
MsgCancelButton.ModalResult := mrCancel;

MsgDelButton := TButton.Create(MsgForm);
MsgDelButton.Parent := MsgForm;
MsgDelButton.Width := ScaleX(75);
MsgDelButton.Height := ScaleY(23);
MsgDelButton.Left := MsgCancelButton.Left - MsgDelButton.Width - ScaleX(10);
MsgDelButton.Top := MsgForm.ClientHeight - ScaleY(23 + 10);
MsgDelButton.Caption := 'Delete';
MsgDelButton.ModalResult := mrOk;

MsgForm.ActiveControl:= MsgCancelButton;

if MsgForm.ShowModal() = mrOk then
Result:= True
else
Result:= False;
end;

procedure DeleteFiles();
var
SR: TFindRec;
i: integer;
str: string;
ResultCode: Integer;
begin
DelAllReadOnly:= False;
SkipAllReadOnly:= False;
for i:= CheckListBox.Items.Count - 1 downto 0 do
begin
if CheckListBox.State[i] = cbChecked then
begin
str:= Trim(TStrings(CheckListBox.ItemObject[i]).Text);
FindFirst(str, SR);
if ((SR.Attributes and FILE_ATTRIBUTE_READONLY) = FILE_ATTRIBUTE_READONLY) then
if Not (DelAllReadOnly or SkipAllReadOnly) then
if DelMsgBox(SR.Name) then
Exec('attrib', ' -h -s -r ' + '"' + str + '"',
'', SW_HIDE, ewWaitUntilTerminated, ResultCode);
if DelAllReadOnly then
Exec('attrib', ' -h -s -r ' + '"' + str + '"',
'', SW_HIDE, ewWaitUntilTerminated, ResultCode);

FindClose(SR);
DeleteFile(str);
RemoveDir(str);
end;
end;
end;

procedure BrowseRemainedFiles();
begin
Form:= CreateCustomForm;
Form.ClientWidth := ScaleX(400);
Form.ClientHeight := ScaleY(400);
Form.Caption := 'Files to delete';
Form.Center;

CheckListBox := TNewCheckListBox.Create(Form);
CheckListBox.Left:= ScaleX(20);
CheckListBox.Top:= ScaleY(20);
CheckListBox.Width:= Form.ClientWidth - ScaleX(20*2);
CheckListBox.Height:= Form.ClientHeight - ScaleY(23*2 + 20);
CheckListBox.Font.Name:= 'Courier New';
CheckListBox.Parent:= Form;

AllButton := TButton.Create(Form);
AllButton.Parent := Form;
AllButton.Width := ScaleX(75);
AllButton.Height := ScaleY(23);
AllButton.Left := ScaleX(20);
AllButton.Top := Form.ClientHeight - ScaleY(23 + 10);
AllButton.Caption := 'Select All';
AllButton.Tag:= 0;
AllButton.OnClick := @ButtonOnClick;

UnAllButton := TButton.Create(Form);
UnAllButton.Parent := Form;
UnAllButton.Width := ScaleX(75);
UnAllButton.Height := ScaleY(23);
UnAllButton.Left := AllButton.Left + AllButton.Width + ScaleX(10);
UnAllButton.Top := Form.ClientHeight - ScaleY(23 + 10);
UnAllButton.Caption := 'Clear All';
UnAllButton.Tag:= 1;
UnAllButton.OnClick := @ButtonOnClick;

CancelButton := TButton.Create(Form);
CancelButton.Parent := Form;
CancelButton.Width := ScaleX(75);
CancelButton.Height := ScaleY(23);
CancelButton.Left := Form.ClientWidth - CancelButton.Width - ScaleX(20);
CancelButton.Top := Form.ClientHeight - ScaleY(23 + 10);
CancelButton.Caption := 'Cancel';
CancelButton.ModalResult := mrCancel;
CancelButton.Cancel := True;

DelButton := TButton.Create(Form);
DelButton.Parent := Form;
DelButton.Width := ScaleX(75);
DelButton.Height := ScaleY(23);
DelButton.Left := CancelButton.Left - DelButton.Width - ScaleX(10);
DelButton.Top := Form.ClientHeight - ScaleY(23 + 10);
DelButton.Caption := 'Delete';
DelButton.ModalResult := mrOk;

Form.ActiveControl:= CancelButton;

CheckListBox.AddCheckBox(ExpandConstant('{app}'), '', 0, True, True, False, True, TStringList.Create);
TStrings(CheckListBox.ItemObject[0]).Text:= ExpandConstant('{app}');
FillListBox(ExpandConstant('{app}'), '*', 1);

if Form.ShowModal() = mrOk then DeleteFiles();
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if DirExists(ExpandConstant('{app}')) and (CurUninstallStep = usPostUninstall) then
BrowseRemainedFiles();
end; [/no]
Автор: Acton
Дата сообщения: 10.11.2008 21:27
подскажите, есть ли еще какие-нибудь распаковщики инсталяторов?
А то инсталятор есть, но похоже не этой прогой заделан.
Inno Setup Unpacker его не берет.
Хотелось бы распаковать.

Автор: Artworks
Дата сообщения: 10.11.2008 21:31
7 zip пробовали. Он некоторые берет.
Автор: Acton
Дата сообщения: 10.11.2008 21:39
Нет он его не берет.
Пользовался поиском, но ничего не дало.
Поэтому может кто знает еще какие-нибудь распаковщики!!
Автор: Artworks
Дата сообщения: 10.11.2008 22:07
попобуй воспользоваться программой для определения типа файла
например вот этой
PE iDentifier
http://forum.ru-board.com/topic.cgi?action=addbookmark&forum=5&topic=11038&start=20
Автор: Acton
Дата сообщения: 10.11.2008 23:01
вот получил такую инфу.
Microsoft Visual C++ 6.0

Чем ее вскрыть?
Автор: htuos
Дата сообщения: 10.11.2008 23:20
skeptik_vdm

Цитата:
Вы не подскажете как будет выглядеть код чтобы он показывал системные требования компьютера и чтоб на странице выбора директории показывало список с локальными дисками????

Corona Skin & Check System Requirements тебе в помощь (в шапке темы)
Автор: Genri
Дата сообщения: 11.11.2008 01:17
GriSky

Цитата:
как вставить в инсталятор дополнительное окно с фомой ввода данных, нужен Nik, password, IP чтоб эти данные можно было вставить в конфигурационные файлы.
IP и password нужен для INI файла
А вот Nik и password необходимо вставить в текстовый файл, просто дописанием строчки
-- "Кто на ком стоял??"(С)Собачье сердце
Когда речь идет об ини-файле, надо указывать и название секции. Так же, желательно указывать и расположение файлов. Хотя, если интересует только принцип, можешь использовать следующий [more=пример.]
Код: [no]
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program

[Code]
var
Page1, Page2: TInputQueryWizardPage;

procedure InitializeWizard();
begin
Page1 := CreateInputQueryPage(wpWelcome,
'Personal Information', 'Who are you?',
'Please specify your personal info, then click Next.');
Page1.Add('Nickname:', False);
Page1.Add('AMX password:', False);
Page1.Add('PBOT password:', False);

Page2 := CreateInputQueryPage(Page1.ID,
'Personal Information', 'Who are you?',
'Please specify your personal info, then click Next.');
Page2.Add('IP address:', False);
Page2.Add('RCON password:', False);
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssPostInstall then
begin
SaveStringToFile(ExpandConstant('{app}\config.cfg'), #13#10+'name "'+Page1.Values[0]+'"', True);
SaveStringToFile(ExpandConstant('{app}\autoexec.cfg'), #13#10+'setinfo _pw "'+Page1.Values[1]+'"', True);
SaveStringToFile(ExpandConstant('{app}\autoexec.cfg'), #13#10+'setinfo "_pbadminpw" "'+Page1.Values[2]+'"', True);
SaveStringToFile(ExpandConstant('{app}\users.ini'), #13#10+'"'+Page1.Values[0]+'" "'+
Page1.Values[1]+'" "abcdefghijklmnopqrstu" "a"', True);
SetIniString('SectionName', 'GameServerAddr', Page2.Values[0], ExpandConstant('{app}\config.ini'));
SetIniString('SectionName', 'GameServerPass', Page2.Values[1], ExpandConstant('{app}\config.ini'));
SetIniString('SectionName', 'HostConnectList', Page2.Values[0], ExpandConstant('{app}\config.ini'));
end;
end; [/no]
Автор: GriSky
Дата сообщения: 11.11.2008 05:21
Genri

Спасибо, попробую понять, а про ини дело в том что это именно и не *.INI а файл с некоторым расшерением, в котором прописана сторочка. Если туда добавить любую секцию, [pass] например, или прописать не
setinfo "_pw" "password", а
setinfo "_pw" = "password"
то файл уже не работает.
Автор: Diawer
Дата сообщения: 11.11.2008 07:53
Genri
Я уже и не надеялся на помощь, сейчас буду пробовать.

Acton

Цитата:
подскажите, есть ли еще какие-нибудь распаковщики инсталяторов?
А то инсталятор есть, но похоже не этой прогой заделан.
Inno Setup Unpacker его не берет.
Хотелось бы распаковать.

http://www.legroom.net - Universal Extractor - Распаковывает много че, но не все, подобных прог не видел, единственный минус редко (не часто) обновляется.


Добавлено:
Тут поднималась тема о изменении окна компонентов, смотрится хорошо но пропали в отличии от оригинала отображение размеров компонентов напротив, как то можно их вернуть?
[more][Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

[Components]
Name: Main; Description: My program™; Types: full custom; Flags: fixed
Name: Main\english; Description: English version; Flags: exclusive
Name: Main\russian; Description: Russian version; Flags: exclusive
Name: Help; Description: Help; Types: full custom
Name: Help\Documentation; Description: Documentation; Types: full custom
Name: Help\Manual; Description: User manual; Types: full custom

[Files]
Source: compiler:descctrl.dll; Flags: dontcopy

[Code]
function enabledesc(ComponentsListHandle: HWND; DescLabelHandle: HWND; DescStrings: PChar): BOOL; external 'enabledesc@files:descctrl.dll stdcall';
function disabledesc(): BOOL; external 'disabledesc@files:descctrl.dll stdcall';

procedure DeinitializeSetup();
begin
disabledesc();
end;

procedure InitializeWizard();
begin
WizardForm.TypesCombo.Visible:=False;
WizardForm.ComponentsList.Height := WizardForm.ComponentsList.Height + WizardForm.ComponentsList.Top - WizardForm.TypesCombo.Top;
WizardForm.ComponentsList.Top := WizardForm.TypesCombo.Top;
WizardForm.ComponentsList.Width := ScaleX(417);
end;[/more]
Автор: Genri
Дата сообщения: 11.11.2008 09:01
Diawer

Цитата:
пропали в отличии от оригинала отображение размеров компонентов напротив
-- а какие размеры ты ожидал увидеть в примере? 5кб? 500кб? 234Мб?
Дальше сам догадаешься?
Автор: skeptik_vdm
Дата сообщения: 11.11.2008 09:33

Цитата:
htuos


Цитата:
Corona Skin & Check System Requirements тебе в помощь (в шапке темы)


Спасибо за совет но я уже как дня 2 рассматривал Corona Skin и у меня ни как не получалось это осуществить может даш сам код как реализовать сис.требования и список с локал. дисками пожалуйста????

Автор: Acton
Дата сообщения: 11.11.2008 10:04

Цитата:
http://www.legroom.net - Universal Extractor - Распаковывает много че, но не все, подобных прог не видел, единственный минус редко (не часто) обновляется.

Спасибо. Но не работает. Пишет, что это Microsoft Visual C++ 6.0
Чем вскрыть его - хрен знает!
Автор: KurtWagner
Дата сообщения: 11.11.2008 10:44
Чуваки раз 3-ий пищу ну реально помогите... Поправте код
[more]
[_Code]
var
InstallLocation: String;
errCode: Integer;
procedure InitializeWizard();
var
MD5: String;
begin
MD5 := GetMD5OfString('сool')
WizardForm.PasswordEdit.Visible:= False;
WizardForm.PasswordEdit.Text:= MD5;
end;
type TSystemTime = record wYear, wMonth, wDayOfWeek, wDay, wHour, wMinute, wSecond, wMilliseconds: word; end;

procedure GetLocalTime(var lpSystemTime: TSystemTime); external 'GetLocalTime@kernel32 stdcall delayload';
function SystemTimeToFileTime(const lpTime: TSystemTime; var lpFileTime: TFileTime): Boolean; external 'SystemTimeToFileTime@kernel32 stdcall delayload';
function CompareFileTime(const lpFileTime1, lpFileTime2: TFileTime): LongInt; external 'CompareFileTime@kernel32 stdcall delayload';

#ifdef TimeLimit
Function TimeLimit: Boolean; var lt, dateLimit: TSystemTime; LocalTime, LimitTime: TFileTime;
Begin
#for {M[0] = 59; Pos(':', TimeLimit); M[0]++} M[M[0]] = Int(Copy(TimeLimit,,Pos(':', TimeLimit)-1)), TimeLimit = Copy(TimeLimit,Pos(':', TimeLimit)+1)
#expr M[M[0]] = TimeLimit
dateLimit.wYear:= {#Int(M[59])}; dateLimit.wMonth:= {#Int(M[60])}; dateLimit.wDay:= {#Int(M[61])}; dateLimit.wHour:= {#Int(M[62])}; dateLimit.wMinute:= {#Int(M[63])};
GetLocalTime(lt); SystemTimeToFileTime(lt, LocalTime); SystemTimeToFileTime(dateLimit, LimitTime)
Result:= not(CompareFileTime(LimitTime, LocalTime) = -1)
End;
#endif
function InitializeSetup(): Boolean;
var
ErrorCode: Integer;
Autorun : Boolean;
begin

Autorun := RegKeyExists(HKLM,'SOFTWARE\{#Author}\');
if Autorun =true then
begin
Result := true;
end;
if Autorun = false then
begin
Autorun := RegKeyExists(HKLM,'SOFTWARE\{#Reglnk}');
if Autorun =true then
begin
Result := true;
end;

if Autorun =false then
begin

Result:=false;
end
else
begin
Result:=false;
ShellExec('open', ExpandConstant('{reg:HKLM\Software\{#Reglnk},{#lnk}|}') + '\{#MyAppExeName}', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
begin
if not TimeLimit then MsgBox('Привет.', mbError, MB_OK)
else Result:= True;
end;
end;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpPassword then
WizardForm.NextButton.OnClick(WizardForm.NextButton);
end;[/more]
Автор: Genri
Дата сообщения: 11.11.2008 11:45
KurtWagner

Цитата:
Чуваки раз 3-ий пищу ну реально помогите... Поправте код
-- чувак, ты предлагаешь лазить по теме и искать описание проблемы?
Автор: RMKusto
Дата сообщения: 11.11.2008 11:54
Подскажите пожалуйста как делать диалоговые окна в Inno setup? Ответы которые вписывает пользователь должны вписываться в файл test.bat в определённое место например

В процессе установки setup спрашивает: Сколько лет? Пользователь отвечает: "X", Это значение "X" заносится в код ниже вместо "enter_your_age"

Второй вопрос, как сделать чтобы несколько вопросов задать в одном диалоновом окне, как задать их отдельно, как next Step?



Код:
procedure CurStepChanged(CurStep: TSetupStep);
begin
if (CurStep=ssPostInstall) then
SaveStringToFile(ExpandConstant('{app}\test.bat'),
'@echo off' + Age: "enter_your_age" + 'nevermind',True)
end;
Автор: Genri
Дата сообщения: 11.11.2008 12:14
RMKusto -- я так понимаю, речь идет не о диалоговых окнах, а о страницах. Чуть выше, я давал пример нескольких страниц. [more]
Код: [no]
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program

[Code]
var
Page: TInputQueryWizardPage;

procedure InitializeWizard();
begin
Page := CreateInputQueryPage(wpWelcome,
'Personal Information', 'Who are you?',
'Please specify your personal info, then click Next.');
Page.Add('Сколько Вам лет?', False);
Page.Add('Совершали ли Вы преступления против человечества?', False);
Page.Add('Если да, поясните:', False);
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssPostInstall then
begin
SaveStringToFile(ExpandConstant('{app}\test.bat'),
'@echo off' + #13#10 +
'Age: "' + Page.Values[0] + '" nevermind',True)
end;
end; [/no]
Автор: RMKusto
Дата сообщения: 11.11.2008 12:41
Genri - да спасибо, это именно то, что надо.

Только несколько вопросов: Приведённый выше пример прописывает в файл только ответ на первый вопрос (Сколько Вам лет?). Остальные даже если ввести в файл не прописываются.

Я что-то сделал не так? Или так и должно быть?


Как сделать чтобы прописывались ответы на все вопросы?


Автор: Genri
Дата сообщения: 11.11.2008 13:01
RMKusto -- в этом примере, сохраняется только одно поле (как в твоем вопросе). Для доступа к другим полям, используй Page.Values[1], Page.Values[2] и т.д. Пример нескольких полей и нескольких страниц, с сохранением в несколько файлов смотри чуть выше - http://forum.ru-board.com/topic.cgi?forum=5&topic=27438&start=1480#7
Описание функции смотри в хелпе в разделе Pascal Scripting: Support Functions Reference: Custom Setup Wizard Page functions: CreateInputQueryPage
Автор: Diawer
Дата сообщения: 11.11.2008 13:11
Genri
Вы волшебник, я уже реально и не ждал помощи, ваш вариант – хорошее решение этого вопроса.


Цитата:
а какие размеры ты ожидал увидеть в примере? 5кб? 500кб? 234Мб?
Дальше сам догадаешься?

Да, ступил, в тестах ведь использую пустышки.

Еще такой вопросик, пока вас не было я спрашивал, что может можно сделать горизонтальную прокрутку и htuos написал такую вещь как основу
Цитата:
SendMessage(CheckListBox.Handle,$0194,CheckListBox.Width*2,0);

добавив, что очень много заморочек с этим. Это действительно трудно сделать горизонтальную прокрутку, я спрашиваю не для конкретно вашего кода, а вообще у меня есть идеи, где это использовать.

skeptik_vdm

Цитата:
как будет выглядеть код, чтобы он показывал системные требования компьютера

Качай из шапки Коллекция скриптов и Сборник вопросов, там, в архиве есть Ultimate test.iss – это и есть системные требования компьютера.
Компилить надо препроцессор.
Автор: Forslay
Дата сообщения: 11.11.2008 14:16
Интересно, когда компилятор новой версии выйдет... 8*(
Автор: Don_Juan
Дата сообщения: 11.11.2008 14:22
Ребят, помогите с моим вопросом, пожалуйста:
"как можно сделать в таске чек бокс если он отмечен, то создаются ярлыки на рабочий стол для всех пользователей, а не только для текущего. тоже самое и с ярлыками группы в меня пуск."

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970

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


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