INNO SETUP卸载程序中加入自定义窗体

原文: INNO SETUP卸载程序中加入自定义窗体

[Setup] AppName=My Program AppVerName=My Program v.1.2 DefaultDirName={pf}/My Program [Files] Source: Files/*; DestDir: {app} [Code] const bidDelAll = 1; bidSkipAll = 2; var Form: TSetupForm; CheckListBox: TNewCheckListBox; AllButton, UnAllButton: TButton; CancelButton, DelButton: TButton; StaticText: TNewStaticText; MsgForm: TSetupForm; MsgAllButton, MsgSkipAllButton: TButton; MsgCancelButton, MsgDelButton: TButton; DelAllReadOnly: Boolean; SkipAllReadOnly: Boolean; CheckDirs, CheckFiles: Boolean; function Size64(Hi, Lo: integer): Extended; var i: integer; begin Result:= Lo; if Lo < 0 then Result:= Result + 2147483647 + 2147483647 + 2; i:= Hi; while i > 0 do begin Result:= Result + 2147483647 + 2147483647 + 2; i:= i - 1; end; end; procedure FillListBox(const fromDir, fileMask: string; Level: Byte); var FSR, DSR: TFindRec; FindResult: Boolean; APath: string; i: integer; begin APath := AddBackslash(fromDir); FindResult := FindFirst(APath + fileMask, FSR); try while FindResult and CheckFiles do begin if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then begin {files} i:= CheckListBox.AddCheckBox(FSR.Name, FloatToStr(Size64(FSR.SizeHigh, FSR.SizeLow)) + ' byte', Level, True, True, False, True, TStringList.Create); TStrings(CheckListBox.ItemObject[i]).Text:= APath + FSR.Name; end; FindResult := FindNext(FSR); end; FindResult := FindFirst(APath + '*.*', DSR); while FindResult and CheckDirs do begin CheckFiles:= True; if ((DSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and not ((DSR.Name = '.') or (DSR.Name = '..')) then begin {dir} i:= CheckListBox.AddCheckBox(DSR.Name,'DIR', Level, True, True, False, True, TStringList.Create); TStrings(CheckListBox.ItemObject[i]).Text:= APath + DSR.Name; {Recursion} FillListBox(APath + DSR.Name, fileMask, Level+1); end; FindResult := FindNext(DSR); end; finally FindClose(FSR); FindClose(DSR); end; end; procedure ButtonOnClick(Sender: TObject); begin if TButton(Sender).Tag = 0 then CheckListBox.CheckItem(0, coCheckWithChildren) else CheckListBox.CheckItem(0, coUnCheck); end; procedure MsgButtonOnClick(Sender: TObject); begin Case TButton(Sender).Tag of bidDelAll : DelAllReadOnly:= True; bidSkipAll: SkipAllReadOnly:= True; end; MsgForm.Close; end; function DelMsgBox(FileName: string): Boolean; var MsgLabel: TLabel; begin MsgForm:= CreateCustomForm; MsgForm.ClientWidth := ScaleX(400); MsgForm.ClientHeight := ScaleY(120); MsgForm.Caption := 'Files to delete'; MsgForm.Center; MsgLabel := TLabel.Create(MsgForm); MsgLabel.Left := ScaleX(20); MsgLabel.Top := ScaleY(20); MsgLabel.Caption:= FileName + ' is protected file or directory!' + #10#10#13 + 'Do you want to delete the file with READONLY attribute?'; MsgLabel.Parent := MsgForm; MsgAllButton := TButton.Create(MsgForm); MsgAllButton.Parent := MsgForm; MsgAllButton.Width := ScaleX(75); MsgAllButton.Height := ScaleY(23); MsgAllButton.Left := ScaleX(20); MsgAllButton.Top := MsgForm.ClientHeight - ScaleY(23 + 10); MsgAllButton.Caption := 'Delete All'; MsgAllButton.Tag:= bidDelAll; MsgAllButton.OnClick := @MsgButtonOnClick; MsgSkipAllButton := TButton.Create(MsgForm); MsgSkipAllButton.Parent := MsgForm; MsgSkipAllButton.Width := ScaleX(75); MsgSkipAllButton.Height := ScaleY(23); MsgSkipAllButton.Left := MsgAllButton.Left + MsgAllButton.Width + ScaleX(10); MsgSkipAllButton.Top := MsgForm.ClientHeight - ScaleY(23 + 10); MsgSkipAllButton.Caption := 'Skip All'; MsgSkipAllButton.Tag:= bidSkipAll; MsgSkipAllButton.OnClick := @MsgButtonOnClick; MsgCancelButton := TButton.Create(MsgForm); MsgCancelButton.Parent := MsgForm; MsgCancelButton.Width := ScaleX(75); MsgCancelButton.Height := ScaleY(23); MsgCancelButton.Left := MsgForm.ClientWidth - MsgCancelButton.Width - ScaleX(20); MsgCancelButton.Top := MsgForm.ClientHeight - ScaleY(23 + 10); MsgCancelButton.Caption := 'Skip'; MsgCancelButton.ModalResult := mrCancel; MsgDelButton := TButton.Create(MsgForm); MsgDelButton.Parent := MsgForm; MsgDelButton.Width := ScaleX(75); MsgDelButton.Height := ScaleY(23); MsgDelButton.Left := MsgCancelButton.Left - MsgDelButton.Width - ScaleX(10); MsgDelButton.Top := MsgForm.ClientHeight - ScaleY(23 + 10); MsgDelButton.Caption := 'Delete'; MsgDelButton.ModalResult := mrOk; MsgForm.ActiveControl:= MsgCancelButton; if MsgForm.ShowModal() = mrOk then Result:= True else Result:= False; end; procedure DeleteFiles(); var SR: TFindRec; i: integer; str: string; ResultCode: Integer; begin DelAllReadOnly:= False; SkipAllReadOnly:= False; for i:= CheckListBox.Items.Count - 1 downto 0 do begin if CheckListBox.State[i] = cbChecked then begin str:= Trim(TStrings(CheckListBox.ItemObject[i]).Text); FindFirst(str, SR); if ((SR.Attributes and FILE_ATTRIBUTE_READONLY) = FILE_ATTRIBUTE_READONLY) then if Not (DelAllReadOnly or SkipAllReadOnly) then if DelMsgBox(SR.Name) then Exec('attrib', ' -h -s -r ' + '"' + str + '"', '', SW_HIDE, ewWaitUntilTerminated, ResultCode); if DelAllReadOnly then Exec('attrib', ' -h -s -r ' + '"' + str + '"', '', SW_HIDE, ewWaitUntilTerminated, ResultCode); FindClose(SR); DeleteFile(str); RemoveDir(str); end; end; end; procedure BrowseRemainedFiles(); begin Form:= CreateCustomForm; Form.ClientWidth := ScaleX(400); Form.ClientHeight := ScaleY(400); Form.Caption := 'Files to delete'; Form.Center; StaticText := TNewStaticText.Create(Form); StaticText.Left:= ScaleX(20); StaticText.Top := ScaleY(8); StaticText.Caption := 'Some elements could not be removed.' + #10#13 + 'These can be removed manually.' + #10#13#13 + 'Choose which are necessary to delete' + #10#13 + 'or press Cancel button.'; StaticText.Font.Color:= clBlue; StaticText.Font.Style:= [fsBold]; StaticText.AutoSize := True; StaticText.Parent := Form; CheckListBox := TNewCheckListBox.Create(Form); CheckListBox.Left:= ScaleX(20); CheckListBox.Top:= ScaleY(20); CheckListBox.Width:= Form.ClientWidth - ScaleX(20*2); CheckListBox.Height:= Form.ClientHeight - ScaleY(23*2 + 20); // CheckListBox.Offset:= 0; CheckListBox.Parent:= Form; AllButton := TButton.Create(Form); AllButton.Parent := Form; AllButton.Width := ScaleX(75); AllButton.Height := ScaleY(23); AllButton.Left := ScaleX(20); AllButton.Top := Form.ClientHeight - ScaleY(23 + 10); AllButton.Caption := 'Select All'; AllButton.Tag:= 0; AllButton.OnClick := @ButtonOnClick; UnAllButton := TButton.Create(Form); UnAllButton.Parent := Form; UnAllButton.Width := ScaleX(75); UnAllButton.Height := ScaleY(23); UnAllButton.Left := AllButton.Left + AllButton.Width + ScaleX(10); UnAllButton.Top := Form.ClientHeight - ScaleY(23 + 10); UnAllButton.Caption := 'Clear All'; UnAllButton.Tag:= 1; UnAllButton.OnClick := @ButtonOnClick; CancelButton := TButton.Create(Form); CancelButton.Parent := Form; CancelButton.Width := ScaleX(75); CancelButton.Height := ScaleY(23); CancelButton.Left := Form.ClientWidth - CancelButton.Width - ScaleX(20); CancelButton.Top := Form.ClientHeight - ScaleY(23 + 10); CancelButton.Caption := 'Cancel'; CancelButton.ModalResult := mrCancel; CancelButton.Cancel := True; DelButton := TButton.Create(Form); DelButton.Parent := Form; DelButton.Width := ScaleX(75); DelButton.Height := ScaleY(23); DelButton.Left := CancelButton.Left - DelButton.Width - ScaleX(10); DelButton.Top := Form.ClientHeight - ScaleY(23 + 10); DelButton.Caption := 'Delete'; DelButton.ModalResult := mrOk; Form.ActiveControl:= CancelButton; CheckListBox.AddCheckBox(ExpandConstant('{app}'), '', 0, True, True, False, True, TStringList.Create); TStrings(CheckListBox.ItemObject[0]).Text:= ExpandConstant('{app}'); CheckDirs:= True; FillListBox(ExpandConstant('{app}'), '*', 1); CheckDirs:= False; FillListBox(ExpandConstant('{app}'), '*', 1); if Form.ShowModal() = mrOk then DeleteFiles(); end; procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); begin if DirExists(ExpandConstant('{app}')) and (CurUninstallStep = usPostUninstall) then BrowseRemainedFiles(); end;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值