2

を指定すると、そこからコレクションにVBComponentアクセスできるメソッドがあります。.Designer.Controls

 private void DeclareControlsAsMembers(VBComponent form)
 {
     var designer = form.Designer;
     if (designer == null)
     {
         return;
     }

      // using dynamic typing here, because not only MSForms could have a Controls collection (e.g. MS-Access forms are 'document' modules).
      foreach (var control in ((dynamic)designer).Controls)
      {
          var declaration = new Declaration(_qualifiedName.QualifyMemberName(control.Name), ...);
          OnNewDeclaration(declaration);
      }
  }

この方法の問題点は、ホストが MS-Access の場合、form.Designernullであるため、メソッドが早く戻ることです。

ここでのdynamicキャストは特に有用ではありません。インターフェイスにキャストできるようUserFormで、少なくとも Excel ホストでは「うまく機能する」ようです。

しかし、MS-Access のフォームにはデザイナ (???) がないため、VBE アドインである C# コード (つまり、何にでも簡単にしかアクセスできない) が与えられた場合、MS-Access フォームでコントロールを反復するにはどうすればよいですか? VBIDE API が利用可能になります)?

4

2 に答える 2

2

フォームが開いていない限り、 Access フォームのコントロールを反復処理することはできません。コントロールをレンダリングする必要があるため、フォームをデザイン モードで開く場合でもコストがかかります。また、Access であるため、バインドされたプロパティはデータベース オブジェクトに解決されます。サブフォームとサブレポートの問題もあります。

ただし、この VBA コードは vbComponent を受け取り、フォームを開き (まだ開いていない場合はデザイン モードで)、vbComponent の Properties コレクションからコントロール コレクションを返します。フォームが最初に開いていなかった場合は、閉じられます。

このコードは、アクセス レポート用に簡単に複製できます。

Function GetControls() As Access.Controls
  Dim comp As VBIDE.VBComponent
  Dim proj As VBIDE.VBProject
  Dim props As VBIDE.Properties
  Dim bCloseFormWhenDone As Boolean
  Dim formName As String

  Set proj = Application.VBE.ActiveVBProject
  Set comp = proj.VBComponents("Form_Form1")
  On Error Resume Next
  Set props = comp.Properties
  On Error GoTo 0

  If props Is Nothing Then
    bCloseFormWhenDone = True
    'The form is not open, so open it in design mode
    formName = Mid(comp.Name, 6)
    Application.DoCmd.OpenForm formName, acDesign
  End If

  'Get the controls collection
  Set GetControls = comp.Properties("Controls").Object

  'Close the form if it wasn't already open
  If bCloseFormWhenDone Then
    Application.DoCmd.Close acForm, formName
  End If

End Function
于 2016-05-07T03:05:28.183 に答える
0

(文書化されていない素敵な機能を使用して) モジュールをエクスポートしApplication.SaveAsText、コンテンツを解析します。ACommandButtonは次のようになります。

Begin CommandButton
    OverlapFlags =85
    Left =907
    Top =793
    Width =3118
    Height =1304
    ForeColor =4210752
    Name ="Command0"
    Caption ="Command0"
    OnClick ="[Event Procedure]"
    GUID = Begin
        0x925ed6d615e7594c83313637a6d582f4
    End
    GridlineColor =10921638

    LayoutCachedLeft =907
    LayoutCachedTop =793
    LayoutCachedWidth =4025
    LayoutCachedHeight =2097
    BackColor =15123357
    BorderColor =15123357
    HoverColor =15652797
    PressedColor =11957550
    HoverForeColor =4210752
    PressedForeColor =4210752
    WebImagePaddingLeft =2
    WebImagePaddingTop =2
    WebImagePaddingRight =1
    WebImagePaddingBottom =1
End

すべてのコントロールのプロパティ (および任意のその他のプロパティ) の値を取得でき、イベント ハンドラー プロシージャにアタッチされているNameかどうかを確認することもできます。OnClick

于 2016-06-01T04:41:25.823 に答える