Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 5]
Ivan_009
11-08-2012, 11:53
Snoopak96, Респект :clapping: и большое спасибо :up все работает...
Ivan_009
11-08-2012, 14:47
Как вставить свою картинку в форму отмены.... :search:
Johny777
11-08-2012, 15:08
Как вставить свою картинку в форму отмены.... »
Ну Вань как и любую другую (приписал пару комментариев)
[Setup]
AppName=Cancel_Demo
AppVerName=Cancel_Demo
DefaultDirName={pf}\Cancel_Demo
// пакуем картинку в экзешник
BitmapResource=CancelPic:C:\Program Files (x86)\Inno Setup 5\WizModernSmallImage.bmp
[Languages]
Name: Russian; MessagesFile: compiler:Languages\Russian.isl;
Name: English; MessagesFile: compiler:Languages\English.isl;
[CustomMessages]
Russian.Close=Выход
English.Close=Exit
Russian.Exit_Install=Выйти из инсталлятора?
English.Exit_Install=Exit Installer?
Russian.Exit_Install_2=Отменить установку?
English.Exit_Install_2=Cancel Installation?
[code]
function GetSystemMenu(hWnd: HWND; bRevert: BOOL): LongWord; external 'GetSystemMenu@user32.dll stdcall';
function DeleteMenu(hMenu: LongWord; uPosition, uFlags: UINT): BOOL; external 'DeleteMenu@user32.dll stdcall';
function GetClassLong(Wnd: HWnd; Index: Integer): Longint; external 'GetClassLongA@user32.dll stdcall';
function SetClassLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetClassLongA@user32.dll stdcall';
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
var
MyExit: TSetupForm;
begin
Confirm := False;
MyExit := CreateCustomForm();
with MyExit do
begin
Position := poScreenCenter;
ClientWidth := ScaleX(200);
ClientHeight := ScaleY(87);
Caption := ExpandConstant('{cm:Close}');
Color := clBtnFace;
DeleteMenu(GetSystemMenu(MyExit.Handle,False), $F060,0); /// сделать кнопку "закрыть" неактивной
SetClassLong(MyExit.Handle, -26, GetClassLong(MyExit.Handle, -26) or $200); /// блокировка комбинации alt + f4
with TLabel.Create(nil) do
begin
AutoSize := False;
if WizardForm.CurPageID = wpInstalling then
begin
if ActiveLanguage = 'Russian' then SetBounds(ScaleX(37), ScaleY(16), ScaleX(140), ScaleY(30)) else SetBounds(ScaleX(47), ScaleY(16), ScaleX(140), ScaleY(30));
Caption := ExpandConstant('{cm:Exit_Install_2}');
end else
begin
if ActiveLanguage = 'Russian' then SetBounds(ScaleX(30), ScaleY(16), ScaleX(140), ScaleY(30)) else SetBounds(ScaleX(65), ScaleY(16), ScaleX(140), ScaleY(30));
Caption := ExpandConstant('{cm:Exit_Install}');
end;
Parent := MyExit;
Font.Size := 9;
end;
with TBitmapImage.Create(nil) do // картинка не имеет переменной, ведь никаких действий с ней не планируется?
begin
Parent := MyExit; /// Родитель - наша форма отмены
Left := ScaleX(0);
Top := ScaleY(0);
AutoSize := True; /// заместо ширины, высоты можно просто указать "авторазмер"
Bitmap.LoadFromResourceName(HInstance, '_IS_CANCELPIC'); /// грузим картинку
end;
with TButton.Create(nil) do
begin
Parent := MyExit;
Caption := ExpandConstant(SetupMessage(msgButtonNo));
SetBounds(ScaleX(18), ScaleY(47), ScaleX(71), ScaleY(25));
Cursor := crHand;
ModalResult:= mrNo;
end;
with TButton.Create(nil) do
begin
Caption := ExpandConstant(SetupMessage(msgButtonYes));
Parent := MyExit;
SetBounds(ScaleX(110), ScaleY(47), ScaleX(71), ScaleY(25));
Cursor := crHand;
ModalResult := mrYes;
end;
case ShowModal() of
mrNo : Cancel := False;
mrYes :
begin
case
WizardForm.CurPageID of
wpInstalling : Application.Title := ExpandConstant(' ' + SetupMessage(msgButtonCancel) + '...');
end;
end;
end;
Free;
end;
end;
Ivan_009
11-08-2012, 23:05
Почему при использовании ISVideo повтор идет нормально но стоит нажать кнопку Stop и Play так все как только видео доходит доконца и все больше неповторяется в чем может быть проблема вот код.....
Johny777
12-08-2012, 01:12
Ivan_009,
узнаю своё кодище :)
улучшил с точки зрения оптимизации
procedure ISVideoInit(Handle: THandle; FileName: PAnsiChar; L,T,W,H: Integer); external 'ISVideoInit@files:ISVideo.dll stdcall';
procedure ISVideoPause(); external 'ISVideoPause@files:ISVideo.dll stdcall';
procedure ISVideoPlay(); external 'ISVideoPlay@files:ISVideo.dll stdcall';
procedure ISVideoStop(); external 'ISVideoStop@files:ISVideo.dll stdcall';
procedure ISVideoRePlay(); external 'ISVideoRePlay@files:ISVideo.dll stdcall';
procedure ISVideoClose(); external 'ISVideoClose@files:ISVideo.dll stdcall';
function GetWindowLong(Wnd: HWnd; Index: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall';
function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
procedure InitializeWizard2();
begin
ExtractTemporaryFile('video.avi');
XVIDInstall;
end;
procedure CurPageChanged1(CurPageID: Integer);
begin
case CurPageID of
wpInstalling:
begin
SetWindowLong(WizardForm.Handle, (-20), GetWindowLong(WizardForm.Handle, (-20)) xor $2000000);
ISVideoInit(WizardForm.Handle, ExpandConstant('{tmp}\video.avi'), ScaleX(1), ScaleY(1), ScaleX(748), ScaleY(421));
ISVideoRePlay;
end;
wpFinished:
begin
SetWindowLong(WizardForm.Handle, (-20), GetWindowLong(WizardForm.Handle, (-20)) or $2000000);
ISVideoClose;
end;
end;
end;
procedure Play_Stop_Pause(Sender: TObject);
begin
case TNewButton(Sender).Tag of
1: ISVideoPause(); /// Pause
2: ISVideoRePlay; // play /// вот тут и был косяк. вместо ISVideoPlay(); нужно ISVideoRePlay; (ISVideo !Re! Play;)
3: /// Stop
begin
ISVideoClose();
ISVideoInit(WizardForm.Handle, ExpandConstant('{tmp}\video.avi'), ScaleX(1), ScaleY(1), ScaleX(748), ScaleY(421));
ISVideoStop();
end;
end;
end;
procedure InitializeWizard1();
begin
with TNewButton.Create(nil) do
begin
Caption := 'Pause';
Parent := WizardForm;
SetBounds(ScaleX(130),ScaleY(488),ScaleX(50),ScaleY(25));
Font.Name := 'Georgia';
Font.Size := 10;
Cursor :=crHand;
Tag := 1;
OnClick := @Play_Stop_Pause;
end;
with TNewButton.Create(nil) do
begin
Caption := 'Play';
Parent := WizardForm;
SetBounds(ScaleX(190),ScaleY(488),ScaleX(50),ScaleY(25));
Font.Name := 'Georgia';
Font.Size := 10;
Cursor :=crHand;
Tag := 2;
OnClick := @Play_Stop_Pause;
end;
with TNewButton.Create(nil) do
begin
Caption := 'Stop';
Parent := WizardForm;
SetBounds(ScaleX(250),ScaleY(488),ScaleX(50),ScaleY(25));
Font.Name := 'Georgia';
Font.Size := 10;
Cursor :=crHand;
Tag := 3;
OnClick := @Play_Stop_Pause;
end;
end;
касательно видео я так понял тебе нужна "петля" после нажатия на кнопку Play
исправил (в код посмотри)
и Вань заимей привычку с файлами выкладывать
я сейчас четверть часа искал Isvideo, собирал скрипт, чтоб сделать у себя проигрывание и только потом начал искать ошибку
El Sanchez
12-08-2012, 11:41
El Sanchez, все сделал - та же самая ошибка »
Batistas, скрины приведите во время ошибки: 1) функции ReadDCPlusPlus, 2) процедуры InitializeWizard.
Ivan_009
12-08-2012, 13:08
Johny777, а как теперь скрыть данные кнопки и отобразить их на wpInstalling: :tomato2:
Подскажи если не трудно...:unsure:
Johny777
12-08-2012, 14:25
Ivan_009,
тогда придётся вернуть переменные
ещё улучшил код
теперь на одну кнопку меньше, тк объединил проигрывание и паузу, а запуск видео и прочее перенёс из переключения страниц в этапы установки
код: (приписал комментарии)
#include "xvid.iss"
[Setup]
AppName=ISVideo
AppVerName=1.5.0
AppPublisher=AVMan
CreateAppDir=no
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes
[Languages]
Name: english; MessagesFile: compiler:Default.isl
[Files]
Source: Video.avi; DestDir: {tmp}; Flags: dontcopy;
Source: ISVideo.dll; DestDir: {tmp}; Flags: dontcopy;
Source: xvidcore.dll; DestDir: {tmp};Flags: dontcopy;
Source: {win}\help\*; DestDir: {app}\Files; Flags: external recursesubdirs
Source: {fonts}\*; DestDir: {app}\Files; Flags: external recursesubdirs
[Code]
var
Play_Pause_Button, StopButton: TNewButton;
Paused: boolean; /// вводим логическую переменную
procedure ISVideoInit(Handle: THandle; FileName: PAnsiChar; L,T,W,H: Integer); external 'ISVideoInit@files:ISVideo.dll stdcall';
procedure ISVideoPause(); external 'ISVideoPause@files:ISVideo.dll stdcall';
procedure ISVideoPlay(); external 'ISVideoPlay@files:ISVideo.dll stdcall';
procedure ISVideoStop(); external 'ISVideoStop@files:ISVideo.dll stdcall';
procedure ISVideoRePlay(); external 'ISVideoRePlay@files:ISVideo.dll stdcall';
procedure ISVideoClose(); external 'ISVideoClose@files:ISVideo.dll stdcall';
function GetWindowLong(Wnd: HWnd; Index: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall';
function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
procedure CurStepChanged(CurStep: TSetupStep);
begin
case CurStep of
ssInstall: /// перед устанокой
begin
ExtractTemporaryFile('video.avi'); /// извлекаем видео перед установкой. Это лучше чем при запуске инстала, тк скорость запуска возрастёт
XVIDInstall;
Play_Pause_Button.Show; /// делаем кнопки видимыми
StopButton.Show;
SetWindowLong(WizardForm.Handle, (-20), GetWindowLong(WizardForm.Handle, (-20)) xor $2000000);
ISVideoInit(WizardForm.Handle, ExpandConstant('{tmp}\video.avi'), ScaleX(1), ScaleY(1), ScaleX(748), ScaleY(421)); /// инициализируем видео
ISVideoRePlay; /// запускаем проигрывание
end;
ssPostInstall: /// после установки
begin
SetWindowLong(WizardForm.Handle, (-20), GetWindowLong(WizardForm.Handle, (-20)) or $2000000);
ISVideoClose; /// закрываем видео
Play_Pause_Button.Free; /// разрушаем кнопки (или можешь просто прятать PauseButton.Visible := False; или PauseButton.Hide)
StopButton.Free;
end;
end;
end;
procedure Play_Stop_Pause(Sender: TObject);
begin
case TNewButton(Sender) of
// PauseButton: /// Pause
Play_Pause_Button:
begin
if Paused then /// если в переменной True, то
begin
ISVideoRePlay; // play - запускаем видео
TNewButton(Sender).Caption := 'Pause'; /// меняем текст кнопки (TNewButton(Sender) типэлемента(посыльный), от которог идёт команда) на "паузу"
Paused := False; /// пишем что сняли с паузы (заметь преременная для удобства переводится как "на паузе")
end else /// в противном случае, те в переменной значение False
begin
ISVideoPause(); /// ставим видео на паузу и меняем текст кнопки
TNewButton(Sender).Caption := 'Play';
Paused := True; /// пишем значение
end;
end;
StopButton: /// Stop
begin
ISVideoClose();
ISVideoInit(WizardForm.Handle, ExpandConstant('{tmp}\video.avi'), ScaleX(1), ScaleY(1), ScaleX(748), ScaleY(421));
ISVideoStop();
Play_Pause_Button.Caption := 'Play';
Paused := True; /// пишем значение
end;
end;
end;
procedure InitializeWizard();
begin
MsgBox('Чтоб имитировать установку во время установки будут скопированы справки и шрифты', mbInformation, MB_OK);
WizardForm.Width := ScaleX(700);
WizardForm.Height := ScaleY(600);
Paused := False; /// присваиваем начальное значение Caption := 'Pause';
Play_Pause_Button := TNewButton.Create(nil);
with Play_Pause_Button do
begin
Caption := 'Pause';
Parent := WizardForm;
SetBounds(ScaleX(190),ScaleY(488),ScaleX(50),ScaleY(25));
Font.Name := 'Georgia';
Font.Size := 10;
Cursor :=crHand;
OnClick := @Play_Stop_Pause;
Hide; // сразу прячем
end;
StopButton := TNewButton.Create(nil);
with StopButton do
begin
Caption := 'Stop';
Parent := WizardForm;
SetBounds(ScaleX(250),ScaleY(488),ScaleX(50),ScaleY(25));
Font.Name := 'Georgia';
Font.Size := 10;
Cursor :=crHand;
OnClick := @Play_Stop_Pause;
Hide; // сразу прячем
end;
end;
наглядный пример со всем необходимым в архиве:
http://sendfile.su/647969
Batistas
12-08-2012, 16:10
El Sanchez, самое смешное, что теперь ошибка не вылетает Оо День не трогал и вдруг заработало Оо
Помогите пожалуйста я делаю инсталл Opera , и как мне сделать так чтобы была флажок 'сделать браузером по умолчанию' и после деинсталяции по умолчанию стал тот который был до opera , заранее спасибо
Ivan_009
14-08-2012, 13:13
Как сделать данные линии подскажите пожалуйста кто знает... :search:
sergey3695
14-08-2012, 14:23
Ivan_009,
// Для примера (убери если надо)
with WizardForm do begin
InnerNotebook.Hide;
OuterNotebook.Hide;
end;
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
[Code_]
procedure InitializeWizard();
var
Bevel: TBevel;
NewStaticText: TNewStaticText;
begin
with WizardForm do begin
InnerNotebook.Hide;
OuterNotebook.Hide;
end;
NewStaticText:= TNewStaticText.Create(WizardForm);
with NewStaticText do
begin
Left:= ScaleX(72);
Top:= ScaleX(82);
Caption := ' Пример '
Parent:= WizardForm;
end;
Bevel:= TBevel.Create(WizardForm);
with Bevel do
begin
Shape := bsFrame;
SetBounds(ScaleX(48),ScaleY(88),ScaleX(281),ScaleY(113));
Parent:= WizardForm;
end;
end;
То,что на скрине, там тупо делали по бевалу. Так гораздо проще и лучше. :-)
Yury_Prizrak
14-08-2012, 17:44
Всем привет. Возник вопрос - как завершить установку и откатить изменения при определенных условиях? Все условия я запрограммировал. Прверяются они при нажатии определенной кнопки далее:
//Функция проверки наличия Meneger при установленном сервисе
function NextButtonClick(CurPageID: Integer): Boolean;
var
AppPath, AppValue: string;
begin
if not Installed then
begin
if (not (CurPageID = ServicePage.ID)) then
begin
Result := True;
Exit;
end;
if ServiceCheck then
begin
AppPath := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Control_i s1,InstallLocation|}'));
if not FileExists(AppPath + '\Manager.exe') then
begin
MsgBox('Не найден Manager!', mbInformation, mb_Ok)
\\что написать сдесь чтобы начось завершение инсталляции и откат изменений???
end;
Result := True;
end;
end
else
begin
Result := True;
end;
end;
И еще вопрос - работаю с xml документом:
// пользовательские настройки
XMLNode := XMLDoc.selectSingleNode('//aaa');
if not VarIsEmpty(XMLNode) then
begin
XMLAttributes := XMLNode.attributes;
// Код bbb
XMLAttrib := XMLAttributes.getNamedItem('bbb');
XMLAttrib.text := bbb;
Как сначала проверить наличие атрибута 'bbb'
Ivan_009
14-08-2012, 23:49
Как использовать разные кнопки через bmp как тут... :unsure:
Johny777
15-08-2012, 02:59
Mafioza,
реестр не знаю
извиняй
жди кто подскажет
==================================================================================================== ========
Yury_Prizrak,
давай писать компактнее
убирай пожалуйста свои коды дополнительно в
как завершить установку и откатить изменения ... при нажатии определенной кнопки далее »
откат работает только во время установки (между этапами ssInstall и ssPostInstall), а нажатие на кнопку далее - это уже до или после установки
поэтому можно только удалить, а откат (под откатом имею ввиду не удаление, а какие-то действия типа возвращения бэкапа) делать в функциях удаления
\\что написать сдесь чтобы начось завершение инсталляции и откат изменений??? »
объясню на основе примера (приписал комментарии) :
[Setup]
AppName=Test Mouse Event
AppVersion=1.5
OutputDir=.
AppId=TheBestAppIdEver
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,InstallLocation|{pf}\Setup_B}
[code]
var
Errorcode: Integer;
function InitializeSetup(): Boolean; /// в твоём случае функция нажатия на кнопку далее
var
AppPath, UninsPath: String;
begin
Result := True;
UninsPath := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSe tting("AppID")}_is1,UninstallString|}'));
AppPath := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSe tting("AppID")}_is1,InstallLocation|}'));
if AppPath <> '' then if MsgBox(ExpandConstant('Установлена. Удалить?'), mbError, MB_YESNO) = IDYES then /// в твоём случае 'Не найден Manager!'
begin
Exec(UninsPath, '', '' , SW_SHOW, ewNoWait, Errorcode); /// запускаем деинсталятор
Result := True;
end
else Result := True;
end;
function RollingBack: boolean; // создаём функцию возвращающую булев значение в конце(в данном случае после месседжбокса) или в зависимости от чего-то
begin
Result := False; /// встроенная переменная Result возвращает False
MsgBox('Все дела перед удалением обделаны', mbInformation, mb_Ok) // здесь делаешь свои дела, если надо
Result := True; /// после дел возвращает True а этот результат уже передаётся Result-у деинсталятора, который есть разрешение на удаление
end;
function InitializeUninstall(): Boolean; /// версия полу-тихого деинсталятора // могу дать полностью тихое
begin
Result := False;
if not UninstallSilent then
begin
Exec(ExpandConstant('{uninstallexe}'), '/VERYSILENT', '', SW_SHOW, ewNoWait, ErrorCode);
Exit;
end;
if MsgBox(FmtMessage(SetupMessage(msgConfirmUninstall), ['{#SetupSetting("AppName")}']), mbInformation, MB_YESNO) = idYes then
begin
Result := RollingBack;
MsgBox(FmtMessage(SetupMessage(msgUninstalledAll), ['{#SetupSetting("AppName")}']), mbInformation, MB_OK);
end
else Result := False;
end;
================================================================================================
Ivan_009,
за основу взял пример "4 состояния"
добавил второй входной параметр процедуре текстурирования кнопок
смотри
procedure LoadButtonImage(AButton: TButton; Texture: Integer);
///////////// название///////////(название кнопки; номер тестуры);
номер текстуры в данном случае целое число (1 или 2)
в самой процедуре:
if Texture = 1 then ButtonImage[n].Bitmap.LoadFromResourceName(HInstance, '_IS_BUTTON1');
if Texture = 2 then ButtonImage[n].Bitmap.LoadFromResourceName(HInstance, '_IS_BUTTON2');
использование:
LoadButtonImage(WizardForm.BackButton, 1)
те грузим картинку процедурой LoadButtonImage и в скобках через запятую отправляем ей параметры (родная кнопка "назад", 1), где 1 - это тестура номер 1
код:
[Setup]
;Используется текстура размером 320х23, где размер одной кнопки 80х23
;обычное состояние - при наведении - при нажатии - заблокировано
AppName=Test
AppVerName=Test
DefaultDirName={pf}\Test
OutputDir=.
BitmapResource=button1:buttonA.bmp|button2:buttonB.bmp
[Languages]
Name: "rus"; MessagesFile: "compiler:Languages\Russian.isl";
[code]
const
ButtonWidth = 80;
ButtonHeight = 27;
var
WizardLabel: TLabel;
ButtonPanel: array of TPanel;
ButtonImage: array of TBitmapImage;
ButtonLabel: array of TLabel;
UsedButtons: array of TButton;
ButtonsCount: Integer;
procedure ButtonLabelClick(Sender: TObject);
var
Button: TButton; n, i: Integer;
begin
i:= TLabel(Sender).Tag; ButtonImage[i].Left:= 0
for n:=0 to (ButtonsCount-1) do
begin
if i = n then Button:= UsedButtons[n];
end;
Button.OnClick(Button)
end;
procedure ButtonLabelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if ButtonLabel[TLabel(Sender).Tag].Enabled then ButtonImage[TLabel(Sender).Tag].Left:=-ButtonWidth*2
end;
procedure ButtonLabelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if ButtonLabel[TLabel(Sender).Tag].Enabled then ButtonImage[TLabel(Sender).Tag].Left:=0
end;
procedure ButtonLabelMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var n, I: Integer;
begin
I:=TLabel(Sender).Tag;
//Сначала восстанавливаем картинку у всех кнопок, так надо иначе могут быть глюки
for n:=0 to (ButtonsCount-1) do begin if (ButtonLabel[n].Enabled)and(ButtonImage[n].Left <> -ButtonWidth*2)and(I<>N) then ButtonImage[n].Left:= 0; end;
//Теперь собственно ставим нужную картинку
if (ButtonLabel[i].Enabled)and(ButtonImage[i].Left <> -ButtonWidth*2) then begin ButtonImage[i].Left:= -ButtonWidth; end;
end;
procedure WizardLabelMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var n: Integer;
begin
//Т.к Sender'ом выступает WizardLabel то не получится испльзовать индекс кнопки
for n:=0 to (ButtonsCount-1) do if (ButtonLabel[n].Enabled)and(ButtonImage[n].Left <> -ButtonWidth*2) then begin ButtonImage[n].Left:= 0; end;
end;
procedure LoadButtonImage(AButton: TButton; Texture: Integer);
var n: Integer;
begin
n:=ButtonsCount; SetArrayLength(ButtonPanel, n+1);
SetArrayLength(ButtonImage, n+1); SetArrayLength(ButtonLabel, n+1);
SetArrayLength(UsedButtons, n+1); UsedButtons[n]:= AButton;
ButtonPanel[n]:=TPanel.Create(WizardForm)
ButtonPanel[n].SetBounds(AButton.Left, AButton.Top, AButton.Width, AButton.Height)
ButtonPanel[n].Tag:= n
ButtonPanel[n].Enabled:= AButton.Enabled
ButtonPanel[n].Parent:=AButton.Parent
ButtonImage[n]:=TBitmapImage.Create(WizardForm)
ButtonImage[n].SetBounds(ScaleX(0), ScaleY(0), ScaleX(320), ScaleY(27))
ButtonImage[n].Enabled:=False
if Texture = 1 then ButtonImage[n].Bitmap.LoadFromResourceName(HInstance, '_IS_BUTTON1');
if Texture = 2 then ButtonImage[n].Bitmap.LoadFromResourceName(HInstance, '_IS_BUTTON2');
ButtonImage[n].Parent:=ButtonPanel[n]
with TLabel.Create(WizardForm) do begin
Tag:=n
Parent:=ButtonPanel[n]
Width:=AButton.Width
Height:=AButton.Height
Transparent:=True
OnClick:=@ButtonLabelClick
OnDblClick:=@ButtonLabelClick
OnMouseMove:=@ButtonLabelMove
OnMouseDown:=@ButtonLabelMouseDown
OnMouseUp:=@ButtonLabelMouseUp
end
ButtonLabel[n]:=TLabel.Create(WizardForm)
ButtonLabel[n].Autosize:=True
ButtonLabel[n].Alignment:=taCenter
ButtonLabel[n].Tag:=n
ButtonLabel[n].Enabled:= AButton.Enabled
ButtonLabel[n].Transparent:=True
ButtonLabel[n].Font.Color:=clBlack
ButtonLabel[n].Caption:=AButton.Caption
ButtonLabel[n].OnClick:=@ButtonLabelClick
ButtonLabel[n].OnDblClick:=@ButtonLabelClick
ButtonLabel[n].OnMouseMove:=@ButtonLabelMove
ButtonLabel[n].OnMouseDown:=@ButtonLabelMouseDown
ButtonLabel[n].OnMouseUp:=@ButtonLabelMouseUp
ButtonLabel[n].Parent:=ButtonPanel[n]
ButtonsCount:= ButtonsCount+1
end;
procedure UpdateButtons();
var n: Integer;
begin
for n:=0 to ButtonsCount-1 do begin
ButtonLabel[n].Caption:=UsedButtons[n].Caption
ButtonPanel[n].Visible:=UsedButtons[n].Visible
if (UsedButtons[n].Enabled = False) then ButtonImage[n].Left:= -ButtonWidth*3 else ButtonImage[n].Left:= 0;
ButtonLabel[n].Enabled:= UsedButtons[n].Enabled;
ButtonPanel[n].Enabled:= UsedButtons[n].Enabled;
//Ставим Left и Top лейбла соразмерно размеру лейбла
ButtonLabel[n].Left:= ButtonPanel[n].Width div 2 - ButtonLabel[n].Width div 2;
ButtonLabel[n].Top:= ButtonPanel[n].Height div 2 - ButtonLabel[n].Height div 2;
end;
end;
procedure LicenceAcceptedRadioOnClick(Sender: TObject);
begin
//Делаем кнопку активной
WizardForm.NextButton.Enabled:= True;
//Обновляем текстурированную кнопку (обновляем активность и текстуру)
UpdateButtons();
end;
procedure LicenceNotAcceptedRadioOnClick(Sender: TObject);
begin
//Делаем кнопку неактивной
WizardForm.NextButton.Enabled:= False;
//Обновляем текстурированную кнопку (обновляем активность и текстуру)
UpdateButtons()
end;
procedure InitializeWizard();
begin
WizardForm.Color := clWhite;
WizardLabel:= TLabel.Create(WizardForm)
WizardLabel.SetBounds(ScaleX(0), ScaleY(0), ScaleX(WizardForm.Width), ScaleY(WizardForm.Height))
WizardLabel.Transparent:= True;
WizardLabel.AutoSize:=false;
WizardLabel.OnMouseMove:=@WizardLabelMove
WizardLabel.Parent:= WizardForm;
WizardForm.BackButton.Width:= ButtonWidth
WizardForm.BackButton.Height:= ButtonHeight
WizardForm.NextButton.Width:= ButtonWidth
WizardForm.NextButton.Height:= ButtonHeight
WizardForm.CancelButton.Width:=ButtonWidth
WizardForm.CancelButton.Height:= ButtonHeight
WizardForm.DirBrowseButton.Left:=ScaleX(337)
WizardForm.DirBrowseButton.Width:= ButtonWidth
WizardForm.DirBrowseButton.Height:=ButtonHeight
WizardForm.GroupBrowseButton.Left:=ScaleX(337)
WizardForm.GroupBrowseButton.Width:= ButtonWidth
WizardForm.GroupBrowseButton.Height:=ButtonHeight
WizardForm.LicenseAcceptedRadio.OnClick:=@LicenceAcceptedRadioOnClick
WizardForm.LicenseNotAcceptedRadio.OnClick:=@LicenceNotAcceptedRadioOnClick
LoadButtonImage(WizardForm.BackButton, 1)
LoadButtonImage(WizardForm.NextButton, 2)
LoadButtonImage(WizardForm.CancelButton, 2)
LoadButtonImage(WizardForm.DirBrowseButton, 1)
LoadButtonImage(WizardForm.GroupBrowseButton, 2)
end;
procedure CurPageChanged(CurPageID: Integer);
begin
UpdateButtons()
end;
пример для наглядности с (двумя тестстурами) :
http://sendfile.su/649535
Yury_Prizrak
15-08-2012, 11:19
Так, задачу немного упростим - как просто выйти из программы инсталляции в определенный момент - еще до начала копирования данных на диск. Тоесть например в момент нажатия кнопки далее на странице выбора пути выскакивал месседж - бла бла бла и при нажатии ок - инсталляция просто закрывалась - не трогая данных, находящихся на диске?
Есть решение WizardForm.Close; но оно вываливает окошко выбора - типа "а вы точно хотите завершить?"
Yury_Prizrak, [ Code]
var
Flag: boolean;
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
Confirm:= Flag=false;
end;
//Функция проверки наличия Meneger при установленном сервисе
function NextButtonClick(CurPageID: Integer): Boolean;
var
AppPath, AppValue: string;
begin
if not Installed then
begin
if (not (CurPageID = ServicePage.ID)) then
begin
Result := True;
Exit;
end;
if ServiceCheck then
begin
AppPath := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Control_i s1,InstallLocation|}'));
if not FileExists(AppPath + '\Manager.exe') then
begin
MsgBox('Не найден Manager!', mbInformation, mb_Ok)
Flag:= true;
WizardForm.Close;
end;
Result := True;
end;
end
else
begin
Result := True;
end;
end;
Yury_Prizrak
15-08-2012, 12:42
nik1967, спасибо, работает. Может еще знаешь как наличие атрибута проверять? Было бы просто здорово! :)
johny 777
не знаешь как довавить программу в автозагрузку через реестр , а не через *пуск\автозагрузка ???
Johny777
15-08-2012, 12:56
Mafioza,
это знаю тк у меня есть пример:
;Я себе создал лаунчере запуска программ, и хочу сделать в нём следующее:
;Создать чекбокс, если который выбрать то лаунчер бы запускался вместе с запуском виндовс т.е запускался при включении компьютера.
;Если же чекбокс не выбран, то запуск не происходилбы.
;Возможноли такое реализовать?
;_____________________________-
;Можно. При клике, если чекбокс выбран, то пишешь в ветку реестра
;HKEY_CURRENT_USER\Software\Microsoft\Windows\Curre ntVersion\Run
;строковый параметр, имя которого - твоя прога, а его значение путь до запускаемого файла, с параметрами ком. строки если нужно. Вот примерно так
;____________________________
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp
[code]
var
RunBox: TCheckBox;
procedure CheckBoxClick(Sender: TObject);
begin
if RunBox.Checked then
RegWriteStringValue(HKCU, 'Software\Microsoft\Windows\CurrentVersion\Run', 'MyAppName', AddQuotes(ExpandConstant('{srcexe}')))
else
RegDeleteValue(HKCU, 'Software\Microsoft\Windows\CurrentVersion\Run', 'MyAppName')
end;
procedure InitializeWizard();
begin
RunBox:= TCheckBox.Create(WizardForm);
RunBox.SetBounds(10, 325, 300, 18);
RunBox.Caption:='Запускать при загрузке системы.';
RunBox.OnClick:= @CheckBoxClick;
RunBox.Parent:= WizardForm;
end;
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.