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

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

Автор: noiseless
Дата сообщения: 22.07.2008 16:32
Cryzer
А так если

var
ItemIndex: Integer;

procedure InitializeWizard();
begin
ItemIndex := WizardForm.TypesCombo.ItemIndex;

...
with WizardForm do begin
Position:=poScreenCenter
WizardForm.TypesCombo.ItemIndex := ItemIndex;
ClientWidth:=700
ClientHeight:=480
... // и т.д.
Автор: ZheKA767
Дата сообщения: 22.07.2008 16:42
Народ подскажите как в инсталлятор внедрить серийный номер и поле ввода было разбито на ячейки как в InstallShield.
И как ещё добавить в окно инсталлятора URL адрес как в инсталляторах от ZoneOfGames
Автор: Artem_Butenko
Дата сообщения: 22.07.2008 16:57
Здравствуйте ценители Inno Setup. Я встречал множество решений организации слайд-шоу. Но, в большинстве случаев, использовались изображения в формате .bmp. Подскажите пожалуйста, может есть готовое решение организации слайд-шоу по процентам прогресс-бара, в котором используются изображения в формате .jpeg. И немного сторонний вопрос: можно ли в Inno Setup реализовать "дробный" прогресс-бар, аналогичный InstallShield. Буду очень признателен за любую помощь!

Добавлено:
Здравствуйте ценители Inno Setup. Я встречал множество решений организации слайд-шоу. Но, в большинстве случаев, использовались изображения в формате .bmp. Подскажите пожалуйста, может есть готовое решение организации слайд-шоу по процентам прогресс-бара, в котором используются изображения в формате .jpeg. И немного сторонний вопрос: можно ли в Inno Setup реализовать "дробный" прогресс-бар, аналогичный InstallShield. Буду очень признателен за любую помощь!
Автор: Diawer
Дата сообщения: 22.07.2008 17:28
Заинтересовала тема звуков для [more=кнопок]

[Files]
Source: click.wav; DestDir: {tmp}; Flags: dontcopy nocompression;

[Code]
function sndPlaySound(lpszSoundName: string; uFlags: cardinal):integer;
external 'sndPlaySoundA@winmm.dll stdcall';


function InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('click.wav');
Result := True;
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
sndPlaySound(ExpandConstant('{tmp}\click.wav'), $0001);
Result := True;
end;

function BackButtonClick(CurPageID: Integer): Boolean;
begin
sndPlaySound(ExpandConstant('{tmp}\click.wav'), $0001);
Result := True;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
sndPlaySound(ExpandConstant('{tmp}\click.wav'), $0001);
end;
[/more], как добавить ещё для двух кнопок “Обзор – папок и пуск”
Автор: boss911
Дата сообщения: 22.07.2008 17:55

Код: [Tasks]
Name: MyTask; Description: {cm:My_Task}; Flags: unchecked
Автор: putes
Дата сообщения: 22.07.2008 19:54
Как использовать два и более КОДОВ в одной инсталляции, подскажите плиз, или направьте в изучающее русло где описано на примерах как совладать с данным трюком
Автор: ZheKA767
Дата сообщения: 22.07.2008 21:34
Diawer

Для Обзора папок
function DirBrowseButtonClick(CurPageID: Integer): Boolean;
begin
sndPlaySound(ExpandConstant('{tmp}\click.wav'), $0001);
Result := True;
end;

Для пуска
function GroupBrowseButtonClick(CurPageID: Integer): Boolean;
begin
sndPlaySound(ExpandConstant('{tmp}\click.wav'), $0001);
Result := True;
end;
Автор: ComradG
Дата сообщения: 22.07.2008 23:13

Цитата:
Как использовать два и более КОДОВ

Бери здесь http://victor-dobrov.narod.ru/InnoSetupFAQ_ru-board.chm



Добавлено:
Кстати, нашел у себя в загашниках скрипт:
[Setup]
AppName=Drive Checked
AppVerName=Drive Checked
DefaultDirName={pf}\Drive Checked

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

