Войти

Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 5]


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 [85] 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

Johny777
19-02-2013, 05:06
semiono, Если я правильно понял, то вот накатал тебе булев функцию замены всех искомых строк/слов на нужную строку/слово в текстовом файле:

function ReplaseStringInTextFile(const FileName, FromString, ToString: String): Boolean;
var
uText: String;
begin
if not FileExists(FileName) then Exit;
if LoadStringFromFile(FileName, uText) then while Pos(FromString, uText) > 0 do StringChange(uText, FromString, ToString);
Result := SaveStringToFile(FileName, uText, False);
end;

procedure InitializeWizard();
begin
if ReplaseStringInTextFile('C:\A.txt', 'VALVE', 'SOFTWARE') then MsgBox('OK', mbError, MB_OK);
end;


==================================================================================================== ========================

Tco 03, Вот только распаковка 7-Zip архивов http://sendfile.su/764485
Вот пример проверки чекбоксов: »
оптимизировал принятие булев значений в методы чекбокса и функцию для Check:
изучай, пригодится :)

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
OutputDir=.

[Files]
Source: 1.zip; DestDir: {app}\File1.exe; Check: CheckBoxResult('File1');
Source: 2.zip; DestDir: {app}\File2.exe; Check: CheckBoxResult('File2');

[ Code]
var
NewCheckBox1: TNewCheckBox;
NewCheckBox2: TNewCheckBox;

function CheckBoxResult(const FileName: String): boolean;
begin
case FileName of
'File1': Result := NewCheckBox1.Checked;
'File2': Result := NewCheckBox2.Checked;
end;
end;

procedure NewCheckBox1Click(Sender: TObject);
begin
if not NewCheckBox1.Checked then NewCheckBox2.Checked:= false;
NewCheckBox2.Enabled:= not NewCheckBox1.Checked;
end;

Кому придёт в голову сразу же повторно устанавливать прогу »
ну например не сразу, но у меня в инсталле 4 игры и иногда приходится доустановливать
Сразу же при повторной установке рядом создаётся файл unins000.exe »
это я не учёл - лечится переименованием файла обратно на этапе ssInstall
По мне так зачем это вообще нужно делать »
Ну, как известно с древних времён - каждый извращается по своему :)

==================================================================================================== ==============

insombia,
как сделать новую папку чтобы при нажатии на неё создавалась сразу папка с названием игры »

[Setup]
AppName=777
AppVerName=777
DefaultDirname=C:\Setup
Compression=none


[ code]
var
DirTreeView: TFolderTreeView;
Edit: TEdit;
Reset_Path_Button: TButton;


procedure DirFolderChange(Sender: TObject);
begin
if TFolderTreeView(Sender).Directory <> WizardDirValue then Edit.Text := AddBackslash(TFolderTreeView(Sender).Directory) + '{#SetupSetting("AppName")}' else Edit.Text := TFolderTreeView(Sender).Directory;
Reset_Path_Button.Enabled := Edit.Text <> RemoveBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}'));
end;


procedure BrowseForm_Buttons_OnClick(Sender: TObject);
begin
case TButton(Sender).Caption of
'Reset':
begin
Edit.Text := RemoveBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}'));
TButton(Sender).Enabled := False;
end;

SetupMessage(msgButtonNewFolder):
begin
DirTreeView.CreateNewDirectory('Half-Life 2');
Edit.Text := AddBackslash(DirTreeView.Directory) + '{#SetupSetting("AppName")}';
end;

SetupMessage(msgButtonOK): if Edit.Text <> WizardForm.DirEdit.Text then WizardForm.DirEdit.Text := Edit.Text;
end;
end;


procedure BrowseClick(Sender: TObject);
var
DefaultInstallPath: String;
BrowseForm: TForm;
begin
DefaultInstallPath := WizardDirValue;
BrowseForm := TForm.Create(nil);
with BrowseForm do
begin
ClientWidth := ScaleX(387);
ClientHeight := ScaleY(364);
Position := poScreenCenter;
Caption := #32 + SetupMessage(msgBrowseDialogTitle);

with TLabel.Create(nil) do
begin
SetBounds(ScaleX(7), ScaleY(4), ScaleX(207), ScaleY(16));
Caption := SetupMessage(msgBrowseDialogLabel);
Parent := BrowseForm;
end;

DirTreeView := TFolderTreeView.Create(nil)
with DirTreeView do
begin
SetBounds(ScaleX(4), ScaleY(52), ScaleX(379), ScaleY(265));
OnChange := @DirFolderChange;
Parent := BrowseForm;
end;

ActiveControl := DirTreeView;

Edit := TEdit.Create(nil);
with Edit do
begin
SetBounds(ScaleX(4), ScaleY(25), ScaleX(379), ScaleY(21));
Text := DirTreeView.Directory;
Parent := BrowseForm;
end;

with TButton.Create(nil) do
begin
SetBounds(ScaleX(4), ScaleY(330), ScaleX(90), ScaleX(22));
Parent := BrowseForm;
Caption := SetupMessage(msgButtonCancel);
Cursor := crHand;
ModalResult := mrCancel;
end;

Reset_Path_Button := TButton.Create(nil)
with Reset_Path_Button do
begin
SetBounds(ScaleX(99), ScaleY(330), ScaleX(90), ScaleY(22));
Parent := BrowseForm;
Caption := 'Reset';
Enabled := Edit.Text <> RemoveBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}'))
Cursor := crHand;
OnClick := @BrowseForm_Buttons_OnClick;
end;

with TButton.Create(nil) do
begin
SetBounds(ScaleX(194), ScaleY(330), ScaleX(90), ScaleY(22));
Parent := BrowseForm;
Caption := SetupMessage(msgButtonNewFolder);
Cursor := crHand;
OnClick := @BrowseForm_Buttons_OnClick;
end;

with TButton.Create(nil) do
begin
SetBounds(ScaleX(289), ScaleY(330), ScaleX(90), ScaleY(22));
Parent := BrowseForm;
Caption := SetupMessage(msgButtonOK);
OnClick := @BrowseForm_Buttons_OnClick;
Cursor := crHand;
ModalResult := mrOk;
end;

DirTreeView.ChangeDirectory(AddBackslash(DefaultInstallPath), True);

if ShowModal = mrOk then WizardForm.DirEdit.Text := Edit.Text else WizardForm.DirEdit.Text := DefaultInstallPath;

Free;
end;
end;

procedure InitializeWizard();
begin
WizardForm.DirBrowseButton.OnClick := @BrowseClick;
end;


======================================================= UPD ============================================================

вот кому интересно - функция для максимального снижения количества оперативки используемой текущим процессом путём выгрузки страниц на жёсткий диск
например с 1900 кб до 400 кб, но это влияет на производительность, так что без необходимости не использовать
можно и настроить используемый размер памяти (увеличить/уменшить) своими цифрами


[Setup]
AppName=TrimWorkingSet
AppVerName=TrimWorkingSet
DefaultDirName={pf}\TrimWorkingSet

[ Code]
function SetProcessWorkingSetSize(hProcess: THandle; dwMinimumWorkingSetSize, dwMaximumWorkingSetSize: DWORD): BOOL; external 'SetProcessWorkingSetSize@kernel32.dll stdcall';
function GetCurrentProcess(): THandle; external 'GetCurrentProcess@kernel32.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): BOOL; external 'KillTimer@user32.dll stdcall';


function TrimWorkingSet(): BOOL;
begin
Result := SetProcessWorkingSetSize(GetCurrentProcess, DWORD(-1), DWORD(-1));
end;


procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpSelectDir then SetTimer(WizardForm.Handle, 16, 1, CallbackAddr('TrimWorkingSet'));
end;

insombia
19-02-2013, 14:00
del

tsskz
19-02-2013, 15:40
Народ подскажите плиз, в общем у меня 3 архива
1 arc без сжатия data.arc
2 srep data.srp
3 arc сжатая папка игры data1.arc

код
if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data1.arc'), ExpandConstant('{app}'), '', false , '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
if not ISSRepExtract ( 0, 0, ExpandConstant('{app}\data.srp'),ExpandConstant('{app}\data.arc'), false) then break;
if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data.arc'), ExpandConstant('{app}'), '', false , '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;

на распаковке на распаковке файлов игры(последний архив) выдает что не найдено ни одного файла указанного в ISArcExtract


2)проблема у меня при установке вместо 100% указано 300% ,как исправить?

