ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Quando trocado a Imagem no TImage ao reiniciar ela não salva

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
x7r3m3x
Aprendiz
Aprendiz


Registrado: Sexta-Feira, 7 de Fevereiro de 2014
Mensagens: 192

MensagemEnviada: Sáb Abr 25, 2015 10:14 am    Assunto: Quando trocado a Imagem no TImage ao reiniciar ela não salva Responder com Citação

Olá Pessoal,

Eu fiz um código onde o usuário pode puxar a imagem desejada para trocar no TImage.

Consegui já copiar e colar. Porém o que eu queria era salvar a imagem que o usuário substituiu no TImage que é o que eu não estou conseguindo.

Eu substituo a imagem no TImage com o código abaixo, no qual é trocado a imagem do TImage, porém ainda não salva.
Código:
imgEmpresa.Picture.LoadFromFile(Diretorio);


Então utilizo o código abaixo para salvar, porém não salva. Pois quando eu fecho o sistema e abro ele denovo volta a imagem antiga e não a nova.
Código:
imgEmpresa.Picture.SaveToFile(Diretorio);


Código Completo:
Código:

procedure TF_FormCaixa.imgEmpresaDblClick(Sender: TObject);
VAR
  Origem, Destino : array[0..512] of char;
  Diretorio : String;
begin
  opdCaixa.Title := 'Abrir Figura';

  if opdCaixa.Execute then
  Begin
    Diretorio := 'C:\CMS\IMAGEM\PLANO DE FUNDO CAIXA\' + ExtractFileName(opdCaixa.FileName);
    //Verifica se o arquivo selecionado pelo OpenDialog1 já existe no diretório de destino
    if FileExists(Diretorio) then
    begin
      if MessageDlg('O arquivo ' + ExtractFileName(opdCaixa.FileName) + ' já existe no destino. Deseja sobrescrevê-lo?', mtInformation, [mbYes, mbNo], 0) = mrYes then
      begin
        //Apaga o arquivo no diretório de destino
          //e depois salva o arquivo selecionado
        DeleteFile(Diretorio);
          StrPCopy(Origem, opdCaixa.FileName);
          StrPCopy(Destino, Diretorio);
          CopyFile(Origem, Destino, True);
      end;
    end
    else
    begin
      //Se não existir a imagem somente copia ela.
      StrPCopy(Origem, opdCaixa.FileName);
        StrPCopy(Destino, Diretorio);
        CopyFile(Origem, Destino, True);
    end;
   
    //Carrega a imagem no TImage
    imgEmpresa.Picture.LoadFromFile(Diretorio);
    //Era para salvar mais não salva
    imgEmpresa.Picture.SaveToFile(Diretorio);

     Application.MessageBox('Imagem cadastrada com sucesso!', 'Operação', MB_OK+MB_ICONINFORMATION);
  end;
end;


Desde já agradecido!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
iDnl
Aprendiz
Aprendiz


Registrado: Domingo, 9 de Junho de 2013
Mensagens: 173

MensagemEnviada: Sáb Abr 25, 2015 3:02 pm    Assunto: Responder com Citação

Coloque no OnCreate:

uses IniFiles;

var Ini:TIniFile;
diretorio:string;
begin
Ini:=TIniFile.Create(ChangeFileExt(Application.FileName, '.ini'));
diretorio:=Ini.ReadString('Imagem', 'FileName', 'C:\ImagemPadrao.jpg');
Image1.picture.LoadFromFile(diretorio);
ini.Free;
end;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
mobius1qwe
Aprendiz
Aprendiz


Registrado: Quarta-Feira, 8 de Dezembro de 2010
Mensagens: 146

MensagemEnviada: Seg Abr 27, 2015 4:46 pm    Assunto: Responder com Citação

extremex, como no seu caso você vai manipular versões de um mesmo arquivo, aconselho usar o TMemoryStream pra fazer essas manipulações.

Você carrega a imagem em um MemoryStream, faz as manipulações nele, depois que tiver concluído o processo, despeja o conteúdo desse MemoryStream no diretório transformando em arquivo.

Exemplo:
Código:
var
  imgStream : TMemoryStream;
begin
  imgStream := TMemoryStream.Create;
  Image1.Picture.LoadFromFile(FileDialog1.FileName); //mostra a imagem pro usuário
  Image1.Picture.SaveToStream(imgStream); //guarda a imagem na memória
  // código blablablabla
  imgStream.SaveToFile('C:\temp\imagem\img.png');
  FreeAndNil(imgStream);
end;


Não garanto que um copiar e colar resolva seu caso, mas após uns ajustes creio que esse exemplo resolva seu problema. Ah ele faz sobrescrita sem precisar deletar o arquivo original caso tenha o mesmo nome.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
x7r3m3x
Aprendiz
Aprendiz


