Ru-Board.club
← Вернуться в раздел «Программы»

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

Автор: Serega0675
Дата сообщения: 30.01.2009 22:14
Don_Juan
Не совсем понятно, что вы хотите сделать, может проще этот код не использовать? Либо удаление прописывайте каждой подпапки отдельно, т.е.

DelTree(ExpandConstant('{app}\Papka1'), True, True, True);
DelTree(ExpandConstant('{app}\Papka2'), True, True, True);

Насколько помню, можно удалять файлы по маске, приблизительно так:

DelTree(ExpandConstant('{app}\*.exe'), False, True, False);
Автор: Don_Juan
Дата сообщения: 30.01.2009 22:41
Serega0675

Просто понимаете, до того как начнётся деинсталляция игры, у меня появляется сообщение «Удалить сохранения и файлы настроек игры?» Если пользователь нажимает «да», то папка с сейвами удаляется, а если нажмет, «нет», то соответственно ничего с ней не происходит. Далее программа удаляется и в случае обнаружения «левых» файлов появляется соответствующее сообщение и предложения эти файлы удалить. То есть срабатывает тот код, который я представил. Так вот проблема в том, что этот код считает папку с сейвами «левыми» файлами. Вот я и спрашивал, как можно сделать, чтобы этого не было. Чтобы этот код папку эту не видел и не трогал её. Но, наверное, Вы правы лучше тогда просто не использовать этот код.
Автор: Sig666
Дата сообщения: 31.01.2009 00:02
SotM

Благодарю, в следующий раз так и поступлю
Автор: GRom V
Дата сообщения: 31.01.2009 07:29
Подскажите как можно указать сдесь путь:....{win}, %windir% и %SystemRoot% не прокатывает
RegWriteStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run', '9', '%windir%\tets.txt');
Автор: Serega0675
Дата сообщения: 31.01.2009 08:24
GRom V

Цитата:
Подскажите как можно указать сдесь путь

так:
RegWriteStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run', '9', ExpandConstant('{win}\tets.txt'));

При деинсталляции придётся второй раз прописывать этот ключ, т.к. сам он не удалится, мне кажется удобней использовать секцию [Registry]...
Автор: GRom V
Дата сообщения: 31.01.2009 09:31
Serega0675
Огромное спасибо - то что надо
Автор: stNeko
Дата сообщения: 31.01.2009 11:47
Как удалить пункт из окна выбора компонентов при наступлении какого-либо определенного условия?
Автор: Serega0675
Дата сообщения: 31.01.2009 12:03
stNeko

Цитата:
Как удалить пункт из окна выбора компонентов при наступлении какого-либо определенного условия?