Gnom_aka_Lexander
19-02-2013, 16:10
вместо 100% указано 300% ,как исправить? »
С примером идет уникальная в своей подробности справка, прочитай про records.inf в ней.файлов игры(последний архив) выдает что не найдено ни одного файла указанного в ISArcExtract »
if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data.arc') тут ты говоришь, что нужно искать архив рядом с инсталлом. а распаковал его перед этоим куда?if not ISSRepExtract ( 0, 0, ExpandConstant('{app}\data.srp'),ExpandConstant('{app}\data.arc'), false) then break; »
Естественно, что рядом его нету.

tsskz
19-02-2013, 16:28
Gnom_aka_Lexander ок,разобрался спс

insombia
19-02-2013, 20:27
tsskz используй http://krinkels.org/showthread.php?t=49 и можно будет указывать только if not ISArcExtract

Lex_from_Belarus
19-02-2013, 20:32
подскажите пожалуйста, как установить шрифты во время установки (.ttf и .otf)?

insombia
19-02-2013, 20:35
Lex_from_Belarus в инсталл или как именно во время установки?

Lex_from_Belarus
19-02-2013, 22:06
Lex_from_Belarus в инсталл или как именно во время установки? »
ну в систему установить шрифты, которые нужны для устанавливаемого приложения? их же просто скопировать мало, надо же ещё в реестр прописать, кароче может скриптик есть какой?

Upd: Разобрался сам

Tco 03
20-02-2013, 13:42
Johny777
Ну, как известно с древних времён - каждый извращается по своему »
Что верно, то верно :)

Господа, помогите, пожалйста, решить проблему, кто знает в чём дело и возможно ли избавиться от ошибки?
Суть в следующем: На странице выбора папки установки создаю кнопку, кустомную форму и чекбокс. При нажатии на кнопку проверяется свободное место на диске. Необходимое место считывается с файла .inf Если свободного места достаточно, то выдаётся сообщение "YES!!!" и выберается чекбокс - если свободного места не достаточно, то выдаётся сообщение "NO!!!" и появляется кустомная форма. Проблема в том, что это работает только со второй попытки, то есть свободного места достаточно, но при этом появляется сообщение "NO!!!" и появляется кустомная форма. Сразу же при повторном нажатии на кнопку этого больше не происходит - выдаётся сообщение "YES!!!" и выбирается чекбокс. При нехватке свободного места на диске функция работает без проблем! Почему так происходит при первом нажатии на кнопку? Вот этот самый код:
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp

[ Code]
var
MyForm: TSetupForm;
MyButton: TButton;
FreeMB, TotalMB: Cardinal;
NewCheckBox1: TNewCheckBox;
MyFile: String;

function MyFormExec: boolean;
var
Path: String;
begin
Path:= ExtractFileDrive(WizardForm.DirEdit.Text);
GetSpaceOnDisk(Path, True, FreeMB, TotalMB);

MyForm:= CreateCustomForm;
with MyForm do begin
Width:= ScaleX(798);
Height:= ScaleY(543);
Position:= poScreenCenter;
MyForm.ShowModal;
end;
end;

procedure MyButtonOnClick(Sender: TObject);
begin
if FreeMb < GetIniInt('Info', 'Size', 0, 0, 0, MyFile) then
begin
MsgBox(ExpandConstant('NO!!!'), mbCriticalError, mb_Ok);
MyFormExec;
end else begin
MsgBox(ExpandConstant('YES!!!'), mbInformation, mb_Ok);
NewCheckBox1.Checked:= True;
end;
end;

procedure InitializeWizard();
begin
MyFile:= 'C:\Info.inf';

MyButton:= TButton.Create(WizardForm);
with MyButton do begin
Left:= WizardForm.DirBrowseButton.Left;
Top:= WizardForm.DirBrowseButton.Top + ScaleY(30);
Width:= WizardForm.DirBrowseButton.Width;
Height:= WizardForm.DirBrowseButton.Height;
Caption:= 'Click Me';
OnClick:= @MyButtonOnClick;
Parent:= WizardForm.SelectDirPage;
end;

NewCheckBox1:= TNewCheckBox.Create(WizardForm);
with NewCheckBox1 do begin
Left:= MyButton.Left + ScaleY(30);
Top:= MyButton.Top + ScaleY(30);
Width:= ScaleX(12);
Height:= ScaleY(12);
Parent:= WizardForm.SelectDirPage;
end;
end;

