GARANTIR DESCONTO

Fórum Como criar pastas e mover arquivos(.jpeg) com o delphi? #385511

02/09/2010

0

Ola, gostaria de saber como mover arquivos de lugar e criar diretorios com o delphi. Para que?Eu estava fazendo meu programa com gravação das imagens em um banco de dados, mas estava ficando muito pesado e as imagens estavam dobrando de tamanho ou até mais no processo, o que estava gerando um alto lag no programa.O que quero tentar agora é o seguinte:Eu cadastro a casa de ID 243Apos salvar vou na opção de acrescentar imagem no imovelQuando adiciono a imagem caso não exista é criada a pasta "Fotos" e dentro dela a pasta "243"(Id da casa) e as imagens que eu for adicionando iram sendo copiadas para essa pasta, para exibir a imagem isarei o caminho "Fotos\"IDdaCasa"\foto1.jpeg".Concluindo para casa casa salva ja ser criada altomaticamente a pasta com com o ID da casa em "Fotos" e o programa armazena o caminho das fotos desse modo.
Bom, eu sei o que quero, mas não tenho a minima ideia de como fazer, alguem poderia me ajudar?
Artur Carlos

Artur Carlos

Responder

Posts

02/09/2010

Eriley Barbosa

Vamos criar uma função para criar o subdiretório, visto que a pasta fotos é fixa:function CriaSubDir(const NomeSubDir: string): boolean;
var
  Caminho: string;
begin
  Caminho := 'C:\Fotos' + NomeSubDir;//Substitua 'C:\Fotos' pelo caminho que a subpasta deve ser criada
  if DirectoryExists(Caminho) then
    Result := true
  else
    Result := CreateDir(Caminho);
end;Exemplo de uso: No evento onclick do botão de inserir fotos digite: if not CriaSubDir(SuaQuery.FieldByName('CODiMOVEL').AsString) then
    ShowMessage('Não foi possível criar o sub-diretório ' +   SuaQuery.FieldByName('CODiMOVEL').AsString);   Faça funcionar esta parte, que depois fazemos funcionar a cópia do arquivo para a pasta criada.
Responder

Gostei + 0

02/09/2010

Eriley Barbosa

Esqueça meu post acima acredito que o que você quer é o código abaixo, apenas adapte-o a sua necessidade: var
  Origem, Destino, caminho: string;
begin
  caminho := 'C:\Fotos\' + SuaQuery.FieldByName('CODIMOVEL').AsString;
  if  not DirectoryExists(caminho) then
    CreateDir(caminho);
  if OpenPictureDialog1.Execute then
  begin
    //Aqui pego o caminho inteiro inclusive com o nome do arquivo
    origem := OpenPictureDialog1.FileName;
    //Aqui pego somente o nome do arquivo com a extenção
    Delete(Origem, 1, Length(ExtractFilePath(OpenPictureDialog1.FileName)));
    Destino := caminho + '\' + origem;
    CopyFile(PChar(Origem), PChar(Destino), False);
  end;
end;
Responder

Gostei + 0

02/09/2010

Eriley Barbosa

Responder

Gostei + 0

02/09/2010

Artur Carlos

  Funcionou, so tive que fazer uma mudança, a parte em negrito. Aparentemente ele so consegue criar uma pasta, não estava sendo criada nenhuma pasta, depois que tentei azer ele colocar antes apenas a pasta 'Fotos' começou a funcionar. Vlwvar
Origem, Destino, caminho: string;
begin
 if not DirectoryExists('C:\Fotos') then
  CreateDir('C:Fotos');
caminho := 'C:\Fotos\' + DM.ADOQImoveis.FieldByName('ID').AsString;
if not DirectoryExists(caminho) then
CreateDir(caminho);
if OpenPictureDialog1.Execute then
begin
//Aqui pego o caminho inteiro inclusive com o nome do arquivo
origem := OpenPictureDialog1.FileName;
//Aqui pego somente o nome do arquivo com a extenção
Delete(Origem, 1, Length(ExtractFilePath(OpenPictureDialog1.FileName)));
Destino := caminho + '\' + origem;
CopyFile(PChar(Origem), PChar(Destino), False);
end;
end;

Outra duvida, pra mandar o caminho da imagem pro BD é so criar uma tabela com ID(auto), codImovel(integer) e Foto(Texto) e jogar o OpenPictureDialog1.FileName; pra dentro da Foto? O DBImage vai ler o caminho e mostrar a imagem normalmente?
PS: Li o seu artigo, achei muito legal, vou até implementar em um programa mais simples que to fazendo e tem 8 forms diferentes de cadastro, fazer um unico form com botões e usar para todos os formularios fica muito mais pratico.
Responder

Gostei + 0

02/09/2010

Artur Carlos

Consegui gravar o caminho no BD, mas os DBImage não exibem mais as fotos de determinado Imovel, creio que seja porque o DataSource e DataField não sirvam mais ja qeu apontam para um caminho e não uma imagem como faziam antes.Eu adicionei 5 fotos e ficaram aparecendo 5 DBImages em branco no DBCtrlGrid, detalhe é que esses campos aparecem para qualquer imovel que eu tente alterar.Alguem poderia me ajudar? Como faço para as fotos aparecerem nos DBImages do DBCtrlGrid quando clico em X Imovel no DBGrid?
Responder

Gostei + 0

02/09/2010

Eriley Barbosa

