VBレスキュー(花ちゃん)
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ各掲示板

リンク元へ戻ります。 数学・算法・基本コード関係のメニュー
1.人に聞けないこんな事(主要プロパティについて)
2.条件判断・条件分け処理関係
3.繰り返し処理関係
4.プログラムの最適化(高速化)について
5.ちょっと便利な小技集
6.10進←→16進相互変換
7.ソート法色々
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.


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より抜粋して記入しておきます。

ByVal 省略可能です。その引数が、値渡し(変数の値のコピーをサブルーチンに渡すこと)で渡されることを示します。
ByRef 省略可能です。その引数が、参照渡し(呼び出されたプロシージャ内で渡された変数の値を変更すると、元の変数の値も変更されます。Visual Basic では、特に指定しない限り、プロシージャの引数は参照渡しで渡されます。)で渡されることを示します。Visual Basic では、既定値は ByRef ですが、参照渡し (ByRef) の代わりに値渡し (ByVal) で引数を渡す方が処理速度が速くなり、プログラムの最適化につながりますので、できれば宣言しておいて下さい。
実際は処理速度に関しては使い方次第で、あまり大差ないようです。

試しに、下記コードを貼り付けて実行して見て下さい。

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 値渡し 参照渡し 繰り返し処理 待機関数 待つ




このページのトップへ移動します。