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

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

Автор: ultimo
Дата сообщения: 10.12.2013 11:35
Здравствуйте еще раз)

Может мой вопрос вам покажется странным, но как сделать кнопку, аналогичную кнопке выбора директории установки дистрибутива?


Код:
FolderToBackup := TNewEdit.Create(WizardForm);
with FolderToBackup do begin
Parent := WizardForm.SelectDirPage;
SetBounds(ScaleX(0), ScaleY(130), WizardForm.DirEdit.Width, ScaleY(15));
Text := WizardDirValue+'\Backup';
ReadOnly := True;
end;
Автор: log1stable
Дата сообщения: 10.12.2013 11:41
Habib2302, создаешь кнопку и к ней привязываешь процедуру смены кэпшнов каждого элемента

Добавлено:
ultimo,[more=Как-то так][Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[_Code]
var
FolderToBackup: TNewEdit;
ButtonToBackup: TNewButton;
CDForm: TForm;
CDTreeView: TFolderTreeView;
CDLabel: TLabel;
CDButtonOK,CDButtonCancel: TNewButton;

procedure CDOk(Sender: TObject); //Процедура нажатия Ок на форме
begin
FolderToBackup.Text:=CDTreeView.Directory+'\Backup'; //Задать твоему эдиту текст из дерева папок на форме
CDForm.Close;
end;

procedure CDCancel(Sender: TObject); //Процедура нажатия Отмена на форме
begin
CDForm.Close; //Тупо закрыть форму
end;

procedure ChooseDirBackup(Sender: TObject); //Создаем форму
begin
CDForm:=TForm.Create(WizardForm); //Форма
with CDForm do
begin
Width:=250;
Height:=300;
Position:=poScreenCenter;
Caption:='Выберите папку';
BorderStyle:=bsSingle;
BorderIcons:=[];
end;
CDLabel:=TLabel.Create(WizardForm); //Верхний лейбл
with CDLabel do
begin
Parent:=CDForm;
Left:=8;
Top:=2;
Width:=CDForm.ClientWidth-Left*2;
Height:=16;
AutoSize:=False;
Caption:='Выберите директорию для Backup';
Alignment:=taCenter;
with Font do
begin
Color:=$00404040;
Size:=10;
Name:='Tahoma';
end;
end;
CDTreeView:=TFolderTreeView.Create(WizardForm); //Дерево папок
with CDTreeView do
begin
Parent:=CDForm;
Left:=8;
Top:=CDLabel.Top+CDLabel.Height+6;
Width:=CDLabel.Width;
Height:=200;
Directory:=WizardForm.DirEdit.Text; //Присваиваем путь из эдита WizardForm.DirEdit
end;
CDButtonOK:=TNewButton.Create(WizardForm); //Кнопка ок
with CDButtonOK do
begin
Parent:=CDForm;
Top:=CDTreeView.Top+CDTreeView.Height+6;
Height:=26;
Width:=80;
Left:=20;
Caption:='OK';
OnClick:=@CDOk; //Привязываем нажатие
end;
CDButtonCancel:=TNewButton.Create(WizardForm); //Кнопка отмены
with CDButtonCancel do
begin
Parent:=CDForm;
Top:=CDTreeView.Top+CDTreeView.Height+6;
Height:=26;
Width:=80;
Left:=CDForm.ClientWidth-Width-20;
Caption:='Отмена';
OnClick:=@CDCancel; //Привязываем нажатие
end;
CDForm.ClientHeight:=CDButtonOk.Top+CDButtonOk.Height+6; //Подгоняем форму для красоты
CDForm.ShowModal; //Показываем форму модально, дабы WizardForm был неактивен до тех пор, пока не закроется наша форма
end;

procedure InitializeWizard;
begin
FolderToBackup := TNewEdit.Create(WizardForm); //Твой эдит
with FolderToBackup do begin
Parent := WizardForm.SelectDirPage;
SetBounds(ScaleX(0), ScaleY(130), WizardForm.DirEdit.Width, ScaleY(15));
Text := WizardDirValue+'\Backup';
ReadOnly := True;
end;

ButtonToBackup := TNewButton.Create(WizardForm); //Кнопка к нему
with ButtonToBackup do
begin
Parent:=WizardForm.SelectDirPage;
SetBounds(WizardForm.DirBrowseButton.Left, FolderToBackup.Top-1, WizardForm.DirBrowseButton.Width, WizardForm.DirBrowseButton.Height);
Caption:='Обзор...';
OnClick:=@ChooseDirBackup; //Процедура создания формы
end;
end;[/more]
Автор: ultimo
Дата сообщения: 10.12.2013 13:07
log1stable
Спасибо, очень помогли.
Автор: R3Pa4eK
Дата сообщения: 10.12.2013 21:08
F-Done v0.0.1 Alpha


Теперь это прога, которая сама всё делает. Инструкция в архиве.

Скачать
Автор: BlackInferno1989
Дата сообщения: 10.12.2013 21:11
Народ, помогите пожалуйста, знаю, вопросы простые, тупые и они задавались миллион раз, но все же:

1. В какой секции и какой флаг (фероятно "unchecked") нужно прописать что бы во вкладе инсталятора "Компоненты" галочки по умолчанию были сняты?

2. Киньте пожалуйста код скрипта на установку дополнительного софта (DirectX и vcredist 64 or 86), такой, что бы инсталятор не "кушал" эти файлы, а устанавливал из папки "Redist", которая лежит с главным исполняемым файлом инсталятора.
Автор: log1stable
Дата сообщения: 10.12.2013 23:11
BlackInferno1989,
1. Flags: unchecked в строке нужного компонента.
2. В секции [Run]:
Filename: "{src}\Redist\DXSetup.exe"; StatusMsg: "Установка DirectX" (где {src} - папка с инсталлятором)
Автор: 0D0A
Дата сообщения: 11.12.2013 00:29
А подскажите, можно-ли в коде изменить значения директив секций, например DefaultDirName? Вроде:

Код: function InitializeSetup: Boolean;
begin
Result := True;
if FileExists('c:\1.dat') then
DefaultDirName := 'c:\1';
end;
Автор: nik1967
Дата сообщения: 11.12.2013 05:59
0D0A
[more]
Код: [Setup]
AppName=My Program
AppVersion=My Program
DefaultDirName={code:GetDefaultDir|{pf}\My Program}
DisableDirPage=yes

[_Code]
function GetDefaultDir(Param: String): String;
begin
if FileExists('c:\1.dat') then
Result:= 'c:\1'
else
Result:= Param;
end;
Автор: 0D0A
Дата сообщения: 11.12.2013 10:13
nik1967
Все остальное из Example1.iss, только изменено DefaultDirName, добавлено DisableDirPage и секция Code.
Главное при отладке видно, что файл находит, DefaultDir присваевается, GetDefaultDir правильно трабатывает. Но в конце, в ReadyMemo все равно пишет, что будет установлено в {pf}\My Program.

Добавлено:
PS. Оказывается еще проще. Даже такое не работает...


Код: [Setup]

DefaultDirName={code:GetDefaultDirName}

[Cоde]

function GetDefaultDirName(Param: String): String;
begin
Result := 'C:\1';
end;
Автор: nik1967
Дата сообщения: 11.12.2013 13:35
0D0A, такое впечатление, что мы пользуемся разными Inno...
[more=Скриншот] [/more]
Автор: 0D0A
Дата сообщения: 11.12.2013 13:54
nik1967
5.5.1u на Win8 x64
Автор: nik1967
Дата сообщения: 11.12.2013 14:43
0D0A, Inno Setup Compiler version 5.5.1.ee2(u) на win7 x64
Автор: log1stable
Дата сообщения: 11.12.2013 16:43
В общем, пытаюсь сделать свое дерево файлов на label'ах. Смог пока что сделать следующее: найти диски (на которые возможна установка, привязать процедуры наведения, снятия, клика(по которому создается дерево подпапок данной папки)). Нужно сделать так, чтобы в случае, когда уже раскрыта папка, при раскрытии папки этого же уровня удалялись подпапки предыдущей (на изображении более понятно выражено). У меня уже мозг кипит, я не знаю, как именно РЕАЛИЗОВАТЬ это. Авось, у кого-нибудь из вас получится.
[more]

Типа Code
var CurrentFile, CurrentDisc, Path: string;
Number, NumberDir, Discs, FirstTop, FirstLeft: Integer;
FindRec: TFindRec;
CreatedLabels: string;

type
TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);
#ifdef UNICODE
PAnsiChar=PChar;
#define A "W"
#else
#define A "A"
#endif

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

function GetDriveType(nDrive: string): Longint; external 'GetDriveType{#A}@kernel32.dll stdcall';
procedure TreeLabelEnter(Sender: TObject); forward;
procedure TreeLabelLeave(Sender: TObject); forward;
procedure TreeLabelClick(Sender: TObject); forward;

procedure ShowMessage(Name: String);
begin
MsgBox(Name,MbInformation,MB_OK);
end;

function GetDiscs(): TStringList;
var
i: integer;
buk: array[0..26] of char;
begin
for i:=1 to 26 do
begin
buk[i] := Chr(i+64)
if (GetDriveType(PChar(buk[i]+':\')) <> 1) and not (GetDriveType(PChar(buk[i]+':\')) = 5) then
begin
with TLabel.Create(WizardForm) do
begin
Parent:=WizardForm;
AutoSize:=True;
Top:=FirstTop+Number*Height+4;
Left:=FirstLeft;
Caption:=buk[i]+':\';
Cursor:=crHand;
Hint:=Caption; //Например "D:\"
OnMouseEnter:=@TreeLabelEnter;
OnMouseLeave:=@TreeLabelLeave;
OnClick:=@TreeLabelClick;
Discs:=Discs+1;
end;
Number:=Number+1;
end;
end;
end;

procedure TreeLabelEnter(Sender: TObject);
begin
if Sender is TLabel then
begin
TLabel(Sender).Font.Style:=[fsBold];
end;
end;

procedure TreeLabelLeave(Sender: TObject);
begin
if Sender is TLabel then
begin
TLabel(Sender).Font.Style:=[];
end;
end;

var MyTop: integer;

procedure DeleteTreeLabels(Sender: TObject);
var i: integer;
begin

end;

procedure TreeLabelClick(Sender: TObject);
var
i, j: integer;
begin
for i:=1 to Length(TLabel(Sender).Hint) do
begin
if TLabel(Sender).Hint[i]='\' then j:=j+1;
end;
WizardForm.Caption:=Путь установки: '+TLabel(Sender).Hint;
WizardForm.DirEdit.Text:=TLabel(Sender).Hint;
if FindFirst(TLabel(Sender).Hint+'\*', FindRec) then begin
try
repeat
if (FindRec.Attributes) and (FILE_ATTRIBUTE_DIRECTORY) <> 0 then
if (FindRec.Name<>'.') and (FindRec.Name<>'..') and (FindRec.Name<>'$Recycle.Bin')
and (FindRec.Name<>'Boot') and (FindRec.Name<>'Recovery') and (FindRec.Name<>'ProgramData')
and (FindRec.Name<>'System Volume Information') and (FindRec.Name<>'$RECYCLE.BIN')
and (FindRec.Name<>'msdownld.tmp') then
begin
Number:=Number+1;
with TLabel.Create(WizardForm) do
begin
AutoSize:=True;
Parent:=WizardForm;
Left:=j*10;
Top:=Number*Height+4;
Caption:=FindRec.Name;
Cursor:=crHand;
Name:='Label_'+IntToStr(Number);
CreatedLabels:=CreatedLabels+','+Name;
Tag:=Number;
Hint:=TLabel(Sender).Hint+Caption+'\'; Например "Диск\Родительска папка\Эта подпапка" "(D:\1\2)"
OnMouseEnter:=@TreeLabelEnter;
OnMouseLeave:=@TreeLabelLeave;
OnClick:=@TreeLabelClick;
end;
end;
until not FindNext(FindRec);
finally
FindClose(FindRec);
end;
end;
end;

procedure initializewizard;
begin
with WizardForm do
begin
NextButton.Top:=-500;
CancelButton.Top:=-500;
Bevel.Top:=-500;
BeveledLabel.Top:=-500;
OuterNotebook.Top:=-500;
end;
FirstTop:=10;
FirstLeft:=10;
GetDiscs;
end;
[/more]
Автор: BlackInferno1989
Дата сообщения: 11.12.2013 17:45
log1stable, спасибо, но есть такой вот не решаемый мною вопрос: как прописать, что бы репак сам определял какую версию vcredist 64 или 86 ставить?
Автор: Tapas77789
Дата сообщения: 11.12.2013 19:22
BlackInferno1989

Код:
[Run]
Filename: {src}\Redist\VCRedist\vcredist_x86.exe; Parameters: /q; StatusMsg: Устанавливаем Microsoft Visual C++ 2005 Redist...; Flags: skipifdoesntexist; Tasks: Redist\VCCheck; Check: not IsWin64
Filename: {src}\Redist\VCRedist\vcredist_x64.exe; Parameters: /q; StatusMsg: Устанавливаем Microsoft Visual C++ 2005 Redist...; Flags: skipifdoesntexist; Tasks: Redist\VCCheck; Check: IsWin64
Автор: BlackInferno1989
Дата сообщения: 11.12.2013 20:47
Что-то не работает, прописываю в дополнение еще и таски - не пашет.
скиньте плз полный код всех нужный секций инсталятора на установку дирекста и vcredist с автоматическим распознованием битности винды.
Автор: tyumenik
Дата сообщения: 11.12.2013 21:29
Доброй времени суток, всем!!!
Как сделать кнопки "Завершить процесс" и "Отмена"???
Заранее спасибо!!!

Автор: log1stable
Дата сообщения: 11.12.2013 22:44
BlackInferno1989, вот так будет удобно:

Код: [Run]
//Вписываем "название" файла, варьируемое в зависимости от того...
Filename: "{src}\Redist\vcredist{code:FoundWin|None}.exe"; StatusMsg: Установка Microsoft VC Redistributable x86..."; Flags: waituntilterminated

[Code]
//...какая архитектура процессора:
function FoundWin(Param: String): String;
begin
case ProcessorArchitecture of //Выборка результата получения архитектуры:
paX64: Result:='64'; //Если х64, то дополняем название текстом "64"
paX86: Result:='86'; //Соответственно
end;
end;
Автор: T2008
Дата сообщения: 11.12.2013 23:37
Скажите, пожалуйста, как в копируемых файлах задать атрибуты.
Например, хочу чтобы некоторые файлы создавались с атрибутом "только чтение".
Как это сделать?
Автор: log1stable
Дата сообщения: 12.12.2013 02:13
T2008,
Автор: tyumenik
Дата сообщения: 12.12.2013 03:15
log1stable, ага, Тюменец)))