[more=так][Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.

[Components]
Name: main; Description: Программа; Types: full custom
Name: help; Description: Помощь; Check: IsComponent1; Types: full custom

[Code]
function IsComponent1:boolean;
begin
Result:=True;
begin
If (FileSearch('proga.txt', ExpandConstant('{src}\main'))='') then
Result:=False;
end;
end;
[/more]
Автор: LordVeider
Дата сообщения: 31.01.2009 13:22
Новая задача.
Имеется такая структура компонентов:

Цитата:

--АА
----АА1
----АА2
--АВ
----АВ1
----АВ2
----АВ3

Компоненты самого низкого уровня (AA1, AB1 etc) имеют флаг exclusive.
Задача: сделать так, чтобы
1. При снятии выбора с А снимался выбор и со всех его подкомпонентов.
2. При выборе А автоматически выбирался хотя бы один подкомпонент 3 уровня для каждого компонента 2 уровня. Т.е. нельзя снимать выбор с компонентов АА и АВ.
На первый взгяд всё просто - применить к компонентам 2 уровня флаг Fixed. Однако в этом случае нельзя будет снять выбор с А, что не катит вообще.
Флаг exclusive на AA и AB повесить тоже нельзя, ибо должны быть выбраны одновременно оба, а не только один.
Жду советов =)
Автор: Artem_Butenko
Дата сообщения: 31.01.2009 16:46
Друзья, пожалуйста, помогите совместить страницу выбора директории установки и страницу с прогресс-баром, на манер WinRAR.
Автор: stNeko
Дата сообщения: 31.01.2009 18:10
Serega0675, штука интересная.. но моё условие: если версия одного из файлов в папке назначения не совпадает с указанной, то компонент скрывается. С указаным кодом это не пройдёт... -(


Автор: Serega0675
Дата сообщения: 31.01.2009 18:19
stNeko
Немного не понял, чего вам нужно, в том примере котом я вам дал компонент и так скрывается... Либо объясните более понятней или можете отправить мне на ящик сообщение со скриптом...
Автор: stNeko
Дата сообщения: 31.01.2009 19:04
Serega0675
Ну вот в предложенном Вами коде компонент включается\отключается в зависимости от того, найден ли файл {src}\main\proga.txt. А мне надо вот что-то типа этого:

function IsComponent1:boolean;
var CurrentAppVersion:string;
begin
GetVersionNumbersString(ExpandConstant('{app}') + '\app.exe', CurrentAppVersion)
Result:=True;
begin
if CurrentAppVersion < '1.1' then
Result:=False;
end;
end;

Но результатом вышеследующего кода является знакомая ошибка:
An attempt was made to expand the "app" constant before it was initialized
Автор: Serega0675
Дата сообщения: 31.01.2009 19:53
stNeko
Так она вылетает в случае если файла нет, т.е. вы пытаетесь получить версию файла до установки приложения, а его там нет... вот отсюда и ошибка...

Добавлено:
LordVeider
если я вас правильно понял, то [more=так][Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes
ComponentsListTVStyle=true

[Types]
Name: full; Description: Полная сборка
Name: custom; Description: Выборочная сборка; Flags: iscustom

[Components]
Name: A; Description: Программа; Types: full
Name: A\A; Description: Компонент 1; Types: full custom
Name: A\A\A; Description: Компонент 1.1; Types: full custom; Flags: exclusive
Name: A\A\B; Description: Компонент 1.2; Types: full custom; Flags: exclusive
Name: A\B; Description: Компонент 2; Types: full custom
Name: A\B\A; Description: Компонент 2.1; Types: full custom; Flags: exclusive
Name: A\B\B; Description: Компонент 2.2; Types: full custom; Flags: exclusive
Name: A\B\C; Description: Компонент 2.3; Types: full custom; Flags: exclusive

[Code]
procedure OnClickCheck(Sender: TObject);
begin
if WizardForm.ComponentsList.Checked[0] = true then
begin
WizardForm.ComponentsList.ItemExpanded[1]:=true; // раскрывает список компонентов
WizardForm.ComponentsList.Checked[1]:=true;
WizardForm.ComponentsList.Checked[4]:=true;
end else
WizardForm.ComponentsList.ItemExpanded[1]:=false; // сворачивает список компонентов
end;

procedure InitializeWizard();
begin
WizardForm.ComponentsList.OnClickCheck:=@OnClickCheck
end;
[/more]
Автор: stNeko
Дата сообщения: 01.02.2009 04:05
Serega0675, не в том дело - файл есть, установщик обновляет уже установленное приложение. У этого обновляемого приложения перед установкой проверяет соответствие версии основного исполняемого файла..

Я понимаю эту ошибку как невозможность получение значения переменной {app}, тк код выполняется до того как эта переменная {app} (папка установки) была задана на соответствующей странице. Ошибка конечно же выскакивает при инициализации мастера.

Надо как-то прикрутить код, например, к клику кнопки Next на странице выбора папки установки, либо выполнить непосредстенно на странице выбора компонентов. Я вот не могу сообразить, каким способом это сделать.
Автор: Serega0675
Дата сообщения: 01.02.2009 10:06
stNeko

Цитата:
Надо как-то прикрутить код, например, к клику кнопки Next на странице выбора папки установки
Вот то, что вам [more=надо][Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app};

[Code]
function NextButtonClick(CurPage: Integer): Boolean;
var
CurrentAppVersion,s:string;

begin
Result:=True;
If CurPage=6 then
// Проверка присутствия определенных файлов в папке с установленной программой на странице выбора папки назначения
begin
If (FileSearch('MyProg.exe', ExpandConstant('{app}'))='') then
begin
s:='Извините, в директории '+ExpandConstant('{app}')+'' #13 'не обнаружены файлы, подтверждающие подлинность программы.' #13#13 'Пожалуйста, выберите правильный путь для установки обновления.';
MsgBox(s, mbError, mb_Ok);
Result:= False;
end else
// И проверка версии оригинальных файлов
begin
GetVersionNumbersString(ExpandConstant('{app}') + '\MyProg.exe', CurrentAppVersion);
if CurrentAppVersion < '1.5' then
begin
s:='Версия установленого компонента MyProg.exe не соответствует.' #13#13 'Для установки обновления требуются версия не ниже 1.5.';
MsgBox(s, mbCriticalError, mb_Ok);
Result:= False;
end;
end;
end;
end;
[/more]
Автор: LordVeider
Дата сообщения: 01.02.2009 10:08

Цитата:
LordVeider
если я вас правильно понял, то так
Поняли вроде правильно, но такое решение не подходит...
Довольно много компонентов нужно сделать по этой схеме, соответственно получается куча костылей, что ничего хорошего не несёт...
Кроме того, некоторые компоненты могут динамически отключаться с помощью Check-функций, что вообще делает данную схему неработоспособной из-за смены нумерации в WizardForm.ComponentsList.
Автор: Serega0675
Дата сообщения: 01.02.2009 10:39
LordVeider
Вы извините, но я не телепат... Надо все условия говорить сразу...
Из вышесказанного вами я понял, что компоненты у вас внешние и в момент запуска приложения происходит проверка на их присутствие... В соответствии с этой проверкой происходит построение списка компонентов. Правильно? Есть ли ещё, какие условия?
Автор: LordVeider
Дата сообщения: 01.02.2009 12:23
Вторая проблема является следствием первой, т.е. костылей, на которых данная проверка построена.
Хотелось более "правильного" решения.
И ещё. Пересмотрел ваш код. Всё-таки не так вы меня поняли.
Но всё равно спасибо за помощь.
Буду пытаться искать другое решение...
Автор: spider91
Дата сообщения: 02.02.2009 22:05
помогите кто разбирается сделал скрип с длл для 7зипа которая и прогресбар создает и он чет не пашет
не рапаковывает архивы кто может проверте пожалуйста



#define ArchiveName "{src}\data1.bin"
#define ArchiveName "{src}\data2.bin"
#define ArchiveName "{src}\data3.bin"
#define ArchiveName "{src}\data4.bin"
#define ArchiveName "{src}\data5.bin"
#define ArchiveName "{src}\data6.bin"
#define ArchiveName "{src}\data7.bin"
#define ArchiveName "{src}\data8.bin"
#define ArchiveDestDir "{app}"


[Setup]
AppName=Grand Theft Auto IV
AppVerName=Grand Theft Auto IV
DefaultDirName={pf}\Rockstar Games\Grand Theft Auto IV
DefaultGroupName=Grand Theft Auto IV
AllowNoIcons=yes
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes
ExtraDiskSpaceRequired=25516192768
WizardImageFile="C:\Users\Dmitri\Desktop\Output\embedded\WizardImage.bmp"
WizardSmallImageFile="C:\Users\Dmitri\Desktop\Output\embedded\WizardSmallImage.bmp"

[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"

[CustomMessages]
CustomStatusLabel=Extracting...
[Files]
Source: "C:\Users\Dmitri\Desktop\Output\is7z.dll"; DestDir: {tmp}; Flags: dontcopy
[UninstallDelete]
Name: {app}; Type: filesandordirs
[Code]
var
SecondProgressBar : TNewProgressBar;

procedure Extract7z (hWnd, hpb, hst: THandle; fpath, extractPath, pass:pchar); external 'Extract7z@files:is7z.dll stdcall';
procedure CancelExtract; external 'CancelExtract@files:is7z.dll stdcall';

procedure InitializeWizard();
begin
WizardForm.ProgressGauge.Left:=ScaleX(155);
WizardForm.ProgressGauge.Width:=ScaleX(262);

SecondProgressBar := TNewProgressBar.Create(WizardForm);
with SecondProgressBar do
begin
Parent := WizardForm.InstallingPage;
Left := ScaleX(0);
Top := WizardForm.ProgressGauge.Top;
Width := ScaleX(150);
Height := ScaleY(21);
Max := 100;
Position := 0;
end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
If CurStep=ssInstall then
begin
WizardForm.StatusLabel.Caption:='Extracting...';
Extract7z (wizardform.handle, SecondProgressBar.handle, WizardForm.FileNameLabel.handle, ExpandConstant('{#ArchiveName}'), ExpandConstant('{#ArchiveDestDir}'), '');
end;
end;


[Registry]
Root: HKLM; Subkey: "SOFTWARE\Rockstar Games"; Flags: uninsdeletekeyifempty
Root: HKLM; Subkey: "SOFTWARE\Rockstar Games\Grand Theft Auto IV"; Flags: uninsdeletekey
Root: HKLM; Subkey: "SOFTWARE\Rockstar Games\Grand Theft Auto IV"; ValueName: "InstallComplete"; ValueType: String; ValueData: "1"; Flags: uninsdeletekey
Root: HKLM; Subkey: "SOFTWARE\Rockstar Games\Grand Theft Auto IV"; ValueName: "InstallFolder"; ValueType: String; ValueData: "{app}"; Flags: uninsdeletekey
Root: HKLM; Subkey: "SOFTWARE\Rockstar Games\Grand Theft Auto IV\1.00.0000"; Flags: uninsdeletekey
Root: HKLM; Subkey: "SOFTWARE\Rockstar Games\Rockstar Games Social Club"; Flags: uninsdeletekey
Root: HKLM; Subkey: "SOFTWARE\Rockstar Games\Rockstar Games Social Club"; ValueName: "InstallFolder"; ValueType: String; ValueData: "{app}\RGSC"; Flags: uninsdeletekey
Root: HKLM; Subkey: "SOFTWARE\Rockstar Games\Rockstar Games Social Club"; ValueName: "InstallLang"; ValueType: String; ValueData: "/clone_wait /L1033 /zAUTORUN"; Flags: uninsdeletekey
Root: HKLM; Subkey: "SOFTWARE\Rockstar Games\Rockstar Games Social Club\1.00.0000"; Flags: uninsdeletekey


[Run]
Filename: "{app}\precomp.exe"; Parameters: "-r data1.pcf"; WorkingDir: "{app}";
Filename: "cmd.exe"; Parameters: "/C del /F /Q data1.pcf"; WorkingDir: "{app}";
Filename: "{app}\data1.exe"; Parameters: "-y"; WorkingDir: "{app}";
Filename: "cmd.exe"; Parameters: "/C del /F /Q data1.exe"; WorkingDir: "{app}";
Filename: "{app}\precomp.exe"; Parameters: "-r data2.pcf"; WorkingDir: "{app}";
Filename: "cmd.exe"; Parameters: "/C del /F /Q data2.pcf"; WorkingDir: "{app}";
Filename: "{app}\data2.exe"; Parameters: "-y"; WorkingDir: "{app}";
Filename: "cmd.exe"; Parameters: "/C del /F /Q data2.exe"; WorkingDir: "{app}";
Filename: "{app}\precomp.exe"; Parameters: "-r data3.pcf"; WorkingDir: "{app}";
Filename: "cmd.exe"; Parameters: "/C del /F /Q data3.pcf"; WorkingDir: "{app}";
Filename: "{app}\data3.exe"; Parameters: "-y"; WorkingDir: "{app}";
Filename: "cmd.exe"; Parameters: "/C del /F /Q data3.exe"; WorkingDir: "{app}";
Filename: "{app}\precomp.exe"; Parameters: "-r data4.pcf"; WorkingDir: "{app}";
Filename: "cmd.exe"; Parameters: "/C del /F /Q data4.pcf"; WorkingDir: "{app}";
Filename: "{app}\data4.exe"; Parameters: "-y"; WorkingDir: "{app}";
Filename: "cmd.exe"; Parameters: "/C del /F /Q data4.exe"; WorkingDir: "{app}";
Filename: "{app}\precomp.exe"; Parameters: "-r data5.pcf"; WorkingDir: "{app}";
Filename: "cmd.exe"; Parameters: "/C del /F /Q data5.pcf"; WorkingDir: "{app}";
Filename: "{app}\data5.exe"; Parameters: "-y"; WorkingDir: "{app}";
Filename: "cmd.exe"; Parameters: "/C del /F /Q data5.exe"; WorkingDir: "{app}";
Filename: "{app}\precomp.exe"; Parameters: "-r data6.pcf"; WorkingDir: "{app}";
Filename: "cmd.exe"; Parameters: "/C del /F /Q data6.pcf"; WorkingDir: "{app}";
Filename: "{app}\data6.exe"; Parameters: "-y"; WorkingDir: "{app}";
Filename: "cmd.exe"; Parameters: "/C del /F /Q data6.exe"; WorkingDir: "{app}";
Filename: "{src}\Redist\dotnetfx3.exe"; Parameters: "/q /norestart"; WorkingDir: "{src}\Redist"; StatusMsg: "Installing MS NET Framework 3.0, please wait..."; Check: "not IsWin64";
Filename: "{src}\Redist\dotnetfx3_x64.exe"; Parameters: "/q /norestart"; WorkingDir: "{src}\Redist"; StatusMsg: "Installing MS NET Framework 3.0, please wait..."; Check: "IsWin64";
Filename: "{src}\Redist\xliveredist.msi"; Parameters: "/quiet /passive /norestart"; WorkingDir: "{src}\Redist"; StatusMsg: "Installing Games for Windows LIVE, please wait...";
Filename: "{src}\Redist\wmfdist11.exe"; Parameters: "/quiet /passive /norestart"; WorkingDir: "{src}\Redist"; StatusMsg: "Installing Windows Media Format 11 Runtime, please wait...";
Filename: "{src}\Redist\umdf.exe"; Parameters: "/quiet /passive /norestart"; WorkingDir: "{src}\Redist";
Filename: "{src}\Redist\vcredist_x86.exe"; Parameters: "/Q"; WorkingDir: "{src}\Redist"; StatusMsg: "Installing MS VCPP 2005 Redistributable, please wait..."; Check: "not IsWin64";
Filename: "{src}\Redist\vcredist_x64.exe"; Parameters: "/Q"; WorkingDir: "{src}\Redist"; StatusMsg: "Installing MS VCPP 2005 Redistributable, please wait..."; Check: "IsWin64";
Filename: "{src}\DirectX\DXSETUP.exe"; Parameters: "/silent"; Tasks: "directx";


[Tasks]
Name: "desktopicon"; Description: "Create desktop icon";
Name: "directx"; Description: "Install DirectX 9.0c";

не
Автор: EagleSH
Дата сообщения: 02.02.2009 23:52
господа, подскажите, нужно запустить sfx архив в секции КОДЕ в конце установки НО ПЕРЕД созданием ярлыков, где это прописать?
Автор: GRom_V
Дата сообщения: 03.02.2009 08:01
Скажите....Можно ли как то изменить текст в инсталляторе на вкладке о программе MainForm.ShowAboutBox ?
Автор: EagleSH
Дата сообщения: 03.02.2009 11:05
ещё вопрос, допустим есть setup.exe и setup1.exe, можно ли сделать так, чтоб при запуске setup1.exe выдавалось сообщение, типа Инстал запускается с setup.exe, и выход.

тоесть при запуске setup.exe начиналась установка, а из неё уже запускалсся setup1.exe
а при запуске setup1.exe ничего не происходило.
Автор: SotM
Дата сообщения: 03.02.2009 12:06
EagleSH
Можно. Когда запускаешь свой setup1.exe, то нужно передать какой нить особенный свой параметр, который известен только тебе.
Автор: EagleSH
Дата сообщения: 03.02.2009 12:25
SotM
о дружище подскажи на примере, например параметр "InnoRulit"

а лучше параметр будет создаваться на диске, к примеру если в папке "<tmp>\inno\innorulit.txt есть такой файл, то успешный запуск, если его нет - нет запуска.
Автор: SotM
Дата сообщения: 03.02.2009 14:07
EagleSH

Что-то типа этого нужно вписать в setup1.exe
Код:
procedure InitializeWizard;
begin
    if ( ParamCount > 1 ) and ( CompareText( ParamStr(2), '/InnoRulit' ) = 0 ) then
        MsgBox('Right usage', mbInformation, MB_OK )
    else
        MsgBox('Blah-blah-blah. Wrong usage', mbError, MB_OK);
end;
Автор: Unc1e
Дата сообщения: 03.02.2009 14:46
Написал скрипт, сворачивающий инсталер в трей на странице установки [more]#define MyAppVerName "My Program"
#define MyAppExeName "MyProg.exe"
[Setup]
AppName=MyApp
AppVerName=MyApp Ver 1.0
DefaultDirName={pf}\MyApp
DefaultGroupName=MyApp
Compression=none

[Files]
Source: trayiconctrl.dll; DestDir: {tmp}; Flags: dontcopy
Source: InnoCallback.dll; DestDir: {tmp}; Flags: dontcopy
Source: "icon.ico"; Flags: dontcopy
Source: "icon1.ico"; Flags: dontcopy
Source: "icon2.ico"; Flags: dontcopy
Source: "icon3.ico"; Flags: dontcopy
Source: "icon4.ico"; Flags: dontcopy
Source: "D:\Games\Ballance.mdf"; DestDir: {app}; Flags: external

[no][code][/no]
type
TIconList = record
Icon1: UINT;
Icon2: UINT;
Icon3: UINT;
Icon4: UINT;
end;

TMenuItemClickProc = procedure(MenuIndex: Integer);
TMenuPopupProc = procedure(PopMenu: LongWord; var bShow: Boolean);

function WrapMenuItemClickProc(Callback: TMenuItemClickProc; ParamCount: Integer): LongWord; external 'wrapcallback@files:innocallback.dll stdcall';
function WrapMenuPopupProc(Callback: TMenuPopupProc; ParamCount: Integer): LongWord; external 'wrapcallback@files:innocallback.dll stdcall';
function LoadImage(hInst: UINT; ImageName: String; ImageType: UINT; X, Y: Integer; Flags: UINT): THandle; external 'LoadImageA@user32.dll stdcall';
function EnableMenuItem(hMenu: UINT; uIDEnableItem, uEnable: UINT): BOOL; external 'EnableMenuItem@user32.dll stdcall';
function IsWindowEnabled(hWnd: HWND): BOOL; external 'IsWindowEnabled@user32.dll stdcall';
function InitTrayIconCtrl(MainForm_Handle, WizardForm_Handle: THandle; uCallbackMessage: UINT;
szToolTip: String; icon: UINT; bHidden: BOOL; ShowTaskbarAppBtn: BOOL; MenuItems: String;
DefaultMnuIndex: Integer; MenuItemOnClickCallBack, MenuOnPopupCallBack: LongWord): Boolean;
external 'inittrayiconctrl@files:trayiconctrl.dll stdcall';
function UninitTrayIconCtrl(): Boolean; external 'uninittrayiconctrl@files:trayiconctrl.dll stdcall';
function HideTrayIcon(): Boolean; external 'hidetrayicon@files:trayiconctrl.dll stdcall';
function ShowTrayIcon(): Boolean; external 'showtrayicon@files:trayiconctrl.dll stdcall';
function SetIconList(pHIconList: TIconList; nNumIcons: UINT): Boolean; external 'seticonlist@files:trayiconctrl.dll stdcall';
function AnimateTrayIcon(nDelayMilliSeconds: UINT; nNumSeconds: Integer): Boolean; external 'animatetrayicon@files:trayiconctrl.dll stdcall';
function StopAnimation(): Boolean; external 'stopanimation@files:trayiconctrl.dll stdcall';
function ToggleWizardVisible(): Boolean; external 'togglewizardvisible@files:trayiconctrl.dll stdcall';
function ShowBalloon(szText, szTitle: String; dwIcon: DWORD; uTimeout: UINT; bWaitforPreMsg: Boolean): Boolean; external 'showballoon@files:trayiconctrl.dll stdcall';
function HideBalloon(): Boolean; external 'hideballoon@files:trayiconctrl.dll stdcall';
function WizardFormInTray(): Boolean; external 'wizardformintray@files:trayiconctrl.dll stdcall';

const
WM_USER = $400;
    WM_ICON_NOTIFY = WM_USER + 22;
IMAGE_ICON = 1;
LR_LOADFROMFILE = $10;
NIIF_NONE = 0;
NIIF_INFO = $1;
NIIF_WARNING = $2;
NIIF_ERROR = $3;
MF_BYPOSITION = $400;
MF_ENABLED = 0;
MF_GRAYED = 1;

procedure TrayMenuItemOnClick(MenuItemIndex: Integer);
begin
if not IsWindowEnabled(WizardForm.Handle) then exit;

Case MenuItemIndex of
0: ToggleWizardVisible;
2: AnimateTrayIcon(40, -1);
3: StopAnimation();
5: MainForm.ShowAboutBox;
7: WizardForm.Close;
end;
end;

procedure TrayMenuOnPopup(PopMenu: LongWord; var bShow: Boolean);
begin
bShow := IsWindowEnabled(WizardForm.Handle);
if WizardFormInTray() then
begin
EnableMenuItem(PopMenu, 5, MF_BYPOSITION or MF_GRAYED);
EnableMenuItem(PopMenu, 7, MF_BYPOSITION or MF_GRAYED);
end else begin
EnableMenuItem(PopMenu, 5, MF_BYPOSITION or MF_ENABLED);
EnableMenuItem(PopMenu, 7, MF_BYPOSITION or MF_ENABLED);
end;
end;

procedure InitializeWizard();
begin
ExtractTemporaryFile('icon.ico');
ExtractTemporaryFile('icon1.ico');
ExtractTemporaryFile('icon2.ico');
ExtractTemporaryFile('icon3.ico');
ExtractTemporaryFile('icon4.ico');
end;

procedure CurStepChanged(CurStep: TSetupStep);
var
AniIcon: TIconList;
Ico: UINT;
MenuStrs: String;
MenuItemClickCallback: LongWord;
MenuPopupCallback: LongWord;
begin
if CurStep = ssInstall then begin

MenuItemClickCallback := WrapMenuItemClickProc(@TrayMenuItemOnClick, 1);
MenuPopupCallback := WrapMenuPopupProc(@TrayMenuOnPopup, 2);

AniIcon.Icon1 := LoadImage(0, ExpandConstant('{tmp}\icon1.ico'), IMAGE_ICON, 16, 16, LR_LOADFROMFILE);
AniIcon.Icon2 := LoadImage(0, ExpandConstant('{tmp}\icon2.ico'), IMAGE_ICON, 16, 16, LR_LOADFROMFILE);
AniIcon.Icon3 := LoadImage(0, ExpandConstant('{tmp}\icon3.ico'), IMAGE_ICON, 16, 16, LR_LOADFROMFILE);
AniIcon.Icon4 := LoadImage(0, ExpandConstant('{tmp}\icon4.ico'), IMAGE_ICON, 16, 16, LR_LOADFROMFILE);
SetIconList(AniIcon, SizeOf(AniIcon) div SizeOf(AniIcon.Icon1));

Ico := LoadImage(0, ExpandConstant('{tmp}\icon.ico'), IMAGE_ICON, 16, 16, LR_LOADFROMFILE);
MenuStrs := '&Show/Hide WizardForm;' + // 0
'-;' + // 1
'&Animate Icon;' + // 2
'S&top Animation;' + // 3
'-;' + // 4
'&About...;' + // 5
'-;' + // 6
'E&xit'; // 7
InitTrayIconCtrl(MainForm.Handle, WizardForm.Handle, WM_ICON_NOTIFY, 'Установка {#MyAppVerName}', Ico,
True, False, MenuStrs, 0, MenuItemClickCallback, MenuPopupCallback);

ToggleWizardVisible
AnimateTrayIcon(40, -1);
ShowBalloon('Копирование файлов'+#13#10+'Пожалуйста, подождите...', 'Установка {#MyAppVerName}', NIIF_INFO, 5, False);
end else begin
ToggleWizardVisible
StopAnimation();
HideTrayIcon();
UninitTrayIconCtrl();
end; end;

procedure DeinitializeSetup();
begin
MainForm.Hide;
WizardForm.Hide;
end;[/more] Вопрос:
можно ли сделать так, чтобы при нажатии на всплывший Balloon основная форма появлялась? И можно ли при наведении курсора на иконку в трее вылазил hint с текущим копируемым файлом? Кетайская библиотека тут
Автор: EagleSH
Дата сообщения: 03.02.2009 16:45
SotM
спасибо дружище, то что нужно!

Код:
procedure InitializeWizard;
begin
if ( ParamCount > 1 ) and ( CompareText( ParamStr(2), '/InnoRulit' ) = 0 ) then
MsgBox('Right usage', mbInformation, MB_OK )
else
MsgBox('Blah-blah-blah. Wrong usage', mbError, MB_OK);
end;
Автор: SotM
Дата сообщения: 03.02.2009 16:50
EagleSH
Пробуй Abort
Автор: EagleSH
Дата сообщения: 03.02.2009 17:06
SotM
умничка!
то что нужно!
спс!

мож подскажешь, нужно запустить sfx архив в секции КОДЕ в конце установки НО ПЕРЕД созданием ярлыков, где это прописать?

procedure CurStepChanged(CurStep: TSetupStep);
я тут пишу, а ярлыки появляются раньше завершения sfx.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071

Предыдущая тема: в очередной раз босудим антивиры?


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.