Ir ao conteúdo
  • Cadastre-se

Me Ajudem!


caezar

Posts recomendados

Bom Dia,

Eu montei uma tabela com apenas um campo. Este campo chama-se CaminhoDaFoto, que é onde são armazenados os endereços das fotos que quero inserir.

Depois criei com formulário onde na caixa de propriedade "NoAtual" inseri o Código:

Private Sub Form_Current()

On Error Resume Next

Me![imagem].Picture = Me![CaminhoDaFoto]

End Sub

Depois coloquei no formulário um campo de imágem que dei o nome de "Imagem" e uma caixa de diálogo de nomiei "CaminhoDaFoto" no qual inseri o códico na caixa de propriedades "ApósAtualizar":

Private Sub CaminhoDaFoto_AfterUpdate()

On Error Resume Next

Me![imagem].Picture = Me![CaminhoDaFoto]

End Sub

Assim sendo cada vez que coloco um endereço de uma foto no campo CaminhoDaFoto ela me mostra a imagem no campo Imagem.

Eu gostaria de saber como criar um botão para eu inseriri a foto sem precisar escrever o endereço dela?

Obrigado

Caio Cezar :bandeira:

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Deixa eu ver se eu entendi: você quer inserir novos caminhos de novas imagens na tabela, sem ter que digitar numa caixa de texto, é isso?

Bom, para isso você precisaria exibir um "Common Dialog Control", que é uma caixa de diálogo comum do Windows, igual à que se usa no Word para procurar e abrir os docs, por exemplo.

Tem um OCX da Microsoft para Comon Dialog que funciona bem no VB, só que no VBA do Access é muito complicado usar.

Tenho uma solução para isso, usando um pouco de API do Windows. Se quiser tentar, aqui vai como implementar um esquema bem simples:

1) No seu Formulário, coloque um Botão de comando e nomeie-o como Botao

2) Na janela do Access, vá na guia Módulos e coloque um novo módulo, em branco.

3) Na janela do módulo que vai abrir, copie e cole o código abaixo:

Postado Originalmente por Código para colar no módulo do Access

Option Compare Database

Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long

Private Type OPENFILENAME

    lStructSize As Long

    hwndOwner As Long

    hInstance As Long

    lpstrFilter As String

    lpstrCustomFilter As String

    nMaxCustFilter As Long

    nFilterIndex As Long

    lpstrFile As String

    nMaxFile As Long

    lpstrFileTitle As String

    nMaxFileTitle As Long

    lpstrInitialDir As String

    lpstrTitle As String

    flags As Long

    nFileOffset As Integer

    nFileExtension As Integer

    lpstrDefExt As String

    lCustData As Long

    lpfnHook As Long

    lpTemplateName As String

End Type

Public Function DialogoAbrir(Optional Filtro As String = "Todos os arquivos (*.*)", Optional PastaInicial As String = "C:\", Optional Titulo As String = "Abrir") As String

   

    Dim OFName As OPENFILENAME

   

    With OFName

        .lStructSize = Len(OFName)

        .hwndOwner = 0

        .hInstance = 0

        .lpstrFilter = Filtro

        .lpstrFile = Space$(254)

        .nMaxFile = 255

        .lpstrFileTitle = Space$(254)

        .nMaxFileTitle = 255

        .lpstrInitialDir = PastaInicial

        .lpstrTitle = Titulo

        .flags = 0

    End With

    If GetOpenFileName(OFName) Then DialogoAbrir = TriMicrosoft(OFName.lpstrFile)

    If Not DialogoAbrir = "" Then DialogoAbrir = Mid$(DialogoAbrir, 1, Len(DialogoAbrir) - 1)

End Function

4) Salve o módulo e feche tudo.

5) Agora, abra seu Formulário no modo estrutura. Clique duas vezes no Botão de comando para abrir a sua respectiva janela de propriedades, então vá na guia Evento e, na linha onde está escrito Ao clicar, escolha [Procedimento do evento].

Clique naquele pequeno botão com três pontos (...) que vai aparecer ao lado do [Procedimento do evento], para abrir a janela do VBA novamente.

6) Agora, na janela do VBA, localize o pedaço de código onde está assim:

Private Sub Botao_Click()

   

End Sub

E substitua o código igual esse acima, pelo código logo abaixo:

Postado Originalmente por Código para o Botão de comando

Private Sub Botao_Click()

   

    Dim Filtro As String, Arquivo As String, Sql As String

   

    Filtro = "Imagens (*.bmp,*.jpg,*.jpeg,*.gif,*.png)" & Chr$(0) & "*.bmp;*.jpg;*.jpeg;*.gif;*.png" & Chr$(0)

    Arquivo = DialogoAbrir(Filtro)

   

    If Not Arquivo = "" And Not Dir$(Arquivo, vbNormal Or vbArchive) = "" Then

        Sql = "INSERT INTO Tabela(CaminhoDaFoto) VALUES(" & Chr$(34) & Arquivo & Chr$(34) & ");"

    Else

        Sql = ""

    End If

       

    If Not Sql = "" Then CurrentDb.Execute Sql

   

    Me.Requery

   

End Sub

Só um pequeno detalhe: repare no código acima, onde está escrito Tabela, em vermelho: substitua isso pelo nome da tabela onde você está gravando os caminhos das figuras (eu já teria deixado pronto se você tivesse passado o nome da tabela).

É isso, agora é só testar. Toda vez que você clicar bo botão, vai aparecer uma caixa de diálogo "padrão Microsoft" para você escolher as imagens. Se escolher abrir alguma, ela automaticamente será gravada na sua tabela, e exibido no Form.

Qualquer coisa, estamos aí...

Link para o comentário
Compartilhar em outros sites

Muito Obrigado Amigo,

O Botão funciona perfeito, porém ainda existem um probleminha:

Eu não consigo editar uma figura, ou seja, não consigo inserir uma figura no lugar de outra em um registro já existente, qual será o problema?

De qualquer forma, Agradço a sua disposição em me ajudar!

Obrigado

Caio Cezar :bandeira:

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Bom, o que eu pretendi foi apenas mostrar como usar um "Common Dialog" no Access, pois veja que o exemplo que eu passei apenas inclui as figuras (inserindo novos registros) e além disso o exemplo não verifica se o caminho já existe na tabela.

Agora para alterar registros, aí já seria melhor fazer outro botão com quase o mesmo código desse, com uma pequena alteração na instrução SQL (UPDATE ao invés de INSERT).

Faça o seguinte: coloque mais um botão nesse Form e nomeie como Botao2. O código para fazê-lo funcionar é o abaixo:

Private Sub Botao2_Click()

    Dim Filtro As String, Arquivo As String, Sql As String

    Dim CaminhoDaFoto_Atual As String

   

    Filtro = "Imagens (*.bmp,*.jpg,*.jpeg,*.gif,*.png)" & Chr$(0) & "*.bmp;*.jpg;*.jpeg;*.gif;*.png" & Chr$(0)

    Arquivo = DialogoAbrir(Filtro)

   

    If Not Arquivo = "" And Not Dir$(Arquivo, vbNormal Or vbArchive) = "" Then

       

        CaminhoDaFoto_Atual = Me.CaminhoDaFoto

       

        'Checa se o caminho já existe

        If (Arquivo = CaminhoDaFoto_Atual) Then

            MsgBox "Não é possível alterar: a foto escolhida tem o mesmo nome da que está tentando alterar.", vbInformation, "Erro"

            Exit Sub

        Else

            If CaminhoJaExiste(Arquivo) Then

                MsgBox "Não é possível alterar: a foto escolhida já existe.", vbInformation, "Erro"

                Exit Sub

            End If

        End If

       

        Sql = "UPDATE Tabela SET CaminhoDaFoto=" & Chr$(34) & Arquivo & Chr$(34) & " WHERE CaminhoDaFoto=" & Chr$(34) & CaminhoDaFoto_Atual & Chr$(34) & ";"

       

    Else

   

        Sql = ""

       

    End If

       

    If Not Sql = "" Then CurrentDb.Execute Sql

   

    Me.Requery

End Sub

Private Function CaminhoJaExiste(Caminho As String) As Boolean

    Me.Recordset.FindFirst "CaminhoDaFoto=" & Chr$(34) & Caminho & Chr$(34)

    CaminhoJaExiste = Not Me.Recordset.NoMatch

End Function

Note que eu inseri uma nova função, chamada CaminhoJaExiste, para pesquisar na tabela se a foto já está cadastrada. Você pode implementar isso naquele primeiro botão também.

Mais uma vez, não esqueça de substituir o nome Tabela pelo verdadeiro nome da tabela que você usa aí.

Como rótulo do botão, você pode colocar o primeiro como "Incluir", e este novo pode colocar como "Alterar", só para não confundir na hora de clicar.

That´s all...

Link para o comentário
Compartilhar em outros sites

Muito bom,

Na verdade pelo que vi eu poderia usar apenas esse botão certo?

E quanto a os problemas:

1º Todas as vezes que insiro um novo registro ele permanece com a foto do registro anteriro, quando na verdade eu gostaria que ficasse em branco.

