Procedure Autoexecutável

Delphi

04/09/2005

Estou iniciando no Delphi, então me desculpem a pergunta talvez um tanto básica demais, mas perguntar acho que não ofende.

Uma DBGrid me mostra o campo principal de uma tabela, e nela navego com as teclas de setas. Algumas DBEdit me monstram os demais campos do registro selecionado na DBGrid. Até aí tudo bem, mas um dos campos da tabela contem o nome de um arquivo .JPG, que está na mesma pasta da tabela. Coloquei um DBImage no Form para que me mostre a figura correspondente àquele registro. Consegui fazer isso, mas só que tenho que clicar em um Button para executar a procedure.

Existe uma forma de eliminar esse procedimento de clicar no Button para que a imagem seja mostrada conforme navego no DBGrid?

Agradeço a ajuda.


Cps.art

Cps.art

Curtidas 0

Respostas

Michael

Michael

04/09/2005

...mas perguntar acho que não ofende.


Claro que não! ;-)

Bom, para mim é estranho a imagem não carregar automaticamente, uma vez que controles [b:b0e7989ff7]data-aware[/b:b0e7989ff7] são conectados ao DataSet e, portanto, ficam ´cientes´ do que acontece nele (daí o nome, Data-aware).

Mas posso estar enganado. Então, é só vc colocar a chamada à sua procedure que exibe a imagem em algum evento da DBGrid que seja chamado sempre que o registro atual mudar. De cabeça eu não me lembro de nenhum, mas vc pode usar o evento [b:b0e7989ff7]OnClick [/b:b0e7989ff7]para simular isso. Porém, se houver algum evento específico para a mudança de registro, que eu aposto muito que tenha, é mais indicado que vc chame sua função de lá.

Qualquer coisa é só postar.

[]´s


GOSTEI 0
Cps.art

Cps.art

04/09/2005

Obrigado Michael.
Já fiz isso e não funciona.
Na verdade estou usando Tabelas de um sistema em Clipper (.DBF) e para isso uso o componente HALCYON, que utiliza os indexadores (.NTX). Esse componente permite que eu use as tabelas e os indexadores nos dois sistemas (Clipper e Delphi), um sempre ´pegando´ de onde o outro parou. Acho que está aí o problema. As DBEdit são conectadas diretamente ao Table1, assim como o DBImage (DBImage: TDBImage), mas na procedure de ´colocar´ a imagem no DBImage o Delphi cria o type: [b:2ed6ea87aa]HalcyonDataSet1ACODVFOTO: TStringField;[/b:2ed6ea87aa], onde o ACODVFOTO é o nome do campo da tabela que contem o nome do JPG.

A procedure do Button ficou assim:
[b:2ed6ea87aa]procedure TForm1.Button1Click(Sender: TObject);
begin
DBImage1.Picture.LoadFromFile(HalcyonDataSet1ACODVFOTO.value);
end;[/b:2ed6ea87aa]

O problema agora é descobrir como ligar o [b:2ed6ea87aa]HalcyonDataSet1ACODVFOTO[/b:2ed6ea87aa] ao [b:2ed6ea87aa]DBImage[/b:2ed6ea87aa] para que se possa suprimir a necessidade do Button, como vc. disse.

Agradeço muito sua ajuda.


GOSTEI 0
Michael

Michael

04/09/2005

Colega,

No evento OnClick da DBGrid não funcionou? Deveria funcionar... :-(

[]´s


GOSTEI 0
Dbergkamps

Dbergkamps

04/09/2005

Olá, boa noite.
Olhei o seu tópico. Pode ter sido só um esquecimento na hora da postagem, mas pq vc nao coloca um DataSource liga ao DataSet e so então ligar o DBImage ao DataSource.


GOSTEI 0
Maikiperin

Maikiperin

04/09/2005

Bom dia,

acredito q a solução seria vc interceptar os eventos (seta p/ cima e p/ baixo) no dbgrid e assim disparar a procedure tipo:

if(Key = VK_DOWN)or(Key = VK_UP) then
Button1.onclick(self);


GOSTEI 0
Michael

Michael

04/09/2005

Colega, apenas interceptando as teclas Up e Down, o click do mouse sobre algum registro não mudaria a imagem do DBImage.

Ainda acho muito estranha o controle não exibir a imagem automaticamente do registro atual. Em todos os casos, continuo achando q uma solução prática seria no evento OnClick do grid, ou, como já mecionei, algum outro que seja disparado sempre que o cursor mudar dentro do DataSet. O evento OnClick é chamado quando a grid muda de linha, ou seja, via teclado ou mouse.

[]´s


GOSTEI 0
Maikiperin

Maikiperin

04/09/2005

Colega, apenas interceptando as teclas Up e Down, o click do mouse sobre algum registro não mudaria a imagem do DBImage. []´s

não entendi meu amigo (Michael)....como assim ?? a partir da hora q estabeleço o seguinte comando:

[b:4d594bdfb8]Button1.onclick(self);[/b:4d594bdfb8]

eu disparo a procedure como desejado pelo colega cps.art.

Consegui fazer isso, mas só que tenho que clicar em um Button para executar a procedure. Existe uma forma de eliminar esse procedimento de clicar no Button para que a imagem seja mostrada conforme navego no DBGrid?


pode ser q eu não tenha interpretado corretamente a dúvida do colega !!

tb acredito q pelo fato de o colega estar usufruindo de controles data-aware, isso teria q ser efetuado de uma forma automática, claro observando se as devidas associações dos componentes/banco estiverem corretas !!

Att, Maiki Perin.


GOSTEI 0
Michael

Michael

04/09/2005

não entendi meu amigo (Michael)....como assim ?? a partir da hora q estabeleço o seguinte comando:


Se ele apenas interceptar as teclas Up e Down para mudar a imagem associada ao registro, então se o usuário selecionasse alguma linha da DBGrid via mouse, ou seja, clicando sobre ela, ao invés do teclado, então o código não seria executado, pois ele apenas verifica as teclas pressionadas.

[]´s


GOSTEI 0
Maikiperin

Maikiperin

04/09/2005

mas ae poderíamos trabalhar alguns eventos do dbgrid para simular o click do mouse, como por exemplo:

OnCellClick;
OnMouseUp;

Att, Maiki Perin.


GOSTEI 0
Michael

Michael

04/09/2005

Correto colega. Mas aí já acho muito trabalho à toa, já q o evento OnClick é disparado tanto quando o usuario seleciona um registro via mouse ou teclado. Mas simples, não? ;-)