Johny777
20-02-2013, 15:34
Tco 03, ну ты блин даёшь!"_": Сравниваешь значение из ини с нулём! Вылетает шибка и вызывается процедура создания формы, где ты впервые пишешь кол-во свободного места в переменную FreeMB. После этого она не пустая и соответственно идёт уже нужная проверка и выводится нужный результат!
Пойми ошибку в своём коде. Когда поймёшь вот переписал тебе твой код на свой лад, в полностью рабочем виде
Используется вин апи функция GetDiskFreeSpaceEx, которая пишет во входные переменные свободный и полный размер харда в байтах, что точнее чем округлённые значения в мегабайтах

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp

[ Code]
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif

type
_LARGE_INTEGER = record
LowPart: Longint;
HighPart: DWORD;
end;
var
NewCheckBox1: TNewCheckBox;

function GetDiskFreeSpaceEx(lpDirectoryName: String; var lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes, lpTotalNumberOfFreeBytes: _LARGE_INTEGER): BOOL; external 'GetDiskFreeSpaceEx{#A}@kernel32.dll stdcall';

function Size64(QuadPart: _LARGE_INTEGER): Extended;
begin
Result := (QuadPart.HighPart + integer(QuadPart.LowPart < 0))*4.294967296E9 + QuadPart.LowPart;
end;

function MyFormExec(): Integer;
var
MyForm: TForm;
begin
MyForm:= TForm.Create(nil);
with MyForm do
begin
Width:= ScaleX(798);
Height:= ScaleY(543);
Position:= poScreenCenter;
Result := ShowModal;
Free;
end;
end;

procedure MyButtonOnClick(Sender: TObject);
var
FreeBytesAvailableToCaller, TotalNumberOfBytes, TotalNumberOfFreeBytes: _LARGE_INTEGER;
uBOOL: Boolean;
NeedSize: Extended;
begin
if GetDiskFreeSpaceEx(ExtractFileDrive(WizardDirValue), FreeBytesAvailableToCaller, TotalNumberOfBytes, TotalNumberOfFreeBytes) then
NeedSize := GetIniInt('Info', 'Size', 0, 0, 0, 'C:\Info.inf')*1024*1024;
if Size64(TotalNumberOfFreeBytes) < NeedSize then
begin
MsgBox(ExpandConstant('NO!!!'), mbCriticalError, mb_Ok);
MyFormExec;
end else
begin
MsgBox(ExpandConstant('YES!!!'), mbInformation, mb_Ok);
NewCheckBox1.Checked:= True;
end;
end;

procedure InitializeWizard();
var
MyButton: TButton;
begin
with WizardForm do
begin
MyButton := TButton.Create(WizardForm)
with MyButton do
begin
Parent:= DirBrowseButton.Parent;
SetBounds(DirBrowseButton.Left, ScaleY(DirBrowseButton.Top + 30), DirBrowseButton.Width, DirBrowseButton.Height)
Caption:= 'Click Me';
OnClick:= @MyButtonOnClick;
end;
NewCheckBox1:= TNewCheckBox.Create(WizardForm);
with NewCheckBox1 do
begin
Parent:= SelectDirPage;
SetBounds(MyButton.Left + ScaleY(30), MyButton.Top + ScaleY(30), ScaleX(12), ScaleY(12));
end;
end;
end;


и как понимать ExpandConstant('NO!!!') ? :)

Tco 03
20-02-2013, 16:28
Johny777
Ну то что я сравниваю значения с ещё несоздавшийся формы - это я догнал :shot:
Как сравнить мои FreeMB с TotalMB, тут догнать не могу :shout:
Тупо воспользуюсь Вашим кодом, чего голову ломать... :gamer:
и как понимать ExpandConstant('NO!!!') ? »
Там просто: MsgBox(ExpandConstant('{cm:Error}'), mbCriticalError, mb_Ok); Ну там rus, eng: compiler:Languages

El Sanchez
20-02-2013, 19:34
Используется вин апи функция GetDiskFreeSpaceEx, которая пишет во входные переменные свободный и полный размер харда в байтах, что точнее чем округлённые значения в мегабайтах »
Johny777, объяви _LARGE_INTEGER вместо _ULARGE_INTEGER как показано ниже, иначе GetDiskFreeSpaceEx неправильно посчитает при отрицательном LowPart. В Inno для GetDiskFreeSpaceEx нужны знаковые 64-битные числа. , а не то, что в MSDN указано.

