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.
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;
02/09/2010
Eriley Barbosa
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.
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?
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.
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.
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ó.
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?
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;
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;
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.
03/09/2010
Eriley Barbosa
Tenta como o renan disse, também.
@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.
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.