PDA

Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 7]


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 [92] 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

saurn
13-10-2014, 23:24
Проблема в том что если все чекбоксы отметить или снять в ручную то обновления кнопки не происходит. »
var
i, nCount: Integer;
SelectAll: TNewButton;


procedure TNewCheckListBoxOnClickCheck( Sender: TObject );
begin
nCount := WizardForm.TasksList.ItemCount - 1;

for i := 0 to nCount do
begin
case TNewCheckListBox( Sender ).Checked[i] of
True: SelectAll.Caption := 'Очистить всё';
False: SelectAll.Caption := 'Выбрать всё';
end;
end;
end;


procedure TButtonOnClick( Sender: TObject );
begin
nCount := WizardForm.TasksList.ItemCount - 1;

for i := nCount downto 0 do
begin
case TButton( Sender ).Caption of
'Выбрать всё': WizardForm.TasksList.CheckItem( i, coCheckWithChildren );
'Очистить всё': WizardForm.TasksList.CheckItem( i, coUncheck );
end;
end;

WizardForm.TasksList.OnClickCheck( WizardForm.TasksList );
end;


procedure InitializeWizard();
begin
WizardForm.TasksList.OnClickCheck := @TNewCheckListBoxOnClickCheck;

SelectAll := TNewButton.Create(WizardForm);
with SelectAll do
begin
Parent := WizardForm.SelectTasksPage;
Left := ScaleX(0);
Top := ScaleY(204);
Width := ScaleX(75);
Height := ScaleY(25);
OnClick := @TButtonOnClick;
end;
end;


procedure CurPageChanged( const CurPageID: Integer );
begin
case CurPageID of
wpSelectTasks: WizardForm.TasksList.OnClickCheck( WizardForm.TasksList );
end;
end;

ROMKA-1977
13-10-2014, 23:59
saurn, в строке: nCount := WizardForm.TasksList.ItemCount - 1;
ошибка - Unknown identifier ITEMCOUNT

saurn, разобрался: nCount := WizardForm.TasksList.Items.Count - 1;

saurn
14-10-2014, 00:10
ошибка - Unknown identifier ITEMCOUNT »
Стандартная версия? Замените в обоих процедурах, на:
nCount := WizardForm.TasksList.Items.Count - 1;

audiofeel
14-10-2014, 06:39
Помогите, подскажите как "правильно" создать в скрипте Windows Metro http://krinkels.org/resources/windows-phone-installer.148/ чек бокс "не создавать папку в меню пуск" , чек бокс создать проблемы нет, но как сделать не активной кнопку "обзор" на странице WpSelectGroup при нажатии на чек бокс не знаю, там процедуры нет на чек бокс , есть только функция

ignietferro@vk
14-10-2014, 11:24
ignietferro@vk, Для особых случаев, ссылка в сообщении. »
спасибо, видел тот форум, но он показался мертвым уже давно (хоть и есть немного новых сообщений) и подумал, что, может быть, кто-то тут поможет

Shkutu
14-10-2014, 19:04
чек бокс "не создавать папку в меню пуск" »
если хотите прям кастомный, то примерно так:

var tc:TNewCheckBox;

procedure tcClick(sender:tobject);
begin
if tc.checked then
WizardForm.GroupBrowseButton.enabled:=false
else
WizardForm.GroupBrowseButton.enabled:=true;
end;

procedure InitializeWizard;
begin
tc:=TNewCheckBox.create(WizardForm);
tc.parent:=WizardForm.SelectProgramGroupPage;
tc.top:=WizardForm.GroupEdit.top + WizardForm.GroupEdit.height + scaleY(15);
tc.onclick:=@tcClick;
end;

А вообще для этих целей есть директива секции Setup
AllowNoIcons=yes
Подробнее в справке можно

Dodakaedr
14-10-2014, 22:08
как "правильно" создать »
#1695 (http://forum.oszone.net/post-2409726-1695.html)

audiofeel
15-10-2014, 04:07
Dodakaedr,
Shkutu,
да нее, создал я его этот чек бокс та...
http://rghost.ru/58529229/thumb.png (http://rghost.ru/58529229.view)

function NoStartIcon: Boolean;
begin
Result := not CheckBoxGetChecked(NoIconsChk);
end;

а как сделать при нажатии на него , кнопку ButtonSetEnabled(GroupBrowseBtn, False) ????
на чек боксы вообще нет процедур, только функции, то есть

function DesktopIcon: Boolean;
begin
Result := CheckBoxGetChecked(DesktopChk);
end;

