Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Colocar Progressbar Em Importação


maxm.ro

Pergunta

ola galera,

o Codigo abaixo e referente a importação de um arquivo TXT para BD em Sq Server

A duvida é: Como coloco um ProgressBar nessa importação?

procedure TForm1.SpeedButton1Click(Sender: TObject); 
var 
arq: textfile; 
Entrada : String; 

begin 
  assignfile(arq,'C:\Documents and Settings\lanhouse\Meus documentos\MAX\Banco de Dados\3271_20070912\3271_20070910_Cadastro.txt');//associa arquivo a variavel 
  reset(arq);//abre arquivo 

      DM.ADOQryCadastro.open; // abre a table 
      DM.ADOQryCadastro.First; // aponta para o primeiro registro 

      while not eof (arq) do 
      begin 
        Readln(arq,entrada);    

   DM.ADOQryCadastro.append; 

        Edit4.Text := Copy(Entrada,01,07); 
        if (Edit4.Text = 'RESPOND') or (Edit4.Text = 'RENOVAD') then 
        begin 

        end 
        else begin 

         DM.ADOQryCadastroNumCadastroUnico.Value := StrToInt(copy(Entrada,01,07)); 
           DM.ADOQryCadastroCodTipoPessoa.Value:= StrToInt(copy(Entrada,08,01)); 
         DM.ADOQryCadastroCPF_CNPJ.Value := Copy(Entrada,19,14); 
         DM.ADOQryCadastroNomeCliente.Value := Copy(Entrada,33,50); 
        
    DM.ADOQryCadastro.post; // salva 
         DM.ADOQryCadastro.Next; // vai para o próximo 
          
    
      end; 

      end; 
end;

?

?

coloquei um progressbar no formulario, qwando passa pro proximo registro (next) eu escrevi: "progressbar.position := progressbar.position + 1;" . Só que ele não executa corretamento, quando ta começando a importar o progressbar já encheu.

então devo dizer para o progressbar o tamanho do arquivo, como posso fazer isso ???

Progressbar1.Max := o que ???

o que devo fazer ?

estou utlizando Delphi for .net

falou agradeço a ajuda ....

Editado por maxm.ro
Link para o comentário
Compartilhar em outros sites

11 respostass a esta questão

Posts Recomendados

  • 0

maxm.ro, dê uma olhada neste post. Ele utiliza o TGauge, mas o princípio é exatamente o mesmo e está comentado (exemplo para download):

- max - contém o tamanho máximo do arquivo sendo importado;

- position - avança com a quantidade de bytes lidos;

Veja se você consegue avançar.

Link para o comentário
Compartilhar em outros sites

  • 0

blza .. vlw pela dica, mas tem um porem: o delphi parece não reconhecer esse comando

TamArquivo := FileSize(ArqCadastro);

TamArquivo --> varivel integer;

ArqCadastro---> que esta relacionado com o arquivo txt, caminho.

ele me retorna o seguinte erro:

Erro: borland.delphi.Systen init out of date or corrupted: missing '@filesize'

Link para o comentário
Compartilhar em outros sites

  • 0
blza .. vlw pela dica, mas tem um porem: o delphi parece não reconhecer esse comando

TamArquivo := FileSize(ArqCadastro);

TamArquivo --> varivel integer;

ArqCadastro---> que esta relacionado com o arquivo txt, caminho.

ele me retorna o seguinte erro:

Erro: borland.delphi.Systen init out of date or corrupted: missing '@filesize'

é esqueci do detalhe do ".NET".

Eu não tenho como verificar isto. Você poderia tentar olhar no help (procurando por filesize) para ver de onde você poderia "importar" a função - caso ela ainda exista para a plataforma ".NET". Eu acredito que ainda haja um meio de você saber o tamanho de um arquivo.

Link para o comentário
Compartilhar em outros sites

  • 0

cara, ele mostra alguma coisa sobre o file size, mas não sei se pode funcionar com esse tipo de operação

oque o delphi tem na ajuda:

FileSize Routine

Returns the number of records in a file.

Namespace

Borland.Delphi.System

Syntax

[Delphi] function FileSize(var F: Object): Integer;

Description

In Delphi code, call FileSize to determine the size of the file specified by the file variable F. The size is expressed as the number of records in a record file. Thus:

If the file is declared as a file of byte, then the record size defaults to one byte, and FileSize returns the number of bytes in the file.

The Reset procedure can set the record size (in bytes) when it opens the file. In this case, FileSize returns the number of records in the file.

Note:

If the file is declared as an untyped file and you don't specify a record size when you call Reset , then FileSize assumes a record size of 128. That is, FileSize gives the number of bytes divided by 128.

To use FileSize, the file must be open. If the file is empty, FileSize(F) returns 0.

Link para o comentário
Compartilhar em outros sites

  • 0

Ai vai seu codigo com as modificações para usar o Progressbar:

Function quantaslin ( nomeDoArquivo: String ):integer;
var arq: TextFile;nr:integer;
linha: String;
begin
nr:=0;
AssignFile ( arq, nomeDoArquivo );
Reset ( arq );
ReadLn ( arq, linha );
while not Eof ( arq ) do
begin
ReadLn ( arq, linha );
nr:=nr+1;
end;
CloseFile ( arq );

end;
procedure TForm1.SpeedButton1Click(Sender: TObject); 
var 
arq: textfile; 
Entrada : String; 
cont : integer;


begin 
   cont := 0;
   Progressbar1.Max :=  quantaslin('C:\Documents and Settings\lanhouse\Meus documentos\MAX\Banco de Dados\3271_20070912\3271_20070910_Cadastro.txt');//valor max do Progressbar em função do numero de linhas do arquivo


  assignfile(arq,'C:\Documents and Settings\lanhouse\Meus documentos\MAX\Banco de Dados\3271_20070912\3271_20070910_Cadastro.txt');//associa arquivo a variavel 
  reset(arq);//abre arquivo 

      DM.ADOQryCadastro.open; // abre a table 
      DM.ADOQryCadastro.First; // aponta para o primeiro registro 

      while not eof (arq) do 
      begin 
        Readln(arq,entrada);    
        cont := cont + 1;
        progressbar.position :=cont;
   DM.ADOQryCadastro.append; 

        Edit4.Text := Copy(Entrada,01,07); 
        if (Edit4.Text = 'RESPOND') or (Edit4.Text = 'RENOVAD') then 
        begin 

        end 
        else begin 

         DM.ADOQryCadastroNumCadastroUnico.Value := StrToInt(copy(Entrada,01,07)); 
           DM.ADOQryCadastroCodTipoPessoa.Value:= StrToInt(copy(Entrada,08,01)); 
         DM.ADOQryCadastroCPF_CNPJ.Value := Copy(Entrada,19,14); 
         DM.ADOQryCadastroNomeCliente.Value := Copy(Entrada,33,50); 
        
    DM.ADOQryCadastro.post; // salva 
         DM.ADOQryCadastro.Next; // vai para o próximo 
          
    
      end; 

      end; 
    progressbar.position := 0;
end;

Link para o comentário
Compartilhar em outros sites

  • 0

não entendi muto bem o que você quis dizer ocm isso:

Progressbar1.Max :=  quantaslin('C:\Documents and Settings\lanhouse\Meus documentos\MAX\Banco de Dados\3271_20070912\3271_20070910_Cadastro.txt');//valor max do Progressbar em função do numero de linhas do arquivo

o que significa esse "Quantaslin" ?

Link para o comentário
Compartilhar em outros sites

  • 0

maxm.ro, se você observar o post do Jhonas, vai ver que ele colocou antes do seu código alterado, o código de uma função para retornar o número de linhas do arquivo sendo importado (function QuantasLin).

Particularmente não gosto deste procedimento porque implica que você lerá o arquivo completo 2 vezes. Mas, como não tenho condições de lhe ajudar com o ".NET", a opção funciona.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Particularmente não gosto deste procedimento porque implica que você lerá o arquivo completo 2 vezes

Devo concordar com o Micheus, porque eu tambem não gosto, sendo assim vai outra modificação para voce, sem que seja necessario ler o arquivo inteiro duas vezes:

procedure TForm1.SpeedButton1Click(Sender: TObject); 
var 
arq: textfile; 
Entrada : String; 
cont : integer;

Linhas: Integer;
Lista: TStringList;


begin 
   cont := 0;

   Lista := TStringList.Create;
   try
    Lista.LoadFromFile('C:\Documents and Settings\lanhouse\Meus documentos\MAX\Banco de Dados\3271_20070912\3271_20070910_Cadastro.txt');
    Linhas := Lista.Count;
   finally
    Lista.Free;
   end;

   Progressbar1.Max :=  Linhas; //valor max do Progressbar em função do numero de linhas do arquivo


   assignfile(arq,'C:\Documents and Settings\lanhouse\Meus documentos\MAX\Banco de Dados\3271_20070912\3271_20070910_Cadastro.txt');//associa arquivo a variavel 
   reset(arq);//abre arquivo 

      DM.ADOQryCadastro.open; // abre a table 
      DM.ADOQryCadastro.First; // aponta para o primeiro registro 

      while not eof (arq) do 
      begin 
        Readln(arq,entrada);    
        cont := cont + 1;
        progressbar.position :=cont;
   DM.ADOQryCadastro.append; 

        Edit4.Text := Copy(Entrada,01,07); 
        if (Edit4.Text = 'RESPOND') or (Edit4.Text = 'RENOVAD') then 
        begin 

        end 
        else begin 

         DM.ADOQryCadastroNumCadastroUnico.Value := StrToInt(copy(Entrada,01,07)); 
           DM.ADOQryCadastroCodTipoPessoa.Value:= StrToInt(copy(Entrada,08,01)); 
         DM.ADOQryCadastroCPF_CNPJ.Value := Copy(Entrada,19,14); 
         DM.ADOQryCadastroNomeCliente.Value := Copy(Entrada,33,50); 
        
    DM.ADOQryCadastro.post; // salva 
         DM.ADOQryCadastro.Next; // vai para o próximo 
          
    
      end; 

      end; 
    progressbar.position := 0;
end;

Editado por Jhonas
Link para o comentário
Compartilhar em outros sites

  • 0

maxm.ro, você não deixou claro o que faz em seu código quando a condição IF é satisfeita, então, assumindo que o processamento sobre o arquivo (importação) ocorra apenas no ELSE, fica conveniente e logicamente mais correto que "DM.ADOQryCadastro.append;" seja chamado neste ponto, pois apenas neste momento você atribui valores e "posta" o resultado.

Particularmente não gosto deste procedimento porque implica que você lerá o arquivo completo 2 vezes

Devo concordar com o Micheus, porque eu tambem não gosto, sendo assim vai outra modificação para voce, sem que seja necessario ler o arquivo inteiro duas vezes:

Jhonas, se você concorda comigo neste ponto, então vai entender que eu não posso concordar com você.

Observe que ao utilizar o componente TStringList e carregando o arquivo via método LoadFromFile para obter Count (representando a quantidade de linhas no arquivo) você obrigatoriamente está fazendo uma leitura do arquivo. Daí, ao eliminar o objeto e utilizar o procedimento com AssignFile, Reset, ..., como anteriormente, voce está fazendo a segunda leitura.

Talvez você até tenha pensado certo, mas não lembrou de ajustar o código. O correto em sua colocação, seria justamente utilizar as linhas já carregadas no StringList para proceder com a importação. Neste caso, sim, teríamos apenas uma leitura:

procedure TForm1.Button5Click(Sender: TObject);
var
  Entrada : String;
  cont : integer;
  Lista: TStringList;
begin
  Lista := TStringList.Create;
  try
    Lista.LoadFromFile('C:\Documents and Settings\lanhouse\Meus documentos\MAX\Banco de Dados\3271_20070912\3271_20070910_Cadastro.txt');
    Progressbar1.Max := Lista.Count; //valor max do Progressbar em função do numero de linhas do arquivo

    DM.ADOQryCadastro.open; // abre a table
    DM.ADOQryCadastro.First; // aponta para o primeiro registro
    cont := 0;
    while cont < Lista.Count do
    begin
      entrada := Lista.Strings[cont];
      Inc(cont);
      Progressbar1.position := cont;

      Edit4.Text := Copy(Entrada,01,07);
      if (Edit4.Text = 'RESPOND') or (Edit4.Text = 'RENOVAD') then
      begin

      end else
      begin
        DM.ADOQryCadastro.append;
        DM.ADOQryCadastroNumCadastroUnico.Value := StrToInt(copy(Entrada,01,07));
        DM.ADOQryCadastroCodTipoPessoa.Value:= StrToInt(copy(Entrada,08,01));
        DM.ADOQryCadastroCPF_CNPJ.Value := Copy(Entrada,19,14);
        DM.ADOQryCadastroNomeCliente.Value := Copy(Entrada,33,50);
        DM.ADOQryCadastro.post; // salva
      end;
    end;
  finally
    Lista.Free;
  end;
  Progressbar1.position := 0;
end;

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...