Registrado: Sexta-Feira, 7 de Fevereiro de 2014
Mensagens: 192

MensagemEnviada: Ter Abr 28, 2015 2:23 pm    Assunto: Responder com Citação

iDnl escreveu:
Coloque no OnCreate:

uses IniFiles;

var Ini:TIniFile;
diretorio:string;
begin
Ini:=TIniFile.Create(ChangeFileExt(Application.FileName, '.ini'));
diretorio:=Ini.ReadString('Imagem', 'FileName', 'C:\ImagemPadrao.jpg');
Image1.picture.LoadFromFile(diretorio);
ini.Free;
end;


iDnl, obrigado pela ajuda. Porém eu acho que o .ini não sei se iria solucionar meu caso. Se não me engano o que você está fazendo é que toda vez que criar o formulário ele puxa o caminho da imagem modificada anteriormente e recarrega ela novamente para sempre aparecer ela. Mas desse jeito não irá ficar salvo a imagem no TImage, só irá modificar toda vez que criar o formulário. E no caso se forem muitas imagens isso pode ser um problema já que teriam que ter vários loadfromfile. Desculpe se não entendi corretamente.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
iDnl
Aprendiz
Aprendiz


Registrado: Domingo, 9 de Junho de 2013
Mensagens: 173

MensagemEnviada: Ter Abr 28, 2015 2:29 pm    Assunto: Responder com Citação

Na forma que estou dizendo, quando o usuário trocar a imagem, você vai salvar em um arquivo ini a localização da imagem, e quando abrir você vai localizar a imagem no arquivo ini e carregá-la no componente...
Eu faria dessa forma, mas também pode ser salvo no registro do windows, em vez do arquivo INI...

Você tbm pode tentar copiar a imagem para a pasta do seu executável e colocar no OnCreate image1.picture.loadfromfile('img.png');
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
x7r3m3x
Aprendiz
Aprendiz


Registrado: Sexta-Feira, 7 de Fevereiro de 2014
Mensagens: 192

MensagemEnviada: Ter Abr 28, 2015 2:45 pm    Assunto: Responder com Citação

mobius1qwe escreveu:
extremex, como no seu caso você vai manipular versões de um mesmo arquivo, aconselho usar o TMemoryStream pra fazer essas manipulações.

Você carrega a imagem em um MemoryStream, faz as manipulações nele, depois que tiver concluído o processo, despeja o conteúdo desse MemoryStream no diretório transformando em arquivo.

Exemplo:
Código:
var
  imgStream : TMemoryStream;
begin
  imgStream := TMemoryStream.Create;
  Image1.Picture.LoadFromFile(FileDialog1.FileName); //mostra a imagem pro usuário
  Image1.Picture.SaveToStream(imgStream); //guarda a imagem na memória
  // código blablablabla
  imgStream.SaveToFile('C:\temp\imagem\img.png');
  FreeAndNil(imgStream);
end;


Não garanto que um copiar e colar resolva seu caso, mas após uns ajustes creio que esse exemplo resolva seu problema. Ah ele faz sobrescrita sem precisar deletar o arquivo original caso tenha o mesmo nome.


Mobius, eu sinceramente não sei direito como funciona o TMemoryStream nunca utilizei antes.
Pelo que eu entendi o arquivo modificado pelo usuário a imagem fica salvo na memoria no qual eu poderia fazer um loadfromfile no OnCreate que ele iria carregar a imagem modificada.
Mas desse jeito após liberar a memoria essa imagem não iria sumir?
E também desse modo não teria que carregar (loadfromfile) sempre no OnCreate para sempre repor a imagem no TImage?
Desculpe se eu não entendi direito.
Porque o que eu gostaria é que quando o usuário substituísse a imagem ela já ficaria salva no TImage, do mesmo modo quando você modifica a imagem direto na propriedade picture do TImage, ela modifica e fica lá.
Porque vamos dizer que são muitas imagens, dai ter que dar loadfromfile de todas seria muito complicado.
No momento o modo como estou fazendo é assim não é o que eu quero mas como ainda não encontrei uma solução:

1º Criei uma pasta no meu projeto chamada IMAGEM
2º Dentro da Pasta IMAGEM criei uma pasta com o respectivo lugar da imagem como PLANO DE FUNDO CAIXA
3º Toda vez que o usuário modifica uma imagem ele pega copia e cola esse arquivo e salva com o nome CAIXA.jpg dentro da pasta designada.
4º E dai eu coloquei no OnShow mesmo um loadfromfile que carrega toda vez essa imagem. Modificando a que sempre aparece (antiga que foi posta pelo picture no TImage) para a que foi modificada (nova), sempre puxando o mesmo caminho toda vez.

