E-listBBSSearchRankingSiliconValleyGo to Top
top/Tips

プログラミングTips集

というか、ただのメモ

[VB]自作のDictionaryを For Each ステートメントに対応させる方法。 - 02/04/04 15:48:57

コメント:
自作のCollectionを For Each ステートメントに対応する場合、通常次のように実装するだろう。

Dim col as Collection
'中略
Public Property Get NewEnum() As IUnknown
    Set NewEnum = col.[_NewEnum]
End Property
そして、NewEnumの属性(VBのメニューより ツール -> プロシージャ属性 )で「プロシージャID」に-4 、「このメンバを非表示にする」にチェックを設定する。

Dictionary オブジェクトにたいして同様に実装すると、コンパイルエラーが発生して実行できない。 なぜなら、Dictonaryオブジェクトの _NewEnum メソッドは restricted として宣言されているため、VBから直接呼ぶことが出来ないからである。 この問題を回避するには、次のように実装すればよい。

dim dic as Scripting.Dictionary
'中略
Public Property Get NewEnum() As IUnknown
    Set NewEnum = CallByName(dic, "_NewEnum", VbMethod)
End Property
注: 当方では、CallByNameを使うとりあえず動作すると言うことしか確認していない。 したがって、使用する際は各人の責任において行っていただきたい。

VB6SP5+Win2000ProSP2で確認

[VB] 漢字仮名変換 - 02/04/03 14:08:32

コメント:

'参照設定でmsime.tlb(Word98のCDに入っている)を指定しておくこと。
'
'使い方
'debug.print GetPhonetic("漢字")
'
Public Function GetPhonetic(s As String) As String
    Dim ime As IFELanguage

    Set ime = New MSIME.MSIMEJPN

    ime.Open
    GetPhonetic = ime.GetPhonetic(s)
    ime.Close
End Function
VB6SP5+Win2000ProSP2で確認

[VB]コンソールに出力する。 - 02/02/06 17:12:16

コメント:

Option Explicit

Public Declare Function AllocConsole Lib "kernel32" () As Long
Public Declare Function FreeConsole Lib "kernel32" () As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public Declare Function GetStdHandle Lib "kernel32" (ByVal nStdHandle As Long) As Long
Public Declare Function WriteConsole Lib "kernel32" Alias "WriteConsoleA" _
          (ByVal hConsoleOutput As Long, lpBuffer As Any, ByVal _
          nNumberOfCharsToWrite As Long, lpNumberOfCharsWritten As Long, _
          lpReserved As Any) As Long
Public Declare Function WriteFile Lib "kernel32" _
          (ByVal hFile As Long, lpBuffer As Any, _
          ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, _
          lpOverlapped As Any) As Long
Public Const STD_OUTPUT_HANDLE = -11&

Sub Main()
    Dim stdout As Long
    Dim s() As Byte
    Dim written As Long

    AllocConsole
    stdout = GetStdHandle(STD_OUTPUT_HANDLE)

    s = StrConv("hello", vbFromUnicode)

    WriteFile stdout, s(0), UBound(s) - LBound(s) + 1, written, ByVal 0
'    WriteConsole stdout, s(0), UBound(s) - LBound(s) + 1, written, ByVal 0

    CloseHandle stdout
    FreeConsole
End Sub
これを実行すると新しいコンソールを開いてそこに出力する(そして結果を確認する間もなくコンソールを閉じる)。 新しいコンソールを開かないようにするには、実行ファイルを作成した後コマンドラインから
editbin /subsystem:console 実行ファイル名
を実行すればよい。 なお、 editbin は Visual C++ に付属するツールで、使用する前に VCVARS32.BAT を実行して環境変数を設定する必要がある。
VB6SP5+Win2000ProSP2で確認
2002/ 7/27:
WriteConsoleの引数で、書き込む文字列のバイト数計算が間違っていたので修正。
WriteConsoleで出力するとリダイレクトが効かなくなるので、WriteFileに変更。

[VB]NULL値を文字列に変換する方法 - 01/10/19 11:22:42

コメント:
NULL値を文字列型変数に代入したり、CStrの引数に指定したりするとエラーになりますが、次のようにすると""(長さ0の文字列)として扱われます。

a$ = NULL & ""

VB6SP5で確認

[Windows] VMWareをインストールすると、LANで接続された他のコンピュータが遅くなる - 01/10/19 11:07:06

コメント:
VMWareをインストールすると、LANで接続された他のコンピュータからのネットワークアクセスが遅くなることがあります。

[原因]
VMWareをインストールすると、仮想LANカードが登録されます。Windowsのデフォルト動作では、IP問い合わせに対してすべてのLANカードのIPアドレスを返すため、周りのコンピュータは実在するLANカードと仮想LANカードの双方に接続を試みることになります。通常、このときの仮想LANカードへのアクセスは失敗し、タイムアウトになるまで待たされる事となります。

[解決策]
レジストリエディタで
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Netbt\Parameters
に SingleResponse (REG_DWORD)を作成し、値に1を指定します。これによって、他のコンピュータからIP問い合わせに対して、仮想LANカードのIPを返すことはなくなります。

このレジストリ値に関する詳細はMicrosoftのページJP120642 および Q120642 を参照してください。

Windows 2000 Pro SP2 + VMWare 2.0.4 で確認

[VB]SetFocusメソッドでフォーカスを移動するとValidateイベントが発生しない - 01/10/10 18:08:37

コメント:
SetFocusメソッドでフォーカスを移動すると、Validateイベントが発生しません。ValidateControlsで明示的にValidateイベントを発生させる必要があります。
マイクロソフトのサポートページによると、この動作は仕様だそうです。

テストコード

'  テキストボックスで Enter キーを押すとコマンドボタンにフォーカスが移動します。
'  テキストボックス(Text1)とコマンドボタン(Command1)をフォームに貼り付けて実行してください。
Private Sub Text1_KeyPress(KeyAscii As Integer)
    If (KeyAscii = 13) Then
'        ValidateControls  'この行を有効に除すると、期待通り Validate イベントが発生する。
        Command1.SetFocus
        KeyAscii = 0
    End If
End Sub

Private Sub Text1_Validate(Cancel As Boolean)
    Debug.Print "Validate"
End Sub
ユーザーコントロールに貼り付けたコントロールの Validate イベントどうやって発生させりゃいいんだ?

VB6SP5で確認

[VB]ActiveX EXEの登録と解除 - 01/09/25 17:47:39

コメント:
登録

foo.exe /regserver
解除
foo.exe /unregserver
ところで、解除する前にEXEを消しちゃった場合、どうすれば良いのだろう?

[linux] ソフトウェアRAID+UPSでシャットダウン時にRAIDが破壊される - 01/09/14 18:44:34

コメント:
ソフトウェアRAID(ミラーリング)を使用したLinuxマシンにAPC製UPS用ドライバ apcupsd をインストールするとシャットダウン時にスーパーブロックが破壊される事があります。 原因はスーパーブロックへの書き込みが終わる前に電源が落ちてしまう事にあります。 apcupsd インストール時に書き換えらたれた /etc/rc.d/init.d/halt をオリジナルに戻すことによって解決します。

Laser5Linux6.4 + apcupsd3.8.1で確認

[VB]実行時にIDE(統合開発環境)上で実行しているかどうかを判定する - 01/09/14 13:28:03

コメント:

Function IsDebug() As Boolean
On Error Resume Next
    Debug.Assert 0 / 0
    If (Err.Number) Then
        Err.Clear
        IsDebug = True
    Else
        IsDebug = False
    End If
End Function

VB6SP5で確認

top/Tips