Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для Johny777

Ветеран


Сообщения: 649
Благодарности: 444

Профиль | Отправить PM | Цитировать


Спасибо! Теперь как в консоли самой игры и очень удобно!
Цитата El Sanchez:
забыл, что ли, как в авторане я тебе делал? »
никак нет! Его я проштудировал и многое реализовал. В том числе перенёс деинсталятор на ту же форму.
а про всплывающее меню даже не подумал, тк там при нажатии на кнопку (это теперь я тоже могу (спасибо ещё раз! )).

Кстати. Деинсталятор с выбором компонентов ещё доработал и полностью перенёс в код
может кому-то пригодится!
вот пример.
читать дальше »

это в основной скрипт

читать дальше »
Код: Выделить весь код
[Setup]
UninstallFilesDir={app}\uninstall
/// привык держать деинсталятор в отдельной папке

[Files]
/// наш заранее скомпилированный деинсталятор пакуется вместе с файлами основного инсталятора
Source: uninstall\Setup\Uninstall.exe; DestDir: {app}\uninstall; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension;

[UninstallDelete]
/// удаление приложени нацелено на удаление всей папки!
Type: filesandordirs; Name: {app}

 [code] 
procedure CurPageChanged(CurPageID: Integer);  /// при смене страниц
begin
    if CurPageID=wpInstalling then  /// страница установки 
/// столкнулся с проблемой. Если установить с действиями на станице завершения без действий строкой ниже и потом
/// установить ещё раз поверх, то второй раз из списка удаления программ вызывается уже не форма с выбором компонентов, 
///а простой стандартный стиратель с вопросом "Удалть? Да и Нет"
// поэтому при повторной установке в ту же директорию проверяем есть ли там деинсталяторы и стираем их, если они есть
/// родной создаётся заново, а наш, в виде формы, копируется и (описание ниже)
      begin
        if FileExists(ExpandConstant('{app}\uninstall\unins000.exe')) then
        DeleteFile(ExpandConstant('{app}\uninstall\unins000.exe'));
        if FileExists(ExpandConstant('{app}\uninstall\unins007.dat')) then
        DeleteFile(ExpandConstant('{app}\uninstall\unins007.dat'));
        if FileExists(ExpandConstant('{app}\uninstall\unins007.exe')) then
        DeleteFile(ExpandConstant('{app}\uninstall\unins007.exe'));
      end;
    if CurPageID=wpFinished then /// завершающая страница
      begin
/// переименовываем созданный автоматом родной деинсталятор в например unins007.exe и unins007.dat
        if FileExists(ExpandConstant('{app}\uninstall\unins000.exe')) then
        RenameFile(ExpandConstant('{app}\uninstall\unins000.exe'), ExpandConstant('{app}\uninstall\unins007.exe'))
        if FileExists(ExpandConstant('{app}\uninstall\unins000.dat')) then
        RenameFile(ExpandConstant('{app}\uninstall\unins000.dat'), ExpandConstant('{app}\uninstall\unins007.dat'))
///теперь переименовываем наш деинсталятор в родное название (см выше) unins000.exe
        if FileExists(ExpandConstant('{app}\uninstall\Uninstall.exe')) then
        RenameFile(ExpandConstant('{app}\uninstall\Uninstall.exe'), ExpandConstant('{app}\uninstall\unins000.exe'))
     end;
end;

сам деинсталятор но в отличии от старого в виде формы
читать дальше »
Код: Выделить весь код
#define MyAppName "Uninstall"

[Setup]
#define MyAppName "Uninstall"

