Como apresentar imagens de uma pasta num formulário, relatório ou página de acesso a dados
Número original da BDC: 285820
Nota
Requer codificação especializada, interoperabilidade e competências multiutilizadas. Este artigo aplica-se a uma base de dados do Microsoft Access (.mdb/.accdb) e a um projeto do Microsoft Access (.adp).
Resumo
Por vezes, não é prático armazenar imagens numa tabela do Microsoft Access. Se tiver muitas imagens ou se cada um dos seus ficheiros de imagem for grande, o tamanho do ficheiro de base de dados do Microsoft Access pode aumentar rapidamente.
Este artigo demonstra uma função personalizada que pode utilizar para:
- Armazene caminhos de ficheiros e nomes de imagens numa tabela.
- Apresentar imagens utilizando um controlo de imagem.
- Oculte o controlo de imagem se não existir nenhuma imagem disponível.
- Forneça feedback sobre o estado de apresentação da imagem.
Este artigo também contém um script de exemplo do Visual Basic que pode utilizar para apresentar as imagens numa página de acesso a dados.
Nota
Embora este exemplo utilize imagens de mapa de bits (.bmp), também pode utilizar outros tipos de imagem, como .jpg, .pcx e .gif.
A Microsoft fornece exemplos de programação apenas a título informativo, sem qualquer garantia expressa ou implícita, incluindo, sem limitações, as garantias implícitas de comercialização e/ou adequação a um fim específico. Este artigo pressupõe que o utilizador está familiarizado com a linguagem de programação demonstrada e as ferramentas utilizadas para criar e depurar procedimentos. Os técnicos de suporte da Microsoft podem ajudar a explicar a funcionalidade de um determinado procedimento, mas não modificarão estes exemplos para proporcionarem funcionalidades adicionais nem criarão procedimentos adaptados às suas necessidades específicas.
Criar a tabela para armazenar dados de ficheiros e caminhos
Abra a base de dados de exemplo, Northwind.mdb ou o projeto de exemplo NorthwindCS.adp.
Crie a seguinte tabela no Northwind.mdb ou em NorthwindCS.adp.
Em Northwind.mdb:
Table: tblImage ---------------------------- Field Name: ImageID Data Type: AutoNumber Indexed: Yes (No Duplicates) Field Name: txtImageName Data Type: Text Table Properties: tblImage -------------------------- PrimaryKey: ImageID
Em NorthwindCS.adp:
Table: tblImage ----------------------- Column Name: ImageID Datatype: Int Allow Nulls: Unchecked Identity: Yes Column Name: txtImageName Datatype: varchar Table Properties: ImageTable ------------------------------- Primary Key Constraint: ImageID
Abra a tabela tblImage na vista Folha de Dados e, em seguida, adicione o caminho e o nome de um ficheiro de mapa de bits a cada registo. A seguinte tabela de exemplos mostra o aspeto dos registos:
Tipo Exemplos: Absoluto (Local) C:\Windows\Zapotec.bmp Absoluto (Caminho UNC) \\Servername\sharename\Zapotec.bmp Relativo Zapotec.bmp
Criar a função personalizada
Crie um novo módulo e, em seguida, cole ou escreva o seguinte código:
Option Compare Database Option Explicit Public Function DisplayImage(ctlImageControl As Control, strImagePath As Variant) As String On Error GoTo Err_DisplayImage Dim strResult As String Dim strDatabasePath As String Dim intSlashLocation As Integer With ctlImageControl If IsNull(strImagePath) Then .Visible = False strResult = "No image name specified." Else If InStr(1, strImagePath, "\") = 0 Then ' Path is relative strDatabasePath = CurrentProject.FullName intSlashLocation = InStrRev(strDatabasePath, "\", Len(strDatabasePath)) strDatabasePath = Left(strDatabasePath, intSlashLocation) strImagePath = strDatabasePath & strImagePath End If .Visible = True .Picture = strImagePath strResult = "Image found and displayed." End If End With Exit_DisplayImage: DisplayImage = strResult Exit Function Err_DisplayImage: Select Case Err.Number Case 2220 ' Can't find the picture. ctlImageControl.Visible = False strResult = "Can't find image in the specified name." Resume Exit_DisplayImage: Case Else ' Some other error. MsgBox Err.Number & " " & Err.Description strResult = "An error occurred displaying image." Resume Exit_DisplayImage: End Select End Function
Guarde o módulo como Módulo1.
Utilizar a função personalizada num formulário
Crie o seguinte novo formulário baseado na tabela tblImage.
Form: frmImage ---------------------- Caption: Image Form RecordSource: tblImage Image Control --------------------------------- Name: ImageFrame Picture: "C:\Windows\Zapotec.bmp" Text box ---------------------- Name: txtImageID ControlSource: ImageID Text box --------------------------- Name: txtImageName ControlSource: txtImageName Text box --------------------------- Name: txtImageNote ControlSource: <Blank>
Nota
Se não quiser que o caminho seja apresentado no formulário, pode definir a
Visible
propriedade dotxtImageName
controlo como Falso.No menu Ver , clique em Código e, em seguida, cole ou escreva o seguinte código:
Option Compare Database Option Explicit Private Sub Form_AfterUpdate() CallDisplayImage End Sub Private Sub Form_Current() CallDisplayImage End Sub Private Sub txtImageName_AfterUpdate() CallDisplayImage End Sub Private Sub CallDisplayImage() Me!txtImageNote = DisplayImage(Me!ImageFrame, Me!txtImageName) End Sub
Abra o formulário frmImage na vista Formulário. Tenha em atenção que o formulário apresenta o mapa de bits correspondente para cada registo. Se o
txtImageName
campo estiver em branco ou se não for possível encontrar a imagem, receberá as mensagens adequadas em vez da moldura da imagem.
Utilizar a função personalizada num relatório
Crie o novo relatório seguinte baseado na tabela ImageTable.
Report: rptImage ---------------------- Caption: Image Report RecordSource: tblImage Image Control --------------------------------- Name: ImageFrame Picture: "C:\Windows\Zapotec.bmp" Text box ---------------------- Name: txtImageID ControlSource: ImageID Text box --------------------------- Name: txtImageName ControlSource: txtImageName Text box --------------------------- Name: txtImageNote ControlSource: <Blank>
Nota
Se não quiser que o caminho seja apresentado no relatório, pode definir a
Visible
propriedade dotxtImageName
controlo como Falso.No menu Ver , clique em Código e, em seguida, cole ou escreva o seguinte código:
Option Compare Database Option Explicit Private Sub Detail_Print(Cancel As Integer, PrintCount As Integer) Me!txtImageNote = DisplayImage(Me!ImageFrame, Me!txtImageName) End Sub
Abra o relatório rptImage na pré-visualização. Tenha em atenção que o relatório apresenta o mapa de bits correspondente para cada registo. Se o
txtImageName
campo estiver em branco ou se não for possível encontrar a imagem, receberá as mensagens adequadas em vez da moldura da imagem.
Duplicar a função personalizada numa página de acesso a dados
Crie a seguinte nova página de acesso a dados baseada na tabela tblImage.
Data Access Page: dapImage ----------------------------- Title: Image Data Access Page Image Control --------------------------------- ID: ImageFrame Text box ---------------------- ID: txtImageID ControlSource: ImageID Text box --------------------------- ID: txtImageName ControlSource: txtImageName
Nota
Se não quiser que o caminho seja apresentado na página, pode definir a
Visibility
propriedade dotxtImageName
controlo como Oculto.No menu Ferramentas, aponte para Macros e, em seguida, clique em Microsoft Script Editor.
Adicione o seguinte script ao evento Atual do MSODSC na parte da etiqueta HEAD do documento HTML.
Nota
Tem de transmitir um parâmetro para que o evento seja acionado.
<SCRIPT language=vbscript event=Current(oEventInfo) for=MSODSC> <!-- ImageFrame.src=txtImageName.value --> </SCRIPT>
Abra a página dapImage na Vista de página. Tenha em atenção que a página apresenta o mapa de bits correspondente para cada registo. Se o campo txtImageName estiver em branco, será apresentado um ícone de controlo. Se não for possível encontrar a imagem, é apresentado um ícone X no controlo de imagem.
Utilizar um caminho de http:// num formulário
Para utilizar um caminho de http:// num formulário, utilize o controlo do browser (shdocvw.dll) da seguinte forma:
Adicione um controlo do Microsoft Web Browser ao formulário e dê-lhe o nome WebBrowser.
Adicione o seguinte código a um módulo:
Public Function DisplayImageWeb(ctlBrowserControl As Control, _ strImagePath As Variant) On Error GoTo Err_DisplayImage Dim strDatabasePath As String Dim intSlashLocation As Integer With ctlBrowserControl If IsNull(strImagePath) Then ElseIf Left(strImagePath, 4) = "http" Then .Navigate (strImagePath) Else If InStr(1, strImagePath, "\") = 0 Then ' Path is relative strDatabasePath = CurrentProject.FullName intSlashLocation = InStrRev(strDatabasePath, "\", Len(strDatabasePath)) strDatabasePath = Left(strDatabasePath, intSlashLocation) strImagePath = strDatabasePath & strImagePath End If .Navigate (strImagePath) End If End With Exit_DisplayImage: Exit Function Err_DisplayImage: Select Case Err.Number Case Else MsgBox Err.Number & " " & Err.Description Resume Exit_DisplayImage: End Select End Function
Adicione o seguinte código por trás do formulário:
Option Compare Database Option Explicit Private Sub Form_AfterUpdate() CallDisplayImage End Sub Private Sub Form_Current() CallDisplayImage End Sub Private Sub txtImageName_AfterUpdate() CallDisplayImage End Sub Private Sub CallDisplayImage() DisplayImageWeb Me.WebBrowser9, Me.txtImageName End Sub
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários