Ветеран
Сообщения: 649
Благодарности: 444
|
Профиль
|
Отправить PM
| Цитировать
Спасибо! Теперь как в консоли самой игры и очень удобно!
Цитата El Sanchez:
забыл, что ли, как в авторане я тебе делал? »
|
никак нет! Его я проштудировал и многое реализовал. В том числе перенёс деинсталятор на ту же форму.
а про всплывающее меню даже не подумал, тк там при нажатии на кнопку (это теперь я тоже могу (спасибо ещё раз! ![Bow](images/smilies/2009/bow.gif) )).
Кстати. Деинсталятор с выбором компонентов ещё доработал и полностью перенёс в код
может кому-то пригодится!
вот пример.
читать дальше »
это в основной скрипт
читать дальше »
Код: ![Выделить весь код](images/misc/selectcode.png)
[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;
сам деинсталятор но в отличии от старого в виде формы
читать дальше »
Код: ![Выделить весь код](images/misc/selectcode.png)
#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;
проверено
работает как ядерные часы
|