вот, пример...

[_CustomMessages]
CloseApp=Программа запущена! Закрыть программу и продолжить?

[_Code]
function KillTask(ExeFileName: string): Integer;
external 'KillTask@files:ISTask.dll stdcall delayload';

function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall delayload';

function InitializeSetup(): Boolean;
begin
If RunTask('WinRAR.exe', false) then
begin
if MsgBox(CustomMessage('CloseApp'), mbConfirmation, MB_YESNO) = IDYES then
begin
KillTask('WinRAR.exe');
Result:= True;
end else
Exit;
end;
Result:=True;
end;

Будут кнопки "Да" и "Нет", а нужны эти мне завершить процесс и отмена
Автор: log1stable
Дата сообщения: 12.12.2013 04:54
tyumenik,
[more=Код][Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[CustomMessages]
Ok=Убить процесс
Cancel=Отмена
CloseApp=Закрытие приложения
;используем format(в справке описание есть), чтобы не менять надо было только переменную
CloseAppDialog=Процесс "%s" запущен.%n%nУбить его?

[Code]
const
mresOk=1; //Результат - ок
mresCancel=2; //Результат - отмена

var
MyMsgForm: TForm; //Форма
MyMsgButtonOk, MyMsgButtonCancel: TButton; //Кнопки
MyMsgLabel: TLabel; //Лейбл
MyMsgResult: Integer; //Результат месседжа

procedure MyMsgOk(Sender: TObject); //Процедура кнопки Ок
begin
MyMsgResult:=mresOk; //Результат:=ок
MyMsgForm.Close; //Закрыть форму
end;

procedure MyMsgCancel(Sender: TObject); //Процедура кнопки отмены
begin
MyMsgForm.Close; //Закрыть форму
end;

function MyMsgBox(MyCaption, Text: String): Integer; //Функция появления нашего месседжбокса с типом Integer
begin
MyMsgForm:=TForm.Create(Screen); //Создаем форму
with MyMsgForm do
begin
Name:='MyMsgForm';
ClientHeight:=150;
ClientWidth:=300;
BorderStyle:=bsSingle;
BorderIcons:=[];
Position:=poScreenCenter;
Caption:=MyCaption;
end;
MyMsgLabel:=TLabel.Create(MyMsgForm); //Лейбл
with MyMsgLabel do
begin
Parent:=MyMsgForm;
Name:='MyMsgLabel';
Left:=4;
Alignment:=taCenter;
Caption:=Text;
AutoSize:=False;
Top:=10;
Width:=Parent.ClientWidth-Left*2;
end;
MyMsgButtonOk:=TButton.Create(MyMsgForm); //Кнопку Ок
with MyMsgButtonOk do
begin
Parent:=MyMsgForm;
Name:='MyMsgButtonOk';
Caption:=CustomMessage('Ok');
Top:=MyMsgLabel.Top+MyMsgLabel.Height+14;
Width:=90;
Left:=30;
OnClick:=@MyMsgOk; //Привязываем процедуру кнопке ок
end;
MyMsgButtonCancel:=TButton.Create(MyMsgForm); //Кнопку отмены
with MyMsgButtonCancel do
begin
Parent:=MyMsgForm;
Name:='MyMsgButtonCancel';
Caption:=CustomMessage('Cancel');
Top:=MyMsgLabel.Top+MyMsgLabel.Height+14;
Width:=90;
Left:=Parent.ClientWidth-Width-30;
OnClick:=@MyMsgCancel; //Привязываем процедуру кнопке отмены
end;
MyMsgForm.ClientHeight:=MyMsgButtonCancel.Top+MyMsgButtonCancel.Height+10; //Подровняем форму для красоты
MyMsgForm.ShowModal; //Покажем форму модально
Result:=MyMsgResult; //Результат возьмем из нашей переменной результата
end;

function KillTask(ExeFileName: string): Integer;
external 'KillTask@files:ISTask.dll stdcall delayload';

function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall delayload';

function InitializeSetup(): Boolean;
begin
If RunTask('WinRAR.exe', false) then //Если запущен WinRar.exe
if MyMsgBox(CustomMessage('CloseApp'),Format(CustomMessage('CloseAppDialog'),['WinRar.exe']))=mresOk //Если процедура появления нашего месседжбокса вернет mresOk(=1), тогда
then begin KillTask('WinRAR.exe'); Result:= True; //Убиваем процесс и продолжаем
else Result:=False; //иначе закрываем форму
end;
[/more]
Автор: nerv1909
Дата сообщения: 12.12.2013 08:02
[more] log1stable,
В продолжении темы от 11:41 09-12-2013.
Задача стоит в построении дерева компонентов с проверочной функцией (параметр Check: is64bit в примере).
Ниже приведен рабочий код, то есть дерево компонентов строится:
[Components]
Name: readme; Description: Readme File; Types: full; Flags: checkablealone
Name: readme\en; Description: English; Flags: checkablealone
Name: readme\de; Description: German; Flags: checkablealone
Name: readme\ru; Description: RUssian; Flags: checkablealone
Если добавить проверку, то вложенные компоненты перестают отображаться:
[Components]
Name: readme; Description: Readme File; Types: full; Flags: checkablealone
Name: readme\en; Description: English; Flags: checkablealone; Check: is64avail;
Name: readme\de; Description: German; Flags: checkablealone
Name: readme\ru; Description: RUssian; Flags: checkablealone; Check: is64avail;
В результате будет выведен только компонент German.
Есть подозрение, что это дефект, но хотелось бы подтвердить.
[/more]
Автор: tyumenik
Дата сообщения: 12.12.2013 09:45
log1stable
Автор: sjwrec
Дата сообщения: 12.12.2013 10:27
tyumenik
Ещё одного end; внизу не хватает.
Автор: nik1967
Дата сообщения: 12.12.2013 10:33
tyumenik
sjwrec
Не внизу, а перед else:
Код: end else Result:= false;
Автор: tyumenik
Дата сообщения: 12.12.2013 10:39
nik1967, вот и получилось, мега пасиб) Хороший парень)))
Автор: sjwrec
Дата сообщения: 12.12.2013 13:41
Кто-нибудь знает. Как получить путь к файлу, просто кинув его на Setup.exe ?
Т.Е чтоб срабатывала комманда: Setup.exe файл.(mp3, wav, ogg)
Чтоб при этом Setup запустился и начал играть этот файл.

Вот кусочек кода для которого это надо:


Код:
function InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('BASS.dll');
mp3Name:= // вот сюда надо отправить путь к файлу
BASS_Init(BASS_ACTIVE_DEVICE, 48000, 0, 0, 0);
mp3Handle := BASS_StreamCreateFile(FALSE, PAnsiChar(mp3Name), 0, 0, 0, 0, BASS_SAMPLE_LOOP);
BASS_Start();
BASS_ChannelPlay(mp3Handle, False);
Sleep(5000)
Result := False;
end;
Автор: R3Pa4eK
Дата сообщения: 12.12.2013 14:14
sjwrec
Получить консольный параметр? Если так, тогда есть функа GetCmdTail.

//add:
или даже так:

Код:
function InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('BASS.dll');
mp3Name:= ParamStr(2);
BASS_Init(BASS_ACTIVE_DEVICE, 48000, 0, 0, 0);
mp3Handle := BASS_StreamCreateFile(FALSE, PAnsiChar(mp3Name), 0, 0, 0, 0, BASS_SAMPLE_LOOP);
BASS_Start();
BASS_ChannelPlay(mp3Handle, False);
Sleep(5000)
Result := False;
end;
Автор: sjwrec
Дата сообщения: 12.12.2013 14:36
R3Pa4eK
Большое спасибо! Второй вариант как раз то что нужно.

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758

Предыдущая тема: Только инсталлятор


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