• 0
Sign in to follow this  
António44

(Resolvido) Ajuda com o TBakcup

Question

Preciso de ajuda,sou um curioso em programação,e estou tentar modificar o Sistema de backup do Tbackup componente do delphi3 e no botão de salvar o backup eu não quero que apareça a caixa do savedialog quero dar um caminho num Tedit em que possa sempre modificar, porque vou gravar num file.ini o directório para onde será feito o backup, e será carregado do Form.Create e atomáticamente faz logo o backup vocês podem se for possivel dar-me umas luzes ai.é que assim tirando o savedialog ele manda o backup para a pasta onde está o backup.exe e já tentei várias maneiras...

Agradecia a sua ajuda.

(Este código é o original, está no Botão Criar backup).

 
procedure TForm1.Button2Click(Sender: TObject);
begin
  if Filelistbox.items.count = 0 then Showmessage('No files added')
  else with SaveDialog do if execute then
  begin
    if uppercase(copy(filename, 1, 1)) = 'A' then
    begin
      Showmessage('Drive A indicates a floppy drive - please a new empty disk');
      BackupFile1.maxSize := 1400000; //backup to floppy
    end
    else BackupFile1.maxSize := 0;

    backupfile1.backuptitle := EdBackupTitle.text;
    backupfile1.backupmode := TBackupMode(rgBackupmode.itemindex);
    backupfile1.compressionLevel := TCompressionLevel(rgCompressionLevel.itemindex);
    backupfile1.SaveFileID := CbSaveFileID.checked;

    if backupfile1.backup(filelistbox.items, filename)
    then Showmessage('Backup sucessful. Compression rate = '+inttostr(BackupFile1.compressionrate)+' %')
    else Showmessage('Backup failed or aborted');
  end;
end;

Share this post


Link to post
Share on other sites

8 answers to this question

Recommended Posts

  • 0

Tenta esta modificação:

procedure TForm1.Button2Click(Sender: TObject);
Var  S : string;
begin
     //............MONTAR UM NOME DE BACKUP......................
     EdBackupTitle.Text := 'Backup'+datetostr(date());
     S := EdBackupTitle.Text;

     while Pos('/', S) > 0 do
        delete(s,Pos('/', S),1);

     EdBackupTitle.Text := s;
     //...........................................................

     if Filelistbox.items.count = 0 then
        begin
           Showmessage('Nenhum arquivo selecionado');
           exit;
        end;
     if EdBackupTitle.Text = '' then
        SaveDialog.Execute;

     begin
          if uppercase(copy(SaveDialog.filename, 1, 1)) = 'A' then
          begin
               Showmessage('Drive A selecionado - por favor inserir um disco vazio');
               BackupFile1.maxSize := 1400000;  //backup to floppy
          end
          else BackupFile1.maxSize := 0;

          if EdBackupTitle.Text <> '' then
             backupfile1.backuptitle  := EdBackupTitle.text;

          if  rgBackupmode.itemindex = 0 then
            backupfile1.backupmode       := TBackupMode(bmAll)
          else
            backupfile1.backupmode       := TBackupMode(bmIncremental);

          case  rgCompressionLevel.itemindex of
           0 : backupfile1.compressionLevel := TCompressionLevel(clFastest);
           1 : backupfile1.compressionLevel := TCompressionLevel(clDefault);
           2 : backupfile1.compressionLevel := TCompressionLevel(clMax);
           3 : backupfile1.compressionLevel := TCompressionLevel(clNone);
          end;

          backupfile1.SaveFileID       := CbSaveFileID.checked;

          if EdBackupTitle.Text = '' then
             begin
                if backupfile1.backup(filelistbox.items, SaveDialog.filename) then
                   Showmessage('Backup realizado com sucesso. Taxa de Compressão = '+inttostr(BackupFile1.compressionrate)+' %')
                else Showmessage('Backup falhou ou abortou');
             end
         else
             begin
                if backupfile1.backup(filelistbox.items, Edit1.Text + '\' + EdBackupTitle.Text)
                   Showmessage('Backup realizado com sucesso. Taxa de Compressão = '+inttostr(BackupFile1.compressionrate)+' %')
                else Showmessage('Backup falhou ou abortou');
             end;

     end;
end;

abraço

Share this post


Link to post
Share on other sites
  • 0
Tenta esta modificação:

...
          case  rgCompressionLevel.itemindex of
           0 : backupfile1.compressionLevel := TCompressionLevel(clFastest);
           1 : backupfile1.compressionLevel := TCompressionLevel(clDefault);
           2 : backupfile1.compressionLevel := TCompressionLevel(clMax);
           3 : backupfile1.compressionLevel := TCompressionLevel(clNone);
          end;
...

Jhonas, apenas um comentário com relação a esta parte da sugestão...

A julgar pelo fato de inicialmente o colega António44 ter feito um type-cast direto do valor em ItemIndex, pressupõe-se que na lista de opções da tela dele, deva aparecer a opção "Sem compressão" como 2º item desta lista e, assim sendo, a sua sugestão não está de acordo com isto, pois você a tratou como sendo a última (ItemIndex = 3), o que deve ser corrigido para não gerar "problemas".

Ponderação sobre o tipo Enumeração:

O tipo enumeração TCompressionLevel é declarado deste modo na unit backup.pas:

TCompressionLevel = (clFastest, clNone, clDefault, clMax);

em outros compactadores como ZLib.pas o mesmo tipo é declarado:

TCompressionLevel = (clNone, clFastest, clDefault, clMax);

todo o tipo enumeração, como o nome sugere, corresponde a uma lista implícita de números inteiros, onde o primeiro elemento equivale a 0 (zero), o segundo 1 e assim por diante.

Do help "Enumerated types":

"(...)

Each value listed in parentheses in an enumerated type declaration has an underlying integer value determined by the position of the value in the list. (...)"

Assim sendo, caso as opções na tela correspondam a seqüência existente na declaração do tipo TCompressionLevel em questão, o uso da opção feita pelo colega António44, otimizaria o código:

backupfile1.compressionLevel := TCompressionLevel(rgCompressionLevel.itemindex);

Já no caso de não corresponderem, a opção pelo CASE é, sem dúvida, a mais apropriada.

Abraços

Share this post


Link to post
Share on other sites
  • 0

Meus amigos vocês foram espetaculares na resposta me ajudaram e isso eu desde já agradeço mas cntinuo com um problema...é que eu tenho um tedit onde será digitado o directório para onde será feita a cópia,até poderá ser feita para uma drive externa...compreendem,esse directório ficará gravado num Arquivo.ini...com essa sugestão que me mandaram ai e eu testei é o seguinte se eu estiver a copiar arquivo um arquivo de C:\ ele manda o backup para C:\ se eu tiver em em D:\ ele manda o backup para D:\ e eu que ria que o backup independente de onde seja a origem dos arquivos se faça sempre para uma drive especifica como referi atras do arquivo.ini.

Um abraço amigos se puderem ajudar agradeco muito.

Share this post


Link to post
Share on other sites
  • 0
...é que eu tenho um tedit onde será digitado o directório para onde será feita a cópia,até poderá ser feita para uma drive externa...compreendem,esse directório ficará gravado num Arquivo.ini...
a dúvida é como salvar estas informações no arquivo ini?

Se for isso, dê uma olhada neste post, porque o procedimento é o mesmo.

Com relação ao seu código inicial ou a sugestão do Jhonas, para que não seja solicitado o destino, basta que você não use o SaveDialog e tudo o que se refere a ele nos códigos (Execute e FileName). Onde o componente de backup usa o nome de arquivo na propriedade FiliName, você passaria a usar o seu TEdit e todos os parâmetros do componente devem ser inicializados diretamente no components.

Supondo que você queira ler as informações do arquivo .ini para inicializar os parâmetros do backup, seria mais apropriado que você o fizesse no OnShow. Dentro desta proposta, e usando o seu código, a idéia seria mais ou menos esta:

procedure TForm1.Show(Sender: TObject);
var
  FileName :string;
begin
  <criação/abertura do arquivo ini>
  
  backupFile1.maxSize := 0;
  backupfile1.backuptitle := <ler do arquivo>;
  backupfile1.backupmode := <ler do arquivo>;
  backupfile1.compressionLevel := <ler do arquivo>;
  backupfile1.SaveFileID := <ler do arquivo>;
  FileName := <ler do arquivo>;

  <fechar arquivo ini>

  if backupfile1.backup(filelistbox.items, FileName) then
    Showmessage('Backup sucessful. Compression rate = '+inttostr(BackupFile1.CompressionRate)+' %')
  else 
    Showmessage('Backup failed or aborted');

  // ... outras coisas que já faça
end;
Em algun ponto de seu código, deverá haver uma opção para mostrar o form de configuração destes parâmetros no arquivo ini, e isto você faria no evento do botão que grava a informação. Teria mais ou menos esta seqüência:
procedure TForm1.BtnGravaConfiguracao(Sender :TObject);
begin
  <criação/abertura do arquivo ini>

  // gravar valores no ini
  <classe regini>.WriteString('BACKUP TITLE', EdBackupTitle.Text);
  <classe regini>.WriteString('FILE NAME', Edit1.Text);
  <classe regini>.WriteInteger('MODE', rgBackupmode.itemindex);
  <classe regini>.WriteInteger('COMPRESSION', rgCompressionLevel.itemindex);
  ...
  <fechar arquivo ini>
end;

onde aparece o "<>" são indicações do que deve ser usado - não tente compilar que dará erro. Veja aquele post e associe ao que está comentado.

Abraços

Share this post


Link to post
Share on other sites
  • 0

Pessoal amigo,tentei aqui usar este codigo mas nada,ele faz o backup para a drive de onde extraio os files para copia o resto está bom mesmo...e preciso dar um diretório especifico onde será criado o file de backup.

um colega daqui do forum tb deu uma ajuda mas não tou conseguindo fazer, vai criar o arquivo sempre na drive onde estão os arquvos que puxo para fazer o backup...não sei mais o que fazer.

um abraço ai pra vocês e obrigado pela disponibilidade em ajudar.

Var  S : string;
begin
     //............MONTAR UM NOME DE BACKUP......................

     EdBackupTitle.Text := 'Backup'+datetostr(date());
     S := EdBackupTitle.Text;

     while Pos('/', S) > 0 do
        delete(s,Pos('/', S),1);

     EdBackupTitle.Text := s;
     //...........................................................

     if Filelistbox.items.count = 0 then
        begin
           Showmessage('Nenhum arquivo selecionado');
           exit;
        end;
     if EdBackupTitle.Text = '' then
        SaveDialog.Execute;

     begin
          if uppercase(copy(SaveDialog.filename, 1, 1)) = 'A' then
          begin
               Showmessage('Drive A selecionado - por favor inserir um disco vazio');
               BackupFile1.maxSize := 1400000;
          end
          else BackupFile1.maxSize := 0;

          if EdBackupTitle.Text <> '' then
             backupfile1.backuptitle  := EdBackupTitle.text;

          if  rgBackupmode.itemindex = 0 then
            backupfile1.backupmode       := TBackupMode(bmAll)
          else
            backupfile1.backupmode       := TBackupMode(bmIncremental);

          case  rgCompressionLevel.itemindex of
           0 : backupfile1.compressionLevel := TCompressionLevel(clFastest);
           1 : backupfile1.compressionLevel := TCompressionLevel(clDefault);
           2 : backupfile1.compressionLevel := TCompressionLevel(clMax);
           3 : backupfile1.compressionLevel := TCompressionLevel(clNone);
          end;

          backupfile1.SaveFileID       := CbSaveFileID.checked;

          if EdBackupTitle.Text = '' then
             begin
                if backupfile1.backup(filelistbox.items, Dir.Text) then
                   Showmessage('Backup realizado com sucesso. Taxa de Compressão = '+inttostr(BackupFile1.compressionrate)+' %')
                else Showmessage('Backup falhou ou abortou');
             end
         else
             begin
                if backupfile1.backup(filelistbox.items, Edit1.Text + '\' + EdBackupTitle.Text) then
                   Showmessage('Backup realizado com sucesso. Taxa de Compressão = '+inttostr(BackupFile1.compressionrate)+' %')
                else Showmessage('Backup falhou ou abortou');
             end;

     end;

Edited by Micheus
Adicionado o delimitador de código [code] [/code]

Share this post


Link to post
Share on other sites
  • 0
não tou conseguindo fazer, vai criar o arquivo sempre na drive onde estão os arquvos que puxo para fazer o backup...não sei mais o que fazer.

Vou te dar um exemplo de como fazer o backup automatico em outra pasta, de preferencia quando for sair do programa

procedure TForm1.Button1Click(Sender: TObject);
var  i,J : integer; S: string;  F: Textfile;
     SR: TSearchRec;
     Origem, Destino: string;
begin
   //............MONTAR UM NOME DE BACKUP......................

   EdBackupTitle.Text := 'Backup'+datetostr(date());
   S := EdBackupTitle.Text;

   while Pos('/', S) > 0 do
   delete(s,Pos('/', S),1);

   EdBackupTitle.Text := s;
   //...........................................................


   FileListBox.items.Clear;
   //Selecionar Todos os Arquivos da pasta Dados onde se encontra o aplicativo
   S := extractFilepath(application.exename)+'Dados\*.*';

   FileListBox.items.add(S);

   BackupFile1.maxSize := 0;

   backupfile1.backuptitle      := EdBackupTitle.text; // recebe o nome Backup+data
   backupfile1.backupmode       := TBackupMode(bmAll);
   backupfile1.compressionLevel := TCompressionLevel(clFastest);
   backupfile1.SaveFileID       := CbSaveFileID.checked;

   if (rbOtherPath.checked) then
      begin
          FileListBox1.items.Clear;
          FileListBox1.items.add(EdPath.Text);
      end
   else
      begin
          FileListBox1.items.Clear;
          FileListBox1.items.add('C:\TESTE\Backup');
      end;

   if backupfile1.Backup(filelistbox.items, EdBackupTitle.Text+'.bck')
   then begin

         Showmessage('Backup realizado com sucesso. Taxa de Compressão = '+inttostr(BackupFile1.compressionrate)+' %');

              J := FindFirst('C:\TESTE\*.bck', faAnyFile, SR);

              while J = 0 do
                 begin
                    if (SR.Attr and faDirectory) <> faDirectory then
                       begin
                         Origem := 'C:\TESTE\' + SR.Name;
                         Destino := 'C:\TESTE\Backup\' + SR.Name;  // o backup sera realizado dentro da pasta backup

                         if not CopyFile(PChar(Origem), PChar(Destino), false) then  // sobreescrever = false
                            ShowMessage('Erro ao copiar ' + Origem + ' para ' + Destino);
                       end;
                    J := FindNext(SR);
                 end;

              J := FindFirst('C:\TESTE\*.BCK', faAnyFile, SR);
              while J = 0 do
                  begin
                     if (SR.Attr and faDirectory) <> faDirectory then
                        begin
                           Origem := 'C:\TESTE\' + SR.Name;
                           if FileExists(Origem) then DeleteFile(Origem);
                        end;
                   J := FindNext(SR);
                   end;

       end
   else Showmessage('Backup falhou ou abortou');

end;

OBS: Tenho uma pasta chamada Teste dentro do meu drive C:\ .... dentro da pasta Teste tenho outra chamda Dados

ao fazer o backup, os arquivos contidos na pasta Dados serão compactados e colocados dentro da pasta Backup que

tambem esta dentro da pasta Teste

veja se consegue entender o que coloquei

abraço

Share this post


Link to post
Share on other sites
  • 0

Jhonas, estão boas as alterações, mas pela MP que recebi do nosso colega, parece que ele está cada vez mas perdido com o que se propõe.

Baseada na MP, vou propor que se volte ao post inicial do colega, alterando naquele código o que ele precisa e que parece mais claro agora:

(...) e no botão de salvar o backup eu não quero que apareça a caixa do savedialog quero dar um caminho num Tedit em que possa sempre modificar, porque vou gravar num file.ini o directório para onde será feito o backup, e será carregado do Form.Create

António44, vamos as alterações e leia os comentários que coloquei no meio do código:

procedure TForm1.Button2Click(Sender: TObject);
var
  FileName :string;  // variável para manter o nome do arquivo de backup
begin
 // inicializamos a variável com o diretório destino informado no TEdit - Dir
  FileName := Trim(Dir.Text);
 // verificamos se foi digitada a barra no final do diretório. 
 // se não foi concatenamos ela
  if Copy(FileName, Length(FileName), 1) <> '\' then
    FileName := FileName +'\';
 // concatenamos o nome do arquivo no formato: "Backup" + <data do backup> +".bkp"
  FileName := FileName + 'Backup'+DateToStr(Date) +'.bkp';

 // daqui para baixo, só retiramos o SaveDialog, não há mais o que mudar
 // porque utilizamos uma variável com o mesmo nome que o da propriedade
 // FileName do SaveDialog que era utilizada. Assim, se funcionava antes, tem que 
 // funcionar agora e com o diretório digitado no edit.
  if Filelistbox.items.count = 0 then Showmessage('No files added')
  else
  begin
    if uppercase(copy(filename, 1, 1)) = 'A' then
    begin
      Showmessage('Drive A indicates a floppy drive - please a new empty disk');
      BackupFile1.maxSize := 1400000; //backup to floppy
    end
    else BackupFile1.maxSize := 0;

    backupfile1.backuptitle := EdBackupTitle.text;
    backupfile1.backupmode := TBackupMode(rgBackupmode.itemindex);
    backupfile1.compressionLevel := TCompressionLevel(rgCompressionLevel.itemindex);
    backupfile1.SaveFileID := CbSaveFileID.checked;

    if backupfile1.backup(filelistbox.items, filename)
    then Showmessage('Backup sucessful. Compression rate = '+inttostr(BackupFile1.compressionrate)+' %')
    else Showmessage('Backup failed or aborted');
  end;
end;

Espero que isto resolva a questão.

Abraços

Share this post


Link to post
Share on other sites
  • 0

Consegui finalmente resolver o problema...que sem a vossa ajuda ainda estava aqui a patinar.

Um grande obrigado para vocês todos confesso que foi a 1ª vez que entrei num Forum para pedir ajuda,minha area é de base de dados Oracle ,e fiquei satisfeito, principalmente pela disponibilidade e boa vontade que vocês tem em ajudar.

Um abraço a todos se precisarem de minha ajuda é só me mandar um Email- [email protected]

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this