著作一覧 |
以前入れたツッコミ用のチェックボックス(元は青木さんが作成したのだと思う)だが、プラグインになっていれば便利だろうとやってみた。
しかし、TDiaryCommentクラスがプラグインをロードするのは、日記を保存したあとだった。したがって、プラグインとしてお手軽導入はできないという結論。チェックした時には既に書き込まれているからだ。保存されたものを後から削除するというのは、どうも気に入らないし。
とは言えせっかく作ったのだから、あまり役には立たないけど、公開しておく。
odzさんのところでデフォルトプロパティについての話題があって、ちょっと試してみた。
次のVB6のプロジェクトを作る。
'Class1.cls Dim obj As Object Public Property Get foo() As Object Set foo = obj End Property Public Property Let foo(ByVal o As Object) Set obj = o End Property
fooプロパティはツールの設定でdefaultプロパティとしておく。
フォームも用意する。
'Form1.frm Private Sub Command1_Click() Dim x As New Class1 Dim y As New Class1 ' As Class1で試してみたり x = Label1 x.foo.Caption = "helloS" MsgBox x y = x ' Let y = x で試してみたり MsgBox y End Sub
省略するが、スタンドアローン実行ができるように、Sub Mainも用意し、かつ、ActiveX Exeとしてコンパイルしておく。これはClass1をCOMコンポーネントとしないと、どうもdefaultプロパティが有効にならないようなので(確認していない)。
これは、何かというと、デフォルトプロパティがオブジェクトの場合の動作を見たいということだ。ここでは、Class1のデフォルトプロパティはfoo(内包したオブジェクト)、LabelのデフォルトプロパティはCaption(文字列)だ。
いろいろ試してみたところ、次の結果を得た。
まず、変数(ここでは、xとy)に対するLet代入(y = x)は、y.foo = x.foo.captionに置き換えられる。つまり右辺のデフォルトプロパティの呼び出しは繰り返される。しかし、左辺については繰り返されない。
次に、setの右辺は、オブジェクトそのものとして評価される。デフォルトプロパティとはならない。したがって、setは左辺だけでなく右辺にも影響する。つまり、set y = x という書き方は常に有効。
つまりSetは評価しない。
あと、思いだしたけど、オブジェクトの場合に、Letが型に応じた特別な処理をするのではなく、SetならばQueryInterfaceを行うというように特化させたかったのかも知れない。COMは参照カウンターがあるので、単なる代入では済まなくて、参照カウンターのインクリメンタルをなんらかの方法で設定側が行う必要があるからだ。
ジェズイットを見習え |
おー、なんだか面白い動作ですね。<br>あまり嬉しい気はしませんけど。
良くみたら不思議ですね。<br>x = Label1 はx = Label1.Captionにはならなかったのに、なぜy = xは、y = x.foo.Captionになったんだろう? <br>型宣言が影響しているからだろうから、調べるならもっとケースを整理しないとだめでした。<br># 実務では使うな、ということでいいんだけど。