トップ «前の日記(2008-09-17) 最新 次の日記(2008-09-19)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2008-09-18

_ 人間チェックプラグインもどき

以前入れたツッコミ用のチェックボックス(元は青木さんが作成したのだと思う)だが、プラグインになっていれば便利だろうとやってみた。

しかし、TDiaryCommentクラスがプラグインをロードするのは、日記を保存したあとだった。したがって、プラグインとしてお手軽導入はできないという結論。チェックした時には既に書き込まれているからだ。保存されたものを後から削除するというのは、どうも気に入らないし。

とは言えせっかく作ったのだから、あまり役には立たないけど、公開しておく。

comment_check.rb

_ オブジェクトのデフォルトプロパティがオブジェクト

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は参照カウンターがあるので、単なる代入では済まなくて、参照カウンターのインクリメンタルをなんらかの方法で設定側が行う必要があるからだ。

本日のツッコミ(全2件) [ツッコミを入れる]
_ odz (2008-09-18 22:35)

おー、なんだか面白い動作ですね。<br>あまり嬉しい気はしませんけど。

_ arton (2008-09-20 21:29)

良くみたら不思議ですね。<br>x = Label1 はx = Label1.Captionにはならなかったのに、なぜy = xは、y = x.foo.Captionになったんだろう? <br>型宣言が影響しているからだろうから、調べるならもっとケースを整理しないとだめでした。<br># 実務では使うな、ということでいいんだけど。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|

ジェズイットを見習え