Como inserir imagens no sistema sem gravar no Banco de Dados

Delphi

28/09/2006

Olá pessoal!

Estou precisando saber se há possibilidades de inserir imagens no sistema feito no Delphi 7 mas sem gravar no Banco de Dados, evitando o carregamento de imagens no mesmo.

Estive vendo a algum tempo atrás sobre este assunto e possibilidade, onde teríamos que criar uma basta com as imagens junto com o projeto, e fazer através de código a ligação (caminho) entre o campo para receber a imagem com o arquivo de imagem, mas, não encontrei mais onde vi estas informações.

Se alguem puder passar esta dica, agradeceria imensamente!

Abraços a todos!


Tekmicro

Tekmicro

Curtidas 0

Respostas

Ramms

Ramms

28/09/2006

Simples amigo, informe o caminho da img no seu hd num campo varchar, awe é só buscar no dataset e lançar num component TImage


GOSTEI 0
Tekmicro

Tekmicro

28/09/2006

Obrigado amigo!

Mas, se não for pedir muito, teria como passar estes procedimentos, isto é, quais os passos que deve ser dados para obter com sucesso esta opção?

Exemplo:

Tenho a tabela Clientes, nesta tabela devo criar um novo campo tipo varchar relacionado com a imagem, porque já existe atualmente um campo tipo Blob criado. Devo deletar este campo e criar o outro?

É justamente nestes detalhes que gostaria se possível passar os procedimentos até chegar no caminho para localizar a imagem, e um outro detalhe, ao salvar os dados cadastrados no formulário Clientes, a imagem não estará salva, correto, porque ela encontra-se numa pasta junto do diretório do sistema ou do BD, apenas quando acessar este formulário é que a imagem seria licalizada em tempo de execução e mostrada?

Como seria o processo?

Agradeço imensamente pela atenção e gentileza!


GOSTEI 0
Paullsoftware

Paullsoftware

28/09/2006

aqui vai os passo básicos que fiz, estou preparando um artigo e vou postar aqui no fórum em breve...

para que o exemplo funcione e necessario ter um campo na tabela que vai armazenar o endereço do arquivo de imagem.

crie a procedure abaixo:
Procedure CopiaFoto(Origem, Destino: string;Barra:TGauge);
var
  FromF,ToF: file of byte;
  Buffer: array[0..4096] of char;
  NumRead: Integer;
  FileLength: LongInt;
  NewPath: string;
begin
  // Antes de copiar, verifica se já existe o diretório
  // Caso o diretório não exista, o mesmo vai ser criado
  NewPath := ExtractFilePath(Destino);
  if not DirectoryExists(NewPath) then
  begin
    CreateDir(NewPath);
  end;
  // Copia o arquivo
  // Abre o arquivo de origem e cria o arquivo destino
  AssignFile(FromF, Origem);
  Reset(FromF);
  AssignFile(ToF, Destino);
  ReWrite(ToF);
  FileLength := FileSize(FromF);
  with Barra do
  begin
    Progress := 0;
    MinValue := 0;
    MaxValue := FileLength;
    while FileLength > 0 do
    begin
      BlockRead(FromF, Buffer[0], SizeOf(Buffer), NumRead);
      FileLength := FileLength - NumRead;
      BlockWrite(ToF, Buffer[0], NumRead);
      AddProgress(NumRead);
    end;
    CloseFile(FromF);
    CloseFile(ToF);
  end;
end; (* CopiaFoto *)


agora no formulario de cadastro coloque um botão e TImage, dê um duplo click no botão e insira o código abaixo:

procedure TFrmCadClientes.btnAbrirFotoClick(Sender: TObject);
var
 PathBmp : string;
begin
PathBmp := ExtractFileDir(ParamStr(0))+´\fotos\´;
if dsClientes.DataSet.Active then
if not dsClientes.DataSet.IsEmpty then
//Requer ExtDlgs na uses
with TOpenPictureDialog.Create(Self) do
  begin
     Filter := ´Arquivos de Imagem|*.bmp;*.jpg;´;
     InitialDir := ExtractFilePath(ParamStr(0));
     DefaultExt := ´.jpg´;
     Title      := ´CroLan - Localizar Foto´;
     if Execute then
     if FileName <> ´´ then
     if FileExists(FileName) then
       begin
         PathBmp := PathBmp+ExtractFileName(FileName);
         Gauge1.Visible := True;
         //Executa a procedure CopiaFoto(Origen, Destino, Barra);
         CopiaFoto(pChar(FileName),pChar(PathBmp),Gauge1);
         Gauge1.Visible := False;
         dsClientes.DataSet.Edit;
         dsClientes.DataSet.FieldByName(´FOTO´).AsString := PathBmp;
         Image1.Picture.LoadFromFile(PathBmp);
         Image1.Visible := True;
       end;
  end;
end;(* BtnAbrirFoto *)

Para que a imagem seja atualizada ao navegar pelos registros faça:
procedure TFrmCadClientes.dsClientesDataChange(Sender: TObject; Field: TField);
var
FileName : string;
begin
  FileName := dsClientes.DataSet.FieldByName(´FOTO´).AsString;
  if FileExists(FileName) then
   begin
    Image1.Visible := True;
    Image1.Picture.LoadFromFile(FileName);
   end
  else
    Image1.Visible := False;
