with句内でwith句内にもあるローカル変数を明示的に
指定する方法はありますでしょうか?
例えば
type
TKouzoutai=record
a:Integer;
end;
procedure TForm1.Kansu(Sender: TObject);
var
a:Integer;
Kouzoutai:TKouzoutai;
begin
with Kouzoutai do
begin
// この中でローカル変数aにアクセスする方法??
// ※自クラス内の変数aにアクセスする場合→Self.a
// ※グローバル変数aにアクセスする場合→ユニット名.a
end;
end;
宜しくお願いします。
TKouzoutai のフィールドとかぶってないなら、たんに a では?
かぶってるんなら、with を使ってはいけません。間違いのもとです。
> // この中でローカル変数aにアクセスする方法??
自分の知る限り、なし
調べた限りでは、「限定付き識別子」ということで、ユニット名やSelf、
クラス名等を指定することができますが、
関数内のローカル変数に対する識別子はないようです。
もっと調べるなら、スコープとか識別子あたりがキーワードかな?
りおりおさん、ぬのさんありがとうございます。
ローカル変数は一番優先されるみたいなので明示的に指定する方法はないようですね。
りおりおさんの仰るようにwith句は使用しない方向で考えます。
ちなみに下記のようなことを考えていました。
--------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var
a:Integer;
b:Integer;
c:Integer;
d:Integer;
begin
{ 省略 }
NanikashiraTabel.NanikashiraMember.NanikashiraColumn.a = a
NanikashiraTabel.NanikashiraMember.NanikashiraColumn.b = b
NanikashiraTabel.NanikashiraMember.NanikashiraColumn.c = c
NanikashiraTabel.NanikashiraMember.NanikashiraColumn.d = d
// ↑これだと面倒なのでNanikashiraTabel.NanikashiraMember.NanikashiraColumnを
// with句で囲いたい!
with NanikashiraTabel.NanikashiraMember.NanikashiraColumn do
begin
a := ローカル.a
b := ローカル.b
c := ローカル.c
d := ローカル.d
end;
// ↑このようなことがやりたかった・・・
end;
というものでした。
var
N: TNanikashiraColumn;
として変数を宣言しておき
N := NanikashiraTabel.NanikashiraMember.NanikashiraColumn;
N.a := a;
などとしたらよいのでは?
ローカル変数の名前をlocal_aなどに変更してみては?
ちょっと譲歩して・・・
with NanikashiraTabel.NanikashiraMember do
begin
NanikashiraColumn.a := a
NanikashiraColumn.b := b
NanikashiraColumn.c := c
NanikashiraColumn.d := d
end;
とか・・・(^^ゞ
りおりおさん、ある意味明示的さん、ぬのさんありがとうございます。
解決策案を記しておきます。
その1.長い変数名の変数を別の短い変数名の変数に代入し操作する。
(りおりおさん案)
その2.長い変数名を別名に置き換える。
※ポインタで操作し変数の実体は変わらず
その3.ローカル変数には同じ変数名を使用しない。(ある意味明示的さん案)
その4.我慢する。
※ぬのさん案は3.と4.の合併ですかね。
現在は4.で我慢してます。
ありがとうございました。
ツイート | ![]() |