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

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

Автор: Genri
Дата сообщения: 27.07.2007 13:45
SyCraft -- возьми Components.iss из примеров, измени Components таким образом :
[Components]
Name: "program"; Description: "Program Files"; Types: full compact custom; Flags: fixed
Name: "help"; Description: "Help File"; Types: full
Name: "readme"; Description: "Readme File"; Types: full
Name: "readme\en"; Description: "English";
Name: "readme\de"; Description: "German";

Если полученный скрипт скомпилить под старой версией и запустить с параметром /COMPONENTS="readme", то English и German отмечены. То же под новой версией - не отмечены. Но если в новой версии параметру добавить префикс * - /COMPONENTS="*readme", то будет так как и раньше - оба отмечены.

Chanka -- ExtraFilesList.ScrollBars := ssBoth;
Автор: Chanka
Дата сообщения: 27.07.2007 13:51
Genri,
И еще раз большое спасибо
Автор: SyCraft
Дата сообщения: 27.07.2007 21:02
Genri
Спасибо большое!
Делаю как раньше но в результате какая то ерунда получается..


[Types]

Цитата:
Name: Base; Description: Рекомендуемый вариант; Languages: ru
Name: Base; Description: Recommended choice; Languages: en

Name: full; Description: Полная установка (не рекомендуется); Languages: ru
Name: full; Description: Full installation (not recommended); Languages: en

Name: Minimal; Description: Базовая сборка; Languages: ru
Name: Minimal; Description: Base assembly; Languages: en

Name: Force; Description: Простая сборка; Languages: ru
Name: Force; Description: Simple assembly; Languages: en

Name: Custom; Description: Custom; Flags: iscustom; Languages: en
Name: Custom; Description: Выборочная Установка; Flags: iscustom; Languages: ru


