Скрипты Inno Setup. Помощь и советы [часть 4]

Ответить
 • Просмотры: 19
Аватара пользователя
Johny777

Re: Скрипты Inno Setup. Помощь и советы [часть 4]

Сообщение Johny777 »

wertulll,

попробуй так

(по двум секциям раскидай)



Код:

Код: Выделить всё

[Files]
Source: Files\button.bmp; DestDir: {app}; Attribs: hidden system;  /// копируем текстуру помимо как в темп(оттуда всё сотрётся после установки) ещё и в директорию установки и скрываем
[ code]
procedure InitializeUninstallProgressForm;
begin
  FileCopy(ExpandConstant('{app}\button.bmp'), ExpandConstant('{tmp}\button.bmp'), False); /// принцип такой же как и у тебя, только не с картинкой для деинсталятора а с текстурой кнопки
  LoadButtonImage(UninstallProgressForm.CancelButton) /// грузим текстуру для кнопки "отмены" окна удаления
end;
Аватара пользователя
R.i.m.s.k.y.

Re: Скрипты Inno Setup. Помощь и советы [часть 4]

Сообщение R.i.m.s.k.y. »

Johny777,

1. либо ставь Тру либо удали блок

Код:

Код: Выделить всё

function InitializeSetup(): Boolean;
begin
 Result:=True;
end;

Если InitializeSetup возвращает Фолсе инсталлер закрывается и не пискнет, а булевая функция возвращает Фолсе по-умолчанию если не задано иное.

2. Никак, в твоем архиве много мелких файлов, пока все переберет...

Но вот почему тупит когда файлов нет так это потому что у тебя цикл for i:= 0 to GetArrayLength(ArrayOfMask)-1 гоняется вхолостую

добавь перед ним условие "если есть твои папки тогда уже искать"

Он вообще у тебя коряво сделан, зачем ты в цикле перебираешь когда достаточно и без цикла просто

Код:

Код: Выделить всё

  StartFolder:= ExpandConstant('{src}\..\common\half-life 2\hl2\SAVE'); // задаём папку откуда начинать поиск
  StartFolder2:= ExpandConstant('{src}\..\common\half-life 2 episode one\episodic\SAVE'); // задаём папку откуда начинать поиск
  StartFolder3:= ExpandConstant('{src}\..\common\half-life 2 episode two\ep2\SAVE'); // задаём папку откуда начинать поиск
  StartFolder4:= ExpandConstant('{src}\..\common\portal\portal\SAVE'); // задаём папку откуда начинать поиск
  Mask:= '*.sav'; if FindFile(StartFolder) then hl2_SAVE_Checkbox.Enabled := true;
  Mask:= '*.sav'; if FindFile(StartFolder2) then ep1_SAVE_CheckBox.Enabled := true;
  Mask:= '*.sav'; if FindFile(StartFolder3) then ep2_SAVE_CheckBox.Enabled := true;
  Mask:= '*.sav'; if FindFile(StartFolder4) then portal_SAVE_CheckBox.Enabled := true;

кстати я смотрю ты халфу собираешь? у тебя нет случаем HD текстур пака? раньше видел но не удосужился скачать, теперь хочу но не могу найти
Аватара пользователя
Johny777

Re: Скрипты Inno Setup. Помощь и советы [часть 4]

Сообщение Johny777 »

wertulll,

там ведь кнопка только заблокирована?

если да, то не проще ли просто создать картинку, а кнопку скрыть?
Аватара пользователя
R.i.m.s.k.y.

Re: Скрипты Inno Setup. Помощь и советы [часть 4]

Сообщение R.i.m.s.k.y. »

Johny777, ну тогда сжимай получше, у меня канал тонкий Изображение
Аватара пользователя
Johny777

Re: Скрипты Inno Setup. Помощь и советы [часть 4]

Сообщение Johny777 »

R.i.m.s.k.y.,

будет прохладным летним вечером! Изображение
Аватара пользователя
insombia

Re: Скрипты Inno Setup. Помощь и советы [часть 4]

Сообщение insombia »

Всем привет,меня долго здесь не было по этому не знаю,выходили ли какие то новые версии iswin7 и isdone?
Аватара пользователя
Johny777

Re: Скрипты Inno Setup. Помощь и советы [часть 4]

Сообщение Johny777 »

намутил пример (под свои нужды, но думаю кому-то пригодится Изображение)

имеем чекбокс отвечающий за установку например директа.

Если во внешней папке директ есть, то он (чекбокс) активен.

В противном случае не активен

Но тут проблема.

Что если инсталл на диске, а директа рядом нет?

тогда добавляется кнопка "показать"

Указываем и если по указанному пути директ есть, то пути передаются директории "откуда ставить" и "рабочей папке"




читать дальше »




Код:

Код: Выделить всё

