procedure呼び出し時のエラーを回避するには?

解決


nanioda  2010-01-15 01:00:15  No: 36994

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)


nanioda  2010-01-15 01:33:09  No: 36995

//自己解決しました(^^)
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;
//を入れるだけの単純なことでした。
//板を汚す結果になりました。申し訳ありません。


tor  2010-01-15 01:34:33  No: 36996

配列の上限値と下限値はLow()とHigh()、長さはLength()で取得できます。
引数で渡された配列にもこれらは適用可能です。なので、
if m > High(c) then ...
のようにすれば範囲を超えたかどうかチェックできます。

部分的に {$R+}..{$R-} で範囲検査を有効にして、
try..exceptでERangeErrorを捕まえるという方法もありますけどね。


nanioda  2010-01-15 01:39:45  No: 36997

tor様ありがとうございました。
今後とも宜しくご指導くださいますようお願いいたします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加