[]´s


GOSTEI 0
Martins

Martins

04/09/2005

Correto colega. Mas aí já acho muito trabalho à toa, já q o evento OnClick é disparado tanto quando o usuario seleciona um registro via mouse ou teclado. Mas simples, não? ;-) []´s

Salve grande [b:7d7c9acacf]Michael !!!![/b:7d7c9acacf]

olha só estou utilizando Delphi 6, e no meu DbGrid não tem o evento OnClick, tenho OnCellClick, OnDblClick, etc...

Agora é muito estranho q a imagem esteja dentro do banco e não seja mostrada no componente DbImage, será q o DbImage tem alguma falha em trabalhar com Jpg direto no BD ??

Em todo caso eu faria assim.

[b:7d7c9acacf]Exibindo a imagem do registro selecionado com o click do mouse no DbGrid[/b:7d7c9acacf]
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
    DBImage1.Picture.LoadFromFile(HalcyonDataSet1ACODVFOTO.value); 
end;


[b:7d7c9acacf]Ao entrar no DbGrid ele já me traz a imagem do registro atual para o DbImage[/b:7d7c9acacf]
procedure TForm1.DBGrid1Enter(Sender: TObject);
begin
    DBImage1.Picture.LoadFromFile(HalcyonDataSet1ACODVFOTO.value); 
end;


[b:7d7c9acacf]Navega entre os registros e traz para o DbImage a imagem do registro em q o cursos estiver no DataSet.[/b:7d7c9acacf]
procedure TForm1.DBGrid1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
    DBImage1.Picture.LoadFromFile(HalcyonDataSet1ACODVFOTO.value); 
end;


Não testei, é apenas uma exemplificação, pode ser melhorada.

Espero q ajude!!!!


Martins


GOSTEI 0
Michael

Michael

04/09/2005

Tem razão Martins. O evento não existe, mesmo estando no help do Delphi. Suas dicas procedem. ;-)

[]´s


GOSTEI 0
Gandalf.nho

Gandalf.nho

04/09/2005

Tente colocar esse seu código que carrega a imagem no evento AfterScroll do dataset, além disso como vc está armazenando o caminho da imagem no banco e não a própria imagem use um TImage ao invés de um TDBImage (mais leve)


GOSTEI 0
Maikiperin

Maikiperin

04/09/2005

Tem razão Martins. O evento não existe, mesmo estando no help do Delphi. Suas dicas procedem. ;-) []´s


as minhas tb !!....mas acredito q tb podem ser otimizadas !!

Att, Maiki Perin.


GOSTEI 0
Cps.art

Cps.art

04/09/2005

Caro amigo Martins, a imagem não está no BD, está no formato .JPG na pasta de trabalho.
No BD tenho um campo ACODVFOTO que tem o nome do arquivo JPG, ou seja CASA.JPG, CARRO.JPG, etc.
Fazendo isso com BDE, a imagem aparece a medida que se navega no DBgrid, mas como eu disse no início, estou usando o componente HALCYON, que trabalha com os BD e indexadores do Clipper.
Vou tentar da forma como vc. disse, depois eu posto uma mensagem com o resultado.
Agradeço a todos pela colaboração.


GOSTEI 0
Martins

Martins

04/09/2005

Tente colocar esse seu código que carrega a imagem no evento AfterScroll do dataset, além disso como vc está armazenando o caminho da imagem no banco e não a própria imagem use um TImage ao invés de um TDBImage (mais leve)


