Fórum Findfirst Salvar imagem em banco na mesma ordem da pasta #398867
08/04/2011
0
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
Curtir tópico
+ 0Posts
09/04/2011
Daniel Qualhato
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
11/04/2011
Ralp Bezerra
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
11/04/2011
Daniel Qualhato
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
11/04/2011
Ralp Bezerra
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
11/04/2011
Daniel Qualhato
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
19/04/2011
Ralp Bezerra
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
25/04/2011
Ralp Bezerra
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;Abraço.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)