Findfirst Salvar imagem em banco na mesma ordem da pasta

Delphi

08/04/2011

Nobre colegas, estou importando as imagens (JPG) contidas em uma pasta para o banco de dados de meu sistema (delphi 7/Firebird 2.1).

Porém, noto que as imagens quando são importadas para o banco, não vem na mesma ordem que estão na pasta.

Algum dos nobres colegas teria uma dica de como resolver esse problema?

Desde já agradeço a todos.

Abaixo a Procedure que estou utilizando para efetuar a carga das imagens:

Procedure GetOrderFiles();
var ListFiles : TStringList; result : integer; Arq: TSearchRec;
    Dir: string;
begin
  ListFiles := TStringList.Create;
  try
  ListFiles.sorted := True;
  result := findFirst('C:\G2DOC\G2Imagem\*.jpg', faArchive, Arq);
  while result = 0 do
  begin
    if (Arq.name <> '.') and (Arq.name <> '..') then
      ListFiles.sort;
      ListFiles.add(Arq.name);
      result:=FindNext(Arq);
      //INICIO DO BLOCO DE IMPORTAÇÃO DAS IMAGENS
      //Criar pasta de armazenamento de arquivos TCM
      Dir := 'C:\G2DOC\TCM\' + Trim(dm.cds_TCMCODIGO_ENTIDADE.Text) + '_' +
      Trim(dm.cds_TCMCOD_UNID_ADMINISTRATIVA.Text) + '_' +
      Trim(dm.cds_TCMSIGLA_DOCUMENTO.Text) + '_' +
      Trim(dm.cds_TCMEXERCICIO.Text) + '_' +
      Trim(dm.cds_TCMUNIDADE_GESTORA.Text) + '_' +
      Copy(dm.cds_TCMDATA.Text, 1, 2) + '-' + Copy(dm.cds_TCMDATA.Text, 4, 2) + '-' +
      Copy(dm.cds_TCMDATA.Text, 7, 4) + '\';
      //Se o diretório não existe força a criação
      if not DirectoryExists(Dir) then ForceDirectories(Dir);
      frmDigitalizaTCM.dbiImagem.AutoDisplay := False;
      try
        frmDigitalizaTCM.MSG.Visible := True;
        Screen.Cursor := crSqlWait;
        DM.cds_TCM_A.DisableControls;
        Application.ProcessMessages;
        repeat
          DM.cds_TCM_A.Insert;
          //dbiImagem.LoadFromFile('C:\G2DOC\G2Imagem\'+Arq.Name);
          TBlobField(DM.cds_TCM_A.FieldByName('Imagem')).LoadFromFile('C:\G2DOC\G2Imagem\' + Arq.Name);
            //Incrementa número da página
          Inc(Pag);
          DM.cds_TCM_ACOD_MUN.Text := DM.cds_TCMCOD_MUN.Text;
            //Grava Número da página
          DM.cds_TCM_APAGINA.Text := IntToStr(Pag);
            //Grava nome do arquivo
          //DM.cds_TCM_ANOME_ARQUIVO.Text := frmDigitalizaTCM.Label13.Caption + IntToStr(Pag) + '.jpg';
          DM.cds_TCM_ANOME_ARQUIVO.Text := Arq.Name;
            //Grava Caminho do Arquivo
          DM.cds_TCM_ACAMINHO.Text := Dir;
            //Grava sigla do documento
          DM.cds_TCM_ASIGLA_DOCUMENTO.Text := DM.cds_TCMSIGLA_DOCUMENTO.Text;
            //Grava Codigo entidade
          DM.cds_TCM_ACODIGO_ENTIDADE.Text := DM.cds_TCMCODIGO_ENTIDADE.Text;
            //Grava Cod. Unid. Administrativa
          DM.cds_TCM_ACOD_UNID_ADMINISTRATIVA.Text := DM.cds_TCMCOD_UNID_ADMINISTRATIVA.Text;
            //Grava Exercicio
          DM.cds_TCM_AEXERCICIO.Text := DM.cds_TCMEXERCICIO.Text;
            //Grava Unidade Gestora
          DM.cds_TCM_AUNIDADE_GESTORA.Text := DM.cds_TCMUNIDADE_GESTORA.Text;
            //Grava Nome Documento
          DM.cds_TCM_ANOME_DOCUMENTO.Text := DM.cds_TCMNOME_DOCUMENTO.Text;
            //Grava Periodo de Emissao
          DM.cds_TCM_APERIODO_EMISSAO.Text := DM.cds_TCMPERIODO_EMISSAO.Text;
            //Grava Data da emissao
          DM.cds_TCM_ADATA.Text := DM.cds_TCMDATA.Text;
            //Informa se arquivo foi digitalizado
          DM.cds_TCM_ADIGITAL.Text := '1';
            //Informa o anexo do demonstrativo
          DM.cds_TCM_AANEXOS.Text := frmDigitalizaTCM.DBText5.Caption;
          DM.cds_TCM_A.Post;
        until FindNext(Arq) <> 0;
        FindClose(Arq);
      finally
        DM.cds_TCM_A.ApplyUpdates(0);
        DeletaDir('C:\G2DOC\G2Imagem');
        Pag := 0;
        frmDigitalizaTCM.MSG.Visible := False;
        Screen.Cursor := crDefault;
        DM.cds_TCM_A.EnableControls;
        frmDigitalizaTCM.dbiImagem.AutoDisplay := True;
      end;
      DeletaDir('C:\G2DOC\G2Imagem');
      frmTCM_Importa.Close;
      DM.cds_TCM_A.First;
      //FIM DO BLOCO DE IMPORTAÇÃO DAS IMAGENS
  end;
    findClose(Arq );
  finally
    ListFiles.Clear;
    ListFiles.free;
  end;
end;

Ralp Bezerra

Ralp Bezerra

Curtidas 0

Respostas

Daniel Qualhato

Daniel Qualhato

08/04/2011

Olá amigo.

     bom é o seguinte antes eu tinha um sistema que armazenava as fotos todas no banco de dados(Firebird) mais logo pude perceber que ao salvar uma imagem dependendo do tamanho da mesma demorava muito para posta.
     então passei a salvar todas dentro de uma pasta img no diretorio do exe. que ficou bem melhor e não pesa o banco de dados.

      mais caso vc queira tentar posso te passar o codigo para esse tipo de finalidade

      não sei se vc conhece os conponentes rxlib na paleta rxdbaware use o componente rememorydata
      para usar como uma tabela temporaria e um OpenDialog1 e use o codigo abaixo.



           if OpenDialog1.Execute Then
              begin
                  bitBtn3.Enabled:=true;
                  BitBtn2.Enabled:=true;
                  Origem := ExtractFilePath(OpenDialog1.FileName);
                  destino:=(ExtractFilePath(Application.ExeName)+'slides\');
                  begin
                      for I := 0 to OpenDialog1.Files.Count - 1 do
                          begin
                              tbl_temporaria.Insert;
                              tbl_temporariaNomeMusica.Value := (ExtractFileName(OpenDialog1.Files.Strings[i]));
                              tbl_temporariaLocalMusica.Value:=origem;
                              tbl_temporaria.Post;
                          end;
                  end;
              end

depois é só vc salvar no banco de dados

        while not(tbl_temporaria.Eof) do
        begin
            dmdados.tbl_musica.Insert;
            DMdados.tbl_musicaCOD_MUSICA.Value:=Maximo('COD_MUSICA','TBL_MUSICA');
            dmdados.tbl_musicaNome_Musica.Value := ToUpper(tbl_temporariaNomeMusica.Value);
            dmdados.tbl_musica.Post;
            tbl_temporaria.Next;
        end;
GOSTEI 0
Ralp Bezerra

Ralp Bezerra

08/04/2011

Pois é caro Daniel, no meu caso, eu tenho realmente que salvar em banco devido ao teor dos documentos. São documentos públicos e não podem ficar gravados em pastas nos micro.

Eu realmente preciso pegar esta imagens na mesma ordem em que se encontram nas pastas e salva-las no banco.

Tem idéia de como posso faze-lo?

Abraço.
GOSTEI 0
Daniel Qualhato

Daniel Qualhato

08/04/2011

Ralp tenta com o codigo que eu postei acima. provavelmente vai te ajudar
ele irá fazer justamente o que  vc quer. primeiro ele salva em uma tabela virtual depois é só salvar no seu banco de dados. a não ser que eu entendi errado
GOSTEI 0
Ralp Bezerra

Ralp Bezerra

08/04/2011

Ralp tenta com o codigo que eu postei acima. provavelmente vai te ajudar
ele irá fazer justamente o que  vc quer. primeiro ele salva em uma tabela virtual depois é só salvar no seu banco de dados. a não ser que eu entendi errado


Pelo que entendi em seu código, ele só grava o caminho da imagem. Ou não?

Abraço.
GOSTEI 0
Daniel Qualhato

Daniel Qualhato

08/04/2011

 sim é isso mesmo esse procedimento é só para te dar uma ideia de como faz. para não ser preciso ficar gravando imagem por imagem. ex: se na sua pasta tiver 500 imagens esse código vai ficar no laço até gravar todas as imagens. claro que você deve alterar o codigo dentro do laço de repetição o codigo de salvar a imagen no banco, assim:
 

procedure TfrmConfig.ProcurarFoto1Click(Sender: TObject);
var
strArquivo: String;
imagem: TPicture;
begin
//Não esquecer de declarar na seção uses: Clipbrd, Jpeg
if (OpenPictureDialog1.Execute) then
begin
strArquivo := OpenPictureDialog1.FileName;
//Cria a variável para armazenar a imagem
imagem := TPicture.Create();
//Busca a imagem no arquivo e joga na variável
imagem.LoadFromFile(strArquivo);
//Passa imagem para o clipboard
clipboard.Assign(imagem);
//Copia a imagem para o DBImage
DBImage1.PasteFromClipboard;
//Libera a variável
imagem.Free;
end;
end;
GOSTEI 0
Ralp Bezerra

Ralp Bezerra

08/04/2011

Bom dia a todos e desculpem a demora em responder, estive com dengue e fiquei uns dias off-line.

Consegui está função com o nobre colega José Claúdio na lista delphi-br.

Porém, estou com a dúvida de como carregar a imagem da Stringlist para o meu banco de dados.

procedure TfrmTCM_Importa.AdvGlassButton2Click(Sender: TObject);
var
  Arq: TsearchRec;
  Dir,Dir2: string;
  lst:TStringList;
  i:Integer;
begin
  lst := TStringList.Create;
  try
    //pesquisar os arquivos e incluir no stringlist.
    //aqui usei uma função minha, mas pode ser esta que vc já tem para incluir os arquivos.
    PesqArqs(Dir2, '*.jpg', lst, True);
    //depois que tiver no stringlist com todos os arquivos que deseja processar,
    //inclua a data e hora antes do nome do arquivo e use um caracter para
    //separar, aqui usei o pipe = |
    for i := 0 to lst.Count - 1 do
    lst[i] := FormatDateTime('yyymmdd-hhnnss|', FileDate(lst[i])) + lst[i];
    lst.Sorted := True;
    //desligue a ordenação, isso fixa a ordem atual do stringlist
    lst.Sorted := False;
    //agora retire a parte onde está a data, assim vc terá somente os nomes dos arquivos
    for i := 0 to lst.Count - 1 do lst[i] := Copy(lst[i], Pos('|', lst[i]) + 1, 999);
    //processe os arquivos aqui...

    //INICIO DO BLOCO DE IMPORTAÇÃO DAS IMAGENS
    //Criar pasta de armazenamento de arquivos TCM
    Dir := 'C:\G2DOC\TCM\' + Trim(dm.cds_TCMCODIGO_ENTIDADE.Text) + '_' +
    Trim(dm.cds_TCMCOD_UNID_ADMINISTRATIVA.Text) + '_' +
    Trim(dm.cds_TCMSIGLA_DOCUMENTO.Text) + '_' +
    Trim(dm.cds_TCMEXERCICIO.Text) + '_' +
    Trim(dm.cds_TCMUNIDADE_GESTORA.Text) + '_' +
    Copy(dm.cds_TCMDATA.Text, 1, 2) + '-' + Copy(dm.cds_TCMDATA.Text, 4, 2) + '-' +
    Copy(dm.cds_TCMDATA.Text, 7, 4) + '\';
    //Se o diretório não existe força a criação
    if not DirectoryExists(Dir) then ForceDirectories(Dir);
    frmDigitalizaTCM.dbiImagem.AutoDisplay := False;
    try
      frmDigitalizaTCM.MSG.Visible := True;
      Screen.Cursor := crSqlWait;
      DM.cds_TCM_A.DisableControls;
      Application.ProcessMessages;
      repeat
        DM.cds_TCM_A.Insert;
        /////// Aqui tenho que carregar as imagens da Stringlist para o banco firebird
        TBlobField(DM.cds_TCM_A.FieldByName('Imagem')).LoadFromFile('C:\G2DOC\G2Imagem\' + Arq.Name);
        //////         Inc(Pag);         DM.cds_TCM_ACOD_MUN.Text := DM.cds_TCMCOD_MUN.Text;         DM.cds_TCM_APAGINA.Text := IntToStr(Pag);         DM.cds_TCM_ANOME_ARQUIVO.Text := Arq.Name;         DM.cds_TCM_ACAMINHO.Text := Dir;         DM.cds_TCM_ASIGLA_DOCUMENTO.Text := DM.cds_TCMSIGLA_DOCUMENTO.Text;         DM.cds_TCM_ACODIGO_ENTIDADE.Text := DM.cds_TCMCODIGO_ENTIDADE.Text;         DM.cds_TCM_ACOD_UNID_ADMINISTRATIVA.Text := DM.cds_TCMCOD_UNID_ADMINISTRATIVA.Text;         DM.cds_TCM_AEXERCICIO.Text := DM.cds_TCMEXERCICIO.Text;         DM.cds_TCM_AUNIDADE_GESTORA.Text := DM.cds_TCMUNIDADE_GESTORA.Text;         DM.cds_TCM_ANOME_DOCUMENTO.Text := DM.cds_TCMNOME_DOCUMENTO.Text;         DM.cds_TCM_APERIODO_EMISSAO.Text := DM.cds_TCMPERIODO_EMISSAO.Text;         DM.cds_TCM_ADATA.Text := DM.cds_TCMDATA.Text;         DM.cds_TCM_ADIGITAL.Text := '1';         DM.cds_TCM_AANEXOS.Text := frmDigitalizaTCM.DBText5.Caption;         DM.cds_TCM_A.Post;       until FindNext(Arq) <> 0;       FindClose(Arq);     finally       DM.cds_TCM_A.ApplyUpdates(0);       DeletaDir('C:\G2DOC\G2Imagem');       Pag := 0;       frmDigitalizaTCM.MSG.Visible := False;       Screen.Cursor := crDefault;       DM.cds_TCM_A.EnableControls;       frmDigitalizaTCM.dbiImagem.AutoDisplay := True;     end;     DeletaDir('C:\G2DOC\G2Imagem');     frmTCM_Importa.Close;     DM.cds_TCM_A.First;     //FIM DO BLOCO DE IMPORTAÇÃO DAS IMAGENS   finally     lst.Free;   end; end;


Como devo proceder utilizando está função?

Abraço.
GOSTEI 0
Ralp Bezerra

Ralp Bezerra

08/04/2011

Alterei o código como conforme dica do nobre colega José Cláudio da lista delphi-br, porém, está dando o erro de memória insuficiente (insuficiente memory for this operation)  Implementação da dica:  
procedure
TfrmTCM_Importa.AdvGlassButton2Click(Sender: TObject);

var

  Arq: TsearchRec;

  Dir,Dir2: string;

  lst:TStringList;

  i:Integer;

begin

  lst := TStringList.Create;

  try

    PesqArqs(Dir2,
'*.jpg', lst, True);

    for i := 0 to
lst.Count - 1 do

    lst[i] :=
FormatDateTime('yyymmdd-hhnnss|', FileDate(lst[i])) + lst[i];

    lst.Sorted
:= True;

    lst.Sorted := False;

    for i := 0 to
lst.Count - 1 do lst[i] := Copy(lst[i], Pos('|', lst[i]) + 1, 999);

    //INICIO DO BLOCO DE IMPORTAÇÃO DAS IMAGENS

    Dir := 'C:\G2DOC\TCM\' +
Trim(dm.cds_TCMCODIGO_ENTIDADE.Text) + '_' +

    Trim(dm.cds_TCMCOD_UNID_ADMINISTRATIVA.Text)
+ '_' +

    Trim(dm.cds_TCMSIGLA_DOCUMENTO.Text) + '_' +

    Trim(dm.cds_TCMEXERCICIO.Text) + '_' +

    Trim(dm.cds_TCMUNIDADE_GESTORA.Text) + '_' +

    Copy(dm.cds_TCMDATA.Text, 1, 2) + '-' +
Copy(dm.cds_TCMDATA.Text, 4, 2) + '-' +

    Copy(dm.cds_TCMDATA.Text,
7, 4) + '\';

    if not
DirectoryExists(Dir) then ForceDirectories(Dir);

   
frmDigitalizaTCM.dbiImagem.AutoDisplay := False;

    try

     
frmDigitalizaTCM.MSG.Visible := True;

     
Screen.Cursor := crSqlWait;

     
DM.cds_TCM_A.DisableControls;

     
Application.ProcessMessages;

      for i:=0
to lst.count-1 do

      begin

       
DM.cds_TCM_A.Insert;

       
//TBlobField(DM.cds_TCM_A.FieldByName('Imagem')).LoadFromFile('C:\G2DOC\G2Imagem\'
+ Arq.Name);

       
TBlobField(DM.cds_TCM_A.FieldByName('Imagem')).LoadFromFile(lst[i]);

       
Inc(Pag);

       
DM.cds_TCM_ACOD_MUN.Text := DM.cds_TCMCOD_MUN.Text;

       
DM.cds_TCM_APAGINA.Text := IntToStr(Pag);

       
DM.cds_TCM_ANOME_ARQUIVO.Text := Arq.Name;

       
DM.cds_TCM_ACAMINHO.Text := Dir;

       
DM.cds_TCM_ASIGLA_DOCUMENTO.Text := DM.cds_TCMSIGLA_DOCUMENTO.Text;

       
DM.cds_TCM_ACODIGO_ENTIDADE.Text := DM.cds_TCMCODIGO_ENTIDADE.Text;

        DM.cds_TCM_ACOD_UNID_ADMINISTRATIVA.Text
:= DM.cds_TCMCOD_UNID_ADMINISTRATIVA.Text;

       
DM.cds_TCM_AEXERCICIO.Text := DM.cds_TCMEXERCICIO.Text;

       
DM.cds_TCM_AUNIDADE_GESTORA.Text :=
DM.cds_TCMUNIDADE_GESTORA.Text;

       
DM.cds_TCM_ANOME_DOCUMENTO.Text := DM.cds_TCMNOME_DOCUMENTO.Text;

       
DM.cds_TCM_APERIODO_EMISSAO.Text := DM.cds_TCMPERIODO_EMISSAO.Text;

        DM.cds_TCM_ADATA.Text
:= DM.cds_TCMDATA.Text;

       
DM.cds_TCM_ADIGITAL.Text := '1';

       
DM.cds_TCM_AANEXOS.Text := frmDigitalizaTCM.DBText5.Caption;

        DM.cds_TCM_A.Post;

      end;

    finally

     
DM.cds_TCM_A.ApplyUpdates(0);

      DeletaDir('C:\G2DOC\G2Imagem');

      Pag := 0;

      frmDigitalizaTCM.MSG.Visible :=
False;

      Screen.Cursor := crDefault;

      DM.cds_TCM_A.EnableControls;

      frmDigitalizaTCM.dbiImagem.AutoDisplay := True;

    end;

    DeletaDir('C:\G2DOC\G2Imagem');

    frmTCM_Importa.Close;

    DM.cds_TCM_A.First;

    //FIM
DO BLOCO DE IMPORTAÇÃO DAS IMAGENS

  finally

    lst.Free;

  end;

end;
Algum dos nobres colegas poderiam me dar uma ajuda de como resolver isso?Será que existe alguma outra forma de recuperar esses arquivos de imagem de outra maneira ou com a utilização de algum componente?
Abraço.
GOSTEI 0
POSTAR