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

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.

210210
Este artigo foi arquivado. Este artigo é oferecido "tal como está" e deixará de ser actualizado.
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).

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 ExplicitDim 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 FunctionFunction 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 IfNext iBye_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 = FalseExit FunctionErr_FindSubForm:  MsgBox Error$, 16, "FindSubform"  Resume Bye_FindSubformEnd 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 MsgEnd 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.
PRB ecrã activecontrol ecrã activeform

Aviso: Este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 210210 - Última Revisão: 01/11/2015 02:05:40 - Revisão: 2.0

  • Microsoft Access 2000 Standard Edition
  • kbnosurvey kbarchive kbmt kbprb KB210210 KbMtpt
Esta informação foi útil?