[Messages]
ru.SelectDirBrowseLabel=Нажмите "Далее", чтобы продолжить. Для установки на другой диск, выберите из списка.

[_Code]
var
cbDrive: TComboBox;
DrvLetters: array of string;
FreeSpaceLabel: TLabel;

function GetDriveType(lpDisk: string): integer;
external 'GetDriveTypeA@kernel32.dll stdcall';

function GetLogicalDriveStrings(nLenDrives: LongInt; lpDrives: string): integer;
external 'GetLogicalDriveStringsA@kernel32.dll stdcall';

const
DRIVE_UNKNOWN=0;
DRIVE_NO_ROOT_DIR=1;
DRIVE_REMOVABLE=2;
DRIVE_FIXED=3;
DRIVE_REMOTE=4;
DRIVE_CDROM=5;
DRIVE_RAMDISK=6;

function DriveTypeString(dtype: integer): string;
begin
case dtype of
DRIVE_NO_ROOT_DIR: Result:='Неверный путь';
DRIVE_REMOVABLE: Result:='Съемный';
DRIVE_FIXED: Result:='';
DRIVE_REMOTE: Result:='Сетевой';
DRIVE_CDROM: Result:='CD-ROM';
DRIVE_RAMDISK: Result:='Ram диск';
else
Result:='Неизвестный';
end;
end;

procedure cbDriveOnClick(Sender: TObject);
begin
WizardForm.DirEdit.Text:=DrvLetters[cbDrive.ItemIndex]+'Program Files\Disk Checked';
end;

