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

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

Автор: SotM
Дата сообщения: 11.11.2008 14:37
Don_Juan
Читай примеры из шапки, а также по форуму поищи. Тут уже похожее обсуждалось.
Автор: RMKusto
Дата сообщения: 11.11.2008 14:41
Genri

Большое спасибо!!! Всё работает
Оказывается всё под носом было, но как сложно это было найти


Ещё 1 вопросик ( если я не надоел ещё ) : Мне надо прописать в одном файле путь куда уставновлен JAVA ( обычно C:\Program Files\Java\jre"x" где x - версия.

Можно как-то научить сетап найти её автоматом, вписать путь в файлик, если Java не установлена, то скачать установить > прописать путь куда установлена JAVA? Было бы здорово посмотреть на подобный код, думаю разобрался бы сам
Автор: skeptik_vdm
Дата сообщения: 11.11.2008 16:16
Diawer


Цитата:
skeptik_vdm

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

Качай из шапки Коллекция скриптов и Сборник вопросов, там, в архиве есть Ultimate test.iss – это и есть системные требования компьютера.
Компилить надо препроцессор.


Большое спасибо за направление одна проблема решена а где взять код чтобы на странице выбора директории отображался список с дисками???
Автор: LinkX
Дата сообщения: 11.11.2008 19:38
Есть вопрос по коду, действие которого заключается в том, что при запуске инсталлятора, если программа уже установлена, создается новая страница с предложением сначала удалить программу. Я добавил код блокирующий кнопку “Назад”, вопрос в том, как сделать, что бы кнопка отключалась только когда срабатывает код "Удаление при повторной установке, если программа установлена", а при нормальной установке она была. Вообщем привязать ее конкретно к этому коду. [more=Здесь][Setup]
AppName=My Program
AppVerName=My Program 1.0
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
AllowNoIcons=yes
OutputBaseFilename=My Program
UninstallDisplayName=My Program

[Code]
var
StaticText: TNewStaticText;
CheckBox: TCheckBox;
Uninstall,Location:string;
ResultCode:Integer;

function Page_NextButtonClick(Page: TWizardPage): Boolean;
begin
if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1','UninstallString', Uninstall) then
Uninstall:=RemoveQuotes(Uninstall);
if CheckBox.Checked then
begin
if not Exec(Uninstall, ' /SILENT', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
MsgBox('Ошибка удаления. ' #13#13 '' + SysErrorMessage(ResultCode) + '.' #13#13 'Вероятно, деинсталлятор был перемещен, удален или переименован.', mbError, MB_OK);
Result:=True;
end
else
begin
if not CheckBox.Checked then
Result:=True;
end;
end;

procedure Page_CancelButtonClick(Page: TWizardPage; var Cancel, Confirm: Boolean);
begin
Confirm:=False;
Cancel:=True;
end;

function CheckInstalledPage(PreviousPageId: Integer): Integer;
var
Page: TWizardPage;
begin
RegQueryStringValue(HKLM, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1','InstallLocation', Location)
Page := CreateCustomPage(PreviousPageId,'Previous Installation Found','Please choose how you want to proceed.');

StaticText := TNewStaticText.Create(Page);
StaticText.Parent := Page.Surface;
StaticText.Caption :='Inno Setup is already installed in'+' '+'"' + Location +'"'++' '+'on your system.'#13+ 'It is recommended that you uninstall the current version before continuing.';
StaticText.Left := 0;
StaticText.Top := ScaleY(24);
StaticText.TabOrder := 0;
StaticText.AutoSize:=True;

CheckBox := TCheckBox.Create(Page);
CheckBox.Parent := Page.Surface;
CheckBox.Caption := 'Uninstall before continuing (recommended)';
CheckBox.Left := 0;
CheckBox.Top := ScaleY(104);
CheckBox.Width := ScaleX(233);
CheckBox.Height := ScaleY(17);
CheckBox.Checked := True;
CheckBox.TabOrder := 1;
CheckBox.TabStop := True;

Page.OnNextButtonClick := @Page_NextButtonClick;
Page.OnCancelButtonClick := @Page_CancelButtonClick;

Result := Page.ID;
end;

procedure InitializeWizard();
begin
if RegQueryStringValue(HKLM, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1','UninstallString', Uninstall) then
CheckInstalledPage(wpLicense);
end;

//Отключить кнопку "Назад" на странице выбора директории установки
procedure CurPageChanged(CurPageID: Integer);
begin
If CurPageID=wpSelectDir then
begin
WizardForm.BackButton.Enabled := False;
end
else
If CurPageID=wpSelectProgramGroup then
begin
WizardForm.BackButton.Enabled := True;
end;
end;[/more]
Автор: Diawer
Дата сообщения: 11.11.2008 21:12
Несколько раз спрашивал про то как поместить [more= изображение][Setup]
AppName=My Program
AppVerName=My Program version 1.0
DefaultDirName={pf}\My Program
DisableProgramGroupPage=yes

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

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

[Code]
procedure InitializeWizard();
var
StaticText: TNewStaticText;
BitmapImage: TBitmapImage;
BitmapFileName: String;
begin
BitmapFileName := ExpandConstant('{tmp}\WizModernSmallImage.bmp');
ExtractTemporaryFile(ExtractFileName(BitmapFileName));
BitmapImage := TBitmapImage.Create(WizardForm);
BitmapImage.Left := ScaleX(300);
BitmapImage.Top := ScaleY(25);
BitmapImage.AutoSize := True;
BitmapImage.Bitmap.LoadFromFile(BitmapFileName);
BitmapImage.Parent := WizardForm.SelectTasksPage;

StaticText := TNewStaticText.Create(WizardForm);
StaticText.Top := BitmapImage.Height;
StaticText.Left := BitmapImage.Left
StaticText.Caption := 'Image Hide';
StaticText.AutoSize := True;
StaticText.Font.Color:= clWhite;
StaticText.Color:= clNavy;
StaticText.Cursor := crHand;
StaticText.Parent := WizardForm.SelectTasksPage;
end;[/more] на какую ни будь страницу к примеру “Доп. задач” но ответа так и не было, по этому решил сделать сам, все вроде нормально, только вот изображение не получается сделать поверх всего остального. ?
Автор: serg_aka_lain
Дата сообщения: 11.11.2008 22:38
Diawer

Цитата:
изображение не получается сделать поверх всего остального. ?


только если изменить длину TasksList
WizardForm.TasksList.Width := ScaleX(290);
Автор: KurtWagner
Дата сообщения: 12.11.2008 04:57
Genri да не! не заставляю... см. здесь [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] в подробном код... который надо поправить...
Автор: RazdorX
Дата сообщения: 12.11.2008 05:50
Есть множество примеров использования собственных сообщений в инсталляторе, но следует так-же учитывать, что кроме русского, как не странно, существуют и иные языки. За сим возникает потребность в том, чтобы использовать не текст напрямую а переменную со сменой текста в зависимости от языка. Хотелось-бы увидеть простейший пример, показывающий, как этого можно добиться. Если подобный вопрос задавался, то прошу прощения. Я не очень хорошо представляю себе, что конкретно нужно вбивать в поиск.
Автор: SotM
Дата сообщения: 12.11.2008 07:32
RazdorX
Если я не ошибаюсь, то в шапке есть примеры этого.
Автор: ExpeditorR
Дата сообщения: 12.11.2008 07:45
Diawer
Может так пойдёт?[more][Setup]
AppName=My Program
AppVerName=My Program version 1.0
DefaultDirName={pf}\My Program
DisableProgramGroupPage=yes

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

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

[Code]
procedure InitializeWizard();
var
StaticText: TNewStaticText;
BitmapImage: TBitmapImage;
BitmapFileName: String;
begin
BitmapFileName := ExpandConstant('{tmp}\WizModernSmallImage.bmp');
ExtractTemporaryFile(ExtractFileName(BitmapFileName));
BitmapImage := TBitmapImage.Create(WizardForm);
BitmapImage.Left := ScaleX(300);
BitmapImage.Top := ScaleY(0);
BitmapImage.AutoSize := True;
BitmapImage.Bitmap.LoadFromFile(BitmapFileName);
BitmapImage.Parent := WizardForm.TasksList;

StaticText := TNewStaticText.Create(WizardForm);
StaticText.Top := BitmapImage.Height;
StaticText.Left := BitmapImage.Left
StaticText.Caption := 'Image Hide';
StaticText.AutoSize := True;
StaticText.Font.Color:= clWhite;
StaticText.Color:= clNavy;
StaticText.Cursor := crHand;
StaticText.Parent := WizardForm.SelectTasksPage;

end;[/more]
Автор: Artem_Butenko
Дата сообщения: 12.11.2008 08:51
htuos -- еще раз благодарю Вас за код, позволяющий скрыть отображение окна инсталлера с панели задач. Только вот возникла небольшая проблема, как заблокировать в этом случае комбинацию Alt+F4? Еще небольшой вопрос: можно ли переместить (на время установки) окно лоадера (в виде значка в системный трей), заблокировать все действия над ним (развернуть, закрыть) и комбинации кнопок? Буду очень признателен за помощь!
Автор: Genri
Дата сообщения: 12.11.2008 09:34
KurtWagner -- ты второй раз выкладываешь один и тот же код, но ни слова о проблеме. Второй раз спрашиваю: где описание проблемы?? Что не так с кодом? Не компилится? Не инсталлируется? Не выполняет каких-то действий? Каких? Ты об этом уже писал? Где?
Ты просишь только "поправить" код. Могу, например, предложить удалить функцию InitializeSetup

Diawer

Цитата:
htuos написал такую вещь как основу
Цитата:SendMessage(CheckListBox.Handle,$0194,CheckListBox.Width*2,0);

добавив, что очень много заморочек с этим. Это действительно трудно сделать горизонтальную прокрутку
-- у меня нет причин сомневаться в компетентности htuos. Могу лишь присоединиться к мнению более продвинутого в вопросах программирования коллеги: задача нетривиальная.
Автор: Diawer
Дата сообщения: 12.11.2008 09:57
Genri
Все понял, спасибо.

serg_aka_lain
ExpeditorR
Спасибо, оба варианта подходят, пригодится так сказать под ситуацию.

Появился еще вопросик. В реестре в
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1, Inno добавляет приставку _is1. Посмотрел на другие установленные программы, похоже, что ни какие другие инсталляторы, ни чего не дописывают к имени (по крайней мере, у меня так), чисто только имя. Еще один способ проверить создан ли Setup при помощи Inno. Ее как можно убрать?


Добавлено:
RazdorX
В [_Code] пиши ExpandConstant ('{cm:Text}'), в дугих секциях просто {cm:Text}, в
[CustomMessages]
english.Text=Create text for all languages
russian.Text=Создать текст для всех языков
Автор: htuos
Дата сообщения: 12.11.2008 12:12
тут вот случайно откопал скрипт, в котором пытался рисовать чекбоксы руками. когда-то бросил эту затею т.к. не получалось полноценно перехватить оконную процедуру, т.е.

Код: procedure CheckBox1Click(Sender: TObject);
begin
MsgBox('Hello.', mbInformation, MB_OK);
end;

. . .

SetWindowLong(CheckBox1.Handle,GWL_WNDPROC,CallBackProc(@CheckBoxProc,4));
CheckBox1.OnClick:=@CheckBox1Click;
Автор: ratc2008
Дата сообщения: 12.11.2008 15:27
При использании некоторых параметров из Corona Skin & Check System Requirements в левом верхнем углу появляется белый квадратик, как его удалить?
Автор: Diawer
Дата сообщения: 12.11.2008 17:04
htuos

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

Я уж это понял, Genri не забыл и решил мой вопрс другим путем который меня вполне устраивает. Есть конечно вопросы, но я не хочу боль мучать.


Добавлено:
htuos

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

Тогда для меня это реально не реально.
Да и Genri не забыл и решил мой вопрос другим путем. Вопросы конечно есть, но не буду мучать.

Добавлено:
Показало что первый раз сообщение не отправилось, я про повтор.

Вопросов уже почти не осталось, но один есть, который давно хотел задать.
Кто-то может помочь вставить озвучку для этого авторана, поместил в комплект два b].wav[/b] файла, нужно что бы click1.wav срабатывал при наведении курсора мыши
на надпись в меню, а click2.wav при нажатии (выборе) на надпись в меню (имеется в виду на всех). Извиняюсь за вопрос, дело в том, что за все время работы с Inno я не разу
не заморачивался за такие темы, как озвучка, проигрывание музыки и т.п. В самом инсталляторе мне кажется это не нужно, а Autorun без звукового оформления выглядит скучно.
http://ifolder.ru/9040703
Автор: Victor_Dobrov
Дата сообщения: 12.11.2008 17:29
skeptik_vdm
Цитата:
одна проблема решена а где взять код чтобы на странице выбора директории отображался список с дисками???

Если Corona Skin не подходит, то вот пример попроще: InnoSetup Upgrade

Artem_Butenko
Цитата:
можно ли переместить (на время установки) окно лоадера (в виде значка в системный трей)

Для этого есть разработка от ResTools: Inno Setup TrayIconCtrl (которая требует библиотеку InnoCallback.dll)

htuos

Цитата:
я тут нарисовал длл с одной функцией, которая позволяет нормально вызвать CallWindowProc. т.е. теперь можно нормально перехватывать события (правильнее сказать "сообщения") у любого окна

Братья китайцы тоже недавно сделали dll-ку Inno Setup Message WinMsgCtrl (работает в паре с InnoCallback.dll)

ratc2008
Цитата:
При использании некоторых параметров из Corona Skin & Check System Requirements в левом верхнем углу появляется белый квадратик, как его удалить?

Конкретнее. Используется Corona Skin или фрагмент кода из неё? Скриншот этого квадратика можешь привести?
Автор: unnameddddd
Дата сообщения: 12.11.2008 19:00
Здрасте подскажите пожалуйста можно ли как-то сделать что бы инсталятор не создавал деинсталятора ВООБЩЕ.

Добавлено:
Скажите пожалуйста можно ли как-нибудь создать инсталятор чтобы он несоздавал ДЕИНСТАЛЯТОРА ВООБЩЕ.
Автор: NightW0lf
Дата сообщения: 12.11.2008 19:52
unnameddddd

Цитата:
подскажите пожалуйста можно ли как-то сделать что бы инсталятор не создавал деинсталятора ВООБЩЕ


Код: [Setup]
;Означает создавать ли автоматический деинсталлятор. При значении "yes" он создается. При значении "no" автоматическое удаление будет невозможно, так что пользователь должен будет вручную удалять программу.
Uninstallable=no
Автор: Genri
Дата сообщения: 12.11.2008 19:58
Diawer -- частичное решение со скроллбаром [more=здесь]
Код: [no]
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program

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

[Code]
type
TCWPSTRUCT = record
lParam: LongWord;
wParam: Word;
msg: LongWord;
hwnd: HWND;
end;

TProc = procedure(Code: Integer; wParam: Word; lParam: TCWPSTRUCT);

const
bidDelAll = 1;
bidSkipAll = 2;
HC_ACTION = 0;
WM_HSCROLL = $114;
WH_CALLWNDPROC = 4;

var
Form: TSetupForm;
CheckListBox: TNewCheckListBox;
AllButton, UnAllButton: TButton;
CancelButton, DelButton: TButton;

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

DelAllReadOnly: Boolean;
SkipAllReadOnly: Boolean;

HookID: LongWord;

function UnhookWindowsHookEx(idHook: LongWord): LongWord;
external 'UnhookWindowsHookEx@user32.dll stdcall delayload';

function WrapProc(callback:TProc; paramcount:integer): longword;
external 'wrapcallback@{tmp}\innocallback.dll stdcall delayload uninstallonly';

function CallNextWNDPROC(idHook: LongWord; Code: Integer; wParam: Word; lParam: TCWPSTRUCT): LongWord;
external 'CallNextHookEx@user32.dll stdcall delayload';

function SetWindowsHookEx(idHook: LongWord; callback: LongWord; hMod: LongWord; dwThreadID: HWND): LongWord;
external 'SetWindowsHookExW@user32.dll stdcall delayload';

function GetCurrentThreadId(): LongWord;
external 'GetCurrentThreadId@kernel32.dll stdcall delayload';

/////////////////// обработка события SendMessage //////////////////////////////////
procedure OnHook(Code: Integer; wParam: Word; lParam: TCWPSTRUCT);
begin
if (Code = HC_ACTION) and((lParam.msg shr 16) = WM_HSCROLL) then
CheckListBox.Invalidate;
CallNextWNDPROC(HookID,code,wParam,lparam);
end;
////////////////////////////////////////////////////////////////////////////////////

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;

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(FSR.Name, 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();
var
i: integer;
intWidth, intMaxWidth: integer;
pfunc: LongWord;
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.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);

/////////////////////////////////////////
SendMessage(CheckListBox.Handle,$0194,CheckListBox.Width*2,0);
/////////////////////////////////////////

pfunc:= WrapProc(@OnHook, 3);
HookID:= SetWindowsHookEx(WH_CALLWNDPROC, pFunc, 0, GetCurrentThreadId()); // установка SendMessage хука
if Form.ShowModal() = mrOk then DeleteFiles();
UnhookWindowsHookEx(HookID); // удаление SendMessage хука
end;

procedure InitializeUninstallProgressForm();
begin
FileCopy(ExpandConstant('{app}\InnoCallback.dll'),
ExpandConstant('{tmp}\InnoCallback.dll'), False);
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if DirExists(ExpandConstant('{app}')) and (CurUninstallStep = usPostUninstall) then
BrowseRemainedFiles();
end; [/no]
Автор: unnameddddd
Дата сообщения: 12.11.2008 22:17
Спасибо помогло
Автор: Artem_Butenko
Дата сообщения: 13.11.2008 00:19
htuos и Victor_Dobrov -- большое Вам спасибо за ценные советы. htuos - с помощью написанной Вами библиотеки можно ли решить проблему озвучки действий (*.wav) в диалоговых окнах Inno Setup?
Автор: boss911
Дата сообщения: 13.11.2008 02:49
Существует ли Ukrainian.isl (украинский интерфейс инсталла), где можно взять?
Автор: noiseless
Дата сообщения: 13.11.2008 09:32
boss911
см. тут, в неофициальных
Автор: skeptik_vdm
Дата сообщения: 13.11.2008 09:39
Victor_Dobrov


Цитата:
Если Corona Skin не подходит, то вот пример попроще: InnoSetup Upgrade


Хотелось бы на сам код посмотреть но все равно большое спасибо буду смотреть!!!
Автор: Blind
Дата сообщения: 13.11.2008 11:09
Как изменить комментарий в версии получаемого файла установки? А то там всегда оказывается строка This installation was built with Inno Setup. Что-то не нашёл как поменять
Автор: braunberg
Дата сообщения: 13.11.2008 14:32
Blind, Inno Setup является freeware-программой и комментарий в версии получаемого файла установки является чем-то вроде рекламы продукта. Убрать его можно если чем-то упаковать инсталлятор, или править исходники, через код вроде бы нельзя (могу ошибаться, поправьте если что)
Автор: Blind
Дата сообщения: 13.11.2008 16:04
braunberg
ИМХО сомнительный способ рекламировать продукт в комментарии версии файла. Ну нельзя так нельзя.
Автор: Diawer
Дата сообщения: 13.11.2008 16:26
Genry
Выглядит неплохо и более – менее работоспособно, в принципе можно использовать, наверное, это уже проблемно, что бы прокрутка появлялась если есть не влезшие имена, а если все влезло в окно, то она не появлялась.

Blind

Цитата:
Как изменить комментарий в версии получаемого файла установки? А то там всегда оказывается строка This installation was built with Inno Setup. Что-то не нашёл как поменять

При помощи правки ресурсов, к примеру с помощью Restorator 2007

Добавлено:
Вчера много времени потратил на написание скрипта для программы, вернее запихать две программы, использующие одни и теже компоненты, т.е. выглядит это так, в компонентах две идентичные по действию, но имеющие свои нужные опции программы с флагом exclusive, и набор плагинов, которые устанавливаются в ту программу, которая выбрана, в скрипте пришлось делать все практически в двойном экземпляре для той и другой программы, пользуясь “; Components: Prog1” и в [_Code] – “if IsComponentSelected('Prog1') then”одно только не смог сделать, а именно, что бы в зависимости от выбранного компонента (Программы), менялись DefaultDirName, DefaultGroupName, UninstallDisplayName, т.е. если я выбрал в компонентах “Prog2”, то в полях где выбор “Папки установки“ и “Папки в меню Пуск” менялось соответственно на “Prog2”, если кто то может помочь то вот [more= заготовка][Setup]
AppName=My Program
AppVerName=My Program 1.0
DefaultDirName={pf}\Default
DefaultGroupName=Default
UninstallDisplayName=Default
;CreateAppDir=no

[Components]
Name: mp1; Description: My Program 1; Flags: exclusive
Name: mp2; Description: My Program 2; Flags: exclusive

[Icons]
Name: {group}\My Program 1; Filename: {app}\Prog1.exe; WorkingDir: {app}; Components: mp1
Name: {group}\My Program 2; Filename: {app}\Prog2.exe; WorkingDir: {app}; Components: mp2

[Code]
//Поменять местами страницу выбора компонентов и страницу выбора папки установки
procedure CurPageChanged(CurPageID: Integer);
begin
with WizardForm do
begin
if CurPageID = wpSelectDir then
SelectDirPage.Notebook.ActivePage:= SelectComponentsPage;
if CurPageID = wpSelectComponents then
SelectComponentsPage.Notebook.ActivePage:= SelectDirPage;
DiskSpaceLabel.Caption:= ComponentsDiskSpaceLabel.Caption;
end;
end;[/more], что бы проще было начать и поскольку выбор “Папки установки“ идет перед “Компонентами”, то поменял их местами. Читал хелп Препроцессора, похоже, через него можно это реализовать, но разобраться как не смог.
Если реально кто знает, выручайте, в скрипте осталось несделанным только это.
Автор: RMKusto
Дата сообщения: 13.11.2008 17:45

Подскажите пожалуйста, как сделать что-то типа: dropdownlist?

Например в часте кода:

Page2.Add('Repository type (SVN/CVS):', False);

Нужно чтобы у пользователя был только выбор SVN или CVS? И не приходилось вписывать это руками?

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970

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


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