Visual Basic Tips(ってほどのものではないけど…)

せっかくなので、作った VB関係のライブラリ(その他)を公開してみたり。っつーか備忘録だったり…
VB5で動作を確認。

(お約束)動作確認は取ってますが、このコンテンツにあるサンプルソースなどを使用・参考にして受けた障害・損害・精神的苦痛(ってなんだ?)について、筆者は一切責任を負いません

■全般

■関数

■VBで OCX(ActiveX)を作る時


同じオブジェクトを同時に参照する時は With文を。

プログラムを書いていると一つのオブジェクトに対して値を読み書きする事が多々あるが、その時は With文などを使用してオブジェクト解析回数を減らして、スピードアップを図ってみよう(既知の事実だけど、案外知らない人もいるようなので)。
ちなみに、この話は一太郎8三四郎8以降のJustsystem製品にあるマクロ(SuperPlayRite)でも同じです。

ex.)VisualBasicだと…

with Text1
	.text = "君子ってサイコーの妹だよね"
	.tooltip = "あ…。みつかっちゃった"
	.enabled = false
end with

おまけ)SuperPlayRiteだと…(ピリオドの数に注意)

with Text1
	..text = "かわいい妹(のようなもの)から「お兄ちゃん」って呼ばれるとドキドキするよね"
	..enabled = True
end with

マウスカーソルを砂時計にするには

砂時計にするには Screen.MousePointer = vbHourglass を使用し、元に戻すには Screen.MousePointer = vbDefaultを使用する


Iniファイルの読み書き

WindowsAPIを使います。指定したファイルやセクションがなければ作ってくれたりする。えらいぞ>API
まず、iniファイルの読み書きは Kernel32.dllの中にあるのでおまじない

▼読込み用。
Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long

▼書き込み用
Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long

関数の中身は引数を変換して渡してるだけで、怪しげな処理はありません。

'*************************************************************
'  Function: SetIniFile
'  Caution : 指定された .iniファイルにキーワードで値を書く
'  arg     : sFileName= iniファイルの名前(要パス指定)
'          : sSection = セクション名
'          : sKey     = キー名
'          : sValue   = 値
'  result  : 成功失敗が返ってくるだけだと思う(←思うって…)
'*************************************************************
Public Function SetIniFile(sFileName As String, sSection As String, sKeyName As String, sValue As String) as long

     SetIniFile = WritePrivateProfileString(ByVal sSection, ByVal sKeyName, ByVal sValue, ByVal sFileName)

End Function

'********************************************************
'  Function: GetIniFile
'  Caution : 指定された .iniファイル・キーワードで
'          : 設定されている値を取得する
'  arg     : sFileName= iniファイルの名前(要パス指定)
'          : sSection = セクション名
'          : sKey     = キー名
'  result  : string   キーが存在しなかったりすると null
'********************************************************
Public Function GetIniFile(sFileName As String, sSection As String, sKeyName As String) As Variant
    Dim nLen As Long
    nLen = 1024
    Dim sResult As String * 1024

    dummy = GetPrivateProfileString(sSection, sKeyName, "", sResult, nLen, sFileName)
    GetIniFile = Left(sResult, InStr(sResult, Chr(0)) - 1)

End Function

Num/Caps/Scrollキーの設定

WinAPIを使用します。MSの元ネタ
おまじない

' キーボード操作用の定数定義
Const KEYEVENTF_EXTENDEDKEY = &H1
Const KEYEVENTF_KEYUP = &H2
' キーボードの状態を返す
Private Declare Function SetKeyboardState Lib "user32" (lppbKeyState As Byte) As Long
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer

'********************************************************
'  Function: SetLockKeys
'  Caution : Lockがらみのキーを on/offする
'  arg     : long VirtualKeyCode
'          : bool True=ロックする  FALSE=ロックしない
'  result  : void
'********************************************************
Public Sub SetLockKeys(lKind As Long, bLock As Boolean)

    If Not ((Not (GetKeyState(lKind) = 0)) = bLock) Then
        keybd_event lKind, 0, KEYEVENTF_EXTENDEDKEY Or 0, 0
        keybd_event lKind, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0
    End If

End Sub

デザインモード(ダイアログ編集中)なのか、実行中なのかを知るには

OCXは基本的にずーっと実行されているようなものだが、デザインモード(ダイアログ編集中)に動いて欲しくないものもある。その時にデザインモードなのか実行モードなのかを返すのが

Ambient.UserMode

実行モードなら TRUE、デザインモードなら FALSEが返ってくる。


コントロールを貼り付けた大きさにあわせるには

例えば、スタティックコントロール(以下スタティック)をカスタマイズして OCX化したあと、その OCXを使用する場合、スタティックも大きさを合せたいという時には、

Private Sub UserControl_Resize()
	Static1.Move 0, 0, ScaleWidth, ScaleHeight
End Sub

としてやると、編集モードで貼り付けた大きさにスタティックのサイズも変化する。


Document written by Hiroshi Momota