Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 7]
Проблема в том что если все чекбоксы отметить или снять в ручную то обновления кнопки не происходит. »
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;
ошибка - 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, Для особых случаев, ссылка в сообщении. »
спасибо, видел тот форум, но он показался мертвым уже давно (хоть и есть немного новых сообщений) и подумал, что, может быть, кто-то тут поможет
чек бокс "не создавать папку в меню пуск" »
если хотите прям кастомный, то примерно так:
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 ?
Подскажите возможно ли выполнить текстурирование прогрессбаров 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
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);
Всем привет. Кто в курсе, как сделать (тихое) удаление без UninstallProgressForm . Что-то вроде удалить программу и в конце программа удалена т.е скрыть окно UninstallProgressForm
ROMKA-1977
16-10-2014, 19:35
Tco 03, с твоим вариантом получилось со стандартным прогрессбаром а надо прогрессбары ISDone.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.