Você tem que gravar o conteúdo da variavel destino. Quanto aos campos da tabela está correto, mas tem que ter um relacionamento entre esta tabela e a de imóveis, como fizemos com o clientdataset(masterSource, masterfield). Não há mais como usar o dbctrlgrid e nem o dbimage e nem o dbnavigator. Você vai ter de usar um dbgrid e um image, no evento afterscroll desta nova tabela, testar se não está em modo de inserção ou edição, se não estiver mostra a foto no image, usando o LoadFromFile do openpicturedialog, lembra como fizemos para inserir e editar a foto. Ha vai ter de testar se a foto gravada é jpg ou bmp, para exibir no image. Outra coisa não deixe o usuario editar o dbgrid, ele deve excluir a foto, editar ou inserir por meio de botões. O dbgrid deve apenas mostrar o campo foto, os outros não precisa.   Mãos a obra, tente fazer tudo que mencionei acima.   Uma dica comente o código antigo, pois, podemos aproveita-lo quase que 100%, onde tem um dbimage apenas troque por um image. Onde tem o clientDataset apenas troque por seu componente que está ligado a nova tabela.   Qualquer coisa poste o código aqui, para que eu possa altera-lo.
Responder

Gostei + 0

02/09/2010

Artur Carlos

  Hum, acho que não entendi, pensei que o DBGrid iria substituir o DBCtrlGrid mas ele so mostra o caminho da imagem, como farei para exibir todas as imagens do imovel X em algum local pequeno como fazia antes com o DBCtrlGrid? Pra mostrar todas as imagens em tamanho grande não se faz necessario mas acho o DBCtrlGrid de grande ajuda pro cliente ter certesa de que imagens ja gravou até o momento. O relacionamento eu tinha feito pelo proprio access mas não parece ter funcionado.Ta dificil, se jogo a imagem na DB ela aumenta 10x de tamanho e torna o processo inviavel, se uso caminho perco o DBCtrlGrid que é uma mão na roda.
Responder

Gostei + 0

03/09/2010

Eriley Barbosa

Sim o dbgrid vai substituir o dbctrlgrid, ao usuario navegar pelo dbgrid evento afterscroll da tabela as imagens vão sendo mostradas, uma de cada vez no image. Você não terá apenas a opção de mostrar todas as imagens de uma vez só.
Responder

Gostei + 0

03/09/2010

Artur Carlos

Fiz um pouco diferente mas funcionou, no afterscroll tava dando erro ae mudei pra OncellClick do DBgrid e coloquei
EDBImage1.Picture.LoadFromFile(DM.cdsFotosImoveisFoto.AsString);
  Uma duvida, tem como tirar a parte C:\Fotos e deixar mostrando somente o nome da foto no DBGridw nem que eu presise criar outro campo pra mostrar so o nome da foto.Agora para montar o Slide Show com as imagens em tamanho grande presiso de uma ajuda, como posso fazer as imagens irem pra frente e pra tras sem o DBNAVIGATOR?
Responder

Gostei + 0

03/09/2010

Renan Gouvea

Tive um problema semelhante para controlar as imagens,não to com o codigo aqui agora, mas tente isso..
procedure TForm.DBCtrlGridPaintPanel(DBCtrlGrid: TDBCtrlGrid; Index: Integer);begin  //TImage dentro do DBCtrlGrid e no evento PaintPanel carregar a imagem gravada no banco  Image1.Picture.LoadFromFile(ClientDataSet.FieldByName('CampoComEndereçoImagem').AsString);end;
Responder

Gostei + 0

03/09/2010

Eriley Barbosa

No evento ongettext do campo que armazena o caminho da foto, digite: var
  i, posicao: Integer;
begin
  if not(sender.Isnull) then
  begin
    for i := 1 to Length(sender.asstring) do
    begin
      if (sender.asstring[i] in ['\']) then
        posicao := i;
    end;
    Text := Copy(Sender.Value, posicao + 1, Length(Sender.Value));
  end;
end;
Responder

Gostei + 0

03/09/2010

Eriley Barbosa

Tem que ser no afterscroll, eu disse para você testar: if not(cdsFotosimoveis in [dsEdit, dsInsert]) then   carrega a foto no image.   Fazendo isso até o dbnavigator funciona. Pois, o oncellclick só acontece se você for clicando com o mouse.   Pode tentar também no onclick do dbnavigator carregar a imagem.
Responder

Gostei + 0

03/09/2010

Eriley Barbosa

Tenta como o renan disse, também.
Responder

Gostei + 0

03/09/2010

Artur Carlos

@Renan funcionou, ta carregando todas as fotos no DBCtrlGrid mas quando vc clica em uma das fotos ela é sobreposta pela ultima foto gravada no registro, e como ja vem como se vc tivese clicado na primeira foto ela vem sempre errada mostrando a ultima imagem gravada em vez da primeira, se vc clica em outra foto ela muda pra ultima foto gravada e a anterir fica correta e assim por diante. Tem como alterar isso pra sempre mostrar a correta mesmo quando eu clico na imagem?@Eriley sua função funcionou certinho, ta mostrando so o nome da foto agora.Agora, como alternar entre as fotos com botões? quero simular um DBNavigator so com o avançar,voltar, ir pro final e ir pro inicio.
Responder

Gostei + 0

03/09/2010

Artur Carlos

  Opa, quando fiz o post acima ainda não tinha suas 3 respostas Eriley.Funcionou, o DBNavigator ta pegando agora, VLW.Agora é so fazer o DBCtrlGrid parar de ficar sobrepondo a foto que clico nele com a ultima imagem gravada no imovel. 
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar