Jump to content
Fórum Script Brasil
  • 0

(Resolvido) Colocar Progressbar Em Importação


maxm.ro
 Share

Question

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 ....

Edited by maxm.ro
Link to comment
Share on other sites

11 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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;

Edited by Jhonas
Link to comment
Share on other 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 to comment
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.

 Share

  • Forum Statistics

    • Total Topics
      149.8k
    • Total Posts
      646.6k
×
×
  • Create New...