[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DirExistsWarning=no
DisableWelcomePage=yes
[  Code]
var
  NewButton1: TNewButton;
  QuickLaunchIcon: TCheckBox;
  Res: Integer;
  S: string;
function MakeQuickLaunchIcon: Boolean;
begin
  Result:=QuickLaunchIcon.Checked;
end;
procedure DirOnClick(Sender: TObject);
var
  DirEditString: String;
begin
  DirEditString := WizardForm.DirEdit.Text;
  if BrowseForFolder('Выберите папку из списка и нажмите «ОК»', S, True) then
    begin
      If FileExists(S+'\DXSETUP.exe') then QuickLaunchIcon.Enabled := true;
    end;
end;
procedure InitializeWizard();
begin
  WizardForm.OuterNotebook.Visible := false;
  WizardForm.Color := clWhite;
  WizardForm.Bevel.Visible := false;
  WizardForm.Caption:= 'DirectX Search Test';
  QuickLaunchIcon := TCheckBox.Create(WizardForm);
    with QuickLaunchIcon do
      begin
        Parent := WizardForm;
        Caption := 'Установить директ';
        Left := ScaleX(100);
        Top := ScaleY(160);
        Width := ScaleX(130);
        Height := ScaleY(25);
        TabOrder := 0;
        Checked := False;
        Enabled := False;
      end;
  NewButton1 := TNewButton.Create(WizardForm);
    with NewButton1 do
      begin
        Name := 'NewButton1';
        Parent := WizardForm;
        Left := QuickLaunchIcon.Left + QuickLaunchIcon.Width + ScaleX(10);
        Top := QuickLaunchIcon.Top;
        Width := ScaleX(160);
        Height := ScaleY(20);
        Caption := 'указать путь к DXSETUP.exe';
        OnClick := @DirOnClick;
      end;
   If FileExists(ExpandConstant('{src}\DirectX\DXSETUP.exe')) then QuickLaunchIcon.Enabled := true;
end;
procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID=wpReady then
    begin
      If FileExists(ExpandConstant('{src}\DirectX\DXSETUP.exe')) and (QuickLaunchIcon.Checked = true) then                            ///// эти две строки имеют приоритет выше, тк идут первыми. 
      Exec(ExpandConstant('{src}\DirectX\DXSETUP.exe'), '', ExpandConstant('{src}\DirectX'), SW_SHOW, ewWaitUntilTerminated, Res);   /// Если пользователь считает, что лучше взять не тот что в комплекте то нижние 2 поменять с этими двумя, 
    end
  else  /// добавил, тк если снаружи видит и в пути есть устанавливал бы 2 раза
    begin
      If FileExists(S+'\DXSETUP.exe') and (QuickLaunchIcon.Checked = true) then
      Exec(S+'\DXSETUP.exe', '', S, SW_SHOW, ewWaitUntilTerminated, Res);
    end;
end;
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm := False;
end;
Аватара пользователя
El Sanchez

Re: Скрипты Inno Setup. Помощь и советы [часть 4]

Сообщение El Sanchez »

Цитата wertulll:



подскажите код для отображения этого
Скрипты Inno Setup. Помощь и советы [часть 4]




насчёт лейбла с отображением прошедшего времени не знаю

а вот с процентами и оставшимся временем дела обстоят хорошо!




читать дальше »




Код:

Код: Выделить всё

[Setup]
AppName=ProgressBar + TimeLeft v2 by South.Tver
AppVerName=ProgressBar + TimeLeft v2 by South.Tver
DefaultDirName={pf}\ProgressBar + TimeLeft v2
OutputBaseFilename=setup
[Files]
Source: {win}\help\*; DestDir: {app}\Files; Flags: external recursesubdirs
Source: {fonts}\*; DestDir: {app}; Flags: external;
Source: CallbackCtrl.dll; Flags: dontcopy
Source: InnoCallback.dll; Flags: dontcopy
[  Code]
type
  TPBProc = function (h:hWnd;Msg,wParam,lParam:Longint):Longint;
  TTimerProc = procedure(HandleW, Msg, idEvent, TimeSys: LongWord);  /// проценты
var
  TimeLeftLabel : TLabel;
  PBOldProc     : Longint;
  WFCaption     : string;
  eTime, sTime  : DWORD;
///////////////////////////////// проценты /// начало
  PercentsTimer: LongWord;
  PercentsLabel: TLabel;
function WrapTimerProc(callback: TTimerProc; Paramcount: Integer): longword; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): longword; external 'SetTimer@user32';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32 stdcall delayload';
/////////////////////////////////////////// конец
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
function CallBackProc(P:TPBProc;ParamCount:integer):LongWord; external 'wrapcallbackaddr@files:CallbackCtrl.dll stdcall';
function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint; external 'CallWindowProcA@user32.dll stdcall';
function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall';
///////////////////////////////// проценты /// начало
Function NumToStr(Float: Extended): String;
begin
  Result:= Format('%.1n', [Float]); StringChange(Result, ',', '.');
  while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
  SetLength(Result, Length(Result)-1);
