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

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

Автор: Genri
Дата сообщения: 17.01.2007 19:16
AtotIK -- на форме с надписью "now preparing to install..." у тебя есть кнопка "Отменить", которая не задействована. Можно вставить обработчик нажатия на нее. [more=Пример]
Код:
[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
Compression=lzma
SolidCompression=yes

[Files]
Source: "MyProg.exe"; DestDir: "{app}"

[Code]
type
TMsg = record
hwnd: HWnd;
msg: Word;
wParam: Word;
lParam: Word;
time: Longint;
pt: TPoint;
end;

var
CancelBtn: TButton;
Msg: TMsg;

function PeekMessage(var Msg: TMsg; Wnd: HWnd; MsgFilterMin, MsgFilterMax, wRemoveMsg: LongInt): LongInt;
external 'PeekMessageW@user32.dll stdcall';

procedure ProcessMessage();
begin
MsgBox('hello', mbInformation, MB_OK);
end;

procedure InitializeWizard();
var
Form: TSetupForm;
ProgressBar: TNewProgressBar;
i: integer;
Wnd: HWND;
res: LongInt;

begin
Form := CreateCustomForm();
try
with Form do
begin
ClientWidth := ScaleX(380);
ClientHeight := ScaleY(120);
BorderStyle:= bsDialog;
Center;
end;
CancelBtn := TButton.Create(Form);
with CancelBtn do
begin
Width := ScaleX(75);
Height := ScaleY(23);
Left := Form.ClientWidth - ScaleX(75 + 10);
Top := Form.ClientHeight - ScaleY(23 + 10);
Parent := Form;
Caption := 'Îòìåíà';
end;
ProgressBar := TNewProgressBar.Create(Form);
with ProgressBar do
begin
Height := CancelBtn.Height - ScaleY(8);
Width := Form.Width - ScaleX(128);
Top := ScaleX(10);
Left := ScaleY(10);
Parent := Form;
Min:= 0;
Max:= 1000;
Position := 0;
end;
Form.ActiveControl := CancelBtn;
Form.Show();
for i:= 0 to 1000 do
begin
res:= PeekMessage(Msg, CancelBtn.Handle, $0202, $0202, 1);
if res <> 0 then
begin
ProcessMessage();
end;
ProgressBar.Position:= ProgressBar.Position + 1;
Form.Refresh;
Sleep(5);
end;
finally
Form.Free();
end;
end;
Автор: Sampron
Дата сообщения: 17.01.2007 20:07
DroN_S

Цитата:
да, скин конечно хорош, но как снести BeveledLabel чуть ниже, а то накладка получается...

Уточни плз что это и на какой странице

Добавлено:
DroN_S

Цитата:
да, скин конечно хорош, но как снести BeveledLabel чуть ниже, а то накладка получается...

Исправил

[Messages]
BeveledLabel=исправлено!

[Code]
procedure InitializeWizard();
var
Page: TWizardPage;
begin
WizardForm.BeveledLabel.Enabled:=True;
WizardForm.BeveledLabel.Font.Color:=clRed;
WizardForm.BeveledLabel.Color:=$dbcdcc;
WizardForm.BeveledLabel.Left:=10;
WizardForm.BeveledLabel.Top:=392;
end;
Автор: CapsLosk
Дата сообщения: 18.01.2007 02:47
Genri

Цитата:
AtotIK -- на форме с надписью "now preparing to install..." у тебя есть кнопка "Отменить", которая не задействована. Можно вставить обработчик нажатия на нее. Пример


Прошу тваоей помощи! Я не программер. Помоги пожалуйсто вставить твой пример в мой скрипт, только чтоб эта кнопка использовалась по назначению, т.е. как Отмена.
Скрипт в личке. Был бы очень благодарен!
Автор: GRom V
Дата сообщения: 18.01.2007 08:56
Chanka

Глянь в личку!!!

Добавлено:
AtotIK

Цитата:
;При запуске инсталлятора отсутствует "мозолящий" глаза синий фон и имя программы.


Фон далеко не отсуствует - он просто черный, с теми-же мозолящими глаза белыми буквама (название проги).

Единственное что можно сделать это уменьшить их максимально:
[LangOptions]
TitleFontSize=1

Вот цвет бы поменять -было бы дело!!!
Автор: JKSerGEAnt
Дата сообщения: 18.01.2007 09:58
Посмотрел скин - красиво, только вот не совсем понятно, почему тут все копируют уродливый и тормозной installshield? Преимущество Inno именно в скорости работы, а вы его замедляете намеренно.

Обращение к сотоварищам по переводам - неужели вы думаете, что пользователям нравятся все эти ваши рюшечки? Я когда вижу кривую надпись "[Censored]" на отличной обоине, меня терзают смутные сомнения насчет качества работы самого русификатора. Уж про музыку вообще молчу - это в лучшем случае должно быть опционально (при запуске инсталла вопросик, как я иногда делаю в инсталлах к игрушкам), а то запускаешь инсталл - и начинается такая канонада, что мне интереснее посидеть и повыдирать все файлы через innounp, потратив на это минут 10-15, чем сидеть и ждать, пока распакуется 300-метровый 7z-архив.
Автор: DroN_S
Дата сообщения: 18.01.2007 14:47
Sampron
прикольно!!!
мне больше вот так нравится

Код:
[Setup]
WizardImageFile=C:\WinXP.bmp
WizardSmallImageFile=C:\WinXP.bmp

[Messages]
BeveledLabel=исправлено!

[Code]
procedure InitializeWizard();
var
Page: TWizardPage;
begin
WizardForm.BackButton.BringToFront;
WizardForm.NextButton.BringToFront;
WizardForm.CancelButton.BringToFront;
WizardForm.BeveledLabel.Enabled:=True;
WizardForm.BeveledLabel.Font.Color:=$00AA4509;;
WizardForm.BeveledLabel.Font.Style := WizardForm.BeveledLabel.Font.Style + [fsBold];
WizardForm.BeveledLabel.Color:=$dbcdcc;
WizardForm.BeveledLabel.Left:=10;
WizardForm.BeveledLabel.Top:=392;
end;
Автор: koc
Дата сообщения: 18.01.2007 15:39
JKSerGEAnt
Вопросище не в тему, но: зачем вы защищаете кодом от унпака руссики игр?
Автор: AtotIK
Дата сообщения: 18.01.2007 15:48
2 Koc

Ну, получается, что так надо...
Автор: EagleSH
Дата сообщения: 18.01.2007 15:50

Цитата:
WizardForm.BeveledLabel.Color:=$dbcdcc;


есть ли возможность сделать транспарент?
Автор: AtotIK
Дата сообщения: 18.01.2007 15:54

2 Genri

Спасибо...А то я уже хотел спрашивать как это сделать...
Автор: Xom9I4oK
Дата сообщения: 18.01.2007 16:04
JKSerGEAnt

Цитата:
Обращение к сотоварищам по переводам - неужели вы думаете, что пользователям нравятся все эти ваши рюшечки...

Лично мне они нафиг не нужны - я, например, хочу немного растянуть окно инсталлера вширь, чтобы изменить пропорции WizardImageFile (cделать 3:4), добавить управление музыкой (придется наверное остановить выбор на внешнем плеере с запуском .mp3 файла через командную строку или вообще отказаться от музыки) и изменить скин у инсталлера (сделать стилизацию под сайт).
Автор: Genri
Дата сообщения: 18.01.2007 16:45
Меня завалили просьбами помочь/подправить скрипты. Заранее извиняюсь, физически не успеваю всем помочь. Но есть одно общее замечание:
Во многих скриптах встречается одна и та же ошибка - попытка обратится к локальной переменной из другой процедуры. Например:
procedure InitializeWizard();
var
Form: TSetupForm;
CancelButton: TButton;
........................
Все работает. Но потом в код добавляется очередная фишка с новыми процедурами. И в этих новых процедурах идет обращение к Form или CancelButton, в результате чего получаем ошибку.

Локальные переменные видны только внутри той процедуры, где они объявлены (в данном случае их можно использовать только внутри InitializeWizard. Если хотите обращаться к ним из других процедур, лучше объявлять их глобально. Т.е. в самом начале секции Code. В моем примере, обратиться к Form и ProgressBar, можно только внутри InitializeWizard. А к CancelBtn из любой процедуры.
Автор: Bergelmir
Дата сообщения: 18.01.2007 17:35
Подскажите, возможно ли сделать так, чтобы при выборе компонентов во время инсталляции при наличии многоуровневых групп компонентов, можно было разные подгруппы свернуть/развернуть для удобства восприятия, как например, в NSIS?
http://nsis.sourceforge.net/mediawiki/images/d/dd/NSISScreenshot3.png
Автор: EagleSH
Дата сообщения: 18.01.2007 18:59

Цитата:

procedure CurStepChanged(CurStep: TSetupStep);
begin
if IsTaskSelected('backup') then
if CurStep = ssInstall then
begin
CopyDir(ExpandConstant('{app}\'),ExpandConstant('{app}\Backup_ENG'));

end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usPostUninstall then
begin
MoveDir(ExpandConstant('{app}\Backup_ENG\'),ExpandConstant('{app}'));
RemoveDir(ExpandConstant('{app}\Backup_ENG'));

end;
end;

при установке в папку, бэкапит всё шо там есть... подскажите что за нафик? а должен токо то что ставит сетап.
Автор: dermatolog
Дата сообщения: 18.01.2007 19:08
Вопрос к гуру - как "сказать" инсталятору, что если при установке невозможно удалить файл (например DLL занята другим процессом), то эту DLL нужно переименовать например в "*.tmp" (как это делает Install Shield). Ну и ессно включить этот темповый файл в список файлов, которые нужно удалить при деинсталяции.
Автор: NightW0lf
Дата сообщения: 18.01.2007 19:44
EagleSH

Цитата:
при установке в папку, бэкапит всё шо там есть... подскажите что за нафик? а должен токо то что ставит сетап.

Вообще я уже этот вопрос подымал, НО раз уж так срочно то вот:
[more=Пример "бекапов"]

Код:
#include "SHFileOperation.iss"

[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
Compression=lzma
SolidCompression=yes


[Languages]
;Язык во всех диалогах инсталлятора
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"


[Tasks]
;Дополнительные задачи - создание резервной копии файлов
Name: src; Description: "Создать резервную копию оригинальных файлов"


[Files]
;Обновленный файл
;Флаг BeforeInstall: CreateBackup; обязателен создать резервную копию через procedure CreateBackup;
Source: "C:\mypog.exe"; DestDir: {app}; BeforeInstall: CreateBackup; Flags: uninsneveruninstall skipifsourcedoesntexist overwritereadonly ignoreversion nocompression


[Run]
;Запуск обновленного файла
Filename: "{app}\mypog.exe"; Description: "{cm:LaunchProgram,My Program}"; Flags: nowait postinstall skipifsilent


[Code]
//При инсталляции, в "бэкап" сохраняются (перемещением) только те файлы,
//которые инсталлятор заменяет. При удалении, эти же файлы восстанавливаются (тоже перемещением).
function MoveFile(const srcFile, destFile: PChar): Integer;
external 'MoveFileA@kernel32.dll stdcall';

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usPostUninstall then
begin
MoveDir(ExpandConstant('{app}\Install_Rus\Backup\'), ExpandConstant('{app}'));
RemoveDir(ExpandConstant('{app}\Install_Rus\Backup\'));
RemoveDir(ExpandConstant('{app}\Install_Rus\'));
end;
end;


//Процедура создания резервной копии при выборе пункта "Создать резервную копию оригинальных файлов"
procedure CreateBackup;
var
srcFile, destFile: string;
basePath, shortPath: string;
begin
if IsTaskSelected('src') then
begin
basePath := ExpandConstant('{app}');
srcFile := ExpandConstant(CurrentFileName);
shortPath := srcFile;
StringChangeEx(shortPath, basePath, '', True);
destFile := ExpandConstant('{app}\Install_Rus\Backup') + shortPath;
ForceDirectories(ExtractFilePath(destFile));
MoveFile(PChar(srcFile), PChar(destFile));
end;
end;


//Функция проверки директории на конкретный файл (пример - mypog.exe) если файл
//отсутствует то выдается сообщение об ошибке
function NextButtonClick(CurPage: Integer): Boolean;
var
s: string;
begin
Result := True;
if CurPage = 6 then
begin
if (FileSearch('mypog.exe', ExpandConstant('{app}')) = '')
then
begin
s := 'Игра "mypog.exe" не найдена в данной директории!'#13#13'Пожалуйста, укажите папку с игрой.';
MsgBox(s, mbError, mb_Ok);
Result := False
end;
end;
end;
end.
Автор: Genri
Дата сообщения: 18.01.2007 20:02
dermatolog
Цитата:
restartreplace
Этот флаг необходим при перемещении системных файлов ядра. Если файл существовал ранее и оказался заблокирован инсталятором из-за невозможности его переместить, инсталятор зарегистрирует файл (в WININIT.INI или используя MoveFileEx для Windows и Windows NT соответственно), чтобы переместить его после перезагрузки системы. Когда это произойдет, пользователю будет предложено перезагрузить компьютер в конце установки.
Для сохранения совместимости с Windows 95/98/Me длинные имена файлов не могут использоваться с этим флагом. Поддерживаются только имена "8.3" (в Windows NT платформах этих ограничений нет).
ВАЖНО: Флаг restartreplace успешно переместит используемый файл на платформах Windows NT, если пользователь наделен правами администратора. Если у пользователя нет прав администратора, появится сообщение: "RestartReplace невозможно: MoveFileEx невозможно; код 5". Поэтому при использовании restartreplace настоятельно рекомендуется установить PrivilegesRequired=admin в секции [Setup].
-- из хелпа

EagleSH
Цитата:
бэкапит всё шо там есть... подскажите что за нафик? а должен токо то что ставит сетап
-- в том виде, в каком ты представил, как раз бэкапится все. Если надо только устанавливаемые файлы, смотри, например, здесь. На тех страницах о бэкапе вообще говорилось много.
Автор: EagleSH
Дата сообщения: 18.01.2007 20:03
NightW0lf
сэнкс мэн! вроде всё ниЩЧак.

Genri
да вроде всё внимательно читал - но шота не получалось, пасиб.

Добавлено:
повторю вопрос:

WizardForm.BeveledLabel.Color:=$dbcdcc;

как сделать не цвет а прозрачность и можно ли вообще?
Автор: dermatolog
Дата сообщения: 18.01.2007 20:21
Genri

Цитата:
restartreplace
Этот флаг необходим при перемещении системных файлов ядра. Если файл существовал ранее и оказался заблокирован инсталятором из-за невозможности его переместить,

Этот флаг мне не совсем подходит, т.к. мне не нужно перегружать машину. Я имел ввиду возможно переименования DLL-ки при копировании файлов если целевой файл занят. Если файл занят, то его нельзя удалить, но можно переименовать.
P.S. Данную фичу можно посмотреть на примере WinRAR-а, когда после установки WinRAR-а открываю в проводнике меню (открывается библиотека RarExt.dll) и затем запускаю повторную установку WInRAR-a, то исльзуемая библиотека переименовывается в *.tmp и впоследствии деинсталируется.
Автор: Sampron
Дата сообщения: 18.01.2007 20:36
EagleSH

Цитата:
как сделать не цвет а прозрачность и можно ли вообще?

По-умолчанию в инно было так:
Enabled = False
Автор: Genri
Дата сообщения: 18.01.2007 20:37
dermatolog --Здесь смотри. Разница только в том, что там переименование в *.bak, а тебе надо в *.tmp. И при деинсталляции там восстанавливается, а тебе надо удалить. Но думаю разберешься.
Автор: dermatolog
Дата сообщения: 18.01.2007 20:55
Genri
Спасибо за ссылку, но это тоже не вариант )
Как я смогу определить то, что инсталятор не смог заменить существующую DLL на новую? Тут явно напрашивается новый флажок на файл - что-то типа rename_exist_file_if_use. В принципе пока сделал с флагом onlyifdoesntexist но это на первое время, т.к. shell extension я думаю еще долго у меня не будет меняться )
Автор: EagleSH
Дата сообщения: 18.01.2007 20:59
Sampron


Цитата:
По-умолчанию в инно было так:
Enabled = False

чесно говоря не понял что и где было...

Enabled = False

както маловато инфы, подробней плиз
Автор: Sampron
Дата сообщения: 18.01.2007 21:04
EagleSH

Цитата:
както маловато инфы, подробней плиз

Замени WizardForm.BeveledLabel.Enabled:=True; на WizardForm.BeveledLabel.Enabled:=False;

Добавлено:
JKSerGEAnt

Цитата:
Посмотрел скин - красиво, только вот не совсем понятно, почему тут все копируют уродливый и тормозной installshield? Преимущество Inno именно в скорости работы, а вы его замедляете намеренно.

Никто его не замедляет просто изменяем вид.
Автор: DroN_S
Дата сообщения: 18.01.2007 21:21

Цитата:
Замени WizardForm.BeveledLabel.Enabled:=True; на WizardForm.BeveledLabel.Enabled:=False;

нет, это не поможет...
а Transporent он не принимает..
странно, если просто метка, то по идеи у неё должно быть это свойство...
Автор: dermatolog
Дата сообщения: 18.01.2007 21:26
DroN_S
Снести BeveledLabel можно так:
[Messages]
BeveledLabel=
Автор: EagleSH
Дата сообщения: 18.01.2007 21:36
Sampron
DroN_S
странно както такой простейший момент, как транспорент - праблэм какойто
Автор: Sampron
Дата сообщения: 18.01.2007 21:36
dermatolog

Цитата:
Снести BeveledLabel можно так:
[Messages]
BeveledLabel=

Нужно сделать задний фон текста прозрачным а не сам текст.

Добавлено:
EagleSH
Был бы транспарент можно было б классные скины делать.
Автор: DroN_S
Дата сообщения: 18.01.2007 21:47

Цитата:
Снести BeveledLabel можно так:
[Messages]
BeveledLabel=

тогда смысл этой метки? просто убрать тег вообще и всё...

Цитата:
Был бы транспарент можно было б классные скины делать

значит это метка с неполноценными свойствами...
по любому как то можно дописать её свайства, только вот где?
Автор: Genri
Дата сообщения: 18.01.2007 23:59
dermatolog
Цитата:
Как я смогу определить то, что инсталятор не смог заменить существующую DLL на новую?
-- ну, во-первых, можно переименовывать все подряд (все которые меняешь). А во-вторых, раз уж ты все равно переписываешь файлы своими, можно сначала удалять функцией DeleteFile, и если функция не сможет удалить файл (вернет False), тогда переименовывать.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172

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


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