Раньше работало нормально а теперь дает ошибку
[img=http://funkyimg.com/t/2562620070727_220001.jpg]
и в списке компонентов отображаются только родительские компоненты а дочерних не видно
Автор: Genri
Дата сообщения: 27.07.2007 21:21
SyCraft -- только один тип может содержать флаг iscustom


Цитата:
Only one type may include this flag
-- это из хелпа новой версии

Автор: SyCraft
Дата сообщения: 27.07.2007 21:23
Genri
ну и дела.. а как делать перевод?

вот кусок списка компонентов
но все дочерние компоненты игнорируются инсталлером(


Цитата:
[Components]
Name: Base; Description: Базовые файлы; Types: full Base Minimal Force Custom; Flags: fixed; Languages: ru
Name: Base; Description: Base files; Types: full Base Minimal Force Custom; Flags: fixed; Languages: en

;Skin
Name: Skin; Description: Cкины; Types: full Base Force Custom; Languages: ru
Name: Skin; Description: Skins; Types: full Base Force Custom; Languages: en

Name: Skin\Standart; Description: Стандартный скин; Types: full Base Minimal Force Custom; Flags: fixed; Languages: ru
Name: Skin\Standart; Description: Standart Skin; Types: full Base Minimal Force Custom; Flags: fixed; Languages: en

Name: Skin\Native; Description: Системный скин; Types: full Base Minimal Force Custom; Languages: ru
Name: Skin\Native; Description: System Skin; Types: full Base Minimal Force Custom; Languages: en

Name: Skin\StellSkin; Description: AC StellSkin; Types: full Custom

;Localiz
Name: Localize; Description: Локализация; Types: full Base Force Custom; Languages: ru
Name: Localize; Description: Localization; Types: full Base Force Custom; Languages: en

Name: Localize\Eng; Description: Английская локализация; Types: full Base Minimal Force Custom; Flags: fixed; Languages: ru
Name: Localize\Eng; Description: English localization; Types: full Base Minimal Force Custom; Flags: fixed; Languages: en

Name: Localize\Rus; Description: Русская локализация; Types: full Base Minimal Force Custom; Languages: ru
Name: Localize\Rus; Description: Russian localization; Types: full Base Minimal Force Custom; Languages: en


Автор: Genri
Дата сообщения: 27.07.2007 21:47
SyCraft --
Автор: Ohotnic
Дата сообщения: 28.07.2007 05:03
У меня вопрос. А есть где-нибудь руссификатор для Inno Script Generator?
Выложите, пожалуйста.
Автор: Victor_Dobrov
Дата сообщения: 28.07.2007 09:39
[more=Подсчёт длительности установки]
[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program

[Code]
type TSystemTime = record wYear, wMonth, wDayOfWeek, wDay, wHour, wMinute, wSecond, wMilliseconds: Word; end;
var StartTime, Time: TSystemTime; StartFileTime, FileTime: TFileTime; TLabel: TNewStaticText;

function GetLocalTime(var lpSystemTime: TSystemTime): Boolean; external 'GetLocalTime@kernel32.dll stdcall';
function SystemTimeToFileTime(const lpSystemTime: TSystemTime; var lpFileTime: TFileTime): Boolean; external 'SystemTimeToFileTime@kernel32.dll stdcall';
function FileTimeToSystemTime(const lpFileTime: TFileTime; var lpSystemTime: TSystemTime): Boolean; external 'FileTimeToSystemTime@kernel32.dll stdcall';

Function GetWorkTime: String;
Begin
    GetLocalTime(Time)    {время завершения установки}
    SystemTimeToFileTime(Time, FileTime)
    SystemTimeToFileTime(StartTime, StartFileTime)

//    здесь необходимо использовать 64-битовую арифметику ULARGE_INTEGER
    FileTime.dwLowDateTime:= FileTime.dwLowDateTime - StartFileTime.dwLowDateTime
        FileTime.dwHighDateTime:= FileTime.dwHighDateTime - StartFileTime.dwHighDateTime

    FileTimeToSystemTime(FileTime, Time)
Result:= 'Длительность: ' + IntToStr(Time.wHour) + ' час, ' + IntToStr(Time.wMinute) + ' мин, ' + FloatToStr((Time.wSecond*1000 + Time.wMilliseconds)/1000) + ' сек.'
End;

Procedure CurPageChanged(CurPageID: Integer);
Begin
if CurPageID = wpFinished then TLabel.Caption:= TLabel.Caption + #13#10 + GetWorkTime;
End;

Procedure InitializeWizard;
Begin
GetLocalTime(StartTime) {время начала установки}
TLabel:= TNewStaticText.Create(WizardForm);
TLabel.Top:= WizardForm.CancelButton.Top;
TLabel.Left:= WizardForm.ClientWidth - WizardForm.CancelButton.Left - WizardForm.CancelButton.Width;
TLabel.Parent:= WizardForm;
TLabel.Caption:= 'Время старта: ' + IntToStr(StartTime.wHour) + ' час, ' + IntToStr(StartTime.wMinute) + ' мин, ' + FloatToStr((StartTime.wSecond*1000 + StartTime.wMilliseconds)/1000) + ' сек.' ;
End;
[/more] (по времени старта и завершения)
[more=второй вариант:]
[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program

[Code]
type TSystemTime = record wYear, wMonth, wDayOfWeek, wDay, wHour, wMinute, wSecond, wMilliseconds: Word; end;
var StartTime, Time: TSystemTime; TLabel: TNewStaticText;

function GetLocalTime(var lpTime: TSystemTime): Boolean; external 'GetLocalTime@kernel32.dll stdcall';

Function GetWorkTime: String;
Begin
    GetLocalTime(Time)    {время завершения установки}
if Time.wHour < StartTime.wHour then begin
        Time.wHour:= 24 - StartTime.wHour + Time.wHour
    end else begin
        Time.wHour:= Time.wHour - StartTime.wHour
    end
if Time.wMinute < StartTime.wMinute then begin
        Time.wMinute:= 60 - StartTime.wMinute + Time.wMinute
        Time.wHour:= Time.wHour - 1
    end else begin
        Time.wMinute:= Time.wMinute - StartTime.wMinute
    end
if Time.wSecond < StartTime.wSecond then begin
        Time.wSecond:= 60 - StartTime.wSecond + Time.wSecond
        Time.wMinute:= Time.wMinute - 1
    end else begin
        Time.wSecond:= Time.wSecond - StartTime.wSecond
    end
if Time.wMilliseconds < StartTime.wMilliseconds then begin
        Time.wMilliseconds:= 1000 - StartTime.wMilliseconds + Time.wMilliseconds
        Time.wSecond:= Time.wSecond - 1
    end else begin
        Time.wMilliseconds:= Time.wMilliseconds - StartTime.wMilliseconds
    end
    Result:= 'Длительность: ' + IntToStr(Time.wHour) + ' час, ' + IntToStr(Time.wMinute) + ' мин, ' + FloatToStr((Time.wSecond*1000 + Time.wMilliseconds)/1000) + ' сек.'
End;

Procedure CurPageChanged(CurPageID: Integer);
Begin
    if CurPageID = wpFinished then TLabel.Caption:= TLabel.Caption + #13#10 + GetWorkTime;
End;

Procedure InitializeWizard;
Begin
    GetLocalTime(StartTime)    {время начала установки}
    TLabel:= TNewStaticText.Create(WizardForm);
    TLabel.Top:= WizardForm.CancelButton.Top;
    TLabel.Left:= WizardForm.ClientWidth - WizardForm.CancelButton.Left - WizardForm.CancelButton.Width;
    TLabel.Parent:= WizardForm;
    TLabel.Caption:= 'Время старта: ' + IntToStr(StartTime.wHour) + ' час, ' + IntToStr(StartTime.wMinute) + ' мин, ' + FloatToStr((StartTime.wSecond*1000 + StartTime.wMilliseconds)/1000) + ' сек.' ;
End; [/more] Может есть способы и попроще...
Автор: NightW0lf
Дата сообщения: 28.07.2007 16:45
[Удалено]
Автор: NightW0lf
Дата сообщения: 29.07.2007 02:35
Обновил шапку с русификатором для Inno Setup v5.1.13

P.S. Исправил баги и ошибки
Автор: Vetal83
Дата сообщения: 29.07.2007 11:33
NightW0lf
Я использую твой русификатор в коммерческих целях!
Автор: Kirgyz
Дата сообщения: 29.07.2007 13:06
Привет всем!

Очень прошу помочь. Нужен "удобный" скрипт, для создания резервной копии файлов перед установкой. И только тех файлов, которые возможно указать в скрипте. Варианты из руководства от Kindly мне не подходят. Надеюсь на помощь, спасибо!
Автор: Kindly
Дата сообщения: 29.07.2007 13:20
Kirgyz, если ты делаешь обновление, значит у тебя обновляются определенные файлы. Зачем указывать их в скрипте? Чем не устраивают методы резервирования из пятого руководства?
Автор: Kirgyz
Дата сообщения: 29.07.2007 17:21
Kindly
согласен, если утанавливаются обновлённые файлы и в такое случае "идентичные" им файлы бекапятся, то Ваш вариант очень удобен. Но у меня другой случай. Устанавливаются как бы обновлённые файлы, которые заменяют старые файлы приложения и ещё куча мелких файлов (их в приложении нет), которые потом командной консолью импортируются/заменяют оригиналы в объёмном/большом файле-архиве.

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

Автор: laleks66
Дата сообщения: 29.07.2007 23:57
Я только начал с ним работать,скажите ,я собираю с мастером новый скрипт,как сделать,чтоб по умолчанию небыло деинтолятора,и не указывалась папка после создания,т.е. были :
Uninstallable=no
AppendDefaultDirName=no
а то приходится каждый раз вбивать их вручную.
Автор: Ruud
Дата сообщения: 30.07.2007 00:35
Я сделал 2 7z SFX архива,каждый из них будет записываться на DVD.Не подскажете,как сделать в инсталляторе запрос о вставке второго диска после распаковки первого архива.
Автор: Kindly
Дата сообщения: 30.07.2007 11:07
Genri, в связи с изменением свойств ЧекЛистБокса в версии 5.1.13 скрипт, который с удалением при выборе в CheckListBox, нужно поправить.

Вместо процедуры:

procedure ButtonOnClick(Sender: TObject);
begin
CheckListBox.Checked[0]:= TButton(Sender).Tag = 0;
end;

Нужно применить следующие:

procedure SelectAll(Sender: TObject);
begin
CheckListBox.CheckItem(0, coCheckWithChildren);
end;

procedure ClearAll(Sender: TObject);
begin
CheckListBox.CheckItem(0, coUncheck);
end;

Также внести поправки в процедуру BrowseRemainedFiles:

// AllButton.Tag:= 0;
AllButton.OnClick := @SelectAll;

// UnAllButton.Tag:= 1;
UnAllButton.OnClick := @ClearAll;

Каждый бы сам так сделал, но я просто предупреждаю тех, кто это будет юзать в новой версии.

laleks66 - если ручками влом, то лучше посидеть пока на инсталлере вроде SmartInstallMaker.
Автор: Genri
Дата сообщения: 30.07.2007 13:30
Kindly -- в целом согласен. Хотя в этих двух кнопках особого смысла и не вижу. Чтобы выделить или снять выделение всех элементов, достаточно кликнуть по верхнему узлу. Больше пользы могло бы принести наличие кнопки "Invert selection". При случае внесу соответствующие изменения (в т.ч. и с твоими замечаниями).
Автор: SelfCoder
Дата сообщения: 30.07.2007 13:46
Возможно ли сделать установщик без упаковки файлов? Есть программа, распространяемая на диске. Она запускается с диска. Нужно ее устанавливать простым копированием папки.
Автор: Sero
Дата сообщения: 30.07.2007 13:54
SelfCoder

Цитата:
Возможно ли сделать установщик без упаковки файлов?



Код: [Files]
Source: {src}\Files\*; DestDir: {app}; Flags: external
Автор: Unc1e
Дата сообщения: 30.07.2007 14:01
SelfCoder, если я правильно тебя понял, то попробуй так
Source: "{src}\folder"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs

Извините за повтор, второй раз новую страницу не заметил. )
Автор: Sero
Дата сообщения: 30.07.2007 14:10
Unc1e
а где флаг External? - без него файлы не будут копироватся снаружи!

Лучше будет так:

Код:
[Files]
Source: {src}\Files\*; DestDir: {app}; Flags: external recursesubdirs createallsubdirs ignoreversion
Автор: Unc1e
Дата сообщения: 30.07.2007 14:25
Sero,SelfCoder
Точно, самое главное забыл.
Автор: SelfCoder
Дата сообщения: 30.07.2007 15:06
Sero, большое спасибо
Автор: SpoinT
Дата сообщения: 30.07.2007 15:22
Есть у кого-нибудь пример записи в бинарник определенной последовательности байт?
Автор: Genri
Дата сообщения: 30.07.2007 16:09
SpoinT
Код:
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program

[Code]
procedure WriteToFile;
var
FS: TFileStream;
str: string;
begin
str:= Chr(0)+Chr(10)+Chr(23)+Chr(255)+Chr(30)+Chr(250);

FS := TFileStream.Create('c:\temp\Test.bin',
fmCreate or fmOpenWrite or fmShareDenyWrite);
try
FS.WriteBuffer(str, Length(str));
finally
FS.Free;
end;
end;

procedure InitializeWizard();
begin
WriteToFile;
end;
Автор: Angel_Smerti
Дата сообщения: 30.07.2007 17:29
Прошу помощи - хотел включить в инсталлятор UninsHs, использовал UninsHs 2.1.0.232, но у меня ничего почти не вышло.
Первое - при установки выскакивает такое вот окно:

Второе - при тестовом запуске на изменение компонентов программы, мало того, что инсталлятор не видит дистрибутив с программой, но после того, как покажешь дистрибутив, выскакивает такое вот окно:
и на этом Все!?
И еще после полного удаления программы UninsHs почему-то прихватывает с собой некоторые файлики из системной папки, в частности ACDSee Pro после такого удаления не работает, пишет, что не хватает DLL-ки и надо переустановить программу.
P.S.
Скин для инсталлятора я использовал от Victor_Dobrov, полный текст скрипта положил здесь, у кого есть время, посмотрите, пожалуйста, а то, как программист я полный чайник.
Автор: Victor_Dobrov
Дата сообщения: 30.07.2007 18:47
Автонастройка скрипта на текущую версию с помощью препроцессора:

#if Ver < 83954944
        CheckListBox.Checked[0]:= True;    { для InnoSetup Compiler версии 5.1.12 и ниже}
#else
        CheckListBox.CheckItem(0, coCheckWithChildren);    { для версии 5.1.13 и выше}
#endif
Автор: Genri
Дата сообщения: 30.07.2007 19:14
Victor_Dobrov -- хорошая мысль [more=Здесь]
Код:
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program

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

[Code]
const
bidDelAll = 1;
bidSkipAll = 2;
var
Form: TSetupForm;
CheckListBox: TNewCheckListBox;
AllButton, UnAllButton, InvertButton: TButton;
CancelButton, DelButton: TButton;

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

DelAllReadOnly: Boolean;
SkipAllReadOnly: Boolean;

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: 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
{files} i:= CheckListBox.AddCheckBox(FSR.Name,
FloatToStr(Size64(FSR.SizeHigh, FSR.SizeLow)) + ' byte',
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 Ver < 83954944
CheckListBox.Checked[0]:= TButton(Sender).Tag = 0;
#else
Case TButton(Sender).Tag of
0 : CheckListBox.CheckItem(0, coCheckWithChildren);
1 : CheckListBox.CheckItem(0, coUncheck);
end;
#endif
end;

function HasChildren(Box: TNewCheckListBox; ItemIndex: integer): Boolean;
begin
if (ItemIndex = Box.Items.Count - 1) or
(Box.ItemLevel[ItemIndex+1] <= Box.ItemLevel[ItemIndex]) then
Result:= False
else
Result:= True;
end;

procedure InvertOnClick(Sender: TObject);
var
i: integer;
begin
for i:= 1 to CheckListBox.Items.Count - 1 do
begin
if Not HasChildren(CheckListBox, i) then
CheckListBox.Checked[i]:= Not (CheckListBox.State[i] = cbChecked);
end;
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();
begin
Form:= CreateCustomForm;
Form.ClientWidth := ScaleX(500);
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.Offset:= 0;
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;

InvertButton := TButton.Create(Form);
InvertButton.Parent := Form;
InvertButton.Width := ScaleX(75);
InvertButton.Height := ScaleY(23);
InvertButton.Left := UnAllButton.Left + UnAllButton.Width + ScaleX(10);
InvertButton.Top := Form.ClientHeight - ScaleY(23 + 10);
InvertButton.Caption := 'Invert';
InvertButton.OnClick := @InvertOnClick;

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);

if Form.ShowModal() = mrOk then DeleteFiles();
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if DirExists(ExpandConstant('{app}')) and (CurUninstallStep = usPostUninstall) then
BrowseRemainedFiles();
end;
Автор: Kindly
Дата сообщения: 30.07.2007 20:14
Genri, спасибо. Все-таки вариант с CheckListBox мне больше нравится, чем с ListBox, а кнопочки никогда не помешают. Только для себя я сделал форму без кнопки Отмена, а вместо Удалить => Далее.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Mail.ru агент - вход не выполнен


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