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

Статус
В этой теме нельзя размещать новые ответы.

Edison007

Ветеран
Модератор
Народ, появилась проблемма...
Надо сделать TLabelEx, у которого будет надпись из WizardForm.DirEdit
с обычным Tlabel будет как-то так:

Код:
[_Code]
var
  SelDir: TLabel; 

procedure DirEditOnChange(Sender: TObject); 
begin;
  SelDir.Caption := MinimizePathName(WizardForm.DirEdit.Text, SelDir.Font, SelDir.Width);
end; 

procedure InitializeWizard;
begin
with WizardForm do begin
  DirEdit.OnChange:=@DirEditOnChange;
end;

with SelDir do begin
  SetBounds(ScaleX(183), ScaleY(182), ScaleX(290), ScaleY(18));
  AutoSize := False;
  WordWrap := False;
  Font.Name:= 'Arial';
  Font.Size:= 10;
  Font.Style := [fsBold];
  ShowAccelChar := False;
  Caption := MinimizePathName(WizardForm.DirEdit.Text, SelDir.Font, SelDir.Width);
  Font.Color := $FFFFFF;
  Transparent := True;
  Parent := WizardForm;
end;
end;
А с TLabelEx не получается.

Если, что вот код (TlabelEx):
Код:
[_Code] 
type 
  TLabelEx = record Massive: array [0..3] of TLabel; TextLabel: TLabel; end; 

function LabelCreateEx(ALeft, ATop, AWidth, AHeight: Integer; FontName: String; FontSize: Integer; FontStyle: TFontStyles; FontColor, ShadowColor: TColor; AAutoSize, ATransparent, AWordWrap: Boolean; AAlignment: TAlignment; AParent: TWinControl; Text: String): TLabelEx; 
var i: integer; tmp: TLabelEx; 
begin 
  for i:= 0 to 3 do begin 
  tmp.Massive[i]:= TLabel.Create(WizardForm); 
with tmp.Massive[i] do begin 
  SetBounds(ALeft, ATop, AWidth, AHeight); 
case i of 
  0: Left:=Left-1; 
  1: Left:=Left+1; 
  2: Top:= Top-1; 
  3: Top:= Top+1; 
end; 
  AutoSize:= AAutoSize; 
  Alignment:= AAlignment; 
  Transparent:= ATransparent; 
  WordWrap:= AWordWrap; 
  Font.Name:= FontName; 
  Font.Size:= FontSize; 
  Font.Style:= FontStyle; 
  Font.Color:= ShadowColor; 
  Caption:= Text; 
  Parent:= AParent; 
end; 
end;
 
tmp.TextLabel:= TLabel.Create(WizardForm); 
with tmp.TextLabel do begin 
  SetBounds(ALeft, ATop, AWidth, Aheight); 
  AutoSize:= AAutoSize; 
  Alignment:= AAlignment; 
  Transparent:= ATransparent; 
  WordWrap:= AWordWrap; 
  Font.Name:= FontName; 
  Font.Size:= FontSize; 
  Font.Style:= FontStyle; 
  Font.Color:= FontColor; 
  Caption:= Text; 
  Parent:= AParent; 
end; 
  Result:= tmp; 
end;
 
procedure HideLabelEx(Line: TLabelEx); 
var i: integer;
begin for i:=0 to 3 do begin 
  Line.Massive[i].Hide;
end;
  Line.TextLabel.Hide;
end; 

procedure ShowLabelEx(Line: TLabelEx); 
var i: integer;
begin for i:=0 to 3 do begin 
  Line.Massive[i].Show;
end;
  Line.TextLabel.Show;
end; 

procedure SetLabelExCaption(var Line: TLabelEx; Text: String); 
var i: Integer;
begin for i:=0 to 3 do begin 
  Line.Massive[i].Caption:=Text
end;
  Line.TextLabel.Caption:= Text;
end; 

procedure SetLabelExColor(var Line: TLabelEx; BackColor, TextColor: TColor); 
var i: Integer;
begin for i:=0 to 3 do begin 
  Line.Massive[i].Font.Color:= BackColor;
end;
  Line.TextLabel.Font.Color:= TextColor;
end; 

procedure SetLabelExEvent(var Line: TlabelEx; ClickEvent: TNotifyEvent; MouseDown, MouseUp: TMouseEvent; MouseMove: TMouseMoveEvent); 
begin 
  If ClickEvent <> nil then Line.TextLabel.OnClick:= ClickEvent; 
  If MouseDown <> nil then Line.TextLabel.OnMouseDown:= MouseDown; 
  If MouseUp <> nil then Line.TextLabel.OnMouseUp:= MouseUp; 
  If MouseMove <> nil then Line.TextLabel.OnMouseMove:= MouseMove; 
end;
 

SuZukI

Мимокрокодил
Можно скрипт,что бы под прогресс баром было большим шрифтом написано сколько выполнено % и сколько из скольких МБ осталось до конца установки?Где то видел подобное?
 

DaRKdemoN

Участник
Проверенный
Народ, появилась проблемма...
Надо сделать TLabelEx, у которого будет надпись из WizardForm.DirEdit
с обычным Tlabel будет как-то так:

Код:
[_Code]
var
  SelDir: TLabel; 

procedure DirEditOnChange(Sender: TObject); 
begin;
  SelDir.Caption := MinimizePathName(WizardForm.DirEdit.Text, SelDir.Font, SelDir.Width);
end; 

procedure InitializeWizard;
begin
with WizardForm do begin
  DirEdit.OnChange:=@DirEditOnChange;
end;

with SelDir do begin
  SetBounds(ScaleX(183), ScaleY(182), ScaleX(290), ScaleY(18));
  AutoSize := False;
  WordWrap := False;
  Font.Name:= 'Arial';
  Font.Size:= 10;
  Font.Style := [fsBold];
  ShowAccelChar := False;
  Caption := MinimizePathName(WizardForm.DirEdit.Text, SelDir.Font, SelDir.Width);
  Font.Color := $FFFFFF;
  Transparent := True;
  Parent := WizardForm;
end;
end;
А с TLabelEx не получается.

Если, что вот код (TlabelEx):
Код:
[_Code] 
type 
  TLabelEx = record Massive: array [0..3] of TLabel; TextLabel: TLabel; end; 

function LabelCreateEx(ALeft, ATop, AWidth, AHeight: Integer; FontName: String; FontSize: Integer; FontStyle: TFontStyles; FontColor, ShadowColor: TColor; AAutoSize, ATransparent, AWordWrap: Boolean; AAlignment: TAlignment; AParent: TWinControl; Text: String): TLabelEx; 
var i: integer; tmp: TLabelEx; 
begin 
  for i:= 0 to 3 do begin 
  tmp.Massive[i]:= TLabel.Create(WizardForm); 
with tmp.Massive[i] do begin 
  SetBounds(ALeft, ATop, AWidth, AHeight); 
case i of 
  0: Left:=Left-1; 
  1: Left:=Left+1; 
  2: Top:= Top-1; 
  3: Top:= Top+1; 
end; 
  AutoSize:= AAutoSize; 
  Alignment:= AAlignment; 
  Transparent:= ATransparent; 
  WordWrap:= AWordWrap; 
  Font.Name:= FontName; 
  Font.Size:= FontSize; 
  Font.Style:= FontStyle; 
  Font.Color:= ShadowColor; 
  Caption:= Text; 
  Parent:= AParent; 
end; 
end;
 
tmp.TextLabel:= TLabel.Create(WizardForm); 
with tmp.TextLabel do begin 
  SetBounds(ALeft, ATop, AWidth, Aheight); 
  AutoSize:= AAutoSize; 
  Alignment:= AAlignment; 
  Transparent:= ATransparent; 
  WordWrap:= AWordWrap; 
  Font.Name:= FontName; 
  Font.Size:= FontSize; 
  Font.Style:= FontStyle; 
  Font.Color:= FontColor; 
  Caption:= Text; 
  Parent:= AParent; 
end; 
  Result:= tmp; 
end;
 
procedure HideLabelEx(Line: TLabelEx); 
var i: integer;
begin for i:=0 to 3 do begin 
  Line.Massive[i].Hide;