type
_ULARGE_INTEGER = record
LowPart: Longint;
HighPart: DWORD;
end;

function Size64(QuadPart: _ULARGE_INTEGER): Extended;
begin
Result := (QuadPart.HighPart + integer(QuadPart.LowPart < 0))*4.294967296E9 + QuadPart.LowPart;
end;

Johny777
20-02-2013, 22:44
El Sanchez, Спасибо за правку. Исправил в коде инсталла халфы! :)
вот только разве не наоборот?

typedef union _LARGE_INTEGER {
struct {
DWORD LowPart;
LONG HighPart;
};

http://msdn.microsoft.com/en-us/library/windows/desktop/aa383742%28v=vs.85%29.aspx

те HighPart - Longint a LowPart - DWORD

=========================================================================

Tco 03, свой предыдущий пост тоже исправил!

Lex_from_Belarus
20-02-2013, 23:43
Хочу воспользоваться скриптом в Inno Setup для "выделения/снятия выделения" всех компонентов


[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[Types]
Name: full; Description: Полная установка
Name: custom; Description: Выборочная установка; Flags: iscustom

[Components]
Name: a; Description: Моя программа™; Types: full custom
Name: a\a; Description: Руководство пользователя; Types: full
Name: a\a\a; Description: Русский; Flags: exclusive
Name: a\a\b; Description: English; Flags: exclusive
Name: a\b; Description: Справка; Types: full

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Components: a
Source: compiler:Examples\Readme-ru.txt; DestDir: {app}; Components: a\a\a
Source: compiler:Examples\Readme-en.txt; DestDir: {app}; Components: a\a\b
Source: compiler:Examples\MyProg.chm; DestDir: {app}; Components: a\b

[code]
var
i, k, count: Integer;

procedure btnClick(Sender: TObject);
begin
count:= WizardForm.ComponentsList.Items.Count-1;
for i:= count downto 0 do
begin
case TButton(Sender).Tag of
0: WizardForm.ComponentsList.Checked[i]:= True;
1: WizardForm.ComponentsList.Checked[i]:= False;
end;
WizardForm.ComponentsList.OnClickCheck(WizardForm.ComponentsList.ItemObject[i]);
end;
end;

procedure InitializeWizard();
begin
for i:= 0 to 1 do
with TButton.Create(WizardForm) do
begin
SetBounds(295+k,210,60,25);
OnClick:= @btnClick;
Parent:= WizardForm.SelectComponentsPage;
Tag:= i;
case i of
0: Caption:= 'Все';
1: Caption:= 'Ничего';
end;
k:= 62;
end;
end;


но у меня проблема возникла. у меня в компонентах 6 групп и в каждой по 2-3 радиобутона. я эти группы свернул флагом "Flags: Collapsed". В итоге снимается выделение и ставится только с первых 3-х групп. без этого сворачивания всё работает нормально. подскажите пожалуйста что подредактировать, чтобы скрипт заработал?

Lex_from_Belarus
21-02-2013, 12:35
И ещё вопрос:
Имеется структура компонентов.

-Компонент 1
--Компонент 1.1
--Компонент 1.2
-Компонент 2
--Компонент 2.1
--Компонент 2.2
--Компонент 2.3
--Компонент 2.4

Как сделать чтобы если выбран 1.1 то доступны для выбора были 2.1 и 2.2, а если выбрано 1.2, то доступны стали 2.3 и 2.4. И соответственно при нажатии на 1.1 или 1.2 происходил выбор 2.1 или 2.3 соответственно?

El Sanchez
21-02-2013, 14:01
вот только разве не наоборот? »
Johny777, спасибо, все-таки _ULARGE_INTEGER, но LowPart должен быть Longint.

Johny777
21-02-2013, 14:49
Lex_from_Belarus, либо я не догоняю либо код для выбора всех компонентов не дружит со свёрнутым деревом компонентов :(
в любом случае оптимизировал процедуру выбора и очиски выбора всех компонентов и ответил на вопрос в твоём последнем сообщении:


[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
DirExistsWarning=no


[Components]
Name: a; Description: -Компонент 1;
Name: a\a; Description: --Компонент 1.1;
Name: a\b; Description: --Компонент 1.2;
Name: b; Description: -Компонент 2;
Name: b\d; Description: --Компонент 2.1;
Name: b\e; Description: --Компонент 2.2;
Name: b\f; Description: --Компонент 2.3;
Name: b\e; Description: --Компонент 2.4;


[ code]
procedure ComponentsOnClick(Sender: TObject);
begin
with WizardForm.ComponentsList do
begin
// Как сделать чтобы если выбран 1.1 то доступны для выбора были 2.1 и 2.2, а если выбрано 1.2, то доступны стали 2.3 и 2.4
ItemEnabled[Items.IndexOf('--Компонент 2.1')] := Checked[Items.IndexOf('--Компонент 1.1')];
ItemEnabled[Items.IndexOf('--Компонент 2.2')] := Checked[Items.IndexOf('--Компонент 1.1')];
ItemEnabled[Items.IndexOf('--Компонент 2.3')] := Checked[Items.IndexOf('--Компонент 1.2')];
ItemEnabled[Items.IndexOf('--Компонент 2.4')] := Checked[Items.IndexOf('--Компонент 1.2')];

// И соответственно при нажатии на 1.1 или 1.2 происходил выбор 2.1 или 2.3 соответственно
if Checked[Items.IndexOf('--Компонент 1.1')] then Checked[Items.IndexOf('--Компонент 2.1')] := True;
if Checked[Items.IndexOf('--Компонент 1.2')] then Checked[Items.IndexOf('--Компонент 2.3')] := True;
Refresh;
end;
end;

procedure btnClick(Sender: TObject);
var
i: Byte;
Check: Boolean;
begin
Check := TButton(Sender).Caption = 'Все';
for i := 0 to WizardForm.ComponentsList.Items.Count-1 do WizardForm.ComponentsList.Checked[i] := Check;
WizardForm.ComponentsList.OnClickCheck(nil);
end;

procedure InitializeWizard();
var
i, k: Byte;
begin
for i:= 0 to 1 do with TButton.Create(WizardForm) do
begin
Parent:= WizardForm.SelectComponentsPage;
SetBounds(ScaleX(295+k), ScaleY(210), ScaleX(60), ScaleY(25));
OnClick := @btnClick;
case i of
0: Caption:= 'Все';
1: Caption:= 'Ничего';
end;
k:= 62;
end;
WizardForm.ComponentsList.OnClickCheck := @ComponentsOnClick;
WizardForm.ComponentsList.OnClickCheck(nil);
end;

Lex_from_Belarus
21-02-2013, 18:26
Lex_from_Belarus, либо я не догоняю либо код для выбора всех компонентов не дружит со свёрнутым деревом компонентов
в любом случае оптимизировал процедуру выбора и очиски выбора всех компонентов и ответил на вопрос в твоём последнем сообщении: »
короче все/ничего решил убрать и использую для этих целей Type (полная установка/очистить список), получается тоже самое, только с Collapsed.

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

Компонент1
Компонент2
-Компонент21 (радиобутон)
-Компонент22 (радиобутон)
-Компонент23

Так вот 21 и 22 работает когда выбран 1, а 23, когда 1 не выбран.
Подскажите как подредактировать ваш код, пожалуйста.

Johny777
21-02-2013, 19:22
все/ничего решил убрать и использую для этих целей Type »
поддерживаю! :)
Так вот 21 и 22 работает когда выбран 1, а 23, когда 1 не выбран. »
вот тебе отдельный пример чтоб понятнее было и он по принципу работы не особо отличается от предыдущего! Изучай.

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
DirExistsWarning=no

[Components]
Name: a; Description: 1;
Name: b; Description: 2;
Name: b\d; Description: 21; Flags: exclusive;
Name: b\e; Description: 22; Flags: exclusive;
Name: b\f; Description: 23;

[ code]
procedure ComponentsOnClick(Sender: TObject);
begin
with WizardForm.ComponentsList do
begin
ItemEnabled[Items.IndexOf('21')] := not Checked[Items.IndexOf('1')];
ItemEnabled[Items.IndexOf('22')] := not Checked[Items.IndexOf('1')];
ItemEnabled[Items.IndexOf('23')] := Checked[Items.IndexOf('1')];
Refresh;
end;
end;

procedure InitializeWizard();
begin
WizardForm.ComponentsList.OnClickCheck := @ComponentsOnClick;
WizardForm.ComponentsList.OnClickCheck(nil);
end;




© OSzone.net 2001-2012