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

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

Ветеран


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

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


Цитата PerfectLove:
На данный момент первый чекбокс делает бекап всей папки. Хочу добавить второй чекбокс чтобы делать бекап только нескольких файлов а не всей папки. »
Пример
Код: Выделить весь код
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program\Fonts
OutputDir=.


[Files]
Source: C:\Windows\Fonts\*; DestDir: {app}; Flags: external overwritereadonly ignoreversion;


[Code]
#define A = (Defined UNICODE) ? "W" : "A"


function MoveFile(const srcFile, destFile: PAnsiChar): Integer; external 'MoveFile{#A}@kernel32.dll stdcall';


var
    arrayChk: array of TCheckBox;


function ChkChecked(const Index: Integer): Boolean;
var
    Len: Integer;
begin
    Len := GetArrayLength(arrayChk) - 1;

    if Index > Len then Exit;
    Result := arrayChk[Index].Checked;
end;


procedure CreateBackup();
var
    FindFiles: TFindRec;
    i, Len: Integer;
    MyFiles: array of string;
    MyDir, BackDir: string;
begin
    Len := GetArrayLength(arrayChk) - 1;
    if (ChkChecked(0) and ChkChecked(Len)) then Exit; //Если выбраны оба чекбокса резервная копия создана не будет
    if ChkChecked(0) then MyFiles := ['*']; //Резервное копирование папки
    if ChkChecked(Len) then MyFiles := ['ariali.ttf', 'tahoma.ttf', 'verdana.ttf']; //Резервное копирование определенных файлов
    MyDir := ExpandConstant('{app}' + '\');
    BackDir := ExpandConstant('{app}' + '\Backup\');

    for i := 0 to GetArrayLength(MyFiles) - 1 do
    begin
        if FindFirst(MyDir + MyFiles[i], FindFiles) then
        begin
            repeat
                if not DirExists(BackDir) then
                begin
                    CreateDir(BackDir);
                end;
                MoveFile(MyDir + FindFiles.Name, BackDir + FindFiles.Name);
            until not FindNext(FindFiles);

            FindClose(FindFiles);
        end;
    end;
end;


procedure CreateChk();
var
    i, Len: Integer;
begin
    SetArrayLength(arrayChk, 2);
    Len := GetArrayLength(arrayChk) - 1;

    for i := 0 to Len do
    begin
        arrayChk[i] := TCheckBox.Create(nil);
        with arrayChk[i] do
        begin
            Parent := WizardForm.SelectDirPage;
            SetBounds(ScaleX(0), ScaleY(115 + i*20), ScaleX(400), ScaleY(15));

            case i of
                0: Caption := 'Создать резервную копию папки';
                Len: Caption := 'Создать резервную копию основных файлов';
            end;
        end;
    end;
end;


procedure InitializeWizard();
begin
    CreateChk();
end;


procedure CurStepChanged(CurStep: TSetupStep);
var
    Len: Integer;
begin
    Len := GetArrayLength(arrayChk) - 1;

    case CurStep of
        ssInstall: if (ChkChecked(0) or ChkChecked(Len)) then CreateBackup();
    end;
end;

Последний раз редактировалось saurn, 16-01-2014 в 09:13.

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

Отправлено: 06:09, 16-01-2014 | #1849