end;
  Line.TextLabel.Hide;
end; 

procedure ShowLabelEx(Line: TLabelEx); 
var i: integer;
begin for i:=0 to 3 do begin 
  Line.Massive[i].Show;
end;
  Line.TextLabel.Show;
end; 

procedure SetLabelExCaption(var Line: TLabelEx; Text: String); 
var i: Integer;
begin for i:=0 to 3 do begin 
  Line.Massive[i].Caption:=Text
end;
  Line.TextLabel.Caption:= Text;
end; 

procedure SetLabelExColor(var Line: TLabelEx; BackColor, TextColor: TColor); 
var i: Integer;
begin for i:=0 to 3 do begin 
  Line.Massive[i].Font.Color:= BackColor;
end;
  Line.TextLabel.Font.Color:= TextColor;
end; 

procedure SetLabelExEvent(var Line: TlabelEx; ClickEvent: TNotifyEvent; MouseDown, MouseUp: TMouseEvent; MouseMove: TMouseMoveEvent); 
begin 
  If ClickEvent <> nil then Line.TextLabel.OnClick:= ClickEvent; 
  If MouseDown <> nil then Line.TextLabel.OnMouseDown:= MouseDown; 
  If MouseUp <> nil then Line.TextLabel.OnMouseUp:= MouseUp; 
  If MouseMove <> nil then Line.TextLabel.OnMouseMove:= MouseMove; 
end;
Код:
[Setup]
AppName=AppName
AppVerName=AppVerName
DefaultDirName=C:\AppName

[_Code]
type
  TLabelEx = record Massive: array [0..3] of TLabel; TextLabel: TLabel; end;

var
  LblEx: TLabelEx;

function LabelCreateEx(ALeft, ATop, AWidth, AHeight: Integer; FontName: String; FontSize: Integer; FontStyle: TFontStyles; FontColor, ShadowColor: TColor; AAutoSize, ATransparent, AWordWrap: Boolean; AAlignment: TAlignment; AParent: TWinControl; Text: String): TLabelEx;
var i: integer; tmp: TLabelEx;
begin
  for i:= 0 to 3 do begin
  tmp.Massive[i]:= TLabel.Create(WizardForm);
with tmp.Massive[i] do begin
  SetBounds(ALeft, ATop, AWidth, AHeight);
case i of
  0: Left:=Left-1;
  1: Left:=Left+1;
  2: Top:= Top-1;
  3: Top:= Top+1;
end;
  AutoSize:= AAutoSize;
  Alignment:= AAlignment;
  Transparent:= ATransparent;
  WordWrap:= AWordWrap;
  Font.Name:= FontName;
  Font.Size:= FontSize;
  Font.Style:= FontStyle;
  Font.Color:= ShadowColor;
  Caption:= Text;
  Parent:= AParent;
end;
end;

tmp.TextLabel:= TLabel.Create(WizardForm);
with tmp.TextLabel do begin
  SetBounds(ALeft, ATop, AWidth, Aheight);
  AutoSize:= AAutoSize;
  Alignment:= AAlignment;
  Transparent:= ATransparent;
  WordWrap:= AWordWrap;
  Font.Name:= FontName;
  Font.Size:= FontSize;
  Font.Style:= FontStyle;
  Font.Color:= FontColor;
  Caption:= Text;
  Parent:= AParent;
end;
  Result:= tmp;
end;

procedure HideLabelEx(Line: TLabelEx);
var i: integer;
begin for i:=0 to 3 do begin
  Line.Massive[i].Hide;
end;
  Line.TextLabel.Hide;
end;

procedure ShowLabelEx(Line: TLabelEx);
var i: integer;
begin for i:=0 to 3 do begin
  Line.Massive[i].Show;
end;
  Line.TextLabel.Show;
end;

procedure SetLabelExCaption(var Line: TLabelEx; Text: String);
var i: Integer;
begin for i:=0 to 3 do begin
  Line.Massive[i].Caption:=Text
end;
  Line.TextLabel.Caption:= Text;
end;