procedure FillCombo();
var
n: integer;
drivesletters: string; lenletters: integer;
drive: string;
disktype, posnull: integer;
sd: string;
begin
sd:=UpperCase(ExpandConstant('{sd}'));
drivesletters:=StringOfChar(' ', 64);
lenletters:=GetLogicalDriveStrings(63, drivesletters);
SetLength(drivesletters, lenletters);
drive:='';
n:=0;
while ((Length(drivesletters) > 0)) do
begin
posnull:=Pos(#0, drivesletters);
if posnull > 0 then
begin
drive:=UpperCase(Copy(drivesletters, 1, posnull-1));
disktype:=GetDriveType(drive);
if (not(disktype=DRIVE_REMOVABLE)) then
begin
cbDrive.Items.Add(drive+DriveTypeString(disktype))
SetArrayLength(DrvLetters, N+1);
DrvLetters[n]:=drive;
if (Copy(drive, 1, 2)=sd) then cbDrive.ItemIndex:=n;
n:=n+1;
end
drivesletters:=Copy(drivesletters, posnull+1, Length(drivesletters));
end
end;
cbDriveOnClick(cbDrive);
end;

procedure GetFreeSpaceCaption(Sender: TObject);
var
Path: string;
FreeMB, TotalMB: cardinal;
begin
Path:=ExtractFileDrive(WizardForm.DirEdit.Text);
GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
if FreeMB > 1024 then
FreeSpaceLabel.Caption:='Свободно на диске:' + FloatToStr(round(FreeMB/1024*100)/100) + ' GB'
else
FreeSpaceLabel.Caption:='Свободно на диске:' + IntToStr(FreeMB) + ' MB'
end;

procedure InitializeWizard();
begin
cbDrive:=TComboBox.Create(WizardForm.SelectDirPage);
FreeSpaceLabel:=TLabel.Create(WizardForm);
with cbDrive do
begin
Parent:=WizardForm.DirEdit.Parent;
Left:=WizardForm.DirEdit.Left;
Top:=WizardForm.DirEdit.Top+WizardForm.DirEdit.Height*5;
Width:=WizardForm.DirEdit.Width+83;
Style:=csDropDownList;
end
with FreeSpaceLabel do
begin
Parent:=WizardForm.SelectDirPage;
Left:=ScaleX(0);
Top:=Scaley(167);
Width:=ScaleX(209);
Height:=ScaleY(13);
end;
WizardForm.DirBrowseButton.Visible:=true;
WizardForm.DirEdit.Enabled:=true;
WizardForm.DirEdit.OnChange:=@GetFreeSpaceCaption;
WizardForm.DirEdit.Text:=WizardForm.DirEdit.Text+#0;
FillCombo;
cbDrive.OnClick:=@cbDriveOnClick;
end;
Кажется, в загашник он был отправлен потому, что че-то там не работало. Хотя когда я скомпилил, вроде все пучком было. Короче, времени разбераться нет - я обещанные проги никак не могу закончить, так что если чего неправильного найдете здесь - пишите.
Автор: boss911
Дата сообщения: 23.07.2008 03:26
Ну так что реально сделать или нет? Половину суток тут просидел в ожидании ответа.
Автор: Artem_Butenko
Дата сообщения: 23.07.2008 03:26
Прошу прощения за столь стремительную генерацию вопросов. Но все же, товарищи может кто-нибудь реализовывал в Inno Setup оконтуривание на странице выбора директории установки области, включающей поле с отображением пути и кнопку "Обзор...". Подобный эффект можно реализовать в NSIS, а в Inno?
Автор: Victor_Dobrov
Дата сообщения: 23.07.2008 06:36
ComradG - Вот [more=этот вариант списка дисков]
[Setup]
AppName=DisksInfo
VersionInfoVersion=5.0
AppVerName=DisksInfo
DefaultDirName={pf}\My program

[CustomMessages]
Ru.SysDirSelect=Выбранный путь включает в себя системную папку!%nВы уверены, что необходимо продолжать установку?

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

[Icons]
Name: {group}\Notepad; Filename: notepad.exe

[Code]
var n: Integer; FreeMB, TotalMB: Cardinal; VolumeName, FileSystemName: String; VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint; ListBox: TListBox; StartMenuTreeView: TStartMenuFolderTreeView;

const oneMB= 1024*1024;
function GetLogicalDrives: DWord; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(nDrive: String): Longint; external 'GetDriveTypeA@kernel32.dll stdcall';
function GetVolumeInformation(PathName,VolumeName: PChar; VolumeNameSize,VolumeSerialNumber,MaxComponentLength,FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint; external 'GetVolumeInformationA@kernel32.dll stdcall';
function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer; external 'MessageBoxA@user32.dll stdcall';

Function ByteOrTB(Bytes: Extended; noMB: Boolean): String; { Перевод числа в значение бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)}
Begin
    if not noMB then Result:= FloatToStr(Int(Bytes)) +' Мб' else
        if Bytes < 1024 then Result:= FloatToStr(Int(Bytes)) +' Бт' else
            if Bytes/1024 < 1024 then Result:= FloatToStr(round((Bytes/1024)*10)/10) +' Кб' else
                If Bytes/oneMB < 1024 then Result:= FloatToStr(round(Bytes/oneMB*100)/100) +' Мб' else
                    If Bytes/oneMB/1000 < 1024 then Result:= FloatToStr(round(Bytes/oneMB/1024*1000)/1000) +' Гб' else
                        Result:= FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Тб'
    StringChange(Result, ',', '.')
End;

Function DelSP(String: String): String; { Удаление начальных, конечных и повторных пробелов }
    Begin    while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1); Result:= Trim(String); End;

Function CutString(String: String; MaxLength: Longint): String; { Обрезать строку до заданного кол-ва символов}
    Begin
        if Length(String) > MaxLength then Result:= Copy(String, 1, 6) +'...'+ Copy(String, Length(String) - MaxLength +9, MaxLength)
        else Result:= String;
    End;

Procedure GetDiskInfo(Disk: String);
    Begin
        FileSystemName:= StringOfChar(' ', 32); VolumeName:= StringOfChar(' ', 256);
            GetVolumeInformation(Disk, VolumeName, 255, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, 31);
        FileSystemName:= DelSp(FileSystemName); VolumeName:= DelSp(VolumeName); if VolumeName='' then VolumeName:='без метки';
    End;

