[リストへもどる]
一括表示

投稿時間:2003/01/06(Mon) 09:48
投稿者名:とろ
Eメール:
URL :
タイトル:
定数宣言での As Long = xxx と = xxx& の違い
Private Const A As Long = &H140
Private Const B = &H140&
上の2つの宣言の仕方について質問です。
私は今まで、 A と B は全く同じ物と思っていましたが、違うのでしょうか?

下のコードを実行した際、
(B) では正しくスクリーンセイバーが起動しますが、 (A) では起動しません。
環境: WinNT4.0(SP6) + VB5(SP3)

'ボタンをクリックすると、スクリーンセイバーを起動するコード
Option Explicit
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" _
(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_SYSCOMMAND = &H112&
'Private Const SC_SCREENSAVE As Long = &HF140   '* (A)
Private Const SC_SCREENSAVE = &HF140&           '* (B)
Private Sub Command1_Click()
  SendMessage Me.hWnd, WM_SYSCOMMAND, SC_SCREENSAVE, ByVal 0&
End Sub

投稿時間:2003/01/06(Mon) 11:27
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: 定数宣言での As Long = xxx と = xxx& の違い
以前、私もWin98からWinXPに移行した時にWinXPで起動できなかったので
調べたところ、16ビットから32ビットに移行?されたとかで &HF140& の
ようにロング型を明記しないと起動できないようです。

Private Const SC_SCREENSAVE As Long = &HF140& なら起動します。

&HF140 と &HF140& では値が違うはずです。
  

投稿時間:2003/01/06(Mon) 11:47
投稿者名:とろ
Eメール:
URL :
タイトル:
Re^2: 定数宣言での As Long = xxx と = xxx& の違い
Const A As Long = &H140 とした場合、
As Long に従って &H140 を Long 型で
評価してくれるものと思っていましたけど、
違うんですね。
As Long は悪魔で A の型を決定するだけもので、
&H140 には無関係だったのですね。

ものすごい、勘違いをしていました。
4年間ずっと間違っていました。
ありがとうございました。

投稿時間:2003/01/06(Mon) 12:03
投稿者名:takk
Eメール:takk_neo@hotmail.com
URL :
タイトル:
Re: 定数宣言での As Long = xxx と = xxx& の違い
代入する値の型が明示的に宣言されていないため、このようなことが起こります。
VB6ではデフォルトの数値型がIntegerなので2Byteの数値型になります。
先頭ビットは符号ビットになりますので &H8000のビットが立っていた場合マイナスの値になります。

&HF140  の場合は -3776 という値を示します。
&HF140& の場合は 61760 という値を示します。

更に言うと
> Private Const B = &H140&
この宣言の仕方では定数BはVariant型になります。

Long型で宣言する場合は
Private Const B& = &H140&
のようにしましょう。