5.ちょっと便利な小技集 |
1.オブジェクトの表示/非表示状態を切り替える(Not 演算子の便利な使い方) 2.画面等のスケールモード単位変換 3.プログラム通りの順序で実行させる 4.ByVal とByRef の使い方 5. 6. 7. 8. |
下記プログラムコードに関する補足・注意事項 動作確認:Windows Vista・Windows 7 (32bit) / VB6.0(SP6) Option :[Option Explicit] 参照設定:追加なし 使用 API:なし その他 : : |
1.オブジェクトの表示/非表示状態を切り替える |
1.プロパティウィンドウのVisibleプロパティをクリックし、右側の選択ボタンをクリックし、True(表示)か False(非表示)を選択する。 False(非表示)を選択した場合、そのオブジェクトは画面に表示されず、Click イベント等も発生しません。 2.プログラム中で切り替える場合 構文 オブジェクト名.Visible=True(表示) 又は オブジェクト名.Visible=False(非表示) 例 1 Private Sub Command2_Click() If Command1.Visible = True Then Command1.Visible = False Else Command1.Visible = True End If End Sub 上記はコマンドボタンをクリックする度にCommand1の表示・非表示を切り替えるものです。 例 2 上記同様の操作を Not 演算子を使用すると下記のように簡単になります。 Private Sub Command3_Click() Command1.Visible = Not Command1.Visible End Sub Not 演算子は式の論理否定を求めます。詳しくはヘルプを参照して下さい。 上記の場合 Command1.Visible = True だったら False を返し Command1.Visible = False だったら True を返します。又、下記のような使い方もできます。 Dim showFlag As Boolean Private Sub Command5_Click() showFlag = Not showFlag If showFlag Then Set Image1.Picture = LoadPicture("Flgjapan.ico") Else Set Image1.Picture = LoadPicture("Flgusa02.ico") End If End Sub 3.よけいなお世話 もちろんフォームを非表示にできますが、非表示してもプログラムは稼動しています。 非表示にしてもプログラムを終了できるようにしておいて下さい |
2.画面等のスケールモード単位変換(SampleNo.123 2002.05.22) |
ScaleX、ScaleY メソッド Form オブジェクト、ピクチャーボックス (PictureBox) コントロール、または Printer オブジェクトの幅や高さの値を、ScaleModeプロパティに設定されている単位から別の単位に変換します。 名前付き引数は指定できません。 Option Explicit Private Sub Command1_Click() 'このマシンでのX方向のサイズ変換です With Form1 Label1.Caption = "1 ピクセルは " & .ScaleX(1, 3, 6) & " mmです" Label2.Caption = "100 Twip は" & .ScaleX(100, 1, 6) & " mmです" Label3.Caption = "100 Twip は " & .ScaleX(100, 1, 3) & " ピクセルです" Label4.Caption = "1 ピクセルは " & .ScaleX(1, 3, 1) & " Twip です" Label5.Caption = "567 Twip " & .ScaleX(567, 1, 6) & " mm です" Label6.Caption = "10 mm は " & .ScaleX(10, 6, 3) & " ピクセル です" Label6.Caption = "10 mm は " & .ScaleX(10, 6, 3) & " ピクセル です" Label7.Caption = "10 mm は " & .ScaleX(10, 6, 1) & " Twip です" Label8.Caption = "1 インチは " & .ScaleX(10, 5, 1) & " Twip です" Label9.Caption = "参考 このマシンでの水平方向の1ピクセル" & _ "あたりのtwip数は " & Screen.TwipsPerPixelX & " です" End With End Sub 参考(私の環境での変換結果) 1 ピクセルは 0.2645836 mmです 100 Twip は 1.763891 mmです 100 Twip は 6.666667 ピクセルです 1 ピクセルは 15 Twip です 567 Twip 10.00126 mm です 10 mm は 37.79524 ピクセル です 10 mm は 37.79524 ピクセル です 10 mm は 566.9286 Twip です 1 インチは 14400 Twip です 参考 このマシンでの水平方向の1ピクセルあたりのtwip数は 15 です |
3.プログラム通りの順序で実行させる |
DoEvents 関数を使用します。 ヘルプには、下記のように書かれています。 発生したイベントがオペレーティングシステムによって処理されるようにプログラムで占有していた制御を オペレーティングシステムに渡すフロー制御関数です。 次のコードを実行すると 1.Label1.Caption に "10秒後に終了します。" と表示して 2.10秒待ってから 3.Beep となるはずですが、実際はすぐには、Label1に表示されず終了時に表示します。 Command1 と Command2 の動作の違いを比べて見て下さい。 Private Sub Command1_Click() Dim st As Long Label1.Caption = "10秒後に終了します。" st = Timer Do While Timer - st < 10 Loop 'Label1.Caption = "" Beep End Sub Private Sub Command2_Click() Dim st As Long Label2.Caption = "10秒後に終了します。" DoEvents '追加する(本当は、Label2.Refresh のように書く) st = Timer Do While Timer - st < 10 DoEvents '追加する Loop 'Label2.Caption = "" 'DoEvents '本当は、Label2.Refresh のように書く Beep End Sub このような事が起こっていると感じた場合はこの1行を入れて確認して見て下さい。 但し、上記のような事例は、Label2.Refresh で強制的に再描画を行う方が正しいコードです。 詳しくは、ヘルプで、Refresh メソッドの項をご覧下さい。 注意 DoEvents 関数は、強制的にメッセージ(イベント)を処理しますので、使い方を間違えたり、ループ内で連続的に呼び出したりすると思わぬトラブルが発生する場合があります。 使用される場合は、他に方法が無い場合や1回きりの最低限の使用にとどめ、他に影響をあたえない場所で使用するようにして下さい。 又、ヘルプの解説や注意事項は、必ず読んでおいて下さい。 |
4.ByVal とByRef の使い方 |
ByVal とByRef の使い方をよく、どちらが、どちらかと迷うことがありますので、HELPより抜粋して記入しておきます。
試しに、下記コードを貼り付けて実行して見て下さい。 Private Sub Command1_Click() Dim intA As Integer Dim intB As Integer intA = 1 intB = 2 Call subByRef(intA, intB) Debug.Print "ByRef :" & intA, intB intA = 1 intB = 2 Call subByVal(intA, intB) Debug.Print "ByVal :" & intA, intB End Sub Sub subByRef(ByRef a As Integer, ByRef b As Integer) a = 1000 b = 2000 End Sub Sub subByVal(ByVal a As Integer, ByVal b As Integer) a = 1000 b = 2000 End Sub 結果 intA intB ByRef :1000 2000 ByVal :1 2 |
5. |
6. |
7. |
8. |
検索キーワード及びサンプルコードの別名(機能名) |
Not 演算子の便利な使い方 フラグを立てる ByValとByRef 値渡し 参照渡し 繰り返し処理 待機関数 待つ |