2º Quando eu insiro a foto nova ele volta ao primeiro registro.

Obrigado,

Caio Cezar :bandeira:

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
Postado Originalmente por caezar@19 ago 2004, 14:03

1) Na verdade pelo que vi eu poderia usar apenas esse botão certo?

2) Todas as vezes que insiro um novo registro ele permanece com a foto do registro anteriro, quando na verdade eu gostaria que ficasse em branco.

3) Quando eu insiro a foto nova ele volta ao primeiro registro.

1) Depende do que você precisa. O primeiro botão grava um novo caminho, e o segundo substitui um caminho já existente por um novo caminho. Veja que são rotinas diferentes.

2) Na rotina do primeiro botão, coloque Me.Recordset.MoveLast na última linha de código, antes do End Sub. Isso vai fazer o Recordset se posicionar no último registro.

3) Mesmo caso do item 2

No mais, você precisa estudar o código e depurar as rotinas.

[]'s

Link para o comentário
Compartilhar em outros sites

Obrigado,

entendi, mas eu quero é quando eu insiro a foto permanecer no mesmo registro e tb que ao invêz de dois botões "inserir e editar" eu tenha um botão inserir que mesmo que já exista uma foto no local quando eu clicar neste botão eu insira uma foto sobre a antiga, ou seja o caminho da foto nova é salvo no lugar do caminho da foto antiga.

Muito Obrigado,

Caio Cezar :bandeira:

Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois...

Oi amigos,

Tentei muito, mais não consegui!

Peguei os codigos que o amigo Clemente me passou e tentei fazer o que eu queria, mas não consegui!

Bem vou tentar mais uma ajuda com vocês:

O que eu quero e juntar os botões 1 (inserir foto) e 2 (substituir foto) descritos no código abaixo em um único botão, ou seja quero inserir a foto e substituíla com o mesmo botão!

Há e que quando eu insira uma foto ele permanece no mesmo registro!

Esse é o código fonte, tem tb o modulo que está descrito nas respstas anteriores:

Option Compare Database

Private Sub Botao_Click()

Dim Filtro As String, Arquivo As String, Sql As String

Filtro = "Imagens (*.bmp,*.jpg,*.jpeg,*.gif,*.png)" & Chr$(0) & "*.bmp;*.jpg;*.jpeg;*.gif;*.png" & Chr$(0)

Arquivo = DialogoAbrir(Filtro)

If Not Arquivo = "" And Not Dir$(Arquivo, vbNormal Or vbArchive) = "" Then

Sql = "INSERT INTO Tabela1(CaminhoDaFoto) VALUES(" & Chr$(34) & Arquivo & Chr$(34) & ");"

Else

Sql = ""

End If

If Not Sql = "" Then CurrentDb.Execute Sql

Me.Requery

Me.Recordset.MoveLast

End Sub

Private Sub Botao2_Click()

Dim Filtro As String, Arquivo As String, Sql As String

Dim CaminhoDaFoto_Atual As String

Filtro = "Imagens (*.bmp,*.jpg,*.jpeg,*.gif,*.png)" & Chr$(0) & "*.bmp;*.jpg;*.jpeg;*.gif;*.png" & Chr$(0)

Arquivo = DialogoAbrir(Filtro)

If Not Arquivo = "" And Not Dir$(Arquivo, vbNormal Or vbArchive) = "" Then

CaminhoDaFoto_Atual = Me.CaminhoDaFoto

'Checa se o caminho já existe

If (Arquivo = CaminhoDaFoto_Atual) Then

MsgBox "Não é possível alterar: a foto escolhida tem o mesmo nome da que está tentando alterar.", vbInformation, "Erro"

Exit Sub

Else

If CaminhoJaExiste(Arquivo) Then

MsgBox "Não é possível alterar: a foto escolhida já existe.", vbInformation, "Erro"

Exit Sub

End If

End If

Sql = "UPDATE Tabela1 SET CaminhoDaFoto=" & Chr$(34) & Arquivo & Chr$(34) & " WHERE CaminhoDaFoto=" & Chr$(34) & CaminhoDaFoto_Atual & Chr$(34) & ";"

Else

Sql = ""

End If

If Not Sql = "" Then CurrentDb.Execute Sql

Me.Requery

End Sub

Private Function CaminhoJaExiste(Caminho As String) As Boolean

Me.Recordset.FindFirst "CaminhoDaFoto=" & Chr$(34) & Caminho & Chr$(34)

CaminhoJaExiste = Not Me.Recordset.NoMatch

End Function

Private Sub Form_Current()

On Error Resume Next

Me![imagem].Picture = Me![CaminhoDaFoto]

End Sub

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...