Procedure ListBoxRefresh;    var FreeB, TotalB: Cardinal; Path, String: string; Begin
    ListBox.Items.Clear
for n:= 1 to 31 do    // диск 'А' пропустить
    if (GetLogicalDrives and (1 shl n)) > 0 then
        if (GetDriveType(Chr(ord('A') + n) +':\') = 2) or (GetDriveType(Chr(ord('A') + n) +':\') = 3) then
            if GetSpaceOnDisk(Chr(ord('A') + n) +':\', True, FreeMB, TotalMB) then ListBox.Items.Add(Chr(ord('A') + n) +':');
for n:= 0 to ListBox.Items.Count -1 do begin
    Path:= Copy(ListBox.Items[n],1,2) +'\'        { если в накопителе нет диска, пропустить обновление }
    if GetSpaceOnDisk(Path, False, FreeB, TotalB) and GetSpaceOnDisk(Path, True, FreeMB, TotalMB) then begin GetDiskInfo(Path);
        if FreeB >= $7FFFFFFF then String:= PadL(ByteOrTB(FreeMB*oneMB, true),10) else String:= PadL(ByteOrTB(FreeB, true),10);
        if TotalB >= $7FFFFFFF then begin TotalB:= TotalMB; FreeB:= FreeMB; String:= PadL(ByteOrTB(TotalMB*oneMB, true),11) +' всего| '+ String end else String:= PadL(ByteOrTB(TotalB, true),11) +' всего| '+ String;
    ListBox.Items[n]:= Copy(Path,1,2) + String + PadL(FloatToStr(round(FreeB/TotalB*100)),3)+ '% своб|'+ PadL(FileSystemName,5)+ '| '+ CutString(VolumeName,9); end; end;
End;

Procedure ObjectOnClick(Sender: TObject); Begin
Case TObject(Sender) of
    ListBox:    for n:= 0 to ListBox.Items.Count-1 do if ListBox.Selected[n] then WizardForm.DirEdit.Text:= Copy(ListBox.Items[n],1,1) +Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text))
    StartMenuTreeView:    if StartMenuTreeView.Directory <> '' then WizardForm.GroupEdit.Text:= StartMenuTreeView.Directory else WizardForm.GroupEdit.Text:= '{#SetupSetting("DefaultGroupName")}'
    WizardForm.NoIconsCheck:    begin WizardForm.GroupEdit.Enabled:= not(WizardForm.GroupEdit.Enabled); StartMenuTreeView.Enabled:= WizardForm.GroupEdit.Enabled; WizardForm.GroupBrowseButton.Enabled:= WizardForm.GroupEdit.Enabled end;
end; End;

Function NextButtonClick(CurPageID: Integer): Boolean; Begin
    Result:= True
    if (CurPageID = wpSelectDir) and (Pos(Uppercase(ExpandConstant('{win}')), Uppercase(ExpandConstant('{app}'))) > 0) then Result:= MessageBox(StrToInt(ExpandConstant('{wizardhwnd}')), ExpandConstant('{cm:SysDirSelect}'), 'Установка в системную папку', MB_YESNO or $30) = idYes;
End;

Procedure CurPageChanged(CurPageID: Integer);
Begin
    if CurPageID = wpSelectDir then ListBoxRefresh
End;

Procedure InitializeWizard;
Begin
    ListBox:= TListBox.Create(WizardForm)
        ListBox.SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 8, WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width - WizardForm.DirEdit.Left, WizardForm.DiskSpaceLabel.Top - (WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 12))
        ListBox.Font.Size:= 9
        ListBox.Font.Style:= [fsBold]
        ListBox.Font.Name:= 'Courier New';
        ListBox.OnClick:= @ObjectOnClick;
        ListBox.Parent:= WizardForm.SelectDirPage;
    WizardForm.NoIconsCheck.SetBounds(WizardForm.DiskSpaceLabel.Left + 96, WizardForm.DiskSpaceLabel.Top + 1, WizardForm.NoIconsCheck.Width, WizardForm.NoIconsCheck.Height)
        WizardForm.NoIconsCheck.OnClick:= @ObjectOnClick
        WizardForm.NoIconsCheck.Parent:= WizardForm.SelectProgramGroupPage
        WizardForm.NoIconsCheck.Show
    StartMenuTreeView:= TStartMenuFolderTreeView.Create(WizardForm)
        StartMenuTreeView.SetPaths(ExpandConstant('{userprograms}'), ExpandConstant('{commonprograms}'), ExpandConstant('{userstartup}'), ExpandConstant('{commonstartup}'));
        StartMenuTreeView.SetBounds(ListBox.Left, ListBox.Top, ListBox.Width, ListBox.Height)
        StartMenuTreeView.Parent:= WizardForm.SelectProgramGroupPage
        StartMenuTreeView.Cursor:= crHand
        StartMenuTreeView.OnChange:=@ObjectOnClick