end;


espero ter ajudado...

nos próximos dias estarei publicando um artigo sobre esse recurso para ajudar a galera! :wink:


GOSTEI 0
Tekmicro

Tekmicro

28/09/2006

Caro colega, agradeço imensamente pela colaboração e atenção.

Com certeza a sua publicação será de grande utilidade para todos que buscam obter da melhor maneira possivel, informações para facilitar seus trabalhos.

Infelizmente ainda falta muita coisa para auxiliar-nos no dia-a-dia. Vou sitar um exemplo:

A elaboração de um Frente de Caixa com a inclusão ECF, TEF etc. utilizando BD local que poderia ser por arquivo .tx etc. São coisas que necessitamos imensamente e não encontramos em nenhum lugar.

O que ocorre é de muitas repetições sobre um determinado assunto. Se um comenta sobre IntraWeb, todos os lugares postam a mesma coisa, esquecendo que existem outros fatores predominantes e que faz muita falta ter um material de apoio como tutoriais etc.

A sua iniciativa em aprofundar este assunto é muito importante, e não deixe apenas permanecer neste tópico, explore outros como por exemplo o sitado acima, e a comunidade delphiana agradece.

Um grande abraço.


GOSTEI 0
Mazzi

Mazzi

28/09/2006

se ainda nao conseguiu, me dá um toque pois eu tenho uns exemplos prontos,

cvlw

abraços ++


GOSTEI 0
Paullsoftware

Paullsoftware

28/09/2006

se ainda nao conseguiu, me dá um toque pois eu tenho uns exemplos prontos, cvlw abraços ++


você bem que poderia publicar aqui pra ajudar a todos que tiveram a mesma dúvida que o [b:2f1a424fc1]tekmicro[/b:2f1a424fc1]... :wink:


GOSTEI 0
Mazzi

Mazzi

28/09/2006

Claro, que sim, vamos ajudar a comunidade...
Vou dar um exemplo aqui, pode parecer meio tosco, mais funciona muito bem nas minhas aplicações... vamos lá

1- Insira um componete TDBedit, ou qq um que prefira para usar como o caminho (path) da sua figura, ou foto... , e conecte-o devidamente com o DataSource da sua Tabela ...

Lembre-se de colocar no seu tipo de campo, um Varchar(x), sendo x bem grande pois, há clientes que costumam digitar, por ex: ´c:\Programa\Fotos\Mariana Juaquina Pereira da Silva Queiroz de Albuquerque Gomes.BMP´... ai judia.... neh?!!, então coloque um varchar com numero de caracteres razoavelmente bom....

2-Insira um OpenPicture (palheta Dialogs);

3-Insira um Botao, com um caption por ex: ´Buscar Figura´, ou algo parecido, e vc pode colocar uma ´lupinha´, parece bobeira mas, ´frescurinhas´ a parte, os usuarios memorizam mais fácil...

5-Insira, claro um TImage (pode ser da palheta Aditional)...

6- No botao que ´Buscar Figura´, que vc criou, insira o código:

[color=green:b5a25621d6]procedure TfrmCliente.btbuscaClick(Sender: TObject);
begin
OpenPicture.Execute;
dbfoto.Text:= OpenPicture.FileName;
Image.Picture.LoadFromFile(dbfoto.Text);
DesligaBotoes(Self);
end;[/color:b5a25621d6]

// Note o codigo, é somente para exemplo, vc deve entende-lo e adequar a sua necessidade, ok?:)


7-Para auxiliar, no tratamento de erros crie rotinas ou mais um botao de ´ATUALIZAR foto´, com o seguinte codigo:


[color=green:b5a25621d6]begin
if dbfoto.Text =´´ then
begin
Image.Picture.LoadFromFile(´c:\Fotos\SemFoto.bmp´[/color:b5a25621d6]);
exit;
end;
try
Image.Picture.LoadFromFile(dbfoto.Text);
except
Image.Picture.LoadFromFile([color=red:b5a25621d6]´c:\Fotos\SemFoto.bmp´[/color:b5a25621d6]);
exit;
end;
end;[/color]


**NOTE QUE EU CRIEI UM BITMAP, ´SEMFOTO.BMP´, que ficará Default do Image, assim se o sistema não encontrar um caminho válido, ele mostra uma figurinha que menciona ao usuario que não tem foto cadastrada**

E se vc for tratar um evento de ´Excluir Foto´, então é só usar:

[color=green:b5a25621d6]procedure TfrmCliente.btexcluiClick(Sender: TObject);
begin
dbFoto.Text:=´c:\Comercial\Fotos\SemFoto.bmp´;
Image.Picture.LoadFromFile(dbFoto.Text);
end;[/color:b5a25621d6]

**mais uma vez usando o Bitmap SemFoto.BMP**, isso deixa a aplicação ,mais transparente ao usuario;

Ai, todo o gerenciamento para o banco será somente o conteudo do TDBedit que vc inseriu, e só vai salvar o caminho o que é muito mais leve para o banco de dados; e assim vc pode ter muito mais fotos;

// Vale lembrar que se vc for salvar em outro computador na rede, use o caminho completo com o HOST, ex:
\\SERVIDOR\C\FOTOS\FOTO01.BMP


sacou?

qq coisa estamos ai...


GOSTEI 0
POSTAR