Digamos q ele estivesse trazendo a imagem direto do BD, ele poderia utilizar Streams para carrega-la ou não ?


GOSTEI 0
Michael

Michael

04/09/2005

as minhas tb !!....mas acredito q tb podem ser otimizadas !!


Claro colega! Não quis desmerecer sua ajuda, longe disso. ;-)

[]´s


GOSTEI 0
Maikiperin

Maikiperin

04/09/2005

Claro colega! Não quis desmerecer sua ajuda, longe disso. ;


tranquilo meu brother !!

Att, Maiki Perin.


GOSTEI 0
Martins

Martins

04/09/2005

Caro amigo Martins, a imagem não está no BD, está no formato .JPG na pasta de trabalho. No BD tenho um campo ACODVFOTO que tem o nome do arquivo JPG, ou seja CASA.JPG, CARRO.JPG, etc. Fazendo isso com BDE, a imagem aparece a medida que se navega no DBgrid, mas como eu disse no início, estou usando o componente HALCYON, que trabalha com os BD e indexadores do Clipper. Vou tentar da forma como vc. disse, depois eu posto uma mensagem com o resultado. Agradeço a todos pela colaboração.


Ah!! blz então, se está fora do BD, e no campo só está o Path da imagem, vc pode seguir tb a dica da [b:05ebfded48]gandalf.nho[/b:05ebfded48], e utilizar TImage ao invés de DbImage, quanto ao afterscroll do dataset nunca testei e nem tenho como testar agora, mas tenta aí, deve funcionar legal, só não deixe de mudar para TImage, vai ficar mais leve OK!!!.

Boa Sorte!!!


GOSTEI 0
Cps.art

Cps.art

04/09/2005

Caros amigos.
Funcionou.
Usei a dica do Martins e coloquei 2 procedures, a da entrada na DBGrid e a da KeyUp para navegação.
Mudei para TImage e realmente fica mais leve.
Nada como ter um Forum destes com umas feras como vocês.
Agora preciso de outra ajuda.
Supondo que em um registro do BD eu tenho o nome do arquivo .JPG mas não tenho esse arquivo na pasta. Já testei e dá erro pois o Image não encontra esse arquivo.
Como eu poderia colocar uma condição dentro das procedures para que só tente mostrar a imagem se for encontrado o arquivo .JPG na pasta, caso contrário me mostrar um outro arquivo .JPG padrão tipo SEMIMAGEM.JPG.
Por exemplo: no BD tem o nome do arquivo ALICATE.JPG mas não existe o arquivo ALICATE.JPG na pasta, então ele teria que mostrar SEMIMAGEM.JPG.
Podem dar uma dica?


GOSTEI 0
Martins

Martins

04/09/2005

Caros amigos. Funcionou. Usei a dica do Martins e coloquei 2 procedures, a da entrada na DBGrid e a da KeyUp para navegação. Mudei para TImage e realmente fica mais leve. Nada como ter um Forum destes com umas feras como vocês. Agora preciso de outra ajuda. Supondo que em um registro do BD eu tenho o nome do arquivo .JPG mas não tenho esse arquivo na pasta. Já testei e dá erro pois o Image não encontra esse arquivo. Como eu poderia colocar uma condição dentro das procedures para que só tente mostrar a imagem se for encontrado o arquivo .JPG na pasta, caso contrário me mostrar um outro arquivo .JPG padrão tipo SEMIMAGEM.JPG. Por exemplo: no BD tem o nome do arquivo ALICATE.JPG mas não existe o arquivo ALICATE.JPG na pasta, então ele teria que mostrar SEMIMAGEM.JPG. Podem dar uma dica?


Blz, ainda bem q foi possível lhe ajudar, agora vamos a outra questão, não implementei nada otmizado, mas vc pode adequar as suas necessidades, qualquer coisa é só postar aqui.

Verifica se existe o arquivo caso negativo, exibe uma mensagem.
 if not fileexists(´C:\Documents and Settings\Proconsult\Meus documentos\Minhas imagens\veic_caminhao.jpg´) then
    ShowMessage(´O arquivo não existe na pasta informada...´)
 else
    ShowMessage(´Arquivo encontrado na pasta indicada...´);


É só adequar as suas necessidades agora.

Um abraço e boa sorte!!!!


Martins


GOSTEI 0
Cps.art

Cps.art

04/09/2005

Caros amigos, depois de muito tempo volto ao forum.
Tive problemas de saúde e fiquei algum tempo sem atividades no Delphi, mas agora, seria justo que retornasse para agradecer novamente a importante ajuda de vocês.
A última dica do Martins funcionou, foi só adaptar e blz.
Com certeza, daqui pra frente vou estar sempre precisando da ajuda dos amigos deste forum, pois pretendo terminar meu sisteminha.
Estarei sempre à disposição de todos, ajudando dentro do pouco que eu sei, e se precisarem de algum componente ou software que eu tiver, é só dar um alô.
Meu email é : cps.art@terra.com.br

Abraços a todos.

Clovis.


GOSTEI 0
POSTAR