[Setup]
AppId=proto15
SourceDir=.
OutputDir=Setup
AppName={#MyAppName}
AppVerName={#MyAppName}
AppVersion={#MyAppName}
CreateAppDir=false
OutputBaseFilename={#MyAppName}
Uninstallable=false
//SetupIconFile=hl2.ico
//BitmapResource=bgnd:orangebox.bmp
ShowLanguageDialog=auto
LanguageDetectionMethod=uilanguage
UsePreviousLanguage=no


[CustomMessages]
ru.Uninstall=удалить
en.Uninstall=Uninstall

ru.Exit=выход
en.Exit=Exit

[Languages]
Name: ru; MessagesFile: compiler:Languages\Russian.isl
Name: en; MessagesFile: compiler:Languages\English.isl

[Files]
Source: ISSkin.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: steam.cjstyles; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression

[  Code]
procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall';
/// тень окна /// начало
function GetWindowLong(Wnd: HWnd; Index: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall';
function SetClassLong(hWnd: HWND; Index, NewLong: Longint): Longint; external 'SetClassLongA@user32 stdcall';
/// конец

////////////////////////////////////////////////////////////////////////
var
    AutoRun: TForm;
    ExitButton, UninstallButton: TButton;
    ResultCode: Integer;
    hl2_Checkbox, ep1_Checkbox, ep2_Checkbox, portal_Checkbox: TCheckBox;
//////////////////////////////////////////////////

function Check_hl2: Boolean; begin Result:=hl2_Checkbox.Checked; end;
function Check_ep1: Boolean; begin Result:=ep1_Checkbox.Checked; end;
function Check_ep2: Boolean; begin Result:=ep2_Checkbox.Checked; end;
function Check_portal: Boolean; begin Result:=portal_Checkbox.Checked; end;

/////////////////////////////////////////////////////////////////////

procedure Unstall(Sender: TObject); /// выполняется сверху вниз
begin
///  сначало удаляются эксклюзивные файлы и папки для кждого компонента, если
  begin
    if hl2_Checkbox.Checked = true then  /// чекбокс этого компонента отмечен, то
      begin  /// начало удаления
        DelTree(ExpandConstant('{src}\..\common\half-life 2'), True, True, True) // трём папку
        DeleteFile(ExpandConstant('{src}\..\half-life 2 buka russian.gcf'));
        DeleteFile(ExpandConstant('{src}\..\half-life 2 2007 base content.gcf'));
        DeleteFile(ExpandConstant('{src}\..\half-life 2 content.gcf'));
        DeleteFile(ExpandConstant('{src}\..\half-life 2 game dialog.gcf'));
        DeleteFile(ExpandConstant('{commondesktop}\Half-Life 2.lnk'));  /// удаляем ярлык
      end // конец
  end;
  
  begin
    if ep1_Checkbox.Checked = true then
      begin
        DelTree(ExpandConstant('{src}\..\common\half-life 2 episode one'), True, True, True)
        DeleteFile(ExpandConstant('{src}\..\episode one 2007 content.gcf'));
        DeleteFile(ExpandConstant('{src}\..\half-life 2 episode one.gcf'));
        DeleteFile(ExpandConstant('{commondesktop}\Half-Life 2 Episode One.lnk'));
      end
  end;

  begin
    if ep2_Checkbox.Checked = true then
      begin
        DelTree(ExpandConstant('{src}\..\common\half-life 2 episode two'), True, True, True)
        DeleteFile(ExpandConstant('{src}\..\episode two content.gcf'));
        DeleteFile(ExpandConstant('{src}\..\episode two maps.gcf'));
        DeleteFile(ExpandConstant('{src}\..\episode two materials.gcf'));
        DeleteFile(ExpandConstant('{src}\..\half-life 2 episode two english.gcf'));
        DeleteFile(ExpandConstant('{src}\..\half-life 2 episode two russian.gcf'));
        DeleteFile(ExpandConstant('{commondesktop}\Half-Life 2 Episode Two.lnk'));
      end
  end;

  begin
    if portal_Checkbox.Checked = true then
      begin
        DelTree(ExpandConstant('{src}\..\common\portal'), True, True, True)
        DeleteFile(ExpandConstant('{src}\..\portal content.gcf'));
        DeleteFile(ExpandConstant('{src}\..\portal english.gcf'));
        DeleteFile(ExpandConstant('{src}\..\portal russian.gcf'));
        DeleteFile(ExpandConstant('{commondesktop}\Portal.lnk'));
      end
  end;
  //// конец первой части. Действие идёт дальше после верхнего удаления. Даже если удаления не было и кто-то просто нажал кнопку "Удалить" ничего не произойдёт, тк
    begin  /// начинается вторая проверка полуэксклюзивных файлов, те файлов относящихся к 2 из 3 из 4 имеющихся (здесь) коммпонентов. Например half-life 2 episode one russian.gcf
      begin /// часть озвучки которого используется во втором эпизоде и вся в первом.
        if (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2 episode one'))='') and  /// если этого компонента нет
           (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2 episode two'))='')  //// и этого тоже, то
        then /// удаляем общие для них (и только для них) файлы
        DeleteFile(ExpandConstant('{src}\..\episode 1 shared.gcf'));
        DeleteFile(ExpandConstant('{src}\..\episodic 2007 shared.gcf'));
        DeleteFile(ExpandConstant('{src}\..\half-life 2 episode one russian.gcf'));
      end
      begin  /// а это проверка для удаления файла half-life 2_russian.gcf, ресурсы которго в той или иной степени нужнв всем hl2 в той или иной мере
     /// Напимер
        If (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2'))='') and  // проверка раз  --- нету
           (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2 episode one'))='') and /// два  --- нету
           (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2 episode two'))='')  /// три --- есть. Файл не стирается
        then
        DeleteFile(ExpandConstant('{src}\..\half-life 2_russian.gcf'));
      end
      //// конец второй проверки
      /// начало 3 -й. 
/// А теперь главное. Идёт такая же проверка как и сверху но ведётся поиск всех компонентов и если нет ни одного компонента (уникального файла, подтверждающего наличие компонента), то
/// выпоняется родное удаление в очень тихом режиме и удаляется вся папка. Разберём пример. При инициализации деинсталятор "видит" 2 компонента - hl2 и портал.
/// При удалении только портала удаляется всё уникальное от портала (выше), но hl2 и общие файлы остаются, тут же доходит до дейстий кода ниже. Идёт третья проверка,
/// но не нацеленная не на создание чекбокса, а на проверку есть ли хоть один компонент и он есть - это hl2. Вызываем деинстаятор ещё раз и видим в списке только hl2.
/// Удаляем и снова доходит до третьей проверки. Он не видит не одного hl2.exe в разных директория, и вызывает другой деинсталятор, который трёт всё.
        If (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2'))='') and
           (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2 episode one'))='') and
           (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2 episode two'))='') and
           (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\portal'))='')
        then
      Exec(ExpandConstant('{src}\unins007.exe'),'/VERYSILENT','', SW_SHOW, ewNoWait, ResultCode); /// запускаем родной деинсталятор в очень тихом режиме. 
    end;
  AutoRun.Close;
end;

///////////////////////////////////////////////////////////


procedure CreateAutoRun();
begin
    //AutoRun
    AutoRun := TForm.Create(nil);
    with AutoRun do
    begin
        BorderIcons := [];
        SetClassLong(AutoRun.Handle, (-26), GetWindowLong(AutoRun.Handle, (-26)) or $00020000); //тень окна
        Position := poScreenCenter;
        Caption := 'Uninstall';
        ClientWidth := ScaleX(256);
        ClientHeight := ScaleY(350);
    end;
/////////////////// чекбоксы /// начало
/// создание чекбоксов. По одному на компонент.
    begin
        begin
        hl2_Checkbox := TCheckBox.Create(AutoRun);
          with hl2_Checkbox do
          begin
            Parent := AutoRun;
            Caption := 'half-life 2';
            Left := ScaleX(40);
            Top := ScaleY(20);
            Width := ScaleX(200);
            Height := ScaleY(15);
            Checked := False;
          end;
        end;

        begin
        ep1_Checkbox := TCheckBox.Create(AutoRun);
          with ep1_Checkbox do
          begin
            Parent := AutoRun;
            Caption := 'half-life 2 episode one';
            SetBounds(hl2_Checkbox.Left, hl2_Checkbox.Top + ScaleY(30), ScaleX(200), ScaleY(15));
            Checked := False;
          end;
        end;

        begin
        ep2_Checkbox := TCheckBox.Create(AutoRun);
          with ep2_Checkbox do
          begin
            Parent := AutoRun;
            Caption := 'half-life 2 episode two';
            SetBounds(ep1_Checkbox.Left, ep1_Checkbox.Top + ScaleY(30), ScaleX(200), ScaleY(15));
            Checked := False;
          end;
        end;

        begin
        portal_Checkbox := TCheckBox.Create(AutoRun);
          with portal_Checkbox do
          begin
            Parent := AutoRun;
            Caption := 'portal';
            SetBounds(ep2_Checkbox.Left, ep2_Checkbox.Top + ScaleY(30), ScaleX(200), ScaleY(15));
            Checked := False;
          end;
        end;
    end;
/////////// конец создания чекбоксов. Нихе начинается кусок (procedure CreateAutoRun()) в котором проверяется наличие компонента. Для проверки наличия компонента.
// необходии хотя бы один уникальный файл. Правда здесь в примере идёт поиск одного и того же hl2.exe вразных директориях
// Пример>
// если файл существует здесть (\..\- поднимаемся на уровень выше), то
If FileExists(ExpandConstant('{src}\..\common\half-life 2\hl2.exe')) then   /// Half-Life 2
  begin
  /// чекбоксы этого включен (можно добавить видим/невидим )
    hl2_Checkbox.Enabled:= true;
  end
else /// в противном случае
  begin
    hl2_Checkbox.Enabled:= false;  /// выключен
  end;
///////////
If FileExists(ExpandConstant('{src}\..\common\half-life 2 episode one\hl2.exe')) then  /// Half-Life 2 Episode One
  begin
    ep1_Checkbox.Enabled:= true;
  end
else
  begin
    ep1_Checkbox.Enabled:= false;
  end;
///////////
If FileExists(ExpandConstant('{src}\..\common\half-life 2 episode two\hl2.exe')) then   /// Half-Life 2 Episode Two
  begin
    ep2_Checkbox.Enabled:= true;
  end
else
  begin
    ep2_Checkbox.Enabled:= false;
  end;
///////////
If FileExists(ExpandConstant('{src}\..\common\portal\hl2.exe')) then   /// Portal
  begin
    portal_Checkbox.Enabled:= true;
  end
else
  begin
    portal_Checkbox.Enabled:= false;
  end;
/// конец проверки

  AutoRun.Repaint;

/////////////////// кнопки /// начало
    ///кнопка "Удалить"
    UninstallButton := TButton.Create(AutoRun);
    with UninstallButton do
    begin
        Parent := AutoRun;
        Left := ScaleX(50);
        Top := ScaleY(265);
        Width := ScaleX(90);
        Height := ScaleY(22);
        Cursor := crHand;
        Caption := ExpandConstant('{cm:Uninstall}');
        OnClick := @Unstall; ///при нажатии выполниется удаление
    end;
    /// кнопка выход
    ExitButton := TButton.Create(AutoRun);
    with ExitButton do
    begin
        Parent := AutoRun;
        Left := ScaleX(150);
        Top := ScaleY(265);
        Width := ScaleX(50);
        Height := ScaleY(22);
        Caption := ExpandConstant('{cm:Exit}');
        Cursor := crHand;
        ModalResult := mrCancel;
    end;
/// конец

  AutoRun.ShowModal;
end;

function InitializeSetup(): Boolean;
begin
    ExtractTemporaryFile('steam.cjstyles');
    LoadSkin(ExpandConstant('{tmp}\steam.cjstyles'), '');
    CreateAutoRun();
    Result := False;
end;

procedure DeinitializeSetup;
begin
    AutoRun.Hide;
    UnloadSkin();
end;

проверено
работает как ядерные часы


Последний раз редактировалось Johny777, 30-03-2012 в 19:52.

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:04, 30-03-2012 | #1350