End;
[/more] более информативный.
Автор: SotM
Дата сообщения: 23.07.2008 07:22
ComradG
Ты бы всё таки скрипты такого размера в тэг [ more ] запихивай.
Автор: Cryzer
Дата сообщения: 23.07.2008 09:57
noiseless
Благодарю Всё пошлО)
Автор: ZheKA767
Дата сообщения: 23.07.2008 10:40

Цитата:
Народ подскажите как в инсталлятор внедрить серийный номер и поле ввода было разбито на ячейки как в InstallShield.
И как ещё добавить в окно инсталлятора URL адрес как в инсталляторах от ZoneOfGames

А мне кто нибудь поможет?
Автор: noiseless
Дата сообщения: 23.07.2008 11:46
ZheKA767
Я вот не знаю, например, что такое "инсталятор от ZoneOfGames" Нельзя ли подробнее? Если надо просто добавить ссылку на какой-либо сайт в форме, то см. руководство Kindly.
Автор: boss911
Дата сообщения: 23.07.2008 15:41

Цитата:

Код: [Tasks]
Name: MyTask; Description: {cm:My_Task}; Flags: unchecked

Как сделать, чтобы данный чекбокс был заблокирован при повторной установки одного и того же приложения?
Автор: noiseless
Дата сообщения: 23.07.2008 15:58
boss911
Надо как-то узнать, что приложение было уже установлено (запись в реестре, наличие определенного файлика и т.п.) и от этого уже исходить.
Автор: Chanka
Дата сообщения: 23.07.2008 16:03
boss911

Мож так:


