Seção 2: Usando DBImage para extrair JPEG – da maneira errada
DBImage - pegue um (O DBImage - pegue um)
Ao tentar fazer algo novo com Delphi, a primeira coisa que faço é pedir um método à ajuda interna do Delphi. Isto é o que a documentação de ajuda irá responder: Um TDBImage (na página Controles de Dados da Paleta de Componentes) representa uma imagem gráfica de um campo BLOB no registro atual do banco de dados. Use TDBImage para representar valores de campos gráficos. TDBImage permite que formulários exibam dados gráficos de um banco de dados. TDBImage possui apenas mais propriedades de visibilidade de dados do que o componente TImage. As duas propriedades mais importantes são: DataSource (fonte de dados) e Field (campo). A propriedade DataSource conecta o componente gráfico ao banco de dados. Em nosso formulário existe um componente DataSource chamado DataSource1 - que representa um conjunto de dados. A propriedade Field indica o campo (na tabela) que contém a imagem.
Tudo está claro, agora coloque um componente DBImage no formulário e nomeie-o como DBImage1 por padrão. Para realmente conectar o DBImage ao campo BLOB da tabela, precisamos apenas fazer a seguinte configuração (usando o Object Inspector):
DBImage1.DataSource = DataSource1
DBImage1.Field = Imagem
Este é um truque necessário para exibir uma imagem JPEG que existe no campo Imagem da tabela de aplicativos.
Para verificar se esta configuração funciona, basta definir a propriedade Active do componente ADOTable1 como True. Podemos fazer isso no Object Inspector durante o design. Depois de fazer isso, a seguinte caixa de diálogo aparecerá:
O que? Por que aparece "Imagem bitmap inválida"? Temos imagens JPEG em vez de imagens BMP - esse é o problema? Vamos voltar para ajudar.
Depois de clicar um pouco na ajuda, cheguei à conclusão: para obter a imagem JPG no banco de dados, temos que utilizar o objeto TJpegImage. Para exibir imagens, precisamos de uma versão simples e invisível do componente Image. Ao mesmo tempo, precisamos usar um stream para carregar a imagem do objeto BLOB. Descrição do documento de ajuda: Devemos usar TADOBlobStream para acessar ou alterar o valor do campo BLOB ou memorando (nota) no conjunto de dados ADO.
Seção 3: Usando streams para extrair JPEG – método errado
Puxando o JPEG – leve dois!
Como não podemos fazer nada com o DBImage - remova-o do formulário e coloque um componente TImage normal (página adicional) chamado ADOImage. Infelizmente, o componente Image não possui nenhuma propriedade de reconhecimento de dados; portanto, é necessário um programa separado para exibir a imagem da tabela do banco de dados que ele representa. A maneira mais simples de fazer isso é colocar um Button no formulário, colocar todo o código do programa em seu evento OnClick e nomear o botão: "btnShowImage".
Para usar ADOBLOBStream, a documentação de ajuda recomenda a criação de uma instância TADOBlobStream, usando o método "stream" para ler os campos gráficos do conjunto de dados e, em seguida, liberar o fluxo BLOB. Em algum ponto intermediário, precisaremos carregar uma imagem JPEG de um objeto TADOBlobStream usando o método LoadFromStream. As propriedades Imagem e Gráfico do componente Imagem serão usadas para armazenar e exibir imagens.
Objeto de campo, o que é?
Neste ponto, presumo que apenas um pouco de conhecimento sobre objetos de campo seja mais que suficiente para você dominar este capítulo. No desenvolvimento do banco de dados Delphi, um dos objetos principais é o objeto TField. Componentes de campo são objetos não visuais que representam os campos de um conjunto de dados em tempo de execução (ou design). TADOTable (e outras subclasses TDataSet) fornecem acesso em tempo de design ao Editor de Campos. O Editor de Campos permite selecionar os campos que deseja incluir no conjunto de dados. Mais importante ainda, ele cria uma lista robusta de componentes de campo usados no conjunto de dados do aplicativo. Para chamar o Editor de Campos, clique duas vezes no componente TADOTable. Por padrão, a lista de campos está vazia. Clique no botão Adicionar para abrir uma caixa de diálogo que lista os campos da tabela Aplicativos. Por padrão, todos os campos estão selecionados e selecione OK.
O Delphi fornecerá o nome padrão do campo da seguinte forma: Nome da tabela (tabela) + Nome do campo (campo). Isso significa que nosso campo de imagem se chama: ADOTable1Picture.
O método Create de TADOBlobStream cria uma instância para ler ou gravar um objeto de campo BLOB especificado, neste caso o campo ADOTable1Picture.
Escrevemos o código do programa no evento OnClick do botão btnShowImage. Este código lerá a imagem do campo Imagem da linha atualmente selecionada. O código fonte é o seguinte:
usa jpeg;
...
PRocedure TForm1.btnShowImageClick(Remetente: TObject);
var bS: TADOBlobStream;
Foto: TJpegImage;
começar
bS := TADOBlobStream.Create
(AdoTable1Picture, bmRead);
tentar
Foto:=TJpegImage.Create;
tentar
Pic.LoadFromStream(bS);
ADOImage.Picture.Graphic:=Pic;
finalmente
Foto.Grátis;
fim ;
finalmente
bS.Livre
fim ;
fim ;
OK, vamos executar este projeto. Claro, defina a propriedade ADOTable1.Active como True. Após a exibição do formulário, clique no botão e a seguinte tela aparecerá:
Uh, o que está acontecendo? O código está 100% correto, mas por que a imagem não é exibida? Lembre-se de “nunca desista, nunca se renda”! Vamos detalhar o nível de byte e ver o que está acontecendo!