VB6 には、Let、Set、LSet、RSet など、似たようなステートメントがいくつかあります。
Let は一般的な変数の代入に使用されます。
次のようにコードをコピーします。
[Let] 変数名 = 式
Let を省略して直接等号で値を代入することが多いので、Let の存在すら知らない人も多いです。
Set はオブジェクトの代入に使用され、変数をオブジェクトにポイントし、オブジェクトの参照カウントを増やします。
では、LSet は何に使用されるのでしょうか?一見するとLetとSetを組み合わせたもののように見えますが、そうではありません。 LSet の L は Left の略であり、それに相当するのは RLet です。 L が Left の略語であることをどうやって知ったのかと尋ねられますか?文書には次のように書かれています。
次のようにコードをコピーします。
LSet ステートメント
文字列変数内の文字列を左揃えにするか、あるユーザー定義型の変数を別のユーザー定義型の別の変数にコピーします。
RSet ステートメント
文字列変数内の文字列を右揃えにします。
LSet には RSet よりも 1 つ多くの関数があります。これについては説明しませんが、最初に同じ部分を見てみましょう。どちらも文字列変数内で文字列を左 (右) に配置するために使用されます。それはどういう意味ですか?実際、ドキュメントを読んだだけでは理解できません。実際にテストしてみましょう。
次のようにコードをコピーします。
サブメイン()
文字列としての Dim URL
文字列としてのディム
URL = "//www.VeVB.COm" とします。
s = 文字列$(20, "*")
LSet s = URL
デバッグ.プリント
RSet s = URL
デバッグ.プリント
エンドサブ
出力 (スペースに注意してください):
次のようにコードをコピーします。
//www.VeVB.COM
//www.VeVB.COM
確かに左揃えと右揃えになっており、アスタリスク * がスペースに置き換えられていますが、これはどのような用途に使用されるのでしょうか。私の意見では、設計者が何を考えたのかはわかりませんが、本当に役に立たないのではないかと思います。
ただし、LSet の別の関数は非常に強力で、ユーザー定義型変数を別のユーザー定義型変数にコピーできます。これはどういう意味ですか?
例を挙げてみましょう。IPアドレスを知っていますか?ここで Baidu に ping を実行すると返される IP は 61.135.169.125 です。この形式の IP アドレスは、実際にはコンピューター内で 32 ビットの整数で表されます。 VB を使用して xxx.xxx.xxx.xxx 形式の IP アドレスを 32 ビット整数に変換するにはどうすればよいですか? Google で調べた後は、次のようなコードを作成できます。
次のようにコードをコピーします。
サブメイン()
Debug.Print IPToLong("61.135.169.125")
エンドサブ
プライベート関数 IPToLong(IPStr As String) As Long
Dim Str() を文字列として、HEXStr を文字列として、TempStr を文字列として
薄暗い×長い
Str = Split(IPStr, ".")
HEXStr = ""
x = 0 の場合、UBound(Str) まで
TempStr = Hex(Str(x))
HEXStr = HEXStr & String(2 - Len(TempStr), "0") & TempStr
次の×
IPToLong = CLng("&H" & HEXStr)
終了機能
コードは正常に動作します。それは問題ありませんが、LSet ステートメントを使用すると、より「高度な」コードを作成できます。
次のようにコードをコピーします。
プライベートタイプ myBytes
B1 バイトとして
B2 バイトとして
B3 バイトとして
B4 バイトとして
エンドタイプ
プライベートタイプ myLong
ヴァル・アズ・ロング
エンドタイプ
「悪魔によって」
'http://VeVB.COm
パブリック関数 IP2Long(ip As String) As Long
Dim a() を文字列として
Dim b As myBytes
ディム・アズ・マイロング
a = Split(ip, ".")
' リトルエンディアンに注意してください
b.B1 = Cバイト(a(3))
b.B2 = Cバイト(a(2))
b.B3 = Cバイト(a(1))
b.B4 = Cバイト(a(0))
LSet l = b
IP2Long = l.Val
終了機能
LSet を使用して、myBytes 型の変数を myLong 型の変数にコピーします。これは非常に優れており強力です。生成されたアセンブリ コードを見てください。
次のようにコードをコピーします。
00401A0E lea eax, dword ptr [ebp-0x20]; 変数 b のアドレス
00401A11 プッシュ eax
00401A12 lea eax, dword ptr [ebp-0x14]; 変数 l のアドレス
00401A15 プッシュ eax
00401A16 プッシュ 0x4
00401A18 __vbaCopyBytes jmp を MSVBVM60.__vbaCopyBytes に呼び出します。
呼び出されるのは MSVBVM60.DLL の __vbaCopyBytes で、最初のパラメータはコピーされるバイト、2 番目のパラメータはターゲット アドレス、3 番目のパラメータは C 標準ライブラリの memcpy 関数に似ています。ただし、パラメータの順序が異なり、その内部実装はアセンブリ内の文字列転送命令にすぎません。
次のようにコードをコピーします。
72A1A0F3 > mov ecx、dword ptr [esp+0x4]
72A1A0F7 プッシュ ESI
72A1A0F8 mov esi、dword ptr [esp+0x10]
72A1A0FC プッシュエディ
72A1A0FD mov edi、dword ptr [esp+0x10]
72A1A101 移動 eax、ecx
72A1A103 ムーブ edx、edi
72A1A105 シュレックス、0x2
72A1A108 rep movs dword ptr es:[edi]、dword ptr [esi]
72A1A10A mov ecx、eax
72A1A10C 移動 eax、edx
72A1A10E および ecx、0x3
72A1A111 rep movs byte ptr es:[edi]、byte ptr [esi]
72A1A113 ポペディ
72A1A114 ポップエシ
72A1A115 戻り 0xC
ドキュメントでは次のように警告されていることに注意してください。
次のようにコードをコピーします。
警告 LSet を使用して、あるユーザー定義型の変数を別のユーザー定義型の変数にコピーすることは、あるデータ型のデータを別のデータ型用に予約された領域にコピーすることはお勧めできません。
あるユーザー定義型から別のユーザー定義型に変数をコピーすると、要素に指定されたデータ型に関係なく、一方の変数のバイナリ データがもう一方の変数のメモリ空間にコピーされます。
LSet を使用してユーザー定義型変数をコピーすることはお勧めできません。また、予期しない結果 (不整列構造など) が発生する可能性があるため、何をしようとしているのか理解していない限り、LSet ステートメントを使用しないでください。