procedure SetLabelExColor(var Line: TLabelEx; BackColor, TextColor: TColor);
var i: Integer;
begin for i:=0 to 3 do begin
  Line.Massive[i].Font.Color:= BackColor;
end;
  Line.TextLabel.Font.Color:= TextColor;
end;

procedure SetLabelExEvent(var Line: TlabelEx; ClickEvent: TNotifyEvent; MouseDown, MouseUp: TMouseEvent; MouseMove: TMouseMoveEvent);
begin
  If ClickEvent <> nil then Line.TextLabel.OnClick:= ClickEvent;
  If MouseDown <> nil then Line.TextLabel.OnMouseDown:= MouseDown;
  If MouseUp <> nil then Line.TextLabel.OnMouseUp:= MouseUp;
  If MouseMove <> nil then Line.TextLabel.OnMouseMove:= MouseMove;
end;

procedure DirEditOnChange(Sender: TObject);
begin
  SetLabelExCaption(LblEx,MinimizePathName(WizardForm.DirEdit.Text,LblEx.TextLabel.Font,LblEx.TextLabel.Width));
end;

procedure InitializeWizard();
begin
  LblEx:=LabelCreateEx(44,112,200,30,'',9,[],clBlack,clRed,False,True,False,taLeftJustify,WizardForm.SelectDirPage,'');
  DirEditOnChange(nil);
  WizardForm.DirEdit.OnChange:=@DirEditOnChange;
end;

Добавлено через 3 минуты
Красивый эффект. Это вы писали?
 

Shegorat

Lord of Madness
Администратор
Красивый эффект. Это вы писали?
Нет, писал я. А идея уже не помню чья была. Кстати этот скрипт можно доработать так, чтобы для каждого лейбла из массива можно было выбирать свой цвет.

Можно скрипт,что бы под прогресс баром было большим шрифтом написано сколько выполнено % и сколько из скольких МБ осталось до конца установки?Где то видел подобное?
Там как бэ используется или ISDone или ISFreeArcExtract. Так просто я могу дать только пример для показа процентов
 

Edison007

Ветеран
Модератор
Всем доброго времени суток.
Я себе создал лаунчере запуска программ, и хочу сделать в нём следующее:
Создать чекбокс, если который выбрать то лаунчер бы запускался вместе с запуском виндовс т.е запускался при включении компьютера.
Если же чекбокс не выбран, то запуск не происходилбы.
Возможноли такое реализовать?
 

Shegorat

Lord of Madness
Администратор
Edison007
Можно. При клике, если чекбокс выбран, то пишешь в ветку реестра
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
строковый параметр, имя которого - твоя прога, а его значение путь до запускаемого файла, с параметрами ком. строки если нужно. Вот примерно так
Код:
[noparse][Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

[code]
var
  RunBox: TCheckBox;

procedure CheckBoxClick(Sender: TObject);
begin
  if RunBox.Checked then begin
    RegWriteStringValue(HKCU, 'Software\Microsoft\Windows\CurrentVersion\Run', 'MyAppName', AddQuotes(ExpandConstant('{srcexe}')));
  end else begin
    RegDeleteValue(HKCU, 'Software\Microsoft\Windows\CurrentVersion\Run', 'MyAppName')
  end;
end;

procedure InitializeWizard();
begin
  RunBox:= TCheckBox.Create(WizardForm);
  RunBox.SetBounds(10, 325, 300, 18);
  RunBox.Caption:='Запускать при загрузке системы.';
  RunBox.OnClick:= @CheckBoxClick;
  RunBox.Parent:= WizardForm;
end;[/noparse]
 

DeKaN

Новичок
ярлык в папку %AppData%\Microsoft\Windows\Start Menu\Programs\Startup

путь к папке можно получить из:
Код:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Startup
 
Последнее редактирование:

LexBell

Борода
Супер модератор
Перезалил сборку InnoSetup Ultra Заменил инсталл на более удобоваримы для слабых машин, заменил русик InnoIDE на нормально работающий. Чуть позже добавлю Гейм скрипт генератор и утилиту для определения ключей тихой установки. Пересмотрел в очередной раз состав сборок :)
В связи со сменой инсталла, возможно появление ошибок, буду благодарен тем, кто ткнет носом.
 
Последнее редактирование:

moonlight

Новичок
Проверенный
Gnom, На второй странице, если нажимать на надписи "Я принимаю/не принимаю условия лиц соглашения" чекбоксы не включаются в след. Это же есть и в конце установки, когда инсталл предлагает перезапустить компьютер.
Еще можно добавить в скрипт WizardFrom.DoubleBuffered:=True; А то слишком мигает:)
+ вот это что-то непонятное :)
 

LexBell

Борода
Супер модератор
вот это что-то непонятное
Я вчера всю голову сломал, так и не придумал, как побороть.


Еще можно добавить в скрипт WizardFrom.DoubleBuffered:=True; А то слишком мигает
Финал, когда выловятся все ошибки, откомпилю в юникоде, тогда и добавлю.
 

David.D.Rocco

Участник
Проверенный

LexBell

Борода
Супер модератор
высоту попробуй увеличить. скроллбар тогда не появится.
Это первое, что пришло в голову. Не помогает, высота уже в 2 раза больше, чем нужно.
[hr]Помогите пожалуйста. нужен пример использования
function BrowseForFolder(const Prompt: String; var Directory: String; const NewFolderButton: Boolean): Boolean;
 
Последнее редактирование:

Serega

Знаток
Проверенный
Что-то типа такого?
немного подкорректирую, переменную Folder не нужно задавать глобально, лучше написать так:
Код:
procedure NewButton1Click(Sender: TObject);
var
  Folder: string;
begin
  if BrowseForFolder('Заголовок', Folder, True) then
    WizardForm.DirEdit.Text := Folder;
end;
Если пользователь выберет папку, то в Folder будет путь до этой папки.
True - говорит о том, что на диалоге выбора каталога, появится кнопка "Создать каталог".
 

LexBell

Борода
Супер модератор
DaRKdemoN, Serega, Спасибо огромное :) а можно дополнить? Отображать путь в эдите?
 

Serega

Знаток
Проверенный
Отображать путь в эдите?
честно говоря, раньше не пользовался этой функцией, сейчас попробовал и был удивлён, что едит в диалоге не отображается и сам диалог получается больше стандартного...
Встречный вопрос, для чего вы хотите использовать эту функцию?

Добавлено через 2 минуты
В любом случае, можно сделать хитрый ход. Запоминаем в любую переменную значение WizardForm.DirEdit, затем программно нажимаем на стандартную кнопку выбора каталога, после этого считываем значение из WizardForm.DirEdit, а уже после туда вставляем старое значение из переменной.
 

Serega

Знаток
Проверенный
Мне нужно три разных пути для установки, и все три должны выбираться отдельно
CreateInputDirPage вам поможет, т.е. прячете стандартную страницу выбора каталога, а по её аналогии делаете свою.
[hr] Еще раз спасибо :) Gnom
 
Последнее редактирование модератором:

DaRKdemoN

Участник
Проверенный
немного подкорректирую, переменную Folder не нужно задавать глобально, лучше написать так
:pardon: Да как бы я то же впервые с ней сталкиваюсь и вот накидал пример на скорую руку, показал лишь принцип использования.

PS. А что это за чудо CreateInputDirPage?
 

LexBell

Борода
Супер модератор
Помогите, пожалуйста, правильно настроить этот код:

Код:
procedure DirSetup(Sender: TObject);
var Flag: Boolean;
begin
  for Pag:=0 to getArrayLength(Pages)-1 do begin
    Pages[Pag].Hide;
case Flag of
  True: begin
    WizardForm.WizardBitmapImage.Parent := Pages[1];
    Pages[1].Show;
    DirSetupButton.Caption := 'Назад';
Flag:=False;
  end;
  False: begin
    WizardForm.WizardBitmapImage.Parent := Pages[0];
    Pages[0].Show;
    DirSetupButton.Caption := 'Настроить';
Flag:=True;
      end;
    end;
  end;
end;
- это динамическая замена действия клика кнопки, но срабатывает почему то только дин раз..
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху