Реалізація резервного копіювання
Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.
Переходимо на вкладку Win32 Палітри компонентів, знаходимо та встановлюємо на форму компонент PageControl (кожне завдання буде на своїй вкладці). Перейменуємо отриманий PageControll в PC1 для стислості коду, а властивості Align надамо значення alClient.
Зразковий вид вкладки дивіться на малюнку:

У правій частині панелі розмістіть компонент Label. Щоб компонент міг містити багаторядковий текст, властивості AutoSize переведіть в False, а властивість WordWrap - в True. У якості Caption напишіть текст "Час запуску автоматичного резервного копіювання:", і налаштуйте розміри, як на малюнку.
Під панеллю встановіть Memo. Властивість Align встановіть alClient, властивість ScrollBars в ssVertical, і не забудьте очистити від тексту властивість Lines.
Компонент IBBackupService призначений створення резервних копій бази даних InterBase. Цей компонент дозволяє виконувати різні налаштування резервного копіювання залежно від того, які параметри у властивості Options включені.
Для цього в розділі Private модуля головної форми опишемо функцію GetName:
Встановіть курсор на назву функції і натисніть , щоб створити саму функцію. Ось її код:
function TfMain.GetName: String;
ye, mo, da: Word; //для дати ho, mi, se, ms: Word; //Для часу st: String[2]; //для додавання нуля, наприклад, 05 begin
DecodeDate(Date, ye, mo, da); //декодуємо на складові дату
DecodeTime(Time, ho, mi, se, ms); //декодуємо час
//тепер збираємо рядок:
Result:= IntToStr(ye); //додали рік
//отримуємо і додаємо місяць:
if Length(st) = 1 then st:= '0' + st; //якщо 1символ, додамо спереду 0 Result: = Result + st; //отримуємо і додаємо день: st: = IntToStr (da);
if Length(st) = 1 then st:= '0' + st;
Result := Result + st +
//тепер отримуємо і додаємо годину:
if Length(st) = 1 then st:= '0' + st;
Result: = Result + st; //отримуємо і додаємо хвилини: st:= IntToStr(mi);
if Length(st) = 1 then st:= '0' + st;
Result: = Result + st; //отримуємо і додаємо секунди: st:= IntToStr(se);
if Length(st) = 1 then st:= '0' + st; Result: = Result + st + '_';
//Тепер функція поверне префікс імені файлу, наприклад: //20100205_010012_end;
Тут ми декодували на складові дату і час. Рік уже має 4 цифри, тож його додатково обробляти не потрібно. А ось місяць, день, година, хвилина чи секунда можуть складатися з однієї цифри. Щоб не заплутатися, робимо перевірку:
if Length(st) = 1 then st:= '0' + st; //якщо 1 символ, додамо спереду 0 Result: = Result + st;
У змінну st ми отримуємо номер місяця. Якщо цей номер складається із однієї цифри, перед нею додамо '0'. І наприкінці додамо результат у змінну Result. Так само ми перевіряємо й інші дані. Ця функція гарантує нам не тільки унікальність імені файлу, а й правильне сортування файлів за датою. До того ж на ім'я відразу видно - коли було створено файл.
if RB1.Checked then
якщо RB2.Checked then
Розуміємо далі. Копіювання у нас буде починатися або натисканням кнопки, або спрацьовуванням таймера, залежно від того, яка радіокнопка виділена. Отже, щоб двічі не писати той самий код, створимо процедуру резервного копіювання, яку викликатимемо з двох місць. Оскільки процедура безпосередньо працюватиме з компонентом IBBS, спочатку оголосимо її врозділ private, після функції GetName:
< Private declarations >function GetName(): String; procedure BackupCopy;
Встановіть курсор на процедуру та натисніть , щоб згенерувати тіло процедури. Її код:
var s: String; //для отримання префікса файлу begin
//отримаємо префікс: s: = GetName ();
//очистимо Memol, якщо там щось є: Memo1.Clear;
//задаємо параметри компонента IBBackupService:
IBBS.DatabaseName:= 'c:\DataBases\first.gdb'; IBBS.BackupFile.Clear;
IBBS.BackupFile.Add('c:\DataBases\Backup' + s + 'first.gbk'); IBBS.ServiceStart;
//Поки не дійшли до кінця, записуємо паралельно лог в Memo1:
while not IBBS.Eof do
IBBS.Active:= False; end;
//збережемо лог у файл:
Memol.Lines.SaveToFile('c:\DataBases\Backup' + s + 'first.log'); end;
Тут ми спочатку отримали змінну префікс імені файлу. Навіщо це потрібно? Нам необхідно:
1. Зробити резервну копію.
2. Зберегти лог копіювання у файл.
Ці дії будуть проводитися в різний час, тому щоб префікс копії збігався з префіксом лог-файлу, ми зберігаємо його в змінну s:
//отримаємо префікс: s: = GetName ();
Далі ми очищаємо Memo1, якщо там вже був текст. Після чого приступаємо до налаштувань параметрів компонента IBBS:
IBBS.ServerName := 'MyServ'; IBBS.LoginPrompt:= False; IBBS.Params.Add('user name=sysdba'); IBBS.Params.Add('password=masterkey'); IBBS.Active := True;
IBBS.DatabaseName:= 'c:\DataBases\first.gdb'; IBBS.BackupFile.Clear;
IBBS.BackupFile.Add('c:\DataBases\Backup' + s + 'first.gbk'); IBBS.ServiceStart;
//поки не дійшли до кінця, записуємо паралельно лог в Memo1: while not IBBS.Eof do
IBBS.Active:= False;end;
Тут властивість Verbose (багатослівність) визначає - чи виводитиметься лог резервного копіювання. При значенні True лог ведеться, інакше – ні. Нам потрібно, щоб ліг створювався.
І в самому кінці процедури записуємо отриманий в Memol лог у файл з таким самим ім'ям, як резервна копія, але розширенням *.log:
//збережемо лог у файл:
Memo1.Lines.SaveToFile('c:\DataBases\Backup' + s + 'first.log');
gbak: closing file, обговорення іфінішування. 38912 bytes written.
Зайдіть в папку Backup – там має з'явитися пара файлів з однаковим ім'ям та розширеннями *.gbk та *.log. Це і є наша резервна копія та лог-файл.
procedure TfMain.Timer1Timer(Sender: TObject); var
ho, mi, se, ms: Word; //Для часу
//інакше декодуємо час
Насамкінець зауважимо, що компонент IBBackupService має складну властивість Options, що розкривається, яка має наступні перемикачі:
Таблиця 27.1. Перемикачі властивості Options компонента IBBackupService