Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Аватара для Johny777

Ветеран


Сообщения: 649
Благодарности: 444

Профиль | Отправить PM | Цитировать


Leka_651,
в общем для того чтобы помочь тебе с кнопкой отмены мне нужен твой код целиком или самодостаточный вариант бэкапа с файлами для теста

но его нет поэтому сделал свой вариант бэкапа
в нём устранены все дисфункции твоей системы резервного коприрования (по функционалу)

======================================
вот (приписал несколько комментариев) :

читать дальше »
Код: Выделить весь код
#define JINNEE_DIR  "JINNEE_DIR"
#define CLIENT_DIR  "CLIENT_DIR"


[Setup]
AppName=Icon_Demo
AppVerName=Icon_Demo
DefaultDirName={pf}\Icon_Demo
Compression=none

[Files]
Source: My_CLIENT_DIR\*; DestDir: {app}\{#CLIENT_DIR}; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension
Source: My_JINNEE_DIR\*; DestDir: {app}\{#JINNEE_DIR}; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension

[code]
type
   TSHFileOpStruct=record
     Wnd: HWND;
     wFunc: UINT;
     pFrom: PChar;
     pTo: PChar;
     fFlags: Word;
     fAnyOperationsAborted: BOOL;
     hNameMappings: HWND;
     lpszProgressTitle: PChar;
   end;

function SHFileOperation(const lpFileOp: TSHFileOpStruct):integer; external 'SHFileOperation@shell32.dll stdcall';

function CopyFile_(FromFile,ToDir:string;IsRemove:boolean):boolean;
var
  F:TShFileOpStruct;
  a1,a2:string;
begin
  F.Wnd:=0;
  if IsRemove then F.wFunc:=$0001 else F.wFunc:=$0002;
  a1:=FromFile+#0#0;
  F.pFrom:=PChar(a1);
  a2:=AddBackslash(ToDir)+#0#0;
  F.pTo:=PChar(a2);
  F.fFlags:=$0254;
  Result:=(ShFileOperation(F)=0);
end;

procedure BackupDir(const FromDir,ToDir,FileMask :string; IsRemove,IncludeSubDirs: boolean);
var
  FindRec:TFindRec;
  sFileName,fd,td:string;
begin
  fd:=AddBackslash(FromDir);
  td:=AddBackslash(ToDir);
  ForceDirectories(td);
  if FindFirst(fd+FileMask,FindRec) then begin
    try
      repeat
        sFileName:=fd+FindRec.Name;
        if ((FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY)=0) then CopyFile_(sFileName,td,IsRemove)
        else
          if IncludeSubDirs then
            if (FindRec.Name<>'') and (FindRec.Name<>'.') and (FindRec.Name<>'..') then
              BackupDir(sFileName,td+FindRec.Name,FileMask,IsRemove,IncludeSubDirs);
      until not FindNext(FindRec);
    finally
      FindClose(FindRec);
    end;
  end;
end;


procedure CurStepChanged(CurStep: TSetupStep);
begin
  case CurStep of
    ssInstall: // этап установки /// перед установкой
    begin
      if (DirExists(ExpandConstant('{app}\{#CLIENT_DIR}')) or DirExists(ExpandConstant('{app}\{#JINNEE_DIR}'))) and /// если эти папки существуют в директории установки
      not (DirExists(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP')) and DirExists(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP')) and DirExists(ExpandConstant('{app}\DLL_BACKUP'))) then  /// а эти с бэкапом нет, то
      begin
        with WizardForm do
        begin
          StatusLabel.Caption := 'Резервное копирование папки {#CLIENT_DIR}'; /// в лейбл статуса пишем "резервное копирование..."
          CancelButton.Enabled := False; /// для кравоты и не только блокируем кнопку "Отмена"
          ProgressGauge.Visible := CancelButton.Enabled; /// и делаем прогрессбар невидимым

          /// дополнительно: если папка существует /// то копируемв в такую же с припиской _BACKUP
          if DirExists(ExpandConstant('{app}\{#CLIENT_DIR}')) then BackupDir(ExpandConstant('{app}\{#CLIENT_DIR}'),ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP'),'*.*',False,True);  
          
          /// дополнительно: если папка существует /// то копируемв в такую же с припиской _BACKUP
          if DirExists(ExpandConstant('{app}\{#JINNEE_DIR}')) then BackupDir(ExpandConstant('{app}\{#JINNEE_DIR}'),ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP'),'*.*',False,True);
          
          /// копируем библиотеки по маске*(расширению) в папку DLL_BACKUP
          BackupDir(ExpandConstant('{app}'),ExpandConstant('{app}\DLL_BACKUP'),'*.dll',False,True);

          CancelButton.Enabled := True; /// делаем кнопку "Отмена"  активной
          ProgressGauge.Visible := CancelButton.Enabled; /// ну и зависмсость прогресбара от состояния кнопки, те видимым
        end;
      end;
    end;
  end;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean );
begin
  case CurPageID of /// если ай-ди страницы...
  
    wpInstalling: ///...страница установки
    begin
      case ExitSetupMsgBox of
      
        True:
        begin
            if DirExists(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP')) or DirExists(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP')) then  /// если существуют файлы бэкапа
            begin
              Confirm := False;  /// убираем подтверэдение

              with WizardForm do
              begin
                StatusLabel.Caption := SetupMessage(msgStatusRollback); // в статул лейбл пишем "Откат..."
                CancelButton.Enabled := False; /// для красоты блокируем кнопку "Отмена"
                ProgressGauge.Visible := CancelButton.Enabled; /// прячем прогресбар
                FilenameLabel.Hide; /// прячем застывший лейбл отображающий какой файл только что распаковывался

                if DirExists(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP')) then /// здесь тоже самое, только в обратную сторону с удалением
                begin
                  DelTree(ExpandConstant('{app}\{#CLIENT_DIR}'), True, True, True); /// удаляем установленную нами папку    CLIENT_DIR
                  BackupDir(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP'),ExpandConstant('{app}\{#CLIENT_DIR}'),'*.*',False,True); /// из бэкапа - пользовательские файлы копируем в папку которую только что удалили - CLIENT_DIR
                  DelTree(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP'), True, True, True); /// удаляем папку бэкапа. Дальше по аналогии
                end;

                if DirExists(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP')) then
                begin
                  DelTree(ExpandConstant('{app}\{#JINNEE_DIR}'), True, True, True);
                  BackupDir(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP'),ExpandConstant('{app}\{#JINNEE_DIR}'),'*.*',False,True);
                  DelTree(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP'), True, True, True);
                end;

                if DirExists(ExpandConstant('{app}\DLL_BACKUP')) then
                begin
                  BackupDir(ExpandConstant('{app}\DLL_BACKUP'),ExpandConstant('{app}'),'*.dll',False,True);
                  DelTree(ExpandConstant('{app}\DLL_BACKUP'), True, True, True);
                end;
              end;

              Cancel := True;    /// выходим из инсталла
            end;
        end;
        
        False: Cancel := False;
        
      end;
    end;
  end;
end;


Цитата Leka_651:
при удалении нужно чтобы удалялось все, кроме каталога db. он и бекапиться не должен. »
[UninstallDelete]
Type: filesandordirs; Name: not "{app}\db"

если нужно откатывать бэкап при удалении, то вот функция

читать дальше »
Код: Выделить весь код
#define MyAppName "DisksInfo"
...

function InitializeUninstall(): Boolean;
var
    Errorcode: Integer;
begin
    Result := False;

    if not UninstallSilent then
    begin
        Exec(ExpandConstant('{uninstallexe}'), '/VERYSILENT', '', SW_SHOW, ewNoWait, ErrorCode);
        Exit;
    end;

    if MsgBox(FmtMessage(SetupMessage(msgConfirmUninstall), ['{#MyAppName}']), mbInformation, MB_YESNO) = idYes then
    begin
        if DirExists(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP')) then /// здесь тоже самое, только в обратную сторону с удалением
        begin
          DelTree(ExpandConstant('{app}\{#CLIENT_DIR}'), True, True, True); /// удаляем установленную нами папку    CLIENT_DIR
          BackupDir(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP'),ExpandConstant('{app}\{#CLIENT_DIR}'),'*.*',False,True); /// из бэкапа - пользовательские файлы копируем в папку которую только что удалили - CLIENT_DIR
          DelTree(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP'), True, True, True); /// удаляем папку бэкапа. Дальше по аналогии
        end;

        if DirExists(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP')) then
        begin
          DelTree(ExpandConstant('{app}\{#JINNEE_DIR}'), True, True, True);
          BackupDir(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP'),ExpandConstant('{app}\{#JINNEE_DIR}'),'*.*',False,True);
          DelTree(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP'), True, True, True);
        end;

        if DirExists(ExpandConstant('{app}\DLL_BACKUP')) then
        begin
          BackupDir(ExpandConstant('{app}\DLL_BACKUP'),ExpandConstant('{app}'),'*.dll',False,True);
          DelTree(ExpandConstant('{app}\DLL_BACKUP'), True, True, True);
        end;
    
        Result := True;
        MsgBox(FmtMessage(SetupMessage(msgUninstalledAll), ['{#MyAppName}']), mbInformation, MB_OK);
    end
    else Result := False;
end;



пользуйся!

Разве установка должна отменяться без подтверждения ("Вы уверены...")?

Последний раз редактировалось Johny777, 03-08-2012 в 18:04. Причина: устарнил признаки своей безграмотности

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:22, 03-08-2012 | #527