FreeBASIC マニュアルのトップに戻る

FreeBASIC With

目次→言語リファレンス→変数とデータ型→ユーザ定義型WITH←オリジナル・サイト

WITH 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る

命令文ブロックで、ユーザ定義型変数中のフィールドへの、暗黙のアクセスを許します。

構文:
With user_defined_var
statements
End With

記述:
With...End With ブロックは、ユーザ定義 Type のフィールドを参照するとき、ユーザ定義 Type の変数名を、省略できます。
そして、フィールドは、その前のただ一つのピリオド (.) でアクセスすることができます。 例えば、Type が "element" と呼ばれるフィールド要素を含んでいるなら、それは ".element" として With ブロックの中でアクセスできます。

これは、入力を節約し、ソースが煩雑になることを避けるための短縮表現として使えます。
With は、下の 2 番目の例に示すように逆参照ポインター、3 番目の例に示すように一時インスタンス (明示的または暗黙のコンストラクターを含む)、さらには一時型 (コンストラクターなし) でも使用できます。これは、このような一時インスタンス/型の破棄が With スコープの最後まで延期されるためです。
ただし、引数として受け取った一時的なインスタンス/型から、関数の byref を返すことは、サポートされていません (エラー メッセージもありません)。

With ブロックは、入れ子にできます。
この場合、最も内側の With ブロックだけがアクティブです。そして、内側のものが再び閉じられるまで、どの外側のものも、無視されます。
この実例として、下の 3番目の例を見てください。

内部で、変数の参照は、With ブロックの開始で始まり、そして、ブロックの中の、どの要素アクセスの計算にも、使われます。
注意:これは、Goto を使って、With ブロックに入り込んではいけない、ということを意味しています。Goto を使って、With ブロックに入り込むと、参照は設定されず、参照にアクセスしようとした結果は、未定義になります。

メンバー手続き内で使われる With ブロックのための注意:
型の外部でグローバルとして定義された重複するシンボルにアクセスするには、プレフィックスとして 2つの点を追加します: "..SomeSymbol" (With...End With ブロック内で)。


例:
Type rect_type
    x As Single
    y As Single
End Type

Dim the_rectangle As rect_type
Dim As Integer temp, t

With the_rectangle
    temp = .x
    .x = 234 * t + 48 + .y
    .y = 321 * t + 2
End With

Print temp, t, the_rectangle.x, the_rectangle.y
Sleep


Type rect_type
    x As Single
    y As Single
End Type

Dim the_rectangle As rect_type Ptr

the_rectangle = CAllocate ( 5 * Len( rect_type ) )

Dim As Integer loopvar, temp, t

For loopvar = 0 To 4

  With the_rectangle [loopvar]  '' dereferenced pointer

    temp = .x
    .x = 234 * t + 48 + .y
    .y = 321 * t + 2

  End With

Next


Type rect_type
    x As Single
    y As Single
    Declare Constructor()
    Declare Constructor(ByVal x0 As Single, ByVal y0 As Single)
End Type

Constructor rect_type()
End Constructor

Constructor rect_type(ByVal x0 As Single, ByVal y0 As Single)
    This.x = x0
    This.y = y0
End Constructor

Dim the_rectangle As rect_type

With rect_type(1, 2)  '' ここで作成された一時インスタンスは「End With」まで保持されます
    the_rectangle.x = .x + .y  '' 1 + 2 = 3
    the_rectangle.y = .x - .y  '' 1 - 2 = -1
End With

Type rect_type
    x As Single
    y As Single
End Type

Dim As rect_type rect1, rect2

'' 入れ子にされたWithブロック
With rect1

    .x = 1
    .y = 2

    With rect2

        .x = 3
        .y = 4

    End With

End With

Print rect1.x, rect1.y '' 1,  2
Print rect2.x, rect2.y '' 3,  4
Sleep


バージョン: 方言差:
QBからの違い:
参照:
ユーザ定義型 に戻る
←リンク元に戻る プログラム開発関連に戻る
ページ歴史:2023-03-05 01:12:04
日本語翻訳:WATANABE Makoto、原文著作者:SysOp

ホームページのトップに戻る

表示-非営利-継承