ACC2000: Screen.ActiveForm devolve o formulário principal, não o subformulário

Traduções de Artigos Traduções de Artigos
Artigo: 210210 - Ver produtos para os quais este artigo se aplica.
Avançado: Requer conhecimentos avançados sobre codificação, interoperabilidade e multi-utilizador.

Este artigo aplica-se a uma base de dados do Microsoft Access (.mdb) e a um projecto do Microsoft Access (.adp).

Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Se o controlo activo no ecrã for num subformulário, Screen.ActiveControl correctamente referencia este controlo. No entanto, Screen.ActiveForm , referencia o formulário principal e não o subformulário contida no controlo.

Causa

Um subformulário não é realmente um formulário, mas um controlo (tal como um texto caixa ou botão de comando) que aparece num formulário. Screen.ActiveForm devolve sempre o formulário activo, não um controlo de subformulário.

Resolução

Pode utilizar a função Set_Screen_ActiveSubformControl descrita na secção "Mais informação" para determinar qual o controlo do subformulário contém Screen.ActiveControl . Esta função define uma variável de controlo global Screen_ActiveSubformControl ao controlo de subformulário actualmente activo no ecrã. A função Set_Screen_ActiveSubformControl() devolve um dos seguintes resultados:
Verdadeiro: Screen_ActiveSubformControl foi definida para o controlo de subformulário que contém Screen.ActiveControl.

- ou -

FALSO: Screen.ActiveControl não existe ou não é um subformulário.

Mais Informação

Como criar a função Set_Screen_ActiveSubformControl()

Para criar a função Set_Screen_ActiveSubformControl() , siga estes passos:
  1. Crie um módulo e escreva as seguintes linhas na secção Declarations, caso não estejam já:
    Option Explicit
    Dim Screen_ActiveSubformControl As Control
    					
  2. Escreva os dois procedimentos seguintes:
    Function Set_Screen_ActiveSubformControl()
      Dim frmActive As Form, ctlActive As Control
      Dim hWndParent As Long
    
      ' Clear the control variable.
      Set Screen_ActiveSubformControl = Nothing
    
      ' Assume a subform is not active.
      Set_Screen_ActiveSubformControl = False
    
      ' Get the active form and control.
      On Error Resume Next
      Set frmActive = Screen.ActiveForm
      Set ctlActive = Screen.ActiveControl
      If Err <> 0 Then Exit Function
    
      ' Get the unique window handle identifying the form
      ' .. the active control is on.
      hWndParent = ctlActive.Parent.Properties("hWnd")
    
      ' If the active form window handle is the same as the window
      ' handle of the form the active control is on, then we are on the
      ' mainform, so exit.
      If hWndParent = frmActive.hWnd Then Exit Function
    
      ' Find a subform control that has a window handle matching the
      ' .. window handle of the form the active control is on.
      Set_Screen_ActiveSubformControl = FindSubform(frmActive, _
          hWndParent)
    
    End Function
    
    Function FindSubform(frmSearch As Form, hWndFind As Long)
      Dim i As Integer
      On Error GoTo Err_FindSubForm
    
      ' Assume we will find a subform control with a window
      ' .. handle matching hWndFind.
      FindSubform = True
    
      ' Visit each control on the form frmSearch.
      For i = 0 To frmSearch.Count - 1
         ' If the control is a subform control...
         If TypeOf frmSearch(i) Is SubForm Then
            ' .. does the window handle match the one we are looking
            ' for?
         If frmSearch(i).Form.hWnd = hWndFind Then
            ' We found it! Set the global control variable and exit.
            Set Screen_ActiveSubformControl = frmSearch(i)
            Exit Function
         Else
            ' Otherwise, search this subform control (recursively)
            ' .. to see if it contains a sub-subform control
            ' .. with a window handle matching the one we are
            ' .. interested in.
    
            ' If we found a subform control, then exit.
            If FindSubform(frmSearch(i).Form, hWndFind) Then
               Exit Function
            End If
         End If
      End If
    Next i
    
    Bye_FindSubform:
    ' If we didn't exit the function earlier, then there is no
    ' .. subform or sub-subform control on this form that has a window
    ' .. handle matching the one we are interested in, so return false.
    FindSubform = False
    Exit Function
    
    Err_FindSubForm:
      MsgBox Error$, 16, "FindSubform"
      Resume Bye_FindSubform
    End Function
    					

Como utilizar a função Set_Screen_ActiveSubformControl()

Para utilizar a função Set_Screen_ActiveSubformControl() para determinar qual o controlo do subformulário contém Screen.ActiveControl , siga estes passos:

atenção : Se seguir os passos neste exemplo, modificará a base de dados de exemplo Adamastor.mdb. Convém cópia de segurança do ficheiro de base de dados Adamastor.mdb e siga estes passos numa cópia da base de dados.

  1. Inicie o Microsoft Access e abra a base de dados de exemplo Adamastor.mdb ou o projecto de exemplo NorthwindCS.adp.
  2. Criar as funções descritas anterior da secção "Como criar a função Set_Screen_ActiveSubformControl()."
  3. Crie uma nova macro denominada teclas automáticas da seguinte forma:
       Macro Name   Action      Action Arguments
       -------------------------------------------------------------------
       {F2}         RunCode     Function Name: =DisplayActiveSubformName()
    					
  4. Adicione a seguinte função ao módulo que criou no passo 1:
    Function DisplayActiveSubformName()
       Dim Msg As String
       Dim CR As String
       CR = Chr$(13)  ' Carriage Return.
    
       If Set_Screen_ActiveSubformControl() = False Then
          Msg = "There is no active subform!"
       Else
          Msg = "Active Form Name = " & Screen.ActiveForm.Name
          Msg = Msg & CR
          Msg = Msg & "Active ControlName = " & Screen.ActiveControl.Name
          Msg = Msg & CR
          Msg = Msg & "Active Subform ControlName = "
          Msg = Msg & Screen_ActiveSubformControl.Name
          Msg = Msg & CR
          Msg = Msg & "Active Subform Form Name = "
          Msg = Msg & Screen_ActiveSubformControl.Form.Name
       End If
    
       MsgBox Msg
    
    End Function
    					
  5. Abra o formulário clientes na vista de estrutura e, em seguida, prima F11 para mudar para a janela da base de dados.
  6. Arraste o formulário Encomendas da janela Base de dados para a parte inferior do formulário clientes para criar um controlo de subformulário. Esta acção permite-lhe testar a função de um subformulário e um sub-subform.
  7. Seleccione o novo controlo do subformulário e defina as seguintes propriedades:
    Nome: Testar 123
    ObjectoDeOrigem: encomendas
  8. Visualiza o formulário clientes na vista de formulário. Repare que o subformulário de encomendas contém apenas as encomendas do cliente actual.
  9. Definir o foco para um controlo no formulário clientes, encomendas formam (subformulário), ou o subformulário de encomendas (sub-subform) e, em seguida, prima F2 a chave para executar a macro.

Propriedades

Artigo: 210210 - Última revisão: 29 de junho de 2004 - Revisão: 2.0
A informação contida neste artigo aplica-se a:
  • Microsoft Access 2000 Standard Edition
Palavras-chave: 
kbmt kbprb KB210210 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 210210

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com