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

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

Автор: Genri
Дата сообщения: 28.12.2006 02:35
maxdddca123

Цитата:
Вы меня не так наверно поняли.
-- действительно. не так понял. Тогда так:
Код:
procedure CurPageChanged(CurPageID: Integer);
var
i: integer;
begin
with WizardForm.ReadyMemo.Lines do
begin
if CurPageID = wpReady then
begin
Clear;
Add('Destination location:');
for i:= 0 to Page.CheckListBox.Items.Count - 1 do
begin
if Page.CheckListBox.Checked[i] then
Add(#9 + Page.CheckListBox.ItemCaption[i]);
end;
end;
end;
end;
Автор: GRom V
Дата сообщения: 28.12.2006 04:06
Извеняюсь не увидел 53 страници форума......в уголочке сц..ко
Автор: maxdddca123
Дата сообщения: 28.12.2006 05:50
Genri
Вы просто генний, спасибо Вам огромное !!!!!!!!
Ещё такой вопросик: надо что бы при нажатии на кн далее на этой странице
Page := CreateInputOptionPage проверялось, выбран ли хоть 1 чекбокс. Если не выбран, выдавать сообщение, что для установки надо выбрать хотя бы 1 базу, и главное что бы в таком случае после нажатия кн далее инсталлятор не переходил на следующую страницу. Смысл в том, что бы инсталлятор не давал пользователю нажать далее, если ни 1 база не выбрана (что вполне логично вобщем то )
Автор: feandy
Дата сообщения: 28.12.2006 07:22
maxdddca123
Используй стандартную функцию
function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result := True;
if CurPageID = Page.ID then
begin
if твоя проверка ложь then
Result := False //запрет перехода на след страницу
else Result := True; //разрешаем переход на след страницу
end;

end;
Автор: GRom V
Дата сообщения: 28.12.2006 08:44
Denis_Kokyev - спасибо!!!
Автор: Genri
Дата сообщения: 28.12.2006 09:31
maxdddca123

Цитата:
что бы инсталлятор не давал пользователю нажать далее, если ни 1 база не выбрана

Код:
procedure OnClickCheck(Sender: TObject);
var
i: integer;
begin
WizardForm.NextButton.Enabled:= False;
for i:= 0 to Page.CheckListBox.Items.Count - 1 do
begin
if Page.CheckListBox.Checked[i] then
begin
WizardForm.NextButton.Enabled:= True;
Break;
end;
end;
end;
Автор: maxdddca123
Дата сообщения: 28.12.2006 09:44
2 feandy
thx

2 Genri
Пробую

Млин не работает... Я тебе весь скрипт в личку скинул.... Посмотри пожалуйста где грабли ..
Автор: feandy
Дата сообщения: 28.12.2006 09:51
maxdddca123
если количество чекбоксов неизменно проверяй на конкретный индекс,
если оно переменное то по заголовку.
Типа такого

if (Page.CheckListBox.ItemCaption[i]='Моя база') and
(Page.CheckListBox.Checked[i]) then
begin
Result := True;
Break;
end
else
Result := False;

Добавлено:
Вот более корректный код

function NextButtonClick(CurPageID: Integer): Boolean;
begin
if CurPageID = Page.ID then
begin
Result := False;
for i:= 0 to Page.CheckListBox.Items.Count - 1 do
if (Page.CheckListBox.ItemCaption[i]='Моя база') and
(Page.CheckListBox.Checked[i]) then
begin
Result := True;
Break;
end
end
else
Result := True;
end;
Автор: GRom V
Дата сообщения: 28.12.2006 10:04
У меня в ват-файле такая строка:
regedit /s backup.reg
В этом случае если (backup.reg) отсуствует - выдается ошибка (WIN 2000)
Какой параметр вместо /s нужно поставить чтоб ошибка импорта не выскакивала внезависимости есть ли backup.reg или нет???
Автор: maxdddca123
Дата сообщения: 28.12.2006 10:06
2 feandy

Цитата:
если количество чекбоксов неизменно

изменно Может быть любое
Автор: feandy
Дата сообщения: 28.12.2006 10:08
GRom V
так сделай проверку

if FileExists('backup.reg') then
regedit /s backup.reg
Автор: maxdddca123
Дата сообщения: 28.12.2006 10:31
2 feandy

Цитата:
Вот более корректный код

Вау, работает !!!
А как тут же сделать, что бы когда ни 1 чекбокс не выбра, и юзер нажимает некст, сделать, что бы выскакивало окошко типа Выберите хотя бы 1 базу ?

Всё сделал, спасибо !
Автор: Genri
Дата сообщения: 28.12.2006 11:07
maxdddca123
Цитата:
не работает
-- у меня работает. Если не выбран ни один чекбокс - кнопка Далее недоступна. Но если нужно именно предупреждение для пользователя, используй вариант feandy. Правда я не совсем понял, зачем проверять ItemCaption

Автор: maxdddca123
Дата сообщения: 28.12.2006 11:23
2 feandy & Genri
С этим всё разобрался. Огомное спасибо вам парни !
Теперь такая мелкая трабла: значит мне нужно проверить перед запуском наличие ветки
HKEY_CURRENT_USER, 'Software\1C\1Cv7\7.7\Titles'
С этим проблем нет, но так же надо проверить, есть ли в этой ветке какие нибудь записи.
Я пробовал так

function InitializeSetup(): Boolean;
var
Names: TArrayOfString;
if not RegGetSubkeyNames(HKEY_CURRENT_USER, 'Software\1C\1Cv7\7.7\Titles', Names)
then
begin
MsgBox('Поиск установленных компонентов:' #13#13
'Обновление не может быть установлено т.к. на компьютере не обнаружено баз 1С.'#13#13
'Сначала необходимо установить хотя бы 1 базу, а только затем производить обновление !'
, mbConfirmation, MB_OK);
Exit;
end;
Result:=True;
end;

Но если я удаляю все значения из HKEY_CURRENT_USER, 'Software\1C\1Cv7\7.7\Titles' (там остаётся тока значение по умолчанию какое то пустое), то эта проверка не срабатывает. Помогите как тут быть ?
Автор: Genri
Дата сообщения: 28.12.2006 11:37
maxdddca123 -- Для разнообразия, почитай хелп.
RegKeyExists(const RootKey: Integer; const SubKeyName: String): Boolean;
RegValueExists(const RootKey: Integer; const SubKeyName, ValueName: String): Boolean;
Автор: maxdddca123
Дата сообщения: 28.12.2006 11:42
Genri
Дак у меня ключ может быть 1, а может быть много, что мне прописывать в ValueName ? Тоже массив что ли ?
Автор: Genri
Дата сообщения: 28.12.2006 12:00
Цитата из хелпа:

Код:
var
Names: TArrayOfString;
I: Integer;
S: String;
begin
if RegGetValueNames(HKEY_CURRENT_USER, 'Control Panel\Mouse', Names) then
begin
S := '';
for I := 0 to GetArrayLength(Names)-1 do
S := S + Names[I] + #13#10;
MsgBox('List of values:'#13#10#13#10 + S, mbInformation, MB_OK);
end else
begin
// add any code to handle failure here
end;
end;
Автор: maxdddca123
Дата сообщения: 28.12.2006 12:09
Genri
Мне ещё необходимо после распаковки запустить на выполнение последовательно все ехе файлы. Я прописал
[Run]
Filename: {code:CurrentDir|{#i}}\ExtForms\Rp06q3.grp\*.exe; StatusMsg: Распаковка форм...; Flags: runhidden
но выскакивает такая ошибка в момент, когда должна начаться распаковка:
List index out of bounds.
Помогите как исправить пожалуйста !

Добавлено:
Genri

Цитата:
Адаптируй сам.

Ок, спасибо !
Автор: Frenzzy
Дата сообщения: 28.12.2006 12:38
Подскажите пожалуйста, какой функцией удалить все содержимое папки, в которую будет устанавливаться программка?
Автор: omals
Дата сообщения: 28.12.2006 12:47
2 Frenzzy
function DelTree(const Path: String; const IsDir, DeleteFiles, DeleteSubdirsAlso: Boolean): Boolean;

// Delete all files and directories inside C:\Test
// but leave the directory itself
DelTree('C:\Test\*', False, True, True);
Автор: Frenzzy
Дата сообщения: 28.12.2006 12:56

Цитата:
[Code]
function DelTree(const Path: String; const IsDir, DeleteFiles, DeleteSubdirsAlso: Boolean): Boolean;

begin
DelTree('{app}\*', False, True, True);
end;

не работает, он ничего не удаляет в папке перед установкой(

Мне нужно чтоб перед началом распоковки файлов, инсталлятор удалил все её содержимое и только после этого начал установку (а папка для установки может быть любая - вибирается пользователем)

И как сделать, чтоб после удаления инсталлятора, удалилась папка {app} ?
Автор: omals
Дата сообщения: 28.12.2006 13:14
2 Frenzzy

[UninstallDelete]
Type: filesandordirs; Name: "{app}"

[Code]

// в NextButtonClick добавляеш

function NextButtonClick(CurPageID: Integer): Boolean;
begin

//добавить эти строчки
if CurPageID = wpReady then
begin
if DirExists({app}) then DelTree('{app}\*', False, True, True);
end;
//

Result := True;
end;

кажись так
Автор: Frenzzy
Дата сообщения: 28.12.2006 13:25
ПОМОГИТЕ ПОЖАЛУЙСТА!
что-то мен сегодня вообще не везет :'(

Цитата:
Compiler Error
Disk spanning must be enabled in order to create an installation larger than 2100000000 bytes in size

Как исправить эту ошибку?

мне нужно чтобы дистрибутив был 1им файлом, а не разбивался на куски
общий размер всех файлов ~5гб


Цитата:
To optimally fill 4.7 GB recordable DVDs, use:
SlicesPerDisk=3
DiskSliceSize=1566000000
Автор: maxdddca123
Дата сообщения: 28.12.2006 15:20
Genri
Прописал
[Run]
Filename: {code:CurrentDir|{#i}}\ExtForms\Rp06q3.grp\akciz5.exe; StatusMsg: Распаковка форм...; Check: NeedCopy(ExpandConstant('{#i}'))

ошибок не выдаёт но файл не запускается
На всякий случай: файл это самораспаковывающийся архив винрар, Flags: shellexec не помогает
Автор: omals
Дата сообщения: 28.12.2006 15:32
2 Frenzzy


Цитата:
Цитата:Compiler Error
Disk spanning must be enabled in order to create an installation larger than 2100000000 bytes in size
Как исправить эту ошибку?
мне нужно чтобы дистрибутив был 1им файлом, а не разбивался на куски
общий размер всех файлов ~5гб


никак
потому как
максимальный Slice == 2100000000

хотя можно попробовать поиграть с настройками компресии
Setup: Compression

ну и попробовать с [Setup]: SolidCompression=yes
Автор: maxdddca123
Дата сообщения: 28.12.2006 15:36
Genri
Причём не запускается любой ехе файл, находящийся в папке с выбранной базой... Какой бы я не указывал, архив или программа.

Добавлено:
Оказывается это изза Check: NeedCopy(ExpandConstant('{#i}'))...
Автор: omals
Дата сообщения: 28.12.2006 15:42
2 maxdddca123
мож там долгие имена есть, то просто попробуй с "
Filename: "{code:CurrentDir|{#i}}\ExtForms\Rp06q3.grp\akciz5.exe"; StatusMsg: Распаковка форм...; Check: NeedCopy(ExpandConstant('{#i}'))
Автор: Genri
Дата сообщения: 28.12.2006 15:56
maxdddca123
Я бы очень удивился, если бы это заработало
Вверху у тебя конструкция:
[Files]
#define MaxTarget 200
#define i

#sub AddFile
Source: G:\Модуль контроля и формы\Модуль контроля\ISTask.dll; DestDir: {tmp}; Flags: dontcopy
Source: G:\Модуль контроля и формы\Формы\3 квартал 2006\rp06q32\*.*; DestDir: {code:CurrentDir|{#i}}; Check: NeedCopy(ExpandConstant('{#i}'))
#endsub
#for {i = 0; i < MaxTarget; i++} AddFile

Т.е. на это этапе препроцессор выставляет i = 200 и то, что ты прописываешь, приобретает вид только одной строки, следующего вида:

Filename: "{code:CurrentDir|200}\ExtForms\Rp06q3.grp\akciz5.exe"; StatusMsg: Распаковка форм...; Check: NeedCopy(ExpandConstant('200'))

Ну и как эта строка сработает? Клиент отметил чекбокс под порядковым номером 200? У него столько баз?
Автор: maxdddca123
Дата сообщения: 28.12.2006 16:08
Genri

Цитата:
Ну и как эта строка сработает? Клиент отметил чекбокс под порядковым номером 200? У него столько баз?

Ой я уже совсем запутался... Вообще баз ну максимум 150 как я говорил, так что 200 это с запасом. С порядковым № 200 никто конечно не отмечал. Я у себя тестирую, ставлю галку на 6 базе... Дак подскажи как сделать, что бы работало, а то у меня щяс голова лопнет
Автор: Genri
Дата сообщения: 28.12.2006 16:26
Теоретически, может сработать в таком виде:
[Run]
#sub RunFile
Filename: "{code:CurrentDir|{#i}}\ExtForms\Rp06q3.grp\akciz5.exe"; StatusMsg: Распаковка форм...; Flags: skipifdoesntexist
#endsub

#for {i = 0; i < MaxTarget; i++} RunFile

... но это надо проверять. Времени нет.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172

Предыдущая тема: ICONS


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