引数二つのProperty

引数二つのProperty

前回

akashi-keirin.hatenablog.com

作成したCaptionBoxクラス。

テキストボックスの塗りつぶし色と透過性という基本的なセッティングをするのに、たとえば

With captBox.Fill
  .ForeColor.RGB = vbBlack
  .Transparency = 0.4
End With

と書かねばならず、イマイチだなあと思っていた。

色と透過性をいっぺんに設定できないものか、と思ってやってみた。

Property Letを使ってみる

設定だけできたらいいので、書き込み専用のProperty、すなわち、Property Letでいいんでねえか、と思って作ってみた。

リスト1 クラスモジュール CaptionBox
Public Property Let BackColor( _
              ByVal colorConstant As Long, _
              ByVal transparencyRatio As Single)
  With captBox_.Fill
    .ForeColor.RGB = colorConstant
    .Transparency = transparencyRatio
  End With
End Property

引数を二つ受け取って、それぞれ[Shape].Fill.ForeColor.RGBプロパティと[Shape].Fill.Transparencyの値をセットするだけ。

問題は使い方。

通常、Propertyをセットするときは、

[オブジェクト式].[プロパティ] = [値]

という形で値をプロパティに渡す。

今回のように、引数が二つあるときはどうするのか。

次のようにするのである。

使ってみる

さっそく、新設のBackColorプロパティを使ってみよう。

スト2 標準モジュール
Private Sub testAddTextBox()
  Dim Sld As Slide
  Set Sld = ActivePresentation.Slides(1)
  Dim captBox As CaptionBox
  Set captBox = insertCaption(Sld, "ち~んw", True)  '……(1)'
  captBox.BackColor(vbBack) = 0.4  '……(2)'
  captBox.TextFrame.HorizontalAnchor = msoAnchorCenter  '……(3)'
End Sub

Private Function insertCaption( _
            ByVal targetSlide As PowerPoint.Slide, _
            ByVal captString As String, _
   Optional ByVal isBottom As Boolean = False) As CaptionBox
  Dim ret As CaptionBox
  Set ret = New CaptionBox
  Call ret.init(targetSlide, captString)
  If isBottom Then Call ret.flipHorizontally
  Set insertCaption = ret
End Function

(1)で、insertCaptionメソッドを実行してテキストボックスを一つ目のスライドに設置する。

insertCaptionメソッドの返り値はCaptionBoxクラスのインスタンスなので、設置したテキストボックスは、返り値のインスタンスを通じてあれこれ操作できる。

(2)の

captBox.BackColor(vbBack) = 0.4

が今回のキモ。

BackColorプロパティの第1引数は、まさにBackColorプロパティの引数であるかのようにカッコにいれる。で、第2引数を代入演算子=)を用いて設定する。

これで、テキストボックスの塗りつぶし色が黒、透過性が40%になる。

あとは、(3)でテキストのヨコ方向の位置を中央揃えにしておしまい。

実行結果

f:id:akashi_keirin:20190908125907j:plain

この状態でリスト2を実行すると、

f:id:akashi_keirin:20190908125910j:plain

このとおり。

おわりに

問題は、(2)の入力方法がわかりやすいかどうか、だと思う。

入力中に表示されるヒントは

f:id:akashi_keirin:20190908182240g:plain

こんな感じ。

Property Letに二つ以上の引数を持たせるのはアリかナシか……。

使用時のコーディングはちょっとわづらわしくなるとはいえ、素直にBackColorプロパティとTransparencyプロパティの二つを持たせて、

captBox.BackColor = vbBlack
captBox.Transparency = 0.4

と書く方がわかりやすいかも知れない。