Код: [Setup]
AppId={{0C01E81B-A528-4EB8-AFA0-415F4401F7E3}

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

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

[Icons]
Name: "{group}\My Program"; Filename: "{app}\MyProg.exe"
Name: "{commondesktop}\My Program"; Filename: "{app}\MyProg.exe"; Tasks: desktopicon

[code]
procedure CurPageChanged(CurPageID: Integer);
begin
if RegValueExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{0C01E81B-A528-4EB8-AFA0-415F4401F7E3}_is1','UninstallString') then
if CurPageID = wpSelectTasks then
WizardForm.TasksList.ItemEnabled[1]:= False;
end;
Автор: Sampron
Дата сообщения: 23.07.2008 16:04
Удалено.
Автор: boss911
Дата сообщения: 23.07.2008 17:35
Chanka

Цитата:
Мож так


Цитата:
HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{0C01E81B-A528-4EB8-AFA0-415F4401F7E3}

А если инсталлятор не создает ключ (деинсталляции) в реестре.

В общем я понял, что это не реально сделать, так как инсталлятору не будет за что зацепиться, чтобы проверить, устанавливалась ли раньше приложение или нет.
Автор: serg_aka_lain
Дата сообщения: 23.07.2008 18:15
boss911

Цитата:
А если инсталлятор не создает ключ (деинсталляции) в реестре.

- Проверить на наличие каких либо определённых файлов директорию {app} при повторной установке тоже можно.
И по результатам проверки блокировать или не блокировать checkbox.
Автор: Zloy_Gelud
Дата сообщения: 23.07.2008 18:16
delete
Автор: ComradG
Дата сообщения: 23.07.2008 18:42
Victor Dobrov, пасиба. Нечто подобное я уже правда карябал в своих последних инсталлах, но до кое чего так и не докумекал. По поводу критики, учту на будущее. Относительно своей работы могу пожалоться лишь на то, что за отсутсвием светлых голов, она продвигается слишком медленно. Всем большой привет и мое почтение.
Автор: boss911
Дата сообщения: 23.07.2008 18:55
serg_aka_lain и Zloy_Gelud

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


Цитата:
создавать файл пустышку, к-ый не нужно удалять при деинсталляции

Об этом я уже думал, но нет знаний, как это можно организовать.

Ребята, плиз, дайте пример, чтобы инсталлятор проверил наличие ключа в реестре, если он его найдет, тогда блокируется чекбокс задачи, только определенный чекбокс, ибо у меня их будет несколько.
Автор: serg_aka_lain
Дата сообщения: 23.07.2008 19:03
boss911

Цитата:
следов от установленного продукта не останется, так как он заменяет некоторые файлы в системе.


Но ведь у этих файлов есть версии, и эталонные размеры.
- лучше чем таскать с собой мусор (пустышки) ИМХО.
Автор: boss911
Дата сообщения: 23.07.2008 19:10
serg_aka_lain

Цитата:
Но ведь у этих файлов есть версии, и эталонные размеры.

Версии файлов могут быть разные, а значит и их эталонные размеры, к примеру, тот же md5.


Цитата:
лучше чем таскать с собой мусор (пустышки) ИМХО.

Мне тоже не нравится эта затея. Посему вот думаю создать не приметный ключик в реестре, только вот нужна ваша помощь.
Автор: serg_aka_lain
Дата сообщения: 23.07.2008 21:24
boss911

Цитата:
Посему вот думаю создать не приметный ключик в реестре, только вот нужна ваша помощь.


Chanka давал пример использования по ключу реестра на прошлой странице,
WizardForm.TasksList.ItemEnabled[2]:= False; где item[] - номер линии в TasksList.
Автор: boss911
Дата сообщения: 23.07.2008 22:16

Цитата:
WizardForm.TasksList.ItemEnabled[2]:= False; где item[] - номер линии в TasksList.

Вот оно в чем дело.

Помоги склеить два [more=кода]procedure CurPageChanged(CurPageID: Integer);
begin
if RegValueExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{0C01E81B-A528-4EB8-AFA0-415F4401F7E3}_is1','UninstallString') then
if CurPageID = wpSelectTasks then
WizardForm.TasksList.ItemEnabled[1]:= False;
end;

----------------------------------------------------------------------------------------------------

procedure CurPageChanged(CurPageID: Integer);
begin
UpdateWizardButton(WizardForm.BackButton,bidBack)
UpdateWizardButton(WizardForm.NextButton,bidNext)
UpdateWizardButton(WizardForm.CancelButton,bidCancel)
end;[/more], плиз.

Автор: serg_aka_lain
Дата сообщения: 23.07.2008 22:32
boss911

Цитата:
Помоги склеить два кода
[more]

procedure CurPageChanged(CurPageID: Integer);
begin
UpdateWizardButton(WizardForm.BackButton,bidBack)
UpdateWizardButton(WizardForm.NextButton,bidNext)
UpdateWizardButton(WizardForm.CancelButton,bidCancel)
begin
if RegValueExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{0C01E81B-A528-4EB8-AFA0-415F4401F7E3}_is1','UninstallString') then
if CurPageID = wpSelectTasks then
WizardForm.TasksList.ItemEnabled[1]:= False;
end;
end;

[/more]

Автор: ComradG
Дата сообщения: 23.07.2008 23:00
А никто не пробовал реализовать имитацию страницы выбора компонентов на подобие инсталлеров NSIS? Если да, можете поделиться наработками?

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970

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


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