procedure TForm1.Coloring(var c:array of Tcolor);
var i,j,k,m:integer;
const V:array[1..3] of byte=(250,170,200);
begin
m:=1;
for i:=1 to 3 do
for j:=1 to 3 do
for k:=1 to 3 do begin
c[m]:=RGB(v[i],v[j],v[k]);
inc(m);
end;
end;
//------
//上記のprocedure Coloringで27個のTcolor値を配列c[]で得ます。
//このprocedureを呼び出すときは、
procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
Mycolor:array[1..27] of Tcolor
begin
Coloring(Mycolor);
end
//------
//とする訳ですが、
//今、Tcolor値を5個必要なとき、
procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
Mycolor:array[1..5] of Tcolor
begin
Coloring(Mycolor);
end
//として呼び出しますと、当然にエラーとなります。
//エラーを回避するには、procedure Coloringをどのように記述すればよいでしょうか?
//(WinXp,D7-pro)
//自己解決しました(^^)
procedure TForm1.Coloring(var c:array of Tcolor);
var i,j,k,m:integer;
const V:array[1..3] of byte=(250,170,200);
begin
m:=1;
for i:=1 to 3 do
for j:=1 to 3 do
for k:=1 to 3 do begin
c[m]:=RGB(v[i],v[j],v[k]);
if m=high(c) then exit;
inc(m);
end;
end;
//if m=high(c) then exit;
//を入れるだけの単純なことでした。
//板を汚す結果になりました。申し訳ありません。
配列の上限値と下限値はLow()とHigh()、長さはLength()で取得できます。
引数で渡された配列にもこれらは適用可能です。なので、
if m > High(c) then ...
のようにすれば範囲を超えたかどうかチェックできます。
部分的に {$R+}..{$R-} で範囲検査を有効にして、
try..exceptでERangeErrorを捕まえるという方法もありますけどね。
tor様ありがとうございました。
今後とも宜しくご指導くださいますようお願いいたします。
ツイート | ![]() |