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

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

Devils Night

Ветеран
Gnom, Спасибо!

А чего это он пишет Unknown indetifier 'Expand'? На строке:
[SOURCE="iss"] FileCopy(ExpandConstant('{app}\ISTask.dll'),Expand Constant('{tmp}\ISTask.dll'),False);[/SOURCE]
Это что значит, нужно где-то какую функцию создать?

Юзая поиск нашёл удобное применение компиляции скрипта с помощью батника.
Для этого понадобится создать файл с расширением *.bat, открыть его в блокноте и вписать туда строку:
Код:
"%ProgramFiles%\Inno Setup 5\iscc.exe" script.iss
, где script.iss ваш скрипт.
 
Последнее редактирование:

Devils Night

Ветеран
Заработало, но теперь деинсталятор не работает, не удаляет! Даже в
[SOURCE="iss"]FileCopy(ExpandConstant('{app}\ISTask.dll'),ExpandConstant('{tmp}\ISTask.dll'),False);[/SOURCE] {app}\ISTask.dll заменял на {pf}\My Program\ISTask.dll, всё равно не фурычит.
 
Последнее редактирование:

LexBell

Борода
Супер модератор
всё равно не фурычит.
так еще более косячно выйдет. попробуй удалить после копирования. и покажи свою секцию файлов. если как в твоем пример -
Код:
[Files]
Source: compiler:Dll Pack\ISTask.dll; DestDir: {app}; Flags: dontcopy
Source: compiler:Dll Pack\ISTask.dll; DestDir: {app}; Flags: ignoreversion
то это совершенно не правильно. неизвестно, как инно запишет эти файлы на удаление. Достаточно одной строчки:
Код:
Source: compiler:Dll Pack\ISTask.dll; DestDir: {app}; Flags: ignoreversion
С трого в таком виде, никаких Flags: dontcopy ни в коем случае. Попробуй сперва именно в таком виде, как я показал, потом посмотри, где у тебя по другому. и эта, убери строчки UnloadDll(ExpandConstant('{app}\ISTask.dll')); - я так и не обнаружил, по какой причине они нужны там.
 

Devils Night

Ветеран
если как в твоем
Секция файл у меня и так одна строка была.
никаких Flags: dontcopy ни в коем случае
У меня даже без флагов была.
Закомментировал я UnloadDll(ExpandConstant('{app}\ISTask.dll'));, не работает деинсталятор.
Кстати, ведь по идее то при удалении деинсталятор должен копировать длл-ку из папки {app} в папку {tmp}, и использовать её от туда так?
Вот, у меня ещё параллельно открыта эта папка Temp, так вот, заметил что деинсталлятор длл-ку туда не копирует, т.е никаких IsTask.dll там не вижу, даже в подпапке которую создаёт деинсталлятор.
А вот и
[SOURCE="iss"]#define AppName "My Program"

[Setup]
AppName={#AppName}
AppVerName={#AppName}
DefaultDirName={pf}\{#AppName}
DefaultGroupName={#AppName}

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

[Messages]
rus.SetupWindowTitle={#AppName}

[Icons]
Name: "{group}\{cm:UninstallProgram,{#AppName}}"; Filename: "{uninstallexe}"

[Files]
Source: compiler:Dll Pack\ISTask.dll; DestDir: {app}; Flags: ignoreversion

Код:
function RunTask(FileName: AnsiString; bFullpath: Boolean): Boolean;
  external 'RunTask@files:ISTask.dll stdcall';
function KillTask(ExeFileName: AnsiString): Integer;
  external 'KillTask@files:ISTask.dll stdcall';

function RunTaskU(FileName: AnsiString; bFullpath: Boolean): Boolean;
  external 'RunTask@{tmp}\ISTask.dll stdcall delayload uninstallonly';
function KillTaskU(ExeFileName: AnsiString): Integer;
  external 'KillTask@{tmp}\ISTask.dll stdcall delayload uninstallonly';

//**************************************************//

function InitializeSetup(): Boolean;
begin
  if RunTask('Compil32.exe', False) then
  begin
    if MsgBox('Программа Compil32.exe используется. Закрыть и продолжить установку?', mbInformation, mb_YesNo) = idYes then
    begin
      KillTask('Compil32.exe');
      Result := True;
    end else
      Exit;
  end;
  Result := True;
end;

function InitializeUninstall(): Boolean;
begin
  if not FileExists(ExpandConstant('{tmp}\ISTask.dll')) then
  FileCopy(ExpandConstant('{app}\ISTask.dll'),ExpandConstant('{tmp}\ISTask.dll'),False);
end;



procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usUninstall then
    if RunTaskU('Compil32.exe', False) then
    begin
    // прячем форму
      UninstallProgressForm.Hide;
      if MsgBox('Программа Compil32.exe используется. Закрыть и продолжить удаление?', mbConfirmation, MB_YESNO) = IDYES then
      begin
        KillTaskU('Compil32.exe');
    //    UnloadDll(ExpandConstant('{tmp}\ISTask.dll'));
    // показываем форму
        UninstallProgressForm.Show;
      end
      else
      begin
        MsgBox('Завершите работу Compil32.exe, затем снова запустите программу удаления.', mbInformation, MB_OK);
        UnloadDll(ExpandConstant('{tmp}\ISTask.dll'));
        Abort;
      end;
    end;
end;[/SOURCE][/SPOILER]
 
Последнее редактирование:

LexBell

Борода
Супер модератор
Код:
function InitializeUninstall(): Boolean;
begin
  FileCopy(ExpandConstant('{app}\ISTask.dll'),ExpandConstant('{tmp}\ISTask.dll'),True);
end;
Так попробуй. Блин, даже интересно уже становится, что у тебя за комп такой :) Случайно не на линуксе тестишь?
 

Edison007

Ветеран
Модератор
Код:
function InitializeUninstall(): Boolean;
begin
  if not FileExists(ExpandConstant('{tmp}\ISTask.dll')) then
  FileCopy(ExpandConstant('{app}\ISTask.dll'),Expand  Constant('{tmp}\ISTask.dll'),False);
  [B][COLOR="Red"]Result:=true;[/COLOR][/B]
end;
 

Devils Night

Ветеран
Случайно не на линуксе тестишь?
:lol:, нет, на винде, ума пока не хватило на линуксе тестить.

Edison007, Заработало :yahoo:, в папке темп, в под папке is-*****.tmp теперь вижу длл-ку и папка MyProgram удаляется, не зависимо от того запущен процесс или нет, так же в папке темп чистятся хвосты инно, в общем всё супер.
Thank you very much Gnom and Edison007!
 
Последнее редактирование:

sergey3695

Ветеран
Модератор
Как сделать запрет установки в системную папку? Меня интересует именно как это сделать в InitializeWizard, :)
 

Devils Night

Ветеран
1 Вопрос - Как сделать чтобы кнопка Изменить работала?
[SOURCE="iss"]
#define AppName "My Program"
#define AppExeName "MyProg.exe"
#define InExe "setup.exe"
#define UnExe "unins000.exe"

[Setup]
AppName={#AppName}
AppVerName={#AppName}
DefaultDirName={pf}\{#AppName}
DefaultGroupName={#AppName}

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

[Messages]
rus.SetupWindowTitle={#AppName}

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

[Files]
Source: "C:\Program Files\Inno Setup 5\Examples\MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion nocompression;

[Icons]
Name: "{group}\{#AppName}"; Filename: "{app}\{#AppExeName}"
Name: "{group}\{cm:UninstallProgram,{#AppName}}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\{#AppName}"; Filename: "{app}\{#AppExeName}"; Tasks: desktopicon

[Run]
Filename: "{app}\{#AppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(AppName, "&", "&&")}}"; Flags: nowait postinstall skipifsilent

[Registry]
Root: HKLM; Subkey: "SOFTWARE\{#AppName}"; Flags: uninsdeletekey
Root: HKLM; Subkey: "SOFTWARE\{#AppName}"; ValueName: "Path"; ValueType: String; ValueData: "{app}\"; Flags: uninsdeletekey

[UninstallDelete]
Type: filesandordirs; Name: {app};

Код:
//=============================================== [Три кнопки - Начало] =============================================\\
var
AppDir, unins, run: string;
ResultCode: Integer;
UninsButton, RunButton: TButton;
MyLabel: TLabel;

procedure ReadEntries;
begin
RegQueryStringValue(HKLM, 'SOFTWARE\{#AppName}', 'Path', AppDir);
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
Confirm:= False;
end;

procedure Uninstall(Sender: TObject);
begin
unins:='{#UnExe}';
ReadEntries;
if not (FileExists(AddBackslash(AppDir) + unins)) then
MsgBox('Невозможно запустить деинсталляцию программы ' + ExpandConstant('{#AppName}') + ', т.к. исполняемый файл деинсталляции unins000.exe не найден.', mbCriticalError, MB_OK or MB_DEFBUTTON1)
else
Exec(AddBackslash(AppDir) + unins, '', ExtractFilePath(AddBackslash(AppDir) + unins), SW_SHOW, ewNoWait, ResultCode);
WizardForm.Close;
end;

procedure RunProgramm(Sender: TObject);
begin
run:='{#AppExeName}';
ReadEntries;
if (FileExists(AddBackslash(AppDir) + run)) then
Exec(AddBackslash(AppDir) + run, '', ExtractFilePath(AddBackslash(AppDir) + run), SW_SHOW, ewNoWait, ResultCode);
WizardForm.Close;
end;


//##################### Кнопка изменить#####################
procedure RunInstall(Sender: TObject);
begin
run:='{src}\{#InExe}';
ReadEntries;
if (FileExists(AddBackslash(AppDir) + run)) then
Exec(ExpandConstant('{src}\{#InExe}'),'','',SW_SHOW,ewNoWait,ResultCode);
WizardForm.Close;
end;
//##################### Кнопка изменить#####################


procedure NewForm;
begin
ReadEntries;
if (RegValueExists(HKLM, 'SOFTWARE\{#AppName}', 'Path')) and (FileExists(ExpandConstant(AppDir)+'\{#AppExeName}')) then begin
with WizardForm do
begin
ClientWidth := ScaleX(395);
ClientHeight := ScaleY(120);
Bevel.Hide;
InnerNotebook.Hide;
OuterNotebook.Hide;
BorderStyle:= bsDialog;
Center;
with CancelButton do
begin
Left := WizardForm.CancelButton.Left -100;
Top := WizardForm.ClientHeight - CancelButton.Height - ScaleY(10);
BringToFront;
end;




//##################### Кнопка изменить#####################
RunButton:= TButton.Create(WizardForm);
with RunButton do
begin
Left := WizardForm.NextButton.Left -280;
Top := WizardForm.ClientHeight - NextButton.Height - ScaleY(10);
Width:= WizardForm.NextButton.Width;
//Height := 22;
Parent:= WizardForm;
Caption:= 'Изменить';
OnClick := @RunInstall;
//Cursor:= crHand;
BringToFront;
end;
//##################### Кнопка изменить#####################



UninsButton:= TButton.Create(WizardForm);
with UninsButton do
begin
Left := WizardForm.NextButton.Left -100;
Top := WizardForm.ClientHeight - NextButton.Height - ScaleY(10);
Width:= WizardForm.NextButton.Width;
Parent:= WizardForm;
Caption:= 'Удалить';
OnClick := @Uninstall;
BringToFront;
end;

RunButton:= TButton.Create(WizardForm);
with RunButton do
begin
Left := WizardForm.BackButton.Left -110;
Top := WizardForm.ClientHeight - BackButton.Height - ScaleY(10);
Width:= WizardForm.BackButton.Width;
Parent:= WizardForm;
Caption:= 'Запустить';
OnClick := @RunProgramm;
BringToFront;
end;

MyLabel:= TLabel.Create(WizardForm);
with MyLabel do
begin
SetBounds(10,10,380,80);
AutoSize:=False;
WordWrap:=True;
//Font.Color:=$000000;
//Font.Style:=[fsBold];
//Font.Size:=10;
Parent:=WizardForm;
Transparent:=True;
Caption:= 'Программа ' + ExpandConstant('{#AppName}') + ' уже установлена на Ваш компьютер.' +#13#13+ 'Выберите нужное действие.';
end;
end;
end;
end;

procedure InitializeWizard;
begin
NewForm;
end;
[/SOURCE][/SPOILER] т.е при нажатии на кнопку Изменить чтоб текущий инсталятор продолжал установку.

2 Вопрос - Как кнопку MusicButton привязать к музыке, т.е чтоб было как Play/Pause?
[SPOILER="Вот код"][SOURCE="iss"][Setup]
AppName=BASS v 2.3.0.3
AppVerName=2.3.0.3
AppVersion=2.3.0.3
DefaultDirName={pf}\Music
DefaultGroupName=Music
OutputDir=.


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

[Files]
Source: "bass.dll"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "innocallback.dll"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "Music.mp3"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression

[Icons]
Name: "{group}\{cm:UninstallProgram,Music}"; Filename: "{uninstallexe}"

[UninstallDelete]
Type: filesandordirs; Name: "{app}"

[Code]
{ RedesignWizardFormBegin } // Не удалять эту строку!
// Не изменять эту секцию. Она создана автоматически.
var
  MusicButton: TNewButton;

procedure RedesignWizardForm;
begin
  { MusicButton }
  MusicButton := TNewButton.Create(WizardForm);
  with MusicButton do
  begin
    Name := 'MusicButton';
    Parent := WizardForm;
    Left := ScaleX(16);
    Top := ScaleY(327);
    Width := ScaleX(75);
    Height := ScaleY(25);
    Hint := 'MusicButton';
    ParentShowHint := False;
    ShowHint := True;
  end;

  MusicButton.TabOrder := 5;

{ ReservationBegin }
  // Вы можете добавить ваш код здесь.

{ ReservationEnd }
end;
// Не изменять эту секцию. Она создана автоматически.
{ RedesignWizardFormEnd } // Не удалять эту строку!

type
  HSTREAM=DWORD;
  TTimerProc=procedure(uTimerID,uMessage:UINT;dwUser,dw1,dw2:DWORD);
var
  MP3List:TStringList;
  CurrentMP3:integer;
  hMP3:HWND;
  TimerID:LongWord;

function SetTimer(hWnd:HWND;nIDEvent,uElapse:UINT;lpTimerFunc:LongWord{TFNTimerProc}):UINT;  external 'SetTimer@user32.dll stdcall delayload';
function KillTimer(hWnd:HWND;uIDEvent:UINT):BOOL; external 'KillTimer@user32.dll stdcall delayload';
function BASS_ChannelIsActive(Handle:HWND):DWORD; external 'BASS_ChannelIsActive@files:bass.dll stdcall';
function BASS_SetConfig(Option,Value:DWORD):DWORD; external 'BASS_SetConfig@files:bass.dll stdcall';
function BASS_Init(Device:integer;Freq,Flags:DWORD;Win:HWND;CLSID:integer):boolean; external 'BASS_Init@files:bass.dll stdcall delayload';
function BASS_StreamCreateFile(Mem:BOOL;f:PChar;Offset:DWORD;Length:DWORD;Flags:DWORD):HSTREAM; external 'BASS_StreamCreateFile@files:bass.dll stdcall';
function BASS_StreamFree(Handle:HWND):boolean; external 'BASS_StreamFree@files:bass.dll stdcall';
function BASS_ChannelPlay(Handle:HWND;Restart:boolean):boolean; external 'BASS_ChannelPlay@files:bass.dll stdcall';
function BASS_Start: Boolean; external 'BASS_Start@files:bass.dll stdcall';
function BASS_Stop: Boolean; external 'BASS_Stop@files:bass.dll stdcall';
function BASS_Free: Boolean; external 'BASS_Free@files:bass.dll stdcall delayload';
function WrapTimerProc(CallBack:TTimerProc;ParamCount:integer):LongWord; external 'wrapcallback@files:innocallback.dll stdcall';

procedure TimerTick(uTimerID,uMessage:UINT;dwUser,dw1,dw2:DWORD);
begin
  if BASS_ChannelIsActive(hMP3)=0 then begin
    BASS_Stop;
    BASS_StreamFree(hMP3);
    hMP3:=BASS_StreamCreateFile(False,PChar(MP3List.Strings[CurrentMP3]),0,0,0);
    BASS_Start;
    if hMP3<>0 then
      if BASS_ChannelPlay(hMP3,True) then begin
        CurrentMP3:=CurrentMP3+1;
        if CurrentMP3>MP3List.Count-1 then CurrentMP3:=0;
      end;
  end;
end;

function InitializeSetup:boolean;
begin
  ExtractTemporaryFile('Music.mp3');
  MP3List:=TStringList.Create;
  MP3List.Add(ExpandConstant('{tmp}')+'\Music.mp3');
  CurrentMP3:=0;
  Result:=True;
end;

procedure InitializeWizard;
begin
  RedesignWizardForm;
  TimerID:=SetTimer(0,0,500,WrapTimerProc(@TimerTick,5));
  BASS_Init(-1,44100,0,0,0);
  BASS_SetConfig(5,100);
  BASS_SetConfig(6,100);
end;

procedure DeinitializeSetup;
begin
  KillTimer(0,TimerID);
  BASS_Stop;
  BASS_Free;
  MP3List.Free;
end;[/SOURCE][/SPOILER]Используется библиотека [URL="http://rghost.ru/private/37695575/abd3471ce047bc47fa3fc012029ed6c1"]Bass v 2.3.0.3[/URL]

[SIZE="2"][SIZE="1"]P.S Извиняюсь конечно, но пока не научился я привязывать кнопки. И ещё интересует только на Bass v 2.3.0.3, на BASS 2.4.8 не интересует.[/SIZE][/SIZE]

[B][SIZE="1"]Последнее обновление библиотеки Bass, можно всегда найти[/SIZE][/B] [URL="http://www.un4seen.com/bass.html"][B][SIZE="1"]здесь[/SIZE][/B][/URL].
 
Последнее редактирование:

Nasgul

Новичок
1 Вопрос - Как сделать чтобы кнопка Изменить работала?
очень просто
при запуске изменяется размер окна, расположение кнопок и тд
чтобы кнопка работала тебе надо при нежатии на неё вернуть всё наместо
пример
Код:
procedure RunInstall(Sender: TObject);
begin
with WizardForm do
begin
ClientWidth := ScaleX(497);
ClientHeight := ScaleY(360);
Bevel.Show;
InnerNotebook.Show;
OuterNotebook.Show;
BorderStyle:= bsDialog;
Center;
end;
  with WizardForm.CancelButton do
  begin
    Left := ScaleX(411);
    Top := ScaleY(328);
  end;

  with WizardForm.NextButton do
  begin
    Top := ScaleY(328);
  end;

  with WizardForm.BackButton do
  begin
    Left := ScaleX(251);
    Top := ScaleY(328);
  end;
UninsButton.Hide;
RunButton.Hide;
MyLabel.Hide;
end;
 
Последнее редактирование:

Devils Night

Ветеран
Nasgul, Помню когда-то тоже объясняли и не понял нифига, даже скрипты сравнивал, заметил там одну функцию которая делает кнопку активной, т.е заставляет её что-то делать, но не догнал откуда эту функцию взяли!
А тут мало того что не понял где вообще функция, так ещё в добавок эта кнопка на форме весит, полагаю на LicensePage, а должна была только там быть где находятся Изменить | Запустить | Удалить | Отмена, а не на форме, что усложняет задачу.
Я блин только только понял что Visible := False; - это скрыть а Visible := True; - показать, так что остальное пока для меня тёмный лес.
 

Nasgul

Новичок
Devils Night
вот готовый пример

Код:
#define AppName "My Program"
#define AppExeName "MyProg.exe"
#define InExe "setup.exe"
#define UnExe "unins000.exe"

[Setup]
AppName={#AppName}
AppVerName={#AppName}
DefaultDirName={pf}\{#AppName}
DefaultGroupName={#AppName}
AppId=TheBestAppIdEverMade


[Files]
Source: hl2.exe; DestDir: {app}\common\half-life 2; Flags: ignoreversion createallsubdirs recursesubdirs sortfilesbyextension sortfilesbyname


[ Code]
var
  Run_Button: TNewButton;
  Del_Button: TNewButton;
  AppPath, UninsPath: string;
  ResultCode: Integer;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
Confirm:= False;
end;

procedure UninstallButtonClick(Sender: TObject);
begin
  Exec(UninsPath, '', '' , SW_SHOW, ewNoWait, ResultCode);
  SendMessage(WizardForm.CancelButton.Handle, $00F5, 0, 0);
end;

procedure RunButtonClick(Sender: TObject);
begin
  Exec(AppPath + '\common\half-life 2\hl2.exe', '', '', SW_SHOW, ewNoWait, ResultCode);
  SendMessage(WizardForm.CancelButton.Handle, $00F5, 0, 0);
end;
  
procedure InitializeWizard;
begin
  AppPath := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,InstallLocation|}'));
  UninsPath := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,UninstallString|}'));
    begin
    { Run_Button }
      Run_Button := TNewButton.Create(WizardForm);
      with Run_Button do
      begin
        Name := 'Run_Button';
        Parent := WizardForm;
        Left := ScaleX(240);
        Top := ScaleY(327);
        Width := ScaleX(75);
        Height := ScaleY(23);
        Caption := 'Запустить';
        OnClick := @RunButtonClick;
      end;

    { Del_Button }
      Del_Button := TNewButton.Create(WizardForm);
      with Del_Button do
      begin
        Name := 'Del_Button';
        Parent := WizardForm;
        Left := ScaleX(153);
        Top := ScaleY(327);
        Width := ScaleX(75);
        Height := ScaleY(23);
        Caption := 'Удалить';
        OnClick := @UninstallButtonClick;
      end;
      
    if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1') then
    MsgBox('Программа {#AppName} уже установлена',mbError,MB_OK);
    
    if FileExists(AppPath + '\common\half-life 2\hl2.exe') then
    begin
      Run_Button.Enabled:=true;
    end
    else
      Run_Button.Enabled:=false;
    end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1') and (CurPageId=wpWelcome)
  then
    begin
      Run_Button.Visible := True;
      Del_Button.Visible := True;
      WizardForm.NextButton.Caption := 'Продолжить';
    end
  else
    begin
      Run_Button.Visible := false;
      Del_Button.Visible := false;
      WizardForm.Caption := ExpandConstant(SetupMessage(msgButtonNext));
    end;
end;
 
Последнее редактирование:

ANTISTATIC

Мимокрокодил
Извините пожалуйста, не подскажете как прогрессбар ISDone наложить на стандартный...Для этого надо или не надо удалять ISDone прогрессбар.:)
 

Adil

Старожил
Как сделать статуслэйбел активным т.е. распаковка файлов, откат установки, установка директикс, визуал++
Просто скрыл inner и outernotebook

А статус лэйбел сделал через Тлэйбел

и во время установки надпись статуслэйбела не меняется

Как сделать чтобы он изменялся помогите
Заранее спасибо
 

YURSHAT

Тех. админ
Администратор
nazbek010, например таймером. Посмотри пример в том же андеркавере, в той части где прогрессБары. Там есть строчка, которая "передергивает" статус...
 
  • Like
Реакции: Adil

Devils Night

Ветеран
Здорова народ!
Подскажите такую вещь, а можно ли как нибудь часы добавить (чтоб они шли) на инсталлятор?
 

LexBell

Борода
Супер модератор
Devils Night, Так пойдет?
[SOURCE="iss"][Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

Код:
var
  LabelTime: TLabel;

procedure SetTime(Sender: TObject);
begin
  LabelTime.Caption := TimeToStr(time);
end;

procedure InitializeWizard();
begin
  LabelTime := TLabel.Create(WizardForm);
  with LabelTime do
  begin
    Parent := WizardForm;
    SetBounds(ScaleX(32), ScaleY(335), ScaleX(31), ScaleY(13));
    Transparent := True;
    with Font do
    begin
      Color := clRed;
      Style := [fsBold];
    end;
    Caption := TimeToStr(time);
  end;

  with TTimer.Create(WizardForm) do OnTimer := @SetTime;
end;[/SOURCE]
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху