せっかくなので、作った VB関係のライブラリ(その他)を公開してみたり。っつーか備忘録だったり…
VB5で動作を確認。
■全般
■関数
■VBで OCX(ActiveX)を作る時
プログラムを書いていると一つのオブジェクトに対して値を読み書きする事が多々あるが、その時は 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を使用する
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
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
としてやると、編集モードで貼り付けた大きさにスタティックのサイズも変化する。