function DopPO: Boolean;
begin
Result := CheckBoxGetChecked(DopPOChk);
end;

function NoStartIcon: Boolean;
begin
Result := not CheckBoxGetChecked(NoIconsChk);
end;

я на него процедуру клика делал - ноль эмоций (может не правильно ??)
--------------------------------------
понимаю что качать не охота, поэтому вот часть скрипта с чек боксами

type
TCusChk = record
Base, Mid, Top: TPanel;
Labl: TLabel;
IsChecked, IsEnabled: Boolean;
end;
procedure CheckBoxEnter(var CheckBox:TCusChk);
begin
if CheckBox.IsChecked then
begin
CheckBox.Base.Color:={#Color1};
CheckBox.Top.Color:=$AAAAAA;
CheckBox.Labl.Font.Color:={#Color1};
end else begin
CheckBox.Base.Color:={#Color1};
CheckBox.Top.Color:={#Color2};
CheckBox.Labl.Font.Color:={#Color1};
end;
end;

procedure CheckBoxLeave(var CheckBox:TCusChk);
begin
if CheckBox.IsChecked then
begin
CheckBox.Base.Color:={#Color1};
CheckBox.Top.Color:={#Color1};
CheckBox.Labl.Font.Color:=$AAAAAA;
end else begin
CheckBox.Base.Color:=$AAAAAA;
CheckBox.Top.Color:={#Color2};
CheckBox.Labl.Font.Color:=$AAAAAA;
end;
end;

procedure CheckBoxDown(var CheckBox:TCusChk);
begin
if CheckBox.IsChecked then
begin
CheckBox.Base.Color:={#Color1};
CheckBox.Top.Color:={#Color2};
CheckBox.Labl.Font.Color:=$AAAAAA;
end else begin
CheckBox.Base.Color:={#Color1};
CheckBox.Top.Color:={#Color1};
CheckBox.Labl.Font.Color:=$AAAAAA;
end
end;

procedure CheckBoxUp(var CheckBox:TCusChk);
begin
if CheckBox.IsChecked then
begin
CheckBox.Base.Color:={#Color1};
CheckBox.Top.Color:=$AAAAAA;
CheckBox.Labl.Font.Color:={#Color1};
end else begin
CheckBox.Base.Color:={#Color1};
CheckBox.Top.Color:={#Color2};
CheckBox.Labl.Font.Color:={#Color1};
end;
end;

procedure CheckBoxClick(var CheckBox:TCusChk);
begin
CheckBox.IsChecked:= not CheckBox.IsChecked;
end;

procedure CheckBoxOnEnter(Sender:TObject);
begin
case Sender of
NoIconsChk.Top: CheckBoxEnter(NoIconsChk);
DesktopChk.Top: CheckBoxEnter(DesktopChk);
DopPOChk.Top: CheckBoxEnter(DopPOChk);
end;
end;

procedure CheckBoxOnLeave(Sender:TObject);
begin
case Sender of
NoIconsChk.Top: CheckBoxLeave(NoIconsChk);
DesktopChk.Top: CheckBoxLeave(DesktopChk);
DopPOChk.Top: CheckBoxLeave(DopPOChk);
end;
end;

procedure CheckBoxOnDown(Sender:TObject; CheckBox:TMouseButton; Shift:TShiftState; X, Y:Integer);
begin
case Sender of
NoIconsChk.Top: CheckBoxDown(NoIconsChk);
DesktopChk.Top: CheckBoxDown(DesktopChk);
DopPOChk.Top: CheckBoxDown(DopPOChk);
end;
end;

procedure CheckBoxOnClick(Sender:TObject);
begin
case Sender of
NoIconsChk.Top: CheckBoxClick(NoIconsChk);
DesktopChk.Top: CheckBoxClick(DesktopChk);
DopPOChk.Top: CheckBoxClick(DopPOChk);
end;
end;

procedure CheckBoxOnUp(Sender:TObject; CheckBox:TMouseButton; Shift:TShiftState; X, Y:Integer);
begin
case Sender of
NoIconsChk.Top: CheckBoxUp(NoIconsChk);
DesktopChk.Top: CheckBoxUp(DesktopChk);
DopPOChk.Top: CheckBoxUp(DopPOChk);
end;
end;

procedure CheckBoxSetText(var CheckBox: TCusChk; hText: String);
begin
CheckBox.Top.Caption:=hText;
end;

procedure CheckBoxSetVisibility(var CheckBox: TCusChk; hVisible: Boolean);
begin
CheckBox.Base.Visible:=hVisible;
CheckBox.Labl.Visible:=hVisible;
end;

procedure CheckBoxSetEnabled(var CheckBox: TCusChk; hEnabled: Boolean);
begin
CheckBox.Base.Enabled:=hEnabled;
CheckBox.IsEnabled:=hEnabled;
if hEnabled then
begin
CheckBox.Base.Color:=$AAAAAA;
CheckBox.Top.Color:=$AAAAAA;
CheckBox.Labl.Font.Color:=$AAAAAA;
end else begin
if CheckBox.IsEnabled then
begin
CheckBox.Base.Color:=$AAAAAA;
CheckBox.Top.Color:=$AAAAAA;
CheckBox.Labl.Font.Color:=$AAAAAA;
end else begin
CheckBox.Base.Color:=$AAAAAA;
CheckBox.Top.Color:={#Color2};
CheckBox.Labl.Font.Color:=$AAAAAA;
end;
end;
end;

procedure CheckBoxSetChecked(var CheckBox: TCusChk; hChecked: Boolean);
begin
CheckBox.IsChecked:= hChecked;
if CheckBox.IsEnabled then
begin
if hChecked then
begin
CheckBox.Base.Color:={#Color1};
CheckBox.Top.Color:={#Color1};
CheckBox.Labl.Font.Color:=$AAAAAA;
end else begin
CheckBox.Base.Color:=$AAAAAA;
CheckBox.Top.Color:={#Color2};
CheckBox.Labl.Font.Color:=$AAAAAA;
end;
end else begin
if hChecked then
begin
CheckBox.Base.Color:=$AAAAAA;
CheckBox.Top.Color:=$AAAAAA;
CheckBox.Labl.Font.Color:=$AAAAAA;
end else begin
CheckBox.Base.Color:=$AAAAAA;
CheckBox.Top.Color:={#Color2};
CheckBox.Labl.Font.Color:=$AAAAAA;
end;
end;
end;

function CheckBoxGetChecked(var CheckBox: TCusChk): Boolean;
begin
Result:=CheckBox.IsChecked;
end;

procedure CheckBoxSetEvent(var CheckBox: TCusChk; Event: TNotifyEvent);
begin
if CheckBox.IsChecked then
CheckBox.Top.OnClick:=Event;
end;

function CheckBoxCreate(hParent :TWinControl; hLeft, hTop, hWidth, hHeight: Integer; hText: String): TCusChk;
begin
Result.IsEnabled:=True;
Result.Base:= TPanel.Create(hParent);
with Result.Base do begin
Parent:=hParent;
Left:=hLeft;
Top:=hTop;
Width:=hWidth;
Height:=hHeight;
Color:=$AAAAAA;
BorderStyle := bsNone;
BevelInner := bvNone;
BevelOuter := bvNone;
BorderWidth := 0;
ParentBackground := False;
end;

Result.Mid:= TPanel.Create(Result.Base);
with Result.Mid do begin
Parent:=Result.Base;
Left:=1;
Top:=1;
Width:=hWidth - 2;
Height:=hHeight - 2;
Color:={#Color2};
BorderStyle := bsNone;
BevelInner := bvNone;
BevelOuter := bvNone;
BorderWidth := 0;
ParentBackground := False;
end;

Result.Top:= TPanel.Create(Result.Mid);
with Result.Top do begin
Parent:=Result.Mid;
Left:=1;
Top:=1;
Width:=hWidth - 4;
Height:=hHeight - 4;
OnMouseEnter:= @CheckBoxOnEnter;
OnMouseLeave:= @CheckBoxOnLeave;
OnMouseDown := @CheckBoxOnDown;
OnMouseUp := @CheckBoxOnUp;
OnClick := @CheckBoxOnClick;
Color:={#Color2};
BorderStyle := bsNone;
BevelInner := bvNone;
BevelOuter := bvNone;
BorderWidth := 0;
ParentBackground := False;
end;

Result.Labl:= TLabel.Create(hParent);
with Result.Labl do
begin
Parent:=hParent;
OnMouseEnter:= @CheckBoxOnEnter;
OnMouseLeave:= @CheckBoxOnLeave;
OnMouseDown := @CheckBoxOnDown;
OnMouseUp := @CheckBoxOnUp;
// Layout:=tlCenter;
Transparent := True;
Font.Color:=$AAAAAA;
Font.Name:='Segoe UI Light';
Font.Size:=11;
SetBounds((hLeft + hWidth) + 5,hTop - 2,0,0);
Caption:=hText
end;
end;

ROMKA-1977
15-10-2014, 12:01
Подскажите возможно ли выполнить текстурирование прогрессбаров ISDone без применения botva2.dll с помощью .bmp ?

Tco 03
15-10-2014, 16:49
Подскажите возможно ли выполнить текстурирование прогрессбаров ISDone без применения botva2.dll с помощью .bmp ? »
Конечно можно :)



[Setup]
AppName=MyApp
AppVerName=MyApp
defaultDirName={pf}\MyApp

[Files]
Source: compiler:InnoCallBack.dll; DestDir: {tmp};
Source: progress.bmp; DestDir: {tmp}
Source: {win}\Help\; DestDir: {app}; Flags: external

[code ]
type
TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);
TPBInfo = record ProgressBarName: TNewProgressBar ; ImageHeight, LastWidth, MaxWidth: Integer; end;

var
ProgressBarEdit: array of TEdit;
ProgressBarImage: array of TBitmapImage;
PBBuff: array of TPBInfo;
ProgressTimer: Longword; PBCount: Integer;

function WrapTimerProc(callback:TProc; paramcount:integer):longword; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';

procedure TextureProgressBar(ProgressBar:TNewProgressBar);
var n: Integer;
begin
n:= PBCount; SetArrayLength(ProgressBarEdit, n+1); SetArrayLength(ProgressBarImage, n+1)
SetArrayLength(PBBuff, n+1);

ProgressBarEdit[n]:= TEdit.Create(WizardForm)
ProgressBarEdit[n].SetBounds(ProgressBar.Left, ProgressBar.Top, ProgressBar.Width, ProgressBar.Height);
ProgressBarEdit[n].Enabled:= False;
ProgressBarEdit[n].Parent:= ProgressBar.Parent;
ProgressBarEdit[n].Visible:= ProgressBar.Visible;

PBBuff[n].LastWidth:= ProgressBar.Position;
PBBuff[n].ImageHeight:= ProgressBarEdit[n].Height - ScaleY(2);
PBBuff[n].ProgressBarName:= ProgressBar ;
PBBuff[n].MaxWidth:= ScaleX(ProgressBar.Width);

ProgressbarImage[n]:= TBitmapImage.Create(WizardForm);
ProgressbarImage[n].Stretch:= True;
ProgressbarImage[n].Parent:= ProgressBarEdit[n];
ProgressbarImage[n].SetBounds(ScaleX(0), ScaleY(0), ScaleX(0), ScaleY(0))
ProgressbarImage[n].Bitmap.LoadFromFile(ExpandConstant('{tmp}\progress.bmp'));

ProgressBar.Width:= ScaleX(0); ProgressBar.Height:= ScaleY(0);

PBCount:= PBCount+1
end;

procedure HideAllTexturedPB();
var n: integer;
begin
for n:=0 to PBCount-1 do begin ProgressBarEdit[n].Hide; ProgressBarImage[n].Hide; end;
end;

procedure UpdateAllTexturedPB();
var n: integer;
begin
for n:=0 to PBCount-1 do begin
ProgressBarEdit[n].Visible:= PBBuff[n]. ProgressBarName.Visible;
ProgressBarImage[n].Visible:= PBBuff[n].ProgressBarName.Visible; end;
end;

procedure UpdatePB(HandleW, msg, idEvent, TimeSys: LongWord);
var f: integer; CurWidth: single;
begin
for f:=0 to PBCount-1 do begin
UpdateAllTexturedPB
with PBBuff[f].ProgressB arName do begin
CurWidth := (Position*PBBuff[f].MaxWidth)/Max;
if PBBuff[f].LastWidth <> Round(CurWidth) then begin
PBBuff[f].LastWidth:= Round(CurWidth);
ProgressBarImage[f].SetBounds(ScaleX(0), ScaleY(0), PBBuff[f].LastWidth, PBBuff[f].ImageHeight); end;
end;
end;
end;

procedure InitializeWizard();
begin
ExtractTemporaryFile('progress.bmp');

TextureProgressBar(WizardForm.ProgressGauge)
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssInstall then ProgressTimer:= SetTimer(0,0, 200, WrapTimerProc(@UpdatePB, 4));
if CurStep=ssPostInstall then KillTimer(0, ProgressTimer);
end;

AlekseyPopovv
15-10-2014, 18:11
Как удалить вот такую запись из реестра?
RegDeleteValue(HKU, 'S-1-5-21-3249071770-3804279344-2902041931-1000\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Persisted', 'D:\WindowsPlayer_2.9.4.0.exe');
Пробовал вот так, не получается:
RegDeleteValue(HKU, 'S-1-5-21-3249071770-3804279344-2902041931-1000\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Persisted', '{src}\WindowsPlayer_2.9.4.0.exe');
Если указать полный путь "D:\WindowsPlayer_2.9.4.0.exe", то всё удаляется. Но пользователь может запустить установку из любого места. Как быть?

audiofeel
15-10-2014, 19:53
AlekseyPopovv,
RegDeleteValue(HKU, 'S-1-5-21-3249071770-3804279344-2902041931-1000\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Persisted', '{app}\WindowsPlayer_2.9.4.0.exe');

Dodakaedr
15-10-2014, 20:11
Как удалить вот такую запись из реестра? »
Попробуйте так: RegDeleteValue(HKEY_CURRENT_USER, 'Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Persisted', '{app}\WindowsPlayer_2.9.4.0.exe');
S-1-5-21-3249071770-3804279344-2902041931-1000 - это SID пользователя и он у каждого разный.
Но если не сработает то GetSID (http://forum.oszone.net/post-2331893-207.html) вам в помощь.

audiofeel
15-10-2014, 20:30
вот таким "макаром" у меняя получилось сделать кнопку "далее" не активной, когда свободного места меньше чем надо,

procedure DirEditOnChange(Sender: TObject);
var
NeedSize, FreeSize: Extended;
begin
EditSetText(SelectDirEdt, MinimizePathName(WizardForm.DirEdit.Text, SelectDirEdt.Top.Font, SelectDirEdt.Top.Width));
NeedSize := StrToFloat(GetFloatFormText(WizardForm.ComponentsDiskSpaceLabel.Caption));
FreeSize := Extended(GetFreeDriveSpace(WizardDirValue()));
NeedInstallSizeLabel.Caption := 'Требуется как минимум ' + MbOrTb(NeedSize) + ' свободного дискового пространства.';
if (FreeSize > NeedSize) then NeedInstallSizeLabel.Font.Color := $AAAAAA else NeedInstallSizeLabel.Font.Color := {#Color1};
ButtonSetEnabled(NextBtn, (FreeSize > NeedSize));
if WizardForm.CurPageID = wpSelectProgramGroup then begin
ButtonSetEnabled(NextBtn, (FreeSize > NeedSize));
ButtonSetEnabled(NextBtn, True);
end;
end;

может все таки есть способ сделать не активной кнопку GroupBrowserBtn после нажатия на чек бокс ????

audiofeel
15-10-2014, 20:57
saurn,

кнопки не через ботву :(

audiofeel
15-10-2014, 22:08
saurn, ок, - оригинал = http://rghost.ru/58543107

saurn
15-10-2014, 22:24
audiofeel, за состояние кнопок отвечает процедура
procedure ButtonSetEnabled(var Button: TCusBtn; hEnabled: Boolean);
Значит включение\отключение выглядит так:
ButtonSetEnabled( MyBtn, True ) - включена, ButtonSetEnabled( MyBtn, False ) - выключена
Обработчик кликов чекбокса будет выглядеть так:
procedure NoIconsCheckClick(Sender: TObject);
begin
case TCheckBox( Sender ).Checked of
True: ButtonSetEnabled( MyBtn, False );
False: ButtonSetEnabled( MyBtn, True );
end;
end;

audiofeel
15-10-2014, 23:18
saurn,
я это "понял" так, но не работает

function NoStartIcon: Boolean;
begin
Result := not CheckBoxGetChecked(NoIconsChk);
end;

procedure NoIconsClick(Sender: TObject);
begin
case CheckBoxGetChecked(NoIconsChk) of
True: ButtonSetEnabled(GroupBrowseBtn, False);
False: ButtonSetEnabled(GroupBrowseBtn, True);
end;
end;

CheckBoxSetEvent(NoIconsChk, @NoIconsClick);

ABBAT
16-10-2014, 11:39
Всем привет. Кто в курсе, как сделать (тихое) удаление без UninstallProgressForm . Что-то вроде удалить программу и в конце программа удалена т.е скрыть окно UninstallProgressForm

ROMKA-1977
16-10-2014, 19:35
Tco 03, с твоим вариантом получилось со стандартным прогрессбаром а надо прогрессбары ISDone.




© OSzone.net 2001-2012