Fórum Procedure Autoexecutável #294423

04/09/2005

0

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

Responder

Posts

04/09/2005

Michael

...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


Responder

Gostei + 0

04/09/2005

Cps.art

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.


Responder

Gostei + 0

04/09/2005

Michael

Colega,

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

[]´s


Responder

Gostei + 0

04/09/2005

Dbergkamps

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.


Responder

Gostei + 0

05/09/2005

Maikiperin

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);


Responder

Gostei + 0

05/09/2005

Michael

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


Responder

Gostei + 0

05/09/2005

Maikiperin

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.


Responder

Gostei + 0

05/09/2005

Michael

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


Responder

Gostei + 0

05/09/2005

Maikiperin

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

OnCellClick;
OnMouseUp;

Att, Maiki Perin.


Responder

Gostei + 0

05/09/2005

Michael

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


Responder

Gostei + 0

05/09/2005

Martins

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


Responder

Gostei + 0

05/09/2005

Michael

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

[]´s


Responder

Gostei + 0

05/09/2005

Gandalf.nho

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)


Responder

Gostei + 0

05/09/2005

Maikiperin

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.


Responder

Gostei + 0

05/09/2005

Cps.art

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.


Responder

Gostei + 0

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

Aceitar