End;
Procedure PercentsProc(h, msg, idevent, dwTime: Longword);
Begin
  with WizardForm.ProgressGauge do
  begin
    PercentsLabel.Caption:= 'Выполнено ' + NumToStr((Position*100)/Max) + ' %';
  end;
End;
//////// конец
function LongintToStringTime(t:Longint):string;
var
  h,m,s:integer;
begin
  h:=t div 3600;
  t:=t-h*3600;
  m:=t div 60;
  s:=t-m*60;
  Result:='';
  if h>0 then Result:=Result+IntToStr(h)+' ч. ';
  if (m>0) or (h>0) then Result:=Result+IntToStr(m)+' мин. ';
  if (m>0) or (h>0) or (s>0) then Result:=Result+IntToStr(s)+' сек.';
end;
function PBProc(h:hWnd;Msg,wParam,lParam:Longint):Longint;
var
  lt:Longint;
  dt,at,pr,i1,i2:Extended;
  p:string;
  tc:DWORD;
begin
  Result:=CallWindowProc(PBOldProc,h,Msg,wParam,lParam);
  if (Msg=$402) and (WizardForm.ProgressGauge.Position>WizardForm.ProgressGauge.Min) then begin
    i1:=WizardForm.ProgressGauge.Position-WizardForm.ProgressGauge.Min;
    i2:=WizardForm.ProgressGauge.Max-WizardForm.ProgressGauge.Min;
    tc:=GetTickCount;
    if (tc-eTime)>=1000 then begin //пересчитывем время оставшееся до конца установки не чаще, чем раз в 1 секунду
      dt:=(tc-sTime)/1000;
      at:=i2*dt/i1;
      lt:=Round(at-dt)
      TimeLeftLabel.Caption:='Осталось - '+LongintToStringTime(lt);
      eTime:=tc;
    end;
    pr:=i1*100/i2;
    p:=' - ['+Format('%f',[pr])+'%]';
    StringChange(p,',','.');
  end;
end;
procedure AllCancel;
begin
  SetWindowLong(WizardForm.ProgressGauge.Handle,-4,PBOldProc);
  TimeLeftLabel.Free;
  PercentsLabel.Free; /// проценты
end;
function InitializeSetup:boolean;
begin
  if not FileExists(ExpandConstant('{tmp}\CallbackCtrl.dll')) then ExtractTemporaryFile('CallbackCtrl.dll');
  Result:=True;
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
  case CurStep of
    ssInstall: begin
      MsgBox('Чтобы продлить время установки будут скопированы шрифты и справки',mbInformation,MB_OK); /// чтоб не пугались
      PercentsTimer:= SetTimer(0, 0, 100, WrapTimerProc(@PercentsProc, 4));  /// проценты
      TimeLeftLabel:=TLabel.Create(nil);
      with TimeLeftLabel do begin
        Parent:=WizardForm.InstallingPage;
        AutoSize:=True;
        SetBounds(WizardForm.ProgressGauge.Left + ScaleX(250),WizardForm.ProgressGauge.Top + ScaleY(30),ScaleY(80),ScaleY(21));
      end;
      ///////////////////// проценты /// начало
      PercentsLabel:= TLabel.Create(nil);
      with PercentsLabel do
      begin
        SetBounds(WizardForm.ProgressGauge.Left + ScaleX(30), WizardForm.ProgressGauge.Top + WizardForm.ProgressGauge.Height + ScaleY(10), WizardForm.StatusLabel.Width, WizardForm.StatusLabel.Height);
        AutoSize:= True;
        Transparent := True;
        Parent:= WizardForm.InstallingPage;
      end;
      /// конец
      sTime:=GetTickCount;
      eTime:=sTime;
      PBOldProc:=SetWindowLong(WizardForm.ProgressGauge.Handle,-4,CallBackProc(@PBProc,4));
    end;
    ssPostInstall: AllCancel;
  end;
end;
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  if CurPageID=wpInstalling then begin
    Confirm:=False;
    Cancel:=ExitSetupMsgBox;
    if Cancel then AllCancel;
  end;
end;
/////// проценты /// начало
procedure DeinitializeSetup();
begin
  KillTimer(0, PercentsTimer);
end;
///////// конец





сделал так что ты можешь стереть проценты и оставить только время установки

немного изменил сами "проценты" (скопипастил создание лейбла у того же примера с которым совмещал Изображение)



1. пример процентов из InnoSetup FAQ

2. "оставшееся время" - это пример ProgressBar + TimeLeft v2 by South.Tver (....\Inno Setup 5\Modules\South\botva2_example\progressbar+TimeLeft.iss), но без ботвы



*(перед тем как выложить проверил)



архив с библиотеками
Аватара пользователя
Johny777

Re: Скрипты Inno Setup. Помощь и советы [часть 4]

Сообщение Johny777 »

Johny777, спасибо !!!решил вопрос через ISDone Изображение
Ответить

Вернуться в «Автоматическая установка приложений»