Para uma imagem isso até que não é um problema mais e se fosse 50 imagens. Seria muito complicado. Por exemplo colocar imagens dos produtos, se não salvar a imagem e ter que ficar puxando o caminho toda vez, seria muito complicado puxar 50 caminhos de imagem toda vez, sem falar se tivesse um novo produto cadastrado.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
x7r3m3x
Aprendiz
Aprendiz


Registrado: Sexta-Feira, 7 de Fevereiro de 2014
Mensagens: 192

MensagemEnviada: Ter Abr 28, 2015 2:55 pm    Assunto: Responder com Citação

iDnl escreveu:
Na forma que estou dizendo, quando o usuário trocar a imagem, você vai salvar em um arquivo ini a localização da imagem, e quando abrir você vai localizar a imagem no arquivo ini e carregá-la no componente...
Eu faria dessa forma, mas também pode ser salvo no registro do windows, em vez do arquivo INI...

Você tbm pode tentar copiar a imagem para a pasta do seu executável e colocar no OnCreate image1.picture.loadfromfile('img.png');


iDnl, então eu estou fazendo algo parecido no momento porém não utilizo ini, exemplo:
1º Criei uma pasta no meu projeto chamada IMAGEM
2º Dentro da Pasta IMAGEM criei uma pasta com o respectivo lugar da imagem como PLANO DE FUNDO CAIXA
3º Toda vez que o usuário modifica uma imagem ele pega copia e cola esse arquivo e salva com o nome CAIXA.jpg dentro da pasta designada.
4º E dai eu coloquei no OnShow mesmo um loadfromfile que carrega toda vez essa imagem. Modificando a que sempre aparece (antiga que foi posta pelo picture no TImage) para a que foi modificada (nova), sempre puxando o mesmo caminho toda vez.

Porém como eu disse ao nosso amigo Mobius, se for somente com uma imagem funciona perfeitamente, porém isso seria um problema se fosse com 50 imagens. Porque colocar um loadfromfile para 50 imagens seria muito trabalhoso. E vamos dizer que cadastrasse um novo produto e colocassem a imagem desse novo produto como que iria carregar a imagem desse produto toda vez se não existe um loadfromfile para ele.

Por isso eu queria muito que a imagem ficasse salvo como é feito pela propriedade picture do TImage, assim que você da um load carrega a imagem e da um OK ela já fica salva nem é necessário ficar recarregando a imagem com loadfromfile porque ela já fica salva no TImage.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
iDnl
Aprendiz
Aprendiz


Registrado: Domingo, 9 de Junho de 2013
Mensagens: 173

MensagemEnviada: Ter Abr 28, 2015 3:11 pm    Assunto: Responder com Citação

x7r3m3x escreveu:
iDnl escreveu:
Na forma que estou dizendo, quando o usuário trocar a imagem, você vai salvar em um arquivo ini a localização da imagem, e quando abrir você vai localizar a imagem no arquivo ini e carregá-la no componente...
Eu faria dessa forma, mas também pode ser salvo no registro do windows, em vez do arquivo INI...

Você tbm pode tentar copiar a imagem para a pasta do seu executável e colocar no OnCreate image1.picture.loadfromfile('img.png');


iDnl, então eu estou fazendo algo parecido no momento porém não utilizo ini, exemplo:
1º Criei uma pasta no meu projeto chamada IMAGEM
2º Dentro da Pasta IMAGEM criei uma pasta com o respectivo lugar da imagem como PLANO DE FUNDO CAIXA
3º Toda vez que o usuário modifica uma imagem ele pega copia e cola esse arquivo e salva com o nome CAIXA.jpg dentro da pasta designada.
4º E dai eu coloquei no OnShow mesmo um loadfromfile que carrega toda vez essa imagem. Modificando a que sempre aparece (antiga que foi posta pelo picture no TImage) para a que foi modificada (nova), sempre puxando o mesmo caminho toda vez.

Porém como eu disse ao nosso amigo Mobius, se for somente com uma imagem funciona perfeitamente, porém isso seria um problema se fosse com 50 imagens. Porque colocar um loadfromfile para 50 imagens seria muito trabalhoso. E vamos dizer que cadastrasse um novo produto e colocassem a imagem desse novo produto como que iria carregar a imagem desse produto toda vez se não existe um loadfromfile para ele.

Por isso eu queria muito que a imagem ficasse salvo como é feito pela propriedade picture do TImage, assim que você da um load carrega a imagem e da um OK ela já fica salva nem é necessário ficar recarregando a imagem com loadfromfile porque ela já fica salva no TImage.



Não sei se é possível assim, mas eu apostaria no ini ou no registro...

Você pode fazer uma tela de splash enquanto ele carrega, com um progressbar ou gauge...
Você poderia fazer um for com um ini
Código:
splash.progresso.max:=50;
for i:= 1 to 50 do
begin
  image1.picture.loadfromfile(ini.readstring('IMAGEM', 'Imagem'+IntToStr(i), ''));
